Version 2.8.0-dev.17.0

Merge commit 'e3af7e724f51ca12636ed0c716cbb3daab9213d5' into dev
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index 8c08a77..ebfd144 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -201,6 +201,12 @@
       "languageVersion": "2.3"
     },
     {
+      "name": "dds",
+      "rootUri": "../pkg/dds",
+      "packageUri": "lib/",
+      "languageVersion": "2.3"
+    },
+    {
       "name": "dev_compiler",
       "rootUri": "../pkg/dev_compiler",
       "packageUri": "lib/",
@@ -568,6 +574,12 @@
       "languageVersion": "1.22"
     },
     {
+      "name": "shelf_proxy",
+      "rootUri": "../third_party/pkg/shelf_proxy",
+      "packageUri": "lib/",
+      "languageVersion": "2.3"
+    },
+    {
       "name": "shelf_static",
       "rootUri": "../third_party/pkg/shelf_static",
       "packageUri": "lib/",
@@ -607,7 +619,7 @@
       "name": "source_span",
       "rootUri": "../third_party/pkg/source_span",
       "packageUri": "lib/",
-      "languageVersion": "1.8"
+      "languageVersion": "2.6"
     },
     {
       "name": "sourcemap_testing",
@@ -724,18 +736,6 @@
       "languageVersion": "2.0"
     },
     {
-      "name": "unittest",
-      "rootUri": "../third_party/pkg/unittest",
-      "packageUri": "lib/",
-      "languageVersion": "2.0"
-    },
-    {
-      "name": "unittest-orig",
-      "rootUri": "../third_party/pkg/unittest-orig",
-      "packageUri": "lib/",
-      "languageVersion": "1.0"
-    },
-    {
       "name": "usage",
       "rootUri": "../third_party/pkg/usage",
       "packageUri": "lib/",
@@ -784,4 +784,4 @@
       "languageVersion": "2.0"
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/.packages b/.packages
index a5ab646..bb207f5 100644
--- a/.packages
+++ b/.packages
@@ -36,6 +36,7 @@
 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
 expect:pkg/expect/lib
@@ -85,6 +86,7 @@
 sdk_library_metadata:sdk/lib/_internal/sdk_library_metadata/lib
 shelf:third_party/pkg/shelf/lib
 shelf_packages_handler:third_party/pkg/shelf_packages_handler/lib
+shelf_proxy:third_party/pkg/shelf_proxy/lib
 shelf_static:third_party/pkg/shelf_static/lib
 shelf_web_socket:third_party/pkg/shelf_web_socket/lib
 smith:pkg/smith/lib
@@ -109,7 +111,6 @@
 testing:pkg/testing/lib
 tflite_native:third_party/pkg/tflite_native/lib
 typed_data:third_party/pkg/typed_data/lib
-unittest:third_party/pkg/unittest/lib
 usage:third_party/pkg/usage/lib
 vm:pkg/vm/lib
 vm_service:pkg/vm_service/lib
diff --git a/CHANGELOG.md b/CHANGELOG.md
index bfced46..6e4afcd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,13 +6,28 @@
 
 ### Core libraries
 
+#### `dart:async`
+
+* Make stack traces non-null. Where methods like `completer.completeError`
+  allows omitting a stack trace, the platform will now insert a default
+  stack trace rather than propagate a `null` value.
+  Error handling functions need no longer be prepared for `null` stack traces.
+
 #### `dart:core`
 
+* Adds `StackTrace.empty` constant which is the stack trace used as default
+  stack trace when no better alternative is available.
+
 * The class `TypeError` no longer extends `AssertionError`.
   This also means that it no longer inherits the spurious `message` getter
   which was added to `AssertionError` when the second operand to `assert`
   was allowed. The value of that getter on a `TypeError` was the same
   string as returned by `toString`, so it is still available.
+* `ArgumentError.checkNotNull` and the `RangeError` static methods
+  `checkValueInInterval`, `checkValidIndex` and `checkNotNegative`
+  all return their first argument on success.
+  This makes these functions more convenient to use in-line in,
+  for example, `=>` function bodies or constructor initialization lists.
 
 #### `dart:developer`
 
@@ -74,6 +89,54 @@
   now contains Unix epoch timestamps instead of `null` for the `accessed`,
   `changed`, and `modified` getters.
 
+* **Breaking change** [#40709](https://github.com/dart-lang/sdk/issues/40709):
+  The `HeaderValue` class now parses more strictly in two invalid edge cases.
+  This is the class used to parse the semicolon delimited parameters used in the
+  `Accept`, `Authorization`, `Content-Type`, and other such HTTP headers.
+
+  The empty parameter value without double quotes (which is not allowed by the
+  standards) is now parsed as the empty string rather than `null`. E.g.
+  `HeaderValue.parse("v;a=").parameters` now gives `{"a": ""}` rather than
+  `{"a": null}`.
+
+  Invalid inputs with unbalanced double quotes are now rejected. E.g.
+  `HeaderValue.parse('v;a="b').parameters` will now throw a `HttpException`
+  instead of giving `{"a": "b"}`.
+
+* The `HeaderValue.toString()` method now supports parameters with `null` values
+  by omitting the value. `HeaderValue("v", {"a": null, "b": "c"}).toString()`
+  now gives `v; a; b=c`. This behavior can be used to implement some features in
+  the `Accept` and `Sec-WebSocket-Extensions` headers.
+
+  Likewise the empty value and values using characters outside of
+  [RFC 7230 tokens](https://tools.ietf.org/html/rfc7230#section-3.2.6) are now
+  correctly implemented by double quoting such values with escape sequences.
+  E.g:
+
+  ```dart
+  HeaderValue("v",
+      {"a": "A", "b": "(B)", "c": "", "d": "ø", "e": "\\\""}).toString()
+  ```
+
+  now gives `v;a=A;b="(B)";c="";d="ø";e="\\\""`.
+
+* [Unix domain sockets](https://en.wikipedia.org/wiki/Unix_domain_socket) are
+  now supported on Linux, Android and MacOS, which can be used by passing a
+  `InternetAddress` of `InternetAddressType.Unix` into `connect`, `startConnect`
+  and `bind` methods. `port` argument in those methods will be ignored. Getter
+  of `port` will always return 0 for Unix domain sockets.
+
+* Class `InternetAddressType` gains one more option `Unix`, which represents a
+  Unix domain address.
+
+* Class `InternetAddress`:
+  * `InternetAddress` constructor gains an optional `type` parameter. To create
+    a Unix domain address, `type` is set to `InternetAddressType.Unix` and
+    `address` is a file path.
+  * `InternetAddress` gains a new constructor `fromRawAddress` that takes an
+    address in byte format for Internet addresses or raw file path for Unix
+    domain addresses.
+
 #### `dart:mirrors`
 
 * Added `MirrorSystem.neverType`.
@@ -166,6 +229,9 @@
 
 #### Pub
 
+* Added `pub outdated` command which lists outdated package dependencies, and
+  gives advice on how to upgrade.
+
 * `pub get` and `pub upgrade` now fetches version information about hosted
   dependencies in parallel, improving the time package resolution performance.
 
@@ -178,13 +244,19 @@
 * Importing packages not in `pubspec.yaml` now causes `pub publish` to reject
   the package.
 
+* `pub publish` no longer requires the presence of a `homepage` field, if the
+  `repository` field is provided.
+
+* `pub publish` will now warn if non-pre-release packages depends on pre-release
+  packages or pre-release Dart SDKs.
+
 * Relative paths in `pubspec.lock` are now using `/` also on Windows to make
   the file sharable between machines.
 
 * Fixed language version in [`.dart_tool/package_config.json`](https://github.com/dart-lang/language/blob/master/accepted/future-releases/language-versioning/package-config-file-v2.md)
   for packages without an explicit sdk constraint.
 
-  Now writes an empty language-version while efore the language version of the
+  Now writes an empty language-version while before the language version of the
   current sdk would be used.
 
 * `%LOCALAPPDATA%` is now preferred over `%APPDATA%` when creating a pub cache
@@ -243,9 +315,14 @@
 
 [17207]: https://github.com/dart-lang/sdk/issues/17207
 
-## 2.7.2 - 2020-03-16
+## 2.7.2 - 2020-03-23
 
-This is a patch release that improves compatibility with ARMv8 processors
+This is a patch release that addresses a vulnerability dart:html
+[NodeValidator](https://api.dart.dev/stable/dart-html/NodeValidator-class.html)
+related to DOM clobbering of `previousSibling`. Thanks to **Vincenzo di Cicco**
+for finding and reporting this issue.
+
+This release also improves compatibility with ARMv8 processors
 (issue [40001][]) and dart:io stability (issue [40589][]).
 
 [40001]: https://github.com/dart-lang/sdk/issues/40001
diff --git a/DEPS b/DEPS
index 353c1c2..9a6d8c6 100644
--- a/DEPS
+++ b/DEPS
@@ -99,7 +99,7 @@
   "http_throttle_tag" : "1.0.2",
   "icu_rev" : "c56c671998902fcc4fc9ace88c83daa99f980793",
   "idl_parser_rev": "5fb1ebf49d235b5a70c9f49047e83b0654031eb7",
-  "intl_tag": "0.15.7",
+  "intl_tag": "0.16.1",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_tag": "2.0.9",
   "linter_tag": "0.1.113",
@@ -119,7 +119,7 @@
   "ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_tag": "1.3.6",
   "protobuf_rev": "3746c8fd3f2b0147623a8e3db89c3ff4330de760",
-  "pub_rev": "429a06039d185149f387a65e3503b0693ce6d24e",
+  "pub_rev": "11afdac99fe67373829f37acc75b625011d360ad",
   "pub_semver_tag": "v1.4.4",
   "quiver-dart_tag": "2.0.0+1",
   "resource_rev": "f8e37558a1c4f54550aa463b88a6a831e3e33cd6",
@@ -127,12 +127,13 @@
   "rust_revision": "60960a260f7b5c695fd0717311d72ce62dd4eb43",
   "shelf_static_rev": "v0.2.8",
   "shelf_packages_handler_tag": "2.0.0",
+  "shelf_proxy_tag": "0.1.0+7",
   "shelf_tag": "0.7.3+3",
   "shelf_web_socket_tag": "0.2.2+3",
   "source_map_stack_trace_tag": "2.0.0",
   "source_maps-0.9.4_rev": "38524",
   "source_maps_tag": "8af7cc1a1c3a193c1fba5993ce22a546a319c40e",
-  "source_span_tag": "1.5.5",
+  "source_span_tag": "1.7.0",
   "stack_trace_tag": "1.9.3",
   "stagehand_tag": "v3.3.7",
   "stream_channel_tag": "2.0.0",
@@ -144,11 +145,10 @@
   "test_tag": "test_core-v0.3.2",
   "tflite_native_rev": "3c777c40608a2a9f1427bfe0028ab48e7116b4c1",
   "typed_data_tag": "1.1.6",
-  "unittest_rev": "2b8375bc98bb9dc81c539c91aaea6adce12e1072",
   "usage_tag": "3.4.0",
   "watcher_rev": "0.9.7+14",
   "web_components_rev": "8f57dac273412a7172c8ade6f361b407e2e4ed02",
-  "web_socket_channel_tag": "1.0.9",
+  "web_socket_channel_tag": "1.0.15",
   "WebCore_rev": "fb11e887f77919450e497344da570d780e078bc8",
   "yaml_tag": "2.2.0",
   "zlib_rev": "c44fb7248079cc3d5563b14b3f758aee60d6b415",
@@ -365,6 +365,8 @@
   Var("dart_root") + "/third_party/pkg/shelf_packages_handler":
       Var("dart_git") + "shelf_packages_handler.git"
       + "@" + Var("shelf_packages_handler_tag"),
+  Var("dart_root") + "/third_party/pkg/shelf_proxy":
+      Var("dart_git") + "shelf_proxy.git" + "@" + Var("shelf_proxy_tag"),
   Var("dart_root") + "/third_party/pkg/shelf_static":
       Var("dart_git") + "shelf_static.git" + "@" + Var("shelf_static_rev"),
   Var("dart_root") + "/third_party/pkg/shelf_web_socket":
@@ -402,12 +404,6 @@
       "@" + Var("test_reflective_loader_tag"),
   Var("dart_root") + "/third_party/pkg/typed_data":
       Var("dart_git") + "typed_data.git" + "@" + Var("typed_data_tag"),
-  # Unittest is an early version, 0.11.x, of the package "test"
-  # Do not use it in any new tests. Fetched from chromium_git to avoid
-  # race condition in cache with pkg/test.
-  Var("dart_root") + "/third_party/pkg/unittest":
-      Var("chromium_git") + "/external/github.com/dart-lang/test.git" +
-      "@" + Var("unittest_rev"),
   Var("dart_root") + "/third_party/pkg/usage":
       Var("dart_git") + "usage.git" + "@" + Var("usage_tag"),
   Var("dart_root") + "/third_party/pkg/watcher":
diff --git a/README.md b/README.md
index a88db95..27cbb2b 100644
--- a/README.md
+++ b/README.md
@@ -61,6 +61,6 @@
 [tools]: https://www.dartlang.org/tools/
 [codelab]: https://dart.dev/codelabs
 [dartbug]: http://dartbug.com
-[contrib]: https://github.com/dart-lang/sdk/wiki/Contributing
+[contrib]: https://github.com/dart-lang/sdk/blob/master/CONTRIBUTING.md
 [pubsite]: https://pub.dev
 [patent_grant]: https://github.com/dart-lang/sdk/blob/master/PATENT_GRANT
diff --git a/WATCHLISTS b/WATCHLISTS
index e88ada2..3e5b2ab 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -68,9 +68,8 @@
 
   'WATCHLISTS': {
     'build': [ 'keertip@google.com' ],
-    'dart2js': [ 'johnniwinther@google.com', 'sigmund@google.com',
-                 'sra@google.com', 'fishythefish@google.com',
-                 'joshualitt@google.com' ],
+    'dart2js': [ 'sigmund@google.com', 'sra@google.com',
+                 'fishythefish@google.com', 'joshualitt@google.com' ],
     'front_end': [ 'dart-fe-team+reviews@google.com' ],
     'kernel': [ 'jensj@google.com', 'alexmarkov@google.com' ],
     'messages_review': [ 'dart-uxr+reviews@google.com' ],
diff --git a/benchmarks/ListCopy/dart/ListCopy.dart b/benchmarks/ListCopy/dart/ListCopy.dart
index e058928..cd16fc0 100644
--- a/benchmarks/ListCopy/dart/ListCopy.dart
+++ b/benchmarks/ListCopy/dart/ListCopy.dart
@@ -56,7 +56,8 @@
     while (totalLength < elements) {
       var variants = makeVariants();
       inputs.addAll(variants);
-      totalLength += variants.fold(0, (sum, iterable) => sum + iterable.length);
+      totalLength +=
+          variants.fold<int>(0, (sum, iterable) => sum + iterable.length);
     }
 
     // Sanity checks.
@@ -90,7 +91,7 @@
 
 // All the 'copy' methods use [input] and [output] rather than a parameter and
 // return value to avoid any possibility of type check in the call sequence.
-Iterable<num> input;
+Iterable<num> input = const [];
 var output;
 
 List<Benchmark> makeBenchmarks(int length) => [
diff --git a/build/config/mac/mac_sdk.gni b/build/config/mac/mac_sdk.gni
index e0a3abc..e93ede0 100644
--- a/build/config/mac/mac_sdk.gni
+++ b/build/config/mac/mac_sdk.gni
@@ -2,6 +2,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/toolchain/goma.gni")
+
 declare_args() {
   # Minimum supported version of the Mac SDK.
   mac_sdk_min = "10.8"
@@ -10,6 +12,8 @@
   # the end. If empty, the path to the lowest version greater than or equal to
   # mac_sdk_min is used.
   mac_sdk_path = ""
+
+  mac_enable_relative_sdk_path = mac_use_goma_rbe
 }
 
 find_sdk_args = [
@@ -17,6 +21,15 @@
   mac_sdk_min,
 ]
 
+if (mac_use_goma_rbe) {
+  find_sdk_args += [
+    "--create_symlink_at",
+
+    # $root_build_dir starts with "//", which is removed by rebase_path().
+    rebase_path("$root_build_dir/sdk/xcode_links", "//"),
+  ]
+}
+
 # The tool will print the SDK path on the first line, and the version on the
 # second line.
 find_sdk_lines =
diff --git a/build/mac/find_sdk.py b/build/mac/find_sdk.py
index 3e7bbc1..a53ba28 100755
--- a/build/mac/find_sdk.py
+++ b/build/mac/find_sdk.py
@@ -17,6 +17,41 @@
 from optparse import OptionParser
 
 
+# sdk/build/xcode_links
+ROOT_SRC_DIR = os.path.join(
+    os.path.dirname(
+        os.path.dirname(os.path.dirname(os.path.realpath(__file__)))))
+
+
+def CreateSymlinkForSDKAt(src, dst):
+    """
+    Create symlink to Xcode directory at target location, which can be absolute or
+    relative to `ROOT_SRC_DIR`.
+    """
+
+    # If `dst` is relative, it is assumed to be relative to src root.
+    if not os.path.isabs(dst):
+        dst = os.path.join(ROOT_SRC_DIR, dst)
+
+    if not os.path.isdir(dst):
+        os.makedirs(dst)
+
+    dst = os.path.join(dst, os.path.basename(src))
+
+    # Update the symlink if exists.
+    if os.path.islink(dst):
+        current_src = os.readlink(dst)
+        if current_src == src:
+            return dst
+
+        os.unlink(dst)
+        sys.stderr.write('existing symlink %s points %s; want %s. Removed.' %
+                         (dst, current_src, src))
+
+    os.symlink(src, dst)
+    return dst
+
+
 def parse_version(version_str):
     """'10.6' => [10, 6]"""
     return map(int, re.findall(r'(\d+)', version_str))
@@ -43,6 +78,13 @@
         dest="print_sdk_path",
         default=False,
         help="Additionaly print the path the SDK (appears first).")
+    parser.add_option(
+        "--create_symlink_at",
+        action="store",
+        dest="create_symlink_at",
+        help=
+        "Create symlink to SDK at given location and return symlink path as SDK "
+        "info instead of the original location.")
     (options, args) = parser.parse_args()
     min_sdk_version = args[0]
 
@@ -91,9 +133,13 @@
         return min_sdk_version
 
     if options.print_sdk_path:
-        print subprocess.check_output(
+        sdk_path = subprocess.check_output(
             ['xcodebuild', '-version', '-sdk', 'macosx' + best_sdk,
              'Path']).strip()
+        if options.create_symlink_at:
+            print CreateSymlinkForSDKAt(sdk_path, options.create_symlink_at)
+        else:
+            print sdk_path
 
     return best_sdk
 
diff --git a/build/toolchain/goma.gni b/build/toolchain/goma.gni
index c0f4cf2..d2bfcf9 100644
--- a/build/toolchain/goma.gni
+++ b/build/toolchain/goma.gni
@@ -19,4 +19,8 @@
     # Absolute directory containing the Goma source code.
     goma_dir = getenv("HOME") + "/goma"
   }
+
+  # Sets relative symlink path to Xcode SDK path.
+  # Based on http://crrev.com/c/1946174.
+  mac_use_goma_rbe = false
 }
diff --git a/build/toolchain/mac/BUILD.gn b/build/toolchain/mac/BUILD.gn
index 48ef702..2c1839f 100644
--- a/build/toolchain/mac/BUILD.gn
+++ b/build/toolchain/mac/BUILD.gn
@@ -222,6 +222,9 @@
   ld = cxx
   strip = "strip"
   is_clang = true
+  if (mac_enable_relative_sdk_path) {
+    mac_sdk_path = rebase_path(mac_sdk_path, root_build_dir)
+  }
   sysroot_flags = "-isysroot $mac_sdk_path -mmacosx-version-min=$mac_sdk_min"
 }
 
@@ -236,5 +239,8 @@
   ld = cxx
   strip = "strip"
   is_clang = true
+  if (mac_enable_relative_sdk_path) {
+    mac_sdk_path = rebase_path(mac_sdk_path, root_build_dir)
+  }
   sysroot_flags = "-isysroot $mac_sdk_path -mmacosx-version-min=$mac_sdk_min"
 }
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes.dart
index 0b7cc1c..743f67d 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes.dart
@@ -123,6 +123,7 @@
 
   Map<String, dynamic> get arguments => messageObject.arguments;
 
+  @override
   int compareTo(LocatedMessage other) {
     int result = "${uri}".compareTo("${other.uri}");
     if (result != 0) return result;
@@ -136,6 +137,28 @@
     return new FormattedMessage(
         this, formatted, line, column, severity, relatedInformation);
   }
+
+  @override
+  int get hashCode =>
+      13 * uri.hashCode +
+      17 * charOffset.hashCode +
+      19 * length.hashCode +
+      23 * messageObject.hashCode;
+
+  @override
+  bool operator ==(Object other) {
+    if (identical(this, other)) return true;
+    return other is LocatedMessage &&
+        uri == other.uri &&
+        charOffset == other.charOffset &&
+        length == other.length &&
+        messageObject == other.messageObject;
+  }
+
+  @override
+  String toString() =>
+      'LocatedMessage(uri=$uri,charOffset=$charOffset,length=$length,'
+      'messageObject=$messageObject)';
 }
 
 class FormattedMessage implements DiagnosticMessage {
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 6d316e6..b4145ba 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -103,6 +103,15 @@
 }
 
 // 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.
+const MessageCode messageAmbiguousExtensionCause = const MessageCode(
+    "AmbiguousExtensionCause",
+    severity: Severity.context,
+    message: r"""This is one of the extension members.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeAnnotationOnFunctionTypeTypeVariable =
     messageAnnotationOnFunctionTypeTypeVariable;
 
@@ -952,17 +961,6 @@
         message: r"""Constructor is marked 'const' so fields can't be late.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Null> codeConstConstructorLateFinalFieldWarning =
-    messageConstConstructorLateFinalFieldWarning;
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageConstConstructorLateFinalFieldWarning =
-    const MessageCode("ConstConstructorLateFinalFieldWarning",
-        severity: Severity.warning,
-        message:
-            r"""Constructor is marked 'const' and some fields are late.""");
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstConstructorNonFinalField =
     messageConstConstructorNonFinalField;
 
@@ -1685,6 +1683,16 @@
         message: r"""This is the inherited member.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeDeclaredMemberConflictsWithInheritedMembersCause =
+    messageDeclaredMemberConflictsWithInheritedMembersCause;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageDeclaredMemberConflictsWithInheritedMembersCause =
+    const MessageCode("DeclaredMemberConflictsWithInheritedMembersCause",
+        severity: Severity.context,
+        message: r"""This is one of the inherited members.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeDefaultListConstructorError =
     messageDefaultListConstructorError;
 
@@ -1695,17 +1703,6 @@
     tip: r"""Try using List.filled instead.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Null> codeDefaultListConstructorWarning =
-    messageDefaultListConstructorWarning;
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageDefaultListConstructorWarning = const MessageCode(
-    "DefaultListConstructorWarning",
-    severity: Severity.warning,
-    message: r"""Using the default List constructor.""",
-    tip: r"""Try using List.filled instead.""");
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)>
     templateDefaultValueInRedirectingFactoryConstructor =
     const Template<Message Function(String name)>(
@@ -2959,6 +2956,15 @@
         r"""This can't be used as metadata; metadata should be a reference to a compile-time constant variable, or a call to a constant constructor.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeExtendFunction = messageExtendFunction;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageExtendFunction = const MessageCode("ExtendFunction",
+    severity: Severity.ignored,
+    message: r"""Extending 'Function' is deprecated.""",
+    tip: r"""Try removing 'Function' from the 'extends' clause.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateExtendingEnum =
     const Template<Message Function(String name)>(
         messageTemplate:
@@ -3972,6 +3978,16 @@
     message: r"""Functions marked 'sync*' can't have return type 'void'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeImplementFunction = messageImplementFunction;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageImplementFunction = const MessageCode(
+    "ImplementFunction",
+    severity: Severity.ignored,
+    message: r"""Implementing 'Function' is deprecated.""",
+    tip: r"""Try removing 'Function' from the 'implements' clause.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeImplementsBeforeExtends = messageImplementsBeforeExtends;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -5857,6 +5873,15 @@
     message: r"""Mixins can't declare constructors.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeMixinFunction = messageMixinFunction;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageMixinFunction = const MessageCode("MixinFunction",
+    severity: Severity.ignored,
+    message: r"""Mixing in 'Function' is deprecated.""",
+    tip: r"""Try removing 'Function' from the 'with' clause.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         String string,
@@ -6170,6 +6195,58 @@
     message: r"""Can't spread a value with static type Null.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+    templateNonNullableLateDefinitelyAssignedError =
+    const Template<Message Function(String name)>(
+        messageTemplate:
+            r"""Non-nullable late final variable '#name' definitely assigned.""",
+        withArguments: _withArgumentsNonNullableLateDefinitelyAssignedError);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)>
+    codeNonNullableLateDefinitelyAssignedError =
+    const Code<Message Function(String name)>(
+  "NonNullableLateDefinitelyAssignedError",
+  templateNonNullableLateDefinitelyAssignedError,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsNonNullableLateDefinitelyAssignedError(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  return new Message(codeNonNullableLateDefinitelyAssignedError,
+      message:
+          """Non-nullable late final variable '${name}' definitely assigned.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+    templateNonNullableLateDefinitelyUnassignedError =
+    const Template<Message Function(String name)>(
+        messageTemplate:
+            r"""Non-nullable late variable '#name' without initializer is definitely unassigned.""",
+        withArguments: _withArgumentsNonNullableLateDefinitelyUnassignedError);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)>
+    codeNonNullableLateDefinitelyUnassignedError =
+    const Code<Message Function(String name)>(
+  "NonNullableLateDefinitelyUnassignedError",
+  templateNonNullableLateDefinitelyUnassignedError,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsNonNullableLateDefinitelyUnassignedError(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  return new Message(codeNonNullableLateDefinitelyUnassignedError,
+      message:
+          """Non-nullable late variable '${name}' without initializer is definitely unassigned.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         String
@@ -6197,30 +6274,6 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)>
-    templateNonNullableNotAssignedWarning =
-    const Template<Message Function(String name)>(
-        messageTemplate:
-            r"""Non-nullable variable '#name' is used before it's assigned.""",
-        withArguments: _withArgumentsNonNullableNotAssignedWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeNonNullableNotAssignedWarning =
-    const Code<Message Function(String name)>(
-        "NonNullableNotAssignedWarning", templateNonNullableNotAssignedWarning,
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsNonNullableNotAssignedWarning(String name) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  return new Message(codeNonNullableNotAssignedWarning,
-      message:
-          """Non-nullable variable '${name}' is used before it's assigned.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeNonNullableOptOut = messageNonNullableOptOut;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6451,27 +6504,6 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)> templateNullableInterfaceWarning =
-    const Template<Message Function(String name)>(
-        messageTemplate: r"""Implementing '#name' marked with '?'.""",
-        withArguments: _withArgumentsNullableInterfaceWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeNullableInterfaceWarning =
-    const Code<Message Function(String name)>(
-        "NullableInterfaceWarning", templateNullableInterfaceWarning,
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsNullableInterfaceWarning(String name) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  return new Message(codeNullableInterfaceWarning,
-      message: """Implementing '${name}' marked with '?'.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateNullableMixinError =
     const Template<Message Function(String name)>(
         messageTemplate:
@@ -6495,27 +6527,6 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)> templateNullableMixinWarning =
-    const Template<Message Function(String name)>(
-        messageTemplate: r"""Mixing in '#name' marked with '?'.""",
-        withArguments: _withArgumentsNullableMixinWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeNullableMixinWarning =
-    const Code<Message Function(String name)>(
-        "NullableMixinWarning", templateNullableMixinWarning,
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsNullableMixinWarning(String name) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  return new Message(codeNullableMixinWarning,
-      message: """Mixing in '${name}' marked with '?'.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateNullableSuperclassError =
     const Template<Message Function(String name)>(
         messageTemplate:
@@ -6539,28 +6550,6 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)>
-    templateNullableSuperclassWarning =
-    const Template<Message Function(String name)>(
-        messageTemplate: r"""Extending '#name' marked with '?'.""",
-        withArguments: _withArgumentsNullableSuperclassWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeNullableSuperclassWarning =
-    const Code<Message Function(String name)>(
-        "NullableSuperclassWarning", templateNullableSuperclassWarning,
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsNullableSuperclassWarning(String name) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  return new Message(codeNullableSuperclassWarning,
-      message: """Extending '${name}' marked with '?'.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateNullableTearoffError =
     const Template<Message Function(String name)>(
         messageTemplate:
@@ -6585,29 +6574,6 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)> templateNullableTearoffWarning =
-    const Template<Message Function(String name)>(
-        messageTemplate:
-            r"""Tearing off method '#name' from a potentially null value.""",
-        withArguments: _withArgumentsNullableTearoffWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeNullableTearoffWarning =
-    const Code<Message Function(String name)>(
-        "NullableTearoffWarning", templateNullableTearoffWarning,
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsNullableTearoffWarning(String name) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  return new Message(codeNullableTearoffWarning,
-      message:
-          """Tearing off method '${name}' from a potentially null value.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeObjectExtends = messageObjectExtends;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6877,6 +6843,37 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name, String name2, String name3)>
+    templateOverrideMismatchRequiredNamedParameter =
+    const Template<Message Function(String name, String name2, String name3)>(
+        messageTemplate:
+            r"""The required named parameter '#name' in method '#name2' is not required in overridden method '#name3'.""",
+        withArguments: _withArgumentsOverrideMismatchRequiredNamedParameter);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name, String name2, String name3)>
+    codeOverrideMismatchRequiredNamedParameter =
+    const Code<Message Function(String name, String name2, String name3)>(
+  "OverrideMismatchRequiredNamedParameter",
+  templateOverrideMismatchRequiredNamedParameter,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsOverrideMismatchRequiredNamedParameter(
+    String name, String name2, String name3) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
+  if (name3.isEmpty) throw 'No name provided';
+  name3 = demangleMixinApplicationName(name3);
+  return new Message(codeOverrideMismatchRequiredNamedParameter,
+      message:
+          """The required named parameter '${name}' in method '${name2}' is not required in overridden method '${name3}'.""",
+      arguments: {'name': name, 'name2': name2, 'name3': name3});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         String name,
@@ -7407,34 +7404,6 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)>
-    templateRequiredNamedParameterHasDefaultValueWarning =
-    const Template<Message Function(String name)>(
-        messageTemplate:
-            r"""Named parameter '#name' is required and has a default value.""",
-        withArguments:
-            _withArgumentsRequiredNamedParameterHasDefaultValueWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)>
-    codeRequiredNamedParameterHasDefaultValueWarning =
-    const Code<Message Function(String name)>(
-        "RequiredNamedParameterHasDefaultValueWarning",
-        templateRequiredNamedParameterHasDefaultValueWarning,
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsRequiredNamedParameterHasDefaultValueWarning(
-    String name) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  return new Message(codeRequiredNamedParameterHasDefaultValueWarning,
-      message:
-          """Named parameter '${name}' is required and has a default value.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeRequiredParameterWithDefault =
     messageRequiredParameterWithDefault;
 
@@ -8412,6 +8381,14 @@
     message: r"""Can't create typedef from non-type.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeTypedefNullableType = messageTypedefNullableType;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageTypedefNullableType = const MessageCode(
+    "TypedefNullableType",
+    message: r"""Can't create typedef from nullable type.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeUnexpectedDollarInString = messageUnexpectedDollarInString;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8652,31 +8629,6 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)>
-    templateValueForRequiredParameterNotProvidedWarning =
-    const Template<Message Function(String name)>(
-        messageTemplate: r"""Missing required named parameter '#name'.""",
-        withArguments:
-            _withArgumentsValueForRequiredParameterNotProvidedWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)>
-    codeValueForRequiredParameterNotProvidedWarning =
-    const Code<Message Function(String name)>(
-        "ValueForRequiredParameterNotProvidedWarning",
-        templateValueForRequiredParameterNotProvidedWarning,
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsValueForRequiredParameterNotProvidedWarning(String name) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  return new Message(codeValueForRequiredParameterNotProvidedWarning,
-      message: """Missing required named parameter '${name}'.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeVarAsTypeName = messageVarAsTypeName;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/reachability/data/switch.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/reachability/data/switch.dart
index 9a817a5..3ff0405 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/reachability/data/switch.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/reachability/data/switch.dart
@@ -37,7 +37,7 @@
   /*stmt: unreachable*/ 1;
 }
 
-/*analyzer.member: enum_no_default:doesNotComplete*/
+/*member: enum_no_default:doesNotComplete*/
 void enum_no_default(MyEnum e) {
   switch (e) {
     case MyEnum.a:
@@ -45,5 +45,5 @@
     case MyEnum.b:
       return;
   }
-  /*analyzer.stmt: unreachable*/ 1;
+  /*stmt: unreachable*/ 1;
 }
diff --git a/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/function_expression.dart b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/function_expression.dart
index e44c4a7..a76e128 100644
--- a/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/function_expression.dart
+++ b/pkg/_fe_analyzer_shared/test/flow_analysis/type_promotion/data/function_expression.dart
@@ -35,9 +35,7 @@
   }
 }
 
-void outerIsType_assignedOutside(Object x) {
-  void Function() g;
-
+void outerIsType_assignedOutside(Object x, void Function() g) {
   if (x is String) {
     /*String*/ x;
 
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_in/main.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_in/main.dart
index 61e7e36..ae5b1dbf 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_in/main.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/from_opt_in/main.dart
@@ -30,8 +30,7 @@
 */
 class LegacyClass3b<T> extends Class3<T> implements GenericInterface<T> {}
 
-/*cfe.class: LegacyClass4a:Class4a,GenericInterface<num*>,LegacyClass4a,Object*/
-/*cfe:builder|analyzer.class: LegacyClass4a:Class4a,GenericInterface<num>,LegacyClass4a,Object*/
+/*class: LegacyClass4a:Class4a,GenericInterface<num*>,LegacyClass4a,Object*/
 class LegacyClass4a extends Class4a {}
 
 /*class: LegacyClass4b:GenericInterface<num*>,LegacyClass4b,Object*/
@@ -40,12 +39,10 @@
 /*class: LegacyClass4c:Class4a,GenericInterface<num*>,LegacyClass4c,Object*/
 class LegacyClass4c extends Class4a implements GenericInterface<num> {}
 
-/*cfe|cfe:builder.class: LegacyClass4d:Class4a,Class4b,GenericInterface<num*>,LegacyClass4d,Object*/
-/*analyzer.class: LegacyClass4d:Class4a,Class4b,GenericInterface<num>,LegacyClass4d,Object*/
+/*class: LegacyClass4d:Class4a,Class4b,GenericInterface<num*>,LegacyClass4d,Object*/
 class LegacyClass4d implements Class4a, Class4b {}
 
-/*cfe|cfe:builder.class: LegacyClass5:Class5,GenericInterface<dynamic>,LegacyClass5,Object*/
-/*analyzer.class: LegacyClass5:Class5,GenericInterface<Object*>,LegacyClass5,Object*/
+/*class: LegacyClass5:Class5,GenericInterface<dynamic>,LegacyClass5,Object*/
 /*analyzer.error: CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES*/
 class
 /*cfe|cfe:builder.error: AmbiguousSupertypes*/
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/function.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/function.dart
new file mode 100644
index 0000000..eef3371
--- /dev/null
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/function.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.
+
+/*library: nnbd=true*/
+
+/*class: A:A,Object*/
+class A implements Function {}
+
+/*class: B:B,Object*/
+class B extends Function {}
+
+/*cfe|cfe:builder.class: C:C,Object,_C&Object&Function*/
+/*analyzer.class: C:C,Object*/
+class C extends Object with Function {}
+
+// CFE hides that this is a mixin declaration since its mixed in type has been
+// removed.
+/*cfe|cfe:builder.class: _C&Object&Function:Object,_C&Object&Function*/
+
+/*cfe|cfe:builder.class: D:D,Object*/
+class D = Object with Function;
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/main.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/main.dart
index 11d144e..55ab8f7 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/main.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/main.dart
@@ -17,3 +17,31 @@
   /*cfe|cfe:builder.member: SubClass2.method:int? Function(int)*/
   /*analyzer.member: SubClass2.method:int* Function(int*)**/
 }
+
+/*class: GenericSubClass1a:GenericClass1,GenericInterface<int?>,GenericLegacyClass1a,GenericSubClass1a,Object*/
+/*analyzer.error: CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES*/ abstract class GenericSubClass1a
+    extends GenericLegacyClass1a implements GenericInterface<int?> {
+  /*cfe|cfe:builder.member: GenericSubClass1a.method:int? Function(int?)*/
+  /*analyzer.member: GenericSubClass1a.method:int* Function(int*)**/
+}
+
+/*class: GenericSubClass1b:GenericClass1,GenericInterface<int?>,GenericLegacyClass1b,GenericSubClass1b,Object*/
+/*analyzer.error: CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES*/ abstract class GenericSubClass1b
+    extends GenericLegacyClass1b implements GenericInterface<int?> {
+  /*cfe|cfe:builder.member: GenericSubClass1b.method:int? Function(int?)*/
+  /*analyzer.member: GenericSubClass1b.method:int* Function(int*)**/
+}
+
+/*class: GenericSubClass2a:GenericClass2,GenericInterface<int>,GenericLegacyClass2a,GenericSubClass2a,Object*/
+/*analyzer.error: CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES*/ abstract class GenericSubClass2a
+    extends GenericLegacyClass2a implements GenericInterface<int> {
+  /*cfe|cfe:builder.member: GenericSubClass2a.method:int Function(int)*/
+  /*analyzer.member: GenericSubClass2a.method:int* Function(int*)**/
+}
+
+/*class: GenericSubClass2b:GenericClass2,GenericInterface<int>,GenericLegacyClass2b,GenericSubClass2b,Object*/
+/*analyzer.error: CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES*/ abstract class GenericSubClass2b
+    extends GenericLegacyClass2b implements GenericInterface<int> {
+  /*cfe|cfe:builder.member: GenericSubClass2b.method:int Function(int)*/
+  /*analyzer.member: GenericSubClass2b.method:int* Function(int*)**/
+}
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/opt_in.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/opt_in.dart
index 2e4244b..086a993 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/opt_in.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/opt_in.dart
@@ -15,3 +15,19 @@
   /*member: Interface.method:int? Function(int)*/
   int? method(int i) => i;
 }
+
+/*class: GenericInterface:GenericInterface<T>,Object*/
+abstract class GenericInterface<T> {
+  /*member: GenericInterface.method:T Function(T)*/
+  T method(T t);
+}
+
+/*class: GenericClass1:GenericClass1,GenericInterface<int>,Object*/
+abstract class GenericClass1 implements GenericInterface<int> {
+  /*member: GenericClass1.method:int Function(int)*/
+}
+
+/*class: GenericClass2:GenericClass2,GenericInterface<int?>,Object*/
+abstract class GenericClass2 implements GenericInterface<int?> {
+  /*member: GenericClass2.method:int? Function(int?)*/
+}
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/opt_out.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/opt_out.dart
index c3e2b41..aa5fccf 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/opt_out.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/in_out_in/opt_out.dart
@@ -17,3 +17,29 @@
 abstract class LegacyClass2 extends Class {
   /*member: LegacyClass2.method:int* Function(int*)**/
 }
+
+/*class: GenericLegacyClass1a:GenericClass1,GenericInterface<int*>,GenericLegacyClass1a,Object*/
+abstract class GenericLegacyClass1a extends GenericClass1 {
+  /*cfe|cfe:builder.member: GenericLegacyClass1a.method:int* Function(int*)*/
+  /*analyzer.member: GenericLegacyClass1a.method:int* Function(int*)**/
+}
+
+/*class: GenericLegacyClass1b:GenericClass1,GenericInterface<int*>,GenericLegacyClass1b,Object*/
+abstract class GenericLegacyClass1b extends GenericClass1
+    implements GenericInterface<int> {
+  /*cfe|cfe:builder.member: GenericLegacyClass1b.method:int* Function(int*)*/
+  /*analyzer.member: GenericLegacyClass1b.method:int* Function(int*)**/
+}
+
+/*class: GenericLegacyClass2a:GenericClass2,GenericInterface<int*>,GenericLegacyClass2a,Object*/
+abstract class GenericLegacyClass2a extends GenericClass2 {
+  /*cfe|cfe:builder.member: GenericLegacyClass2a.method:int* Function(int*)*/
+  /*analyzer.member: GenericLegacyClass2a.method:int* Function(int*)**/
+}
+
+/*class: GenericLegacyClass2b:GenericClass2,GenericInterface<int*>,GenericLegacyClass2b,Object*/
+abstract class GenericLegacyClass2b extends GenericClass2
+    implements GenericInterface<int> {
+  /*cfe|cfe:builder.member: GenericLegacyClass2b.method:int* Function(int*)*/
+  /*analyzer.member: GenericLegacyClass2b.method:int* Function(int*)**/
+}
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481.dart
index a388a8d..9ef0a47 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481.dart
@@ -19,8 +19,7 @@
 /*class: B1:A<Object?>,A_Object,A_dynamic,B1,Object*/
 class B1 extends A_Object implements A_dynamic {}
 
-/*cfe|cfe:builder.class: B2:A<void>,A_Object,A_void,B2,Object*/
-/*analyzer.class: B2:A<Object?>,A_Object,A_void,B2,Object*/
+/*class: B2:A<void>,A_Object,A_void,B2,Object*/
 class B2 extends A_Object implements A_void {}
 
 main() {}
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481/main.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481/main.dart
index 4206e56..4a6f1ad 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481/main.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40481/main.dart
@@ -12,12 +12,10 @@
 /*class: A_void:A<void>,A_void,Object*/
 class A_void implements A<void> {}
 
-/*cfe|cfe:builder.class: B1:A<Object?>,A_Object,A_dynamic,B1,Object*/
-/*analyzer.class: B1:A<Object*>,A_Object,A_dynamic,B1,Object*/
+/*class: B1:A<Object?>,A_Object,A_dynamic,B1,Object*/
 class B1 extends A_Object implements A_dynamic {}
 
-/*cfe|cfe:builder.class: B2:A<void>,A_Object,A_void,B2,Object*/
-/*analyzer.class: B2:A<Object*>,A_Object,A_void,B2,Object*/
+/*class: B2:A<void>,A_Object,A_void,B2,Object*/
 class B2 extends A_Object implements A_void {}
 
 main() {}
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40524/main.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40524/main.dart
index 2428a5f..83ad4bb 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40524/main.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40524/main.dart
@@ -11,8 +11,7 @@
   /*member: B.getType:Type* Function()**/
 }
 
-/*cfe|cfe:builder.class: C:A<int?>,B,C,Object,out_int*/
-/*analyzer.class: C:A<int*>,B,C,Object,out_int*/
+/*class: C:A<int?>,B,C,Object,out_int*/
 class C extends out_int implements B {
   /*member: C.getType:Type* Function()**/
 }
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40541.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40541.dart
index 16456a7..4ff5000 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40541.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40541.dart
@@ -26,8 +26,7 @@
   /*member: D1.test:void Function()*/
 }
 
-/*cfe|cfe:builder.class: D2:A<Object?>,B,C,D2,Object*/
-/*analyzer.class: D2:A<dynamic>,B,C,D2,Object*/
+/*class: D2:A<Object?>,B,C,D2,Object*/
 class D2 extends C implements B {
   /*member: D2.test:void Function()*/
 }
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40553/main.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40553/main.dart
index 46bd14d..7917c9b 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/issue40553/main.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/issue40553/main.dart
@@ -14,8 +14,12 @@
   /*member: D.getType:Type* Function()**/
 }
 
+/// TODO: Solve CFE / analyzer disagreement.
+/// It looks to me that CFE type of `A` is incorrect.
+/// As described in https://github.com/dart-lang/sdk/issues/40553,
+/// NNBD_TOP_MERGE(FutureOr<int?>, FutureOr*<int*>) = FutureOr<int?>
 /*cfe|cfe:builder.class: E:A<FutureOr<int?>?>,B,C,E,Object*/
-/*analyzer.class: E:A<FutureOr<int*>*>,B,C,E,Object*/
+/*analyzer.class: E:A<FutureOr<int?>>,B,C,E,Object*/
 class E extends B implements C {
   /*member: E.getType:Type* Function()**/
 }
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/members_from_opt_out/main.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/members_from_opt_out/main.dart
index 0fef8c6..8ae0381 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/members_from_opt_out/main.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/members_from_opt_out/main.dart
@@ -39,22 +39,12 @@
   /*member: Interface.method5b:int Function({int a, int b})*/
   int method5b({int a: 0, int b: 0});
 
-  /*member: Interface.method5c:int Function({required int a, required int b})*/
-  int method5c(
-      {required int /*analyzer.error: CompileTimeErrorCode.DEFAULT_VALUE_ON_REQUIRED_PARAMETER*/ a:
-          0,
-      required int /*analyzer.error: CompileTimeErrorCode.DEFAULT_VALUE_ON_REQUIRED_PARAMETER*/ b:
-          0});
-
   /*member: Interface.method6a:int? Function(int?, {int? b})*/
   int? method6a(int? a, {int? b});
 
   /*member: Interface.method6b:int? Function({int? a, int? b})*/
   int? method6b({int? a, int? b});
 
-  /*member: Interface.method6c:int? Function({required int? a, required int? b})*/
-  int? method6c({required int? a, required int? b});
-
   /*member: Interface.getter1:int*/
   int get getter1;
 
@@ -134,10 +124,8 @@
   /*member: Class1.method4c:int* Function([int*, int*])**/
   /*member: Class1.method5a:int* Function(int*, {int* b})**/
   /*member: Class1.method5b:int* Function({int* a, int* b})**/
-  /*member: Class1.method5c:int* Function({int* a, int* b})**/
   /*member: Class1.method6a:int* Function(int*, {int* b})**/
   /*member: Class1.method6b:int* Function({int* a, int* b})**/
-  /*member: Class1.method6c:int* Function({int* a, int* b})**/
   /*member: Class1.getter1:int**/
   /*member: Class1.getter2:int**/
   /*member: Class1.setter1=:int**/
@@ -190,22 +178,12 @@
   /*cfe|cfe:builder.member: Class2a.method5b:int Function({int a, int b})*/
   /*analyzer.member: Class2a.method5b:int* Function({int* a, int* b})**/
 
-  // TODO(johnniwinther): Should `method5c` be an error? It mixes required
-  // and optional named parameters.
-  /*cfe|cfe:builder.member: Class2a.method5c:int Function({int a, int b})*/
-  /*analyzer.member: Class2a.method5c:int* Function({int* a, int* b})**/
-
   /*cfe|cfe:builder.member: Class2a.method6a:int? Function(int?, {int? b})*/
   /*analyzer.member: Class2a.method6a:int* Function(int*, {int* b})**/
 
   /*cfe|cfe:builder.member: Class2a.method6b:int? Function({int? a, int? b})*/
   /*analyzer.member: Class2a.method6b:int* Function({int* a, int* b})**/
 
-  // TODO(johnniwinther): Should `method6c` be an error? It mixes required
-  // and optional named parameters.
-  /*cfe|cfe:builder.member: Class2a.method6c:int? Function({int? a, int? b})*/
-  /*analyzer.member: Class2a.method6c:int* Function({int* a, int* b})**/
-
   /*cfe|cfe:builder.member: Class2a.getter1:int*/
   /*analyzer.member: Class2a.getter1:int**/
   /*cfe|cfe:builder.member: Class2a.getter2:int?*/
@@ -299,26 +277,12 @@
   /*member: Class2b.method5b:int Function({int a, int b})*/
   int method5b({int a: 0, int b: 0}) => 0;
 
-  /*member: Class2b.method5c:int Function({required int a, required int b})*/
-  int /*analyzer.error: CompileTimeErrorCode.INVALID_OVERRIDE*/
-      method5c(
-              {required int /*analyzer.error: CompileTimeErrorCode.DEFAULT_VALUE_ON_REQUIRED_PARAMETER*/ a:
-                  0,
-              required int /*analyzer.error: CompileTimeErrorCode.DEFAULT_VALUE_ON_REQUIRED_PARAMETER*/ b:
-                  0}) =>
-          0;
-
   /*member: Class2b.method6a:int? Function(int?, {int? b})*/
   int? method6a(int? a, {int? b}) => 0;
 
   /*member: Class2b.method6b:int? Function({int? a, int? b})*/
   int? method6b({int? a, int? b}) => 0;
 
-  /*member: Class2b.method6c:int? Function({required int? a, required int? b})*/
-  int? /*analyzer.error: CompileTimeErrorCode.INVALID_OVERRIDE*/ method6c(
-          {required int? a, required int? b}) =>
-      0;
-
   /*member: Class2b.getter1:int*/
   int get getter1 => 0;
 
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/members_from_opt_out/opt_out.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/members_from_opt_out/opt_out.dart
index 97e1926..ea49b9879 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/members_from_opt_out/opt_out.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/members_from_opt_out/opt_out.dart
@@ -39,18 +39,12 @@
   /*member: LegacyClass.method5b:int* Function({int* a, int* b})**/
   int method5b({int a, int b}) => 0;
 
-  /*member: LegacyClass.method5c:int* Function({int* a, int* b})**/
-  int method5c({int a, int b}) => 0;
-
   /*member: LegacyClass.method6a:int* Function(int*, {int* b})**/
   int method6a(int a, {int b}) => 0;
 
   /*member: LegacyClass.method6b:int* Function({int* a, int* b})**/
   int method6b({int a, int b}) => 0;
 
-  /*member: LegacyClass.method6c:int* Function({int* a, int* b})**/
-  int method6c({int a, int b}) => 0;
-
   /*member: LegacyClass.getter1:int**/
   int get getter1 => 0;
 
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/norm_supertypes.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/norm_supertypes.dart
index fc0acb4..37dcca4 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/norm_supertypes.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/norm_supertypes.dart
@@ -12,6 +12,10 @@
 /*class: Foo:A<FutureOr<T?>>,Foo<T, S>,Object*/
 class Foo<T extends S, S extends Never> implements A<FutureOr<T?>> {}
 
+/// TODO: Solve CFE / analyzer disagreement.
+/// It looks to me that is should be `A<FutureOr<Never?>>`, because this is
+/// what is written in the code. We don't do normalization because there is
+/// only one implementation of `A` in `Bar`.
 /*cfe|cfe:builder.class: Bar:A<FutureOr<Never>>,Bar,Object*/
 /*analyzer.class: Bar:A<FutureOr<Never?>>,Bar,Object*/
 class Bar implements A<FutureOr<Never?>> {}
@@ -19,12 +23,10 @@
 /*class: Baz:A<Future<Null>?>,Baz,Object*/
 class Baz implements A<Future<Null>?> {}
 
-/*cfe|cfe:builder.class: Hest:A<Future<Null>?>,Bar,Foo<Never, Never>,Hest,Object*/
-/*analyzer.class: Hest:A<FutureOr<Never?>>,Bar,Foo<Never, Never>,Hest,Object*/
+/*class: Hest:A<Future<Null>?>,Bar,Foo<Never, Never>,Hest,Object*/
 class Hest extends Foo implements Bar {}
 
-/*cfe|cfe:builder.class: Fisk:A<Future<Null>?>,Bar,Baz,Fisk,Object*/
-/*analyzer.class: Fisk:A<FutureOr<Never?>>,Bar,Baz,Fisk,Object*/
+/*class: Fisk:A<Future<Null>?>,Bar,Baz,Fisk,Object*/
 class Fisk extends Bar implements Baz {}
 
 /*class: Naebdyr:A<Future<Null>?>,Baz,Foo<Never, Never>,Naebdyr,Object*/
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_out/async.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_out/async.dart
index 9dbd3d0..77a5afa 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_out/async.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_out/async.dart
@@ -6,10 +6,8 @@
 
 /*library: nnbd=false*/
 
-/*cfe|cfe:builder.class: Future:Future<T*>,Object*/
-/*analyzer.class: Future:Future<T>,Object*/
+/*class: Future:Future<T*>,Object*/
 class Future<T> {}
 
-/*cfe|cfe:builder.class: FutureOr:FutureOr<T*>,Object*/
-/*analyzer.class: FutureOr:FutureOr<T>,Object*/
+/*class: FutureOr:FutureOr<T*>,Object*/
 class FutureOr<T> {}
diff --git a/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_out/core.dart b/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_out/core.dart
index 7601e98..2712fa3 100644
--- a/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_out/core.dart
+++ b/pkg/_fe_analyzer_shared/test/inheritance/data/object_opt_out/core.dart
@@ -46,27 +46,22 @@
 /*class: String:Object,String*/
 class String {}
 
-/*cfe|cfe:builder.class: Iterable:Iterable<E*>,Object*/
-/*analyzer.class: Iterable:Iterable<E>,Object*/
+/*class: Iterable:Iterable<E*>,Object*/
 abstract class Iterable<E> {}
 
-/*cfe|cfe:builder.class: List:EfficientLengthIterable<E*>,Iterable<E*>,List<E*>,Object*/
-/*analyzer.class: List:Iterable<E>,List<E>,Object*/
+/*class: List:EfficientLengthIterable<E*>,Iterable<E*>,List<E*>,Object*/
 abstract class List<E> implements EfficientLengthIterable<E> {
   /*cfe|cfe:builder.member: List.==:bool* Function(Object*)**/
   bool operator ==(Object other);
 }
 
-/*cfe|cfe:builder.class: Set:Iterable<E*>,Object,Set<E*>*/
-/*analyzer.class: Set:Iterable<E>,Object,Set<E>*/
+/*class: Set:Iterable<E*>,Object,Set<E*>*/
 class Set<E> implements Iterable<E> {}
 
-/*cfe|cfe:builder.class: Map:Map<K*, V*>,Object*/
-/*analyzer.class: Map:Map<K, V>,Object*/
+/*class: Map:Map<K*, V*>,Object*/
 class Map<K, V> {}
 
-/*cfe|cfe:builder.class: Stream:Object,Stream<E*>*/
-/*analyzer.class: Stream:Object,Stream<E>*/
+/*class: Stream:Object,Stream<E*>*/
 class Stream<E> {}
 
 /*class: Function:Function,Object*/
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/README.md b/pkg/analysis_server/lib/src/edit/nnbd_migration/README.md
deleted file mode 100644
index be03e90..0000000
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/README.md
+++ /dev/null
@@ -1,50 +0,0 @@
-# Null Safety Migration Tooling
-
-Note: the null safety migration tooling and workflow is in an early state;
-this doc will be updated as the steps and workflow are simplified.
-
-## Building the NNBD sdk
-
-In order to run the tool currently you have to be able to build your own copy
-of the Dart SDK.
-
-To do this, run:
-
-```
-./tools/build.py -mrelease --nnbd create_sdk
-```
-
-The NNBD sdk now lives under the ReleaseX64NNBD sub-directory of your build
-directory, e.g.
-
-```
-xcodebuild/ReleaseX64NNBD/dart-sdk/
-```
-
-## Migrating a package
-
-- build a NNBD version of the SDK (see above)
-- select a package to work on
-- in that package, edit the `analysis_options.yaml` to enable the NNBD
-  experiment from the POV of the analyzer:
-```yaml
-analyzer:
-  enable-experiment:
-    - non-nullable
-```
-- run `pub get` for the package (and, verify that the
-  `.dart_tool/package_config.json` file was created)
-
-Then, run the migration tool from the top-level of the package directory:
-
-```
-<sdk-repo>/xcodebuild/ReleaseX64NNBD/dart migrate .
-```
-
-The migration tool will run, print the proposed changes to the console, and
-display a url for the preview tool. Open that url from a browser to see a rich
-preview of the proposed null safety changes.
-
-## Using the tool
-
-TODO:
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart
index bf2926f2..f006600 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart
@@ -48,20 +48,13 @@
   /// The [NullabilityMigration] instance for this migration.
   final NullabilityMigration migration;
 
-  /// A flag indicating whether types that were not changed (because they should
-  /// be non-nullable) should be explained.
-  final bool explainNonNullableTypes;
-
   /// A map from the path of a compilation unit to the information about that
   /// unit.
   final Map<String, UnitInfo> unitMap = {};
 
   /// Initialize a newly created builder.
   InfoBuilder(this.provider, this.includedPath, this.info, this.listener,
-      this.adapter, this.migration,
-      // TODO(srawlins): Re-enable once
-      //  https://github.com/dart-lang/sdk/issues/40253 is fixed.
-      {this.explainNonNullableTypes = false});
+      this.adapter, this.migration);
 
   /// The analysis server used to get information about libraries.
   AnalysisServer get server => listener.server;
@@ -478,7 +471,7 @@
         // There's no need for hints around code that is being removed.
         break;
       case NullabilityFixKind.makeTypeNullable:
-      case NullabilityFixKind.noModification:
+      case NullabilityFixKind.typeNotMadeNullable:
         edits.add(
             EditDetail('Force type to be non-nullable.', offset, 0, '/*!*/'));
         edits.add(EditDetail('Force type to be nullable.', offset, 0, '/*?*/'));
@@ -523,6 +516,11 @@
     }
     assert(identical(step.node, node));
     while (step != null) {
+      if (step.node == info.never) {
+        // Assert that we are only ever trimming off the last step.
+        assert(step.principalCause == null);
+        break;
+      }
       entries.add(_nodeToTraceEntry(step.node));
       if (step.codeReference != null) {
         entries.add(_stepToTraceEntry(step));
@@ -543,6 +541,12 @@
     assert(identical(step.targetNode, node));
     while (step != null) {
       entries.add(_nodeToTraceEntry(step.targetNode));
+      if (step.targetNode.upstreamEdges.isNotEmpty &&
+          step.targetNode.upstreamEdges.first.sourceNode == info.always) {
+        // Assert that we are only ever trimming off the last step.
+        assert(step.principalCause == null);
+        break;
+      }
       if (step.codeReference != null) {
         entries.add(_stepToTraceEntry(step));
       }
@@ -558,6 +562,8 @@
       if (reason is NullabilityNodeInfo) {
         if (reason.isNullable) {
           _computeTraceNullableInfo(reason, traces);
+        } else {
+          _computeTraceNonNullableInfo(reason, traces);
         }
       } else if (reason is EdgeInfo) {
         assert(reason.sourceNode.isNullable);
@@ -571,36 +577,6 @@
     return traces;
   }
 
-  /// Compute details about [edgeInfos] which are upstream triggered.
-  List<RegionDetail> _computeUpstreamTriggeredDetails(
-      Iterable<EdgeInfo> edgeInfos) {
-    List<RegionDetail> details = [];
-    for (var edge in edgeInfos) {
-      EdgeOriginInfo origin = info.edgeOrigin[edge];
-      if (origin == null) {
-        // TODO(srawlins): I think this shouldn't happen? But it does on the
-        //  collection and path packages.
-        assert(false, 'edge with no origin $edge');
-        continue;
-      }
-      NavigationTarget target =
-          _proximateTargetForNode(origin.source.fullName, origin.node);
-      if (origin.kind == EdgeOriginKind.expressionChecks) {
-        details.add(RegionDetail(
-            'This value is unconditionally used in a non-nullable context',
-            target));
-      } else if (origin.kind == EdgeOriginKind.nonNullAssertion) {
-        details
-            .add(RegionDetail('This value is asserted to be non-null', target));
-      } else if (origin.kind == EdgeOriginKind.nullabilityComment) {
-        details.add(RegionDetail(
-            'This type is annotated with a non-nullability comment ("/*!*/")',
-            target));
-      }
-    }
-    return details;
-  }
-
   /// Describe why an edge may have gotten a '!'.
   String _describeNonNullEdge(EdgeOriginInfo edge) {
     // TODO(mfairhurst/paulberry): Do NOT use astNode/parent to create this
@@ -618,37 +594,6 @@
     return 'This value must be null-checked before use here.';
   }
 
-  /// Explain the type annotations that were not changed because they were
-  /// determined to be non-nullable.
-  void _explainNonNullableTypes(SourceInformation sourceInfo,
-      List<RegionInfo> regions, OffsetMapper mapper, LineInfo lineInfo) {
-    Iterable<MapEntry<TypeAnnotation, NullabilityNodeInfo>> nonNullableTypes =
-        sourceInfo.explicitTypeNullability.entries
-            .where((entry) => !entry.value.isNullable);
-    for (MapEntry<TypeAnnotation, NullabilityNodeInfo> nonNullableType
-        in nonNullableTypes) {
-      Iterable<EdgeInfo> upstreamTriggeredEdgeInfos = info.edgeOrigin.keys
-          .where((e) =>
-              e.sourceNode == nonNullableType.value &&
-              e.isUpstreamTriggered &&
-              !e.destinationNode.isNullable);
-      if (upstreamTriggeredEdgeInfos.isNotEmpty) {
-        List<RegionDetail> details =
-            _computeUpstreamTriggeredDetails(upstreamTriggeredEdgeInfos);
-        if (details.isNotEmpty) {
-          TypeAnnotation node = nonNullableType.key;
-          regions.add(RegionInfo(
-              RegionType.unchanged,
-              mapper.map(node.offset),
-              node.length,
-              lineInfo.getLocation(node.offset).lineNumber,
-              'This type is not changed; it is determined to be non-nullable',
-              details));
-        }
-      }
-    }
-  }
-
   /// Return the migration information for the unit associated with the
   /// [result].
   UnitInfo _explainUnit(SourceInformation sourceInfo, ResolvedUnitResult result,
@@ -703,9 +648,15 @@
                 lineNumber, explanation, details,
                 edits: edits, traces: traces));
           } else {
-            regions.add(RegionInfo(RegionType.add, offset, replacement.length,
-                lineNumber, explanation, details,
-                edits: edits, traces: traces));
+            if (edit.isInformative) {
+              regions.add(RegionInfo(RegionType.informative, offset,
+                  replacement.length, lineNumber, explanation, const [],
+                  edits: edits, traces: traces));
+            } else {
+              regions.add(RegionInfo(RegionType.add, offset, replacement.length,
+                  lineNumber, explanation, details,
+                  edits: edits, traces: traces));
+            }
           }
         }
         offset += replacement.length;
@@ -718,11 +669,6 @@
     List<SourceEdit> edits = insertions.toSourceEdits();
     edits.sort((first, second) => first.offset.compareTo(second.offset));
     OffsetMapper mapper = OffsetMapper.forEdits(edits);
-
-    if (explainNonNullableTypes) {
-      _explainNonNullableTypes(
-          sourceInfo, regions, mapper, result.unit.lineInfo);
-    }
     regions.sort((first, second) => first.offset.compareTo(second.offset));
     unitInfo.offsetMapper = mapper;
     unitInfo.content = content;
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_info.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_info.dart
index a80ef58..7bd0a6d 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_info.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_info.dart
@@ -181,9 +181,9 @@
   /// This is a region of code that was removed in migration.
   remove,
 
-  /// This is a region of code that was unchanged in migration; likely a type
-  /// that was declared non-nullable in migration.
-  unchanged,
+  /// This is a region of code that wasn't changed by migration, but is being
+  /// shown to give the user more information about the migration.
+  informative,
 }
 
 /// Information about a single entry in a nullability trace.
@@ -240,13 +240,14 @@
   UnitInfo(this.path);
 
   /// Returns the [regions] that represent a fixed (changed) region of code.
-  List<RegionInfo> get fixRegions => List.of(
-      regions.where((region) => region.regionType != RegionType.unchanged));
+  List<RegionInfo> get fixRegions => regions
+      .where((region) => region.regionType != RegionType.informative)
+      .toList();
 
-  /// Returns the [regions] that represent an unchanged type which was
-  /// determined to be non-null.
-  List<RegionInfo> get nonNullableTypeRegions => List.of(
-      regions.where((region) => region.regionType == RegionType.unchanged));
+  /// Returns the [regions] that are informative.
+  List<RegionInfo> get informativeRegions => regions
+      .where((region) => region.regionType == RegionType.informative)
+      .toList();
 
   /// Returns the [RegionInfo] at offset [offset].
   // TODO(srawlins): This is O(n), used each time the user clicks on a region.
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/index.html b/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/index.html
index 9dbed6e..6fa41e4 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/index.html
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/index.html
@@ -53,7 +53,7 @@
 </div><!-- /panels -->
 <footer>
     <a target="_blank"
-       href="https://github.com/dart-lang/sdk/blob/master/pkg/analysis_server/lib/src/edit/nnbd_migration/README.md">Null
+       href="https://github.com/dart-lang/sdk/blob/master/pkg/nnbd_migration/README.md">Null
         safety migration help</a>
     <span class="wide"> </span>
     <div>Based on {{ sdkVersion }}</div>
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/migration.css b/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/migration.css
index 0c63e02..27c3340 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/migration.css
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/migration.css
@@ -280,13 +280,9 @@
   color: #001100;
 }
 
-.region.unchanged-region {
-  background-color: rgba(0, 0, 0, 0.3);
-  border-bottom: solid 2px #ccc;
-  /* Invisible text; use underlying highlighting. */
-  color: rgba(0, 0, 0, 0);
-  /* Reduce line height to make room for border. */
-  line-height: 1;
+.region.informative-region {
+  background-color: #888888;
+  color: #000000;
 }
 
 .target {
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/resources.g.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/resources.g.dart
index 3a39789..1a941df 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/resources.g.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/resources/resources.g.dart
@@ -270,7 +270,7 @@
 ''';
 
 String _index_html;
-// index_html md5 is '5ea053889e3c34ee57db31a5a3d2d8b9'
+// index_html md5 is '54a9928481db293c8e6d1869622d95a2'
 String _index_html_base64 = '''
 PGh0bWw+CjxoZWFkPgogICAgPHRpdGxlPk51bGwgU2FmZXR5IFByZXZpZXc8L3RpdGxlPgogICAgPHNj
 cmlwdCBzcmM9Int7IGhpZ2hsaWdodEpzUGF0aCB9fSI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0Pnt7IGRh
@@ -309,14 +309,14 @@
 ZWwtY29udGVudCAtLT4KICAgICAgICA8L2Rpdj48IS0tIC9lZGl0LXBhbmVsIC0tPgogICAgPC9kaXY+
 PCEtLSAvaW5mby1wYW5lbCAtLT4KPC9kaXY+PCEtLSAvcGFuZWxzIC0tPgo8Zm9vdGVyPgogICAgPGEg
 dGFyZ2V0PSJfYmxhbmsiCiAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL3Nk
-ay9ibG9iL21hc3Rlci9wa2cvYW5hbHlzaXNfc2VydmVyL2xpYi9zcmMvZWRpdC9ubmJkX21pZ3JhdGlv
-bi9SRUFETUUubWQiPk51bGwKICAgICAgICBzYWZldHkgbWlncmF0aW9uIGhlbHA8L2E+CiAgICA8c3Bh
-biBjbGFzcz0id2lkZSI+IDwvc3Bhbj4KICAgIDxkaXY+QmFzZWQgb24ge3sgc2RrVmVyc2lvbiB9fTwv
-ZGl2Pgo8L2Zvb3Rlcj4KPC9ib2R5Pgo8L2h0bWw+Cg==
+ay9ibG9iL21hc3Rlci9wa2cvbm5iZF9taWdyYXRpb24vUkVBRE1FLm1kIj5OdWxsCiAgICAgICAgc2Fm
+ZXR5IG1pZ3JhdGlvbiBoZWxwPC9hPgogICAgPHNwYW4gY2xhc3M9IndpZGUiPiA8L3NwYW4+CiAgICA8
+ZGl2PkJhc2VkIG9uIHt7IHNka1ZlcnNpb24gfX08L2Rpdj4KPC9mb290ZXI+CjwvYm9keT4KPC9odG1s
+Pgo=
 ''';
 
 String _migration_css;
-// migration_css md5 is '2bfe65627f29ccb0a43fa1b79569a571'
+// migration_css md5 is '2b325a70e847b11533218ca621f9763f'
 String _migration_css_base64 = '''
 LyogQ29weXJpZ2h0IChjKSAyMDE5LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuIFBsZWFzZSBzZWUg
 dGhlIEFVVEhPUlMgZmlsZSAgKi8KLyogZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVz
@@ -388,56 +388,53 @@
 bG9jazsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICB6LWluZGV4
 OiAyMDA7Cn0KCi5yZWdpb24uYWRkZWQtcmVnaW9uIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NmZmNj
 OwogIGNvbG9yOiAjMDAzMzAwOwp9CgoucmVnaW9uLnJlbW92ZWQtcmVnaW9uIHsKICBiYWNrZ3JvdW5k
-LWNvbG9yOiAjZmY2NjY2OwogIGNvbG9yOiAjMDAxMTAwOwp9CgoucmVnaW9uLnVuY2hhbmdlZC1yZWdp
-b24gewogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zKTsKICBib3JkZXItYm90dG9t
-OiBzb2xpZCAycHggI2NjYzsKICAvKiBJbnZpc2libGUgdGV4dDsgdXNlIHVuZGVybHlpbmcgaGlnaGxp
-Z2h0aW5nLiAqLwogIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogIC8qIFJlZHVjZSBsaW5lIGhlaWdo
-dCB0byBtYWtlIHJvb20gZm9yIGJvcmRlci4gKi8KICBsaW5lLWhlaWdodDogMTsKfQoKLnRhcmdldCB7
-CiAgYmFja2dyb3VuZC1jb2xvcjogIzQ0NDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmlzaWJpbGl0
-eTogdmlzaWJsZTsKICBmb250LXdlaWdodDogNjAwOwp9CgouaW5mby1wYW5lbCB7CiAgZmxleDogMSAy
-MDBweDsKICBtYXJnaW46IDA7CiAgaGVpZ2h0OiAxMDAlOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1k
-aXJlY3Rpb246IGNvbHVtbjsKfQoKLmluZm8tcGFuZWwgLmVkaXQtcGFuZWwgewogIGJhY2tncm91bmQt
-Y29sb3I6ICMyODJiMmU7CiAgb3ZlcmZsb3c6IGF1dG87Cn0KCi5pbmZvLXBhbmVsIC5wYW5lbC1jb250
-ZW50IHsKICBwYWRkaW5nOiA3cHg7Cn0KCi5pbmZvLXBhbmVsIC5wYW5lbC1jb250ZW50PiA6Zmlyc3Qt
-Y2hpbGQgewogIG1hcmdpbi10b3A6IDA7Cn0KCi5pbmZvLXBhbmVsIC5ub3dyYXAgewogIHdoaXRlLXNw
-YWNlOiBub3dyYXA7Cn0KCi5pbmZvLXBhbmVsIHVsLAouaW5mby1wYW5lbCBvbCB7CiAgcGFkZGluZy1s
-ZWZ0OiAyMHB4Owp9CgouaW5mby1wYW5lbCBsaSB7CiAgbWFyZ2luOiAwIDAgNXB4IDA7Cn0KCi5pbmZv
-LXBhbmVsIGEgewogIGNvbG9yOiAjMzNjY2ZmOwp9CgouaW5mby1wYW5lbCAuZWRpdC1saXN0IHsKICBi
-YWNrZ3JvdW5kLWNvbG9yOiAjMjgyYjJlOwogIG92ZXJmbG93OiBhdXRvOwp9CgouZWRpdC1wYW5lbCB7
-CiAgbWFyZ2luLXRvcDogNnB4OwogIGZsZXg6IDEgMTAwcHg7Cn0KCi5lZGl0LWxpc3QgewogIGZsZXg6
-IDIgMTAwcHg7Cn0KCi5lZGl0LWxpc3QgLmVkaXQgewogIG1hcmdpbjogM3B4IDA7Cn0KCi5lZGl0LWxp
-c3QgLmVkaXQtbGluayB7CiAgY3Vyc29yOiBwb2ludGVyOwp9CgoucmVydW5uaW5nLXBhbmUgewogIGRp
-c3BsYXk6IG5vbmU7Cn0KCmJvZHkucmVydW5uaW5nIC5yZXJ1bm5pbmctcGFuZSB7CiAgZGlzcGxheTog
-YmxvY2s7CiAgcG9zaXRpb246IGZpeGVkOwogIHRvcDogMHB4OwogIGJvdHRvbTogMHB4OwogIGxlZnQ6
-IDBweDsKICByaWdodDogMHB4OwogIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDBBQTsgLyogdHJhbnNs
-dWNlbnQgYmxhY2sgKi8KICB6LWluZGV4OiA0MDA7Cn0KCi5yZXJ1bm5pbmctcGFuZSBoMSB7CiAgcG9z
-aXRpb246IGFic29sdXRlOwogIHRvcDogNTAlOwogIGxlZnQ6IDUwJTsKICB0cmFuc2Zvcm06IHRyYW5z
-bGF0ZSgtNTAlLCAtNTAlKTsKfQoKcC50cmFjZSAudHlwZS1kZXNjcmlwdGlvbiB7CiAgLyogRnJvbSBI
-TEpTJ3MgLmhsanMta2V5d29yZCwgLmhsanMtc2VsZWN0b3ItdGFnLCAuaGxqcy1kZWxldGlvbiAqLwog
-IGNvbG9yOiAjY2M3ODMyOwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Cn0KCnVsLnRyYWNlIHsKICBm
-b250LXNpemU6IDEzcHg7CiAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogIHBhZGRpbmctbGVmdDogMHB4
-Owp9Cgp1bC50cmFjZSBsaSB7CiAgY29sb3I6IHdoaXRlOwogIG1hcmdpbi1sZWZ0OiAxNHB4OwogIHRl
-eHQtaW5kZW50OiAtMTRweDsKfQoKdWwudHJhY2UgbGkgLmZ1bmN0aW9uIHsKICAvKiBGcm9tIEhMSlMn
-cyAuaGxqcy1zZWN0aW9uLCAuaGxqcy10aXRsZSwgLmhsanMtdHlwZSAqLwogIGNvbG9yOiAjZmZjNjZk
-OwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLmVsZXZhdGlv
-bi16NCB7CiAgYm94LXNoYWRvdzogMHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksCiAg
-ICAgIDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAwcHggMXB4IDEwcHgg
-MHB4IHJnYmEoMCwgMCwgMCwgLjEyKTsKfQoKYSB7CiAgY29sb3I6ICNjY2M7CiAgZmlsbDogI2NjYzsK
-ICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCmE6aG92ZXIgewogIGNvbG9yOiAjZmZmOwogIGZpbGw6
-ICNmZmY7Cn0KCmJ1dHRvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzMzY2NmZjsKICBib3JkZXI6IDJw
-eCBzb2xpZCAjMzdhZWRjOwogIGJvcmRlci1yYWRpdXM6IDNweDsKICBwYWRkaW5nOiA2cHggMTBweDsK
-ICBmb250LXdlaWdodDogYm9sZDsKICBjb2xvcjogIzI4MjgyODsKfQoKYnV0dG9uOmhvdmVyIHsKICBi
-YWNrZ3JvdW5kLWNvbG9yOiAjODBkZmZmOwogIGJvcmRlcjogMnB4IHNvbGlkICM1MmI4ZTA7CiAgY3Vy
-c29yOiBwb2ludGVyOwp9CgpidXR0b25bZGlzYWJsZWRdIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjN2Fh
-OGI4OwogIGNvbG9yOiAjNTA3MTc3OwogIGJvcmRlcjogMnB4IHNvbGlkICM1MDcxNzc7CiAgY3Vyc29y
-OiBub3QtYWxsb3dlZDsKfQoKLnBsYWNlaG9sZGVyIHsKICBjb2xvcjogIzc3NzsKICB0ZXh0LWFsaWdu
-OiBjZW50ZXI7CiAgbWFyZ2luLXRvcDogM2VtICFpbXBvcnRhbnQ7Cn0KCi8qKgogKiBITEpTIE92ZXJy
-aWRlcwogKi8KLmhsanMgewogIC8qKgogICAqIFRoaXMgYWxsb3dzIHRoZSBwZXItbGluZSBoaWdobGln
-aHRzIHRvIHNob3cuCiAgICovCiAgYmFja2dyb3VuZDogbm9uZTsKfQo=
+LWNvbG9yOiAjZmY2NjY2OwogIGNvbG9yOiAjMDAxMTAwOwp9CgoucmVnaW9uLmluZm9ybWF0aXZlLXJl
+Z2lvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzg4ODg4ODsKICBjb2xvcjogIzAwMDAwMDsKfQoKLnRh
+cmdldCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzQ0NDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmlz
+aWJpbGl0eTogdmlzaWJsZTsKICBmb250LXdlaWdodDogNjAwOwp9CgouaW5mby1wYW5lbCB7CiAgZmxl
+eDogMSAyMDBweDsKICBtYXJnaW46IDA7CiAgaGVpZ2h0OiAxMDAlOwogIGRpc3BsYXk6IGZsZXg7CiAg
+ZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQoKLmluZm8tcGFuZWwgLmVkaXQtcGFuZWwgewogIGJhY2tn
+cm91bmQtY29sb3I6ICMyODJiMmU7CiAgb3ZlcmZsb3c6IGF1dG87Cn0KCi5pbmZvLXBhbmVsIC5wYW5l
+bC1jb250ZW50IHsKICBwYWRkaW5nOiA3cHg7Cn0KCi5pbmZvLXBhbmVsIC5wYW5lbC1jb250ZW50PiA6
+Zmlyc3QtY2hpbGQgewogIG1hcmdpbi10b3A6IDA7Cn0KCi5pbmZvLXBhbmVsIC5ub3dyYXAgewogIHdo
+aXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5pbmZvLXBhbmVsIHVsLAouaW5mby1wYW5lbCBvbCB7CiAgcGFk
+ZGluZy1sZWZ0OiAyMHB4Owp9CgouaW5mby1wYW5lbCBsaSB7CiAgbWFyZ2luOiAwIDAgNXB4IDA7Cn0K
+Ci5pbmZvLXBhbmVsIGEgewogIGNvbG9yOiAjMzNjY2ZmOwp9CgouaW5mby1wYW5lbCAuZWRpdC1saXN0
+IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjgyYjJlOwogIG92ZXJmbG93OiBhdXRvOwp9CgouZWRpdC1w
+YW5lbCB7CiAgbWFyZ2luLXRvcDogNnB4OwogIGZsZXg6IDEgMTAwcHg7Cn0KCi5lZGl0LWxpc3Qgewog
+IGZsZXg6IDIgMTAwcHg7Cn0KCi5lZGl0LWxpc3QgLmVkaXQgewogIG1hcmdpbjogM3B4IDA7Cn0KCi5l
+ZGl0LWxpc3QgLmVkaXQtbGluayB7CiAgY3Vyc29yOiBwb2ludGVyOwp9CgoucmVydW5uaW5nLXBhbmUg
+ewogIGRpc3BsYXk6IG5vbmU7Cn0KCmJvZHkucmVydW5uaW5nIC5yZXJ1bm5pbmctcGFuZSB7CiAgZGlz
+cGxheTogYmxvY2s7CiAgcG9zaXRpb246IGZpeGVkOwogIHRvcDogMHB4OwogIGJvdHRvbTogMHB4Owog
+IGxlZnQ6IDBweDsKICByaWdodDogMHB4OwogIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDBBQTsgLyog
+dHJhbnNsdWNlbnQgYmxhY2sgKi8KICB6LWluZGV4OiA0MDA7Cn0KCi5yZXJ1bm5pbmctcGFuZSBoMSB7
+CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRvcDogNTAlOwogIGxlZnQ6IDUwJTsKICB0cmFuc2Zvcm06
+IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKfQoKcC50cmFjZSAudHlwZS1kZXNjcmlwdGlvbiB7CiAgLyog
+RnJvbSBITEpTJ3MgLmhsanMta2V5d29yZCwgLmhsanMtc2VsZWN0b3ItdGFnLCAuaGxqcy1kZWxldGlv
+biAqLwogIGNvbG9yOiAjY2M3ODMyOwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Cn0KCnVsLnRyYWNl
+IHsKICBmb250LXNpemU6IDEzcHg7CiAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogIHBhZGRpbmctbGVm
+dDogMHB4Owp9Cgp1bC50cmFjZSBsaSB7CiAgY29sb3I6IHdoaXRlOwogIG1hcmdpbi1sZWZ0OiAxNHB4
+OwogIHRleHQtaW5kZW50OiAtMTRweDsKfQoKdWwudHJhY2UgbGkgLmZ1bmN0aW9uIHsKICAvKiBGcm9t
+IEhMSlMncyAuaGxqcy1zZWN0aW9uLCAuaGxqcy10aXRsZSwgLmhsanMtdHlwZSAqLwogIGNvbG9yOiAj
+ZmZjNjZkOwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLmVs
+ZXZhdGlvbi16NCB7CiAgYm94LXNoYWRvdzogMHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAu
+MiksCiAgICAgIDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAwcHggMXB4
+IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgLjEyKTsKfQoKYSB7CiAgY29sb3I6ICNjY2M7CiAgZmlsbDog
+I2NjYzsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCmE6aG92ZXIgewogIGNvbG9yOiAjZmZmOwog
+IGZpbGw6ICNmZmY7Cn0KCmJ1dHRvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzMzY2NmZjsKICBib3Jk
+ZXI6IDJweCBzb2xpZCAjMzdhZWRjOwogIGJvcmRlci1yYWRpdXM6IDNweDsKICBwYWRkaW5nOiA2cHgg
+MTBweDsKICBmb250LXdlaWdodDogYm9sZDsKICBjb2xvcjogIzI4MjgyODsKfQoKYnV0dG9uOmhvdmVy
+IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjODBkZmZmOwogIGJvcmRlcjogMnB4IHNvbGlkICM1MmI4ZTA7
+CiAgY3Vyc29yOiBwb2ludGVyOwp9CgpidXR0b25bZGlzYWJsZWRdIHsKICBiYWNrZ3JvdW5kLWNvbG9y
+OiAjN2FhOGI4OwogIGNvbG9yOiAjNTA3MTc3OwogIGJvcmRlcjogMnB4IHNvbGlkICM1MDcxNzc7CiAg
+Y3Vyc29yOiBub3QtYWxsb3dlZDsKfQoKLnBsYWNlaG9sZGVyIHsKICBjb2xvcjogIzc3NzsKICB0ZXh0
+LWFsaWduOiBjZW50ZXI7CiAgbWFyZ2luLXRvcDogM2VtICFpbXBvcnRhbnQ7Cn0KCi8qKgogKiBITEpT
+IE92ZXJyaWRlcwogKi8KLmhsanMgewogIC8qKgogICAqIFRoaXMgYWxsb3dzIHRoZSBwZXItbGluZSBo
+aWdobGlnaHRzIHRvIHNob3cuCiAgICovCiAgYmFja2dyb3VuZDogbm9uZTsKfQo=
 ''';
 
 String _migration_js;
-// migration_dart md5 is 'fed856f862bffea0f76b893ef77223dc'
+// migration_dart md5 is '6520368a5d56a6a3d8049dbc6ac1b17f'
 String _migration_js_base64 = '''
 KGZ1bmN0aW9uIGRhcnRQcm9ncmFtKCl7ZnVuY3Rpb24gY29weVByb3BlcnRpZXMoYSxiKXt2YXIgdD1P
 YmplY3Qua2V5cyhhKQpmb3IodmFyIHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIHI9dFtzXQpiW3JdPWFb
@@ -536,3415 +533,3414 @@
 ZiB0IT0ic3RyaW5nIil0aHJvdyBILmIoSC50TChhKSkKcmV0dXJuIHR9LAplUTpmdW5jdGlvbihhKXt2
 YXIgdD1hLiRpZGVudGl0eUhhc2gKaWYodD09bnVsbCl7dD1NYXRoLnJhbmRvbSgpKjB4M2ZmZmZmZmZ8
 MAphLiRpZGVudGl0eUhhc2g9dH1yZXR1cm4gdH0sCkhwOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEs
-cCxvCmlmKHR5cGVvZiBhIT0ic3RyaW5nIilILnZoKEgudEwoYSkpCnQ9L15ccypbKy1dPygoMHhbYS1m
-MC05XSspfChcZCspfChbYS16MC05XSspKVxzKiQvaS5leGVjKGEpCmlmKHQ9PW51bGwpcmV0dXJuCmlm
-KDM+PXQubGVuZ3RoKXJldHVybiBILk9IKHQsMykKcz1ILnkodFszXSkKaWYoYj09bnVsbCl7aWYocyE9
-bnVsbClyZXR1cm4gcGFyc2VJbnQoYSwxMCkKaWYodFsyXSE9bnVsbClyZXR1cm4gcGFyc2VJbnQoYSwx
-NikKcmV0dXJufWlmKGI8Mnx8Yj4zNil0aHJvdyBILmIoUC5URShiLDIsMzYsInJhZGl4IixudWxsKSkK
-aWYoYj09PTEwJiZzIT1udWxsKXJldHVybiBwYXJzZUludChhLDEwKQppZihiPDEwfHxzPT1udWxsKXty
-PWI8PTEwPzQ3K2I6ODYrYgpxPXRbMV0KZm9yKHA9cS5sZW5ndGgsbz0wO288cDsrK28paWYoKEMueEIu
-VyhxLG8pfDMyKT5yKXJldHVybn1yZXR1cm4gcGFyc2VJbnQoYSxiKX0sCk06ZnVuY3Rpb24oYSl7dmFy
-IHQ9SC5INShhKQpyZXR1cm4gdH0sCkg1OmZ1bmN0aW9uKGEpe3ZhciB0LHMscgppZihhIGluc3RhbmNl
-b2YgUC5rKXJldHVybiBILmRtKEgueksoYSksbnVsbCkKaWYoSi5pYShhKT09PUMuT2t8fHUuYWsuYyhh
-KSl7dD1DLk80KGEpCmlmKEguZih0KSlyZXR1cm4gdApzPWEuY29uc3RydWN0b3IKaWYodHlwZW9mIHM9
-PSJmdW5jdGlvbiIpe3I9cy5uYW1lCmlmKHR5cGVvZiByPT0ic3RyaW5nIiYmSC5mKHIpKXJldHVybiBy
-fX1yZXR1cm4gSC5kbShILnpLKGEpLG51bGwpfSwKZjpmdW5jdGlvbihhKXt2YXIgdD1hIT09Ik9iamVj
-dCImJmEhPT0iIgpyZXR1cm4gdH0sCk0wOmZ1bmN0aW9uKCl7aWYoISFzZWxmLmxvY2F0aW9uKXJldHVy
-biBzZWxmLmxvY2F0aW9uLmhyZWYKcmV0dXJufSwKVks6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscD1h
-Lmxlbmd0aAppZihwPD01MDApcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxhKQpm
-b3IodD0iIixzPTA7czxwO3M9cil7cj1zKzUwMApxPXI8cD9yOnAKdCs9U3RyaW5nLmZyb21DaGFyQ29k
-ZS5hcHBseShudWxsLGEuc2xpY2UocyxxKSl9cmV0dXJuIHR9LApQTDpmdW5jdGlvbihhKXt2YXIgdCxz
-LHIscT1ILlZNKFtdLHUudCkKZm9yKHQ9YS5sZW5ndGgscz0wO3M8YS5sZW5ndGg7YS5sZW5ndGg9PT10
-fHwoMCxILmxrKShhKSwrK3Mpe3I9YVtzXQppZighSC5vayhyKSl0aHJvdyBILmIoSC50TChyKSkKaWYo
-cjw9NjU1MzUpQy5ObS5pKHEscikKZWxzZSBpZihyPD0xMTE0MTExKXtDLk5tLmkocSw1NTI5NisoQy5q
-bi53RyhyLTY1NTM2LDEwKSYxMDIzKSkKQy5ObS5pKHEsNTYzMjArKHImMTAyMykpfWVsc2UgdGhyb3cg
-SC5iKEgudEwocikpfXJldHVybiBILlZLKHEpfSwKZVQ6ZnVuY3Rpb24oYSl7dmFyIHQscyxyCmZvcih0
-PWEubGVuZ3RoLHM9MDtzPHQ7KytzKXtyPWFbc10KaWYoIUgub2socikpdGhyb3cgSC5iKEgudEwocikp
-CmlmKHI8MCl0aHJvdyBILmIoSC50TChyKSkKaWYocj42NTUzNSlyZXR1cm4gSC5QTChhKX1yZXR1cm4g
-SC5WSyhhKX0sCmZ3OmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscQppZihjPD01MDAmJmI9PT0wJiZj
-PT09YS5sZW5ndGgpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxhKQpmb3IodD1i
-LHM9IiI7dDxjO3Q9cil7cj10KzUwMApxPXI8Yz9yOmMKcys9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBs
-eShudWxsLGEuc3ViYXJyYXkodCxxKSl9cmV0dXJuIHN9LApMdzpmdW5jdGlvbihhKXt2YXIgdAppZigw
-PD1hKXtpZihhPD02NTUzNSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKQppZihhPD0xMTE0MTEx
-KXt0PWEtNjU1MzYKcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoKDU1Mjk2fEMuam4ud0codCwxMCkp
-Pj4+MCw1NjMyMHx0JjEwMjMpfX10aHJvdyBILmIoUC5URShhLDAsMTExNDExMSxudWxsLG51bGwpKX0s
-Cm8yOmZ1bmN0aW9uKGEpe2lmKGEuZGF0ZT09PXZvaWQgMClhLmRhdGU9bmV3IERhdGUoYS5hKQpyZXR1
-cm4gYS5kYXRlfSwKdEo6ZnVuY3Rpb24oYSl7dmFyIHQ9SC5vMihhKS5nZXRGdWxsWWVhcigpKzAKcmV0
-dXJuIHR9LApOUzpmdW5jdGlvbihhKXt2YXIgdD1ILm8yKGEpLmdldE1vbnRoKCkrMQpyZXR1cm4gdH0s
-CmpBOmZ1bmN0aW9uKGEpe3ZhciB0PUgubzIoYSkuZ2V0RGF0ZSgpKzAKcmV0dXJuIHR9LApLTDpmdW5j
-dGlvbihhKXt2YXIgdD1ILm8yKGEpLmdldEhvdXJzKCkrMApyZXR1cm4gdH0sCmNoOmZ1bmN0aW9uKGEp
-e3ZhciB0PUgubzIoYSkuZ2V0TWludXRlcygpKzAKcmV0dXJuIHR9LApKZDpmdW5jdGlvbihhKXt2YXIg
-dD1ILm8yKGEpLmdldFNlY29uZHMoKSswCnJldHVybiB0fSwKbzE6ZnVuY3Rpb24oYSl7dmFyIHQ9SC5v
-MihhKS5nZXRNaWxsaXNlY29uZHMoKSswCnJldHVybiB0fSwKem86ZnVuY3Rpb24oYSxiLGMpe3ZhciB0
-LHMscj17fQpyLmE9MAp0PVtdCnM9W10Kci5hPWIubGVuZ3RoCkMuTm0uRlYodCxiKQpyLmI9IiIKaWYo
-YyE9bnVsbCYmYy5hIT09MCljLksoMCxuZXcgSC5DaihyLHMsdCkpCiIiK3IuYQpyZXR1cm4gSi5KeShh
-LG5ldyBILkxJKEMuVGUsMCx0LHMsMCkpfSwKRWs6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscixxCmlm
-KGIgaW5zdGFuY2VvZiBBcnJheSl0PWM9PW51bGx8fGMuYT09PTAKZWxzZSB0PSExCmlmKHQpe3M9Ygpy
-PXMubGVuZ3RoCmlmKHI9PT0wKXtpZighIWEuJDApcmV0dXJuIGEuJDAoKX1lbHNlIGlmKHI9PT0xKXtp
-ZighIWEuJDEpcmV0dXJuIGEuJDEoc1swXSl9ZWxzZSBpZihyPT09Mil7aWYoISFhLiQyKXJldHVybiBh
-LiQyKHNbMF0sc1sxXSl9ZWxzZSBpZihyPT09Myl7aWYoISFhLiQzKXJldHVybiBhLiQzKHNbMF0sc1sx
-XSxzWzJdKX1lbHNlIGlmKHI9PT00KXtpZighIWEuJDQpcmV0dXJuIGEuJDQoc1swXSxzWzFdLHNbMl0s
-c1szXSl9ZWxzZSBpZihyPT09NSlpZighIWEuJDUpcmV0dXJuIGEuJDUoc1swXSxzWzFdLHNbMl0sc1sz
-XSxzWzRdKQpxPWFbIiIrIiQiK3JdCmlmKHEhPW51bGwpcmV0dXJuIHEuYXBwbHkoYSxzKX1yZXR1cm4g
-SC5FdyhhLGIsYyl9LApFdzpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHEscCxvLG4sbSxsLGs9YiBp
-bnN0YW5jZW9mIEFycmF5P2I6UC5DSChiLCEwLHUueiksaj1rLmxlbmd0aCxpPWEuJFIKaWYoajxpKXJl
-dHVybiBILnpvKGEsayxjKQp0PWEuJEQKcz10PT1udWxsCnI9IXM/dCgpOm51bGwKcT1KLmlhKGEpCnA9
-cS4kQwppZih0eXBlb2YgcD09InN0cmluZyIpcD1xW3BdCmlmKHMpe2lmKGMhPW51bGwmJmMuYSE9PTAp
-cmV0dXJuIEguem8oYSxrLGMpCmlmKGo9PT1pKXJldHVybiBwLmFwcGx5KGEsaykKcmV0dXJuIEguem8o
-YSxrLGMpfWlmKHIgaW5zdGFuY2VvZiBBcnJheSl7aWYoYyE9bnVsbCYmYy5hIT09MClyZXR1cm4gSC56
-byhhLGssYykKaWYoaj5pK3IubGVuZ3RoKXJldHVybiBILnpvKGEsayxudWxsKQpDLk5tLkZWKGssci5z
-bGljZShqLWkpKQpyZXR1cm4gcC5hcHBseShhLGspfWVsc2V7aWYoaj5pKXJldHVybiBILnpvKGEsayxj
-KQpvPU9iamVjdC5rZXlzKHIpCmlmKGM9PW51bGwpZm9yKHM9by5sZW5ndGgsbj0wO248by5sZW5ndGg7
-by5sZW5ndGg9PT1zfHwoMCxILmxrKShvKSwrK24pQy5ObS5pKGsscltILnkob1tuXSldKQplbHNle2Zv
-cihzPW8ubGVuZ3RoLG09MCxuPTA7bjxvLmxlbmd0aDtvLmxlbmd0aD09PXN8fCgwLEgubGspKG8pLCsr
-bil7bD1ILnkob1tuXSkKaWYoYy54NChsKSl7KyttCkMuTm0uaShrLGMucSgwLGwpKX1lbHNlIEMuTm0u
-aShrLHJbbF0pfWlmKG0hPT1jLmEpcmV0dXJuIEguem8oYSxrLGMpfXJldHVybiBwLmFwcGx5KGEsayl9
-fSwKcFk6ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKEgudEwoYSkpfSwKT0g6ZnVuY3Rpb24oYSxiKXtpZihh
-PT1udWxsKUouSG0oYSkKdGhyb3cgSC5iKEguSFkoYSxiKSl9LApIWTpmdW5jdGlvbihhLGIpe3ZhciB0
-LHMscj0iaW5kZXgiCmlmKCFILm9rKGIpKXJldHVybiBuZXcgUC51KCEwLGIscixudWxsKQp0PUguU2Mo
-Si5IbShhKSkKaWYoIShiPDApKXtpZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiBILnBZKHQpCnM9
-Yj49dH1lbHNlIHM9ITAKaWYocylyZXR1cm4gUC5DZihiLGEscixudWxsLHQpCnJldHVybiBQLngoYixy
-KX0sCmF1OmZ1bmN0aW9uKGEsYixjKXt2YXIgdD0iSW52YWxpZCB2YWx1ZSIKaWYoYT5jKXJldHVybiBu
-ZXcgUC5iSigwLGMsITAsYSwic3RhcnQiLHQpCmlmKGIhPW51bGwpe2lmKCFILm9rKGIpKXJldHVybiBu
-ZXcgUC51KCEwLGIsImVuZCIsbnVsbCkKaWYoYjxhfHxiPmMpcmV0dXJuIG5ldyBQLmJKKGEsYywhMCxi
-LCJlbmQiLHQpfXJldHVybiBuZXcgUC51KCEwLGIsImVuZCIsbnVsbCl9LAp0TDpmdW5jdGlvbihhKXty
-ZXR1cm4gbmV3IFAudSghMCxhLG51bGwsbnVsbCl9LApiOmZ1bmN0aW9uKGEpe3ZhciB0CmlmKGE9PW51
-bGwpYT1uZXcgUC5uKCkKdD1uZXcgRXJyb3IoKQp0LmRhcnRFeGNlcHRpb249YQppZigiZGVmaW5lUHJv
-cGVydHkiIGluIE9iamVjdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIm1lc3NhZ2UiLHtnZXQ6SC5o
-fSkKdC5uYW1lPSIifWVsc2UgdC50b1N0cmluZz1ILmgKcmV0dXJuIHR9LApoOmZ1bmN0aW9uKCl7cmV0
-dXJuIEouaih0aGlzLmRhcnRFeGNlcHRpb24pfSwKdmg6ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKGEpfSwK
-bGs6ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKFAuYTQoYSkpfSwKY006ZnVuY3Rpb24oYSl7dmFyIHQscyxy
-LHEscCxvCmE9SC5lQShhLnJlcGxhY2UoU3RyaW5nKHt9KSwnJHJlY2VpdmVyJCcpKQp0PWEubWF0Y2go
-L1xcXCRbYS16QS1aXStcXFwkL2cpCmlmKHQ9PW51bGwpdD1ILlZNKFtdLHUucykKcz10LmluZGV4T2Yo
-IlxcJGFyZ3VtZW50c1xcJCIpCnI9dC5pbmRleE9mKCJcXCRhcmd1bWVudHNFeHByXFwkIikKcT10Lmlu
-ZGV4T2YoIlxcJGV4cHJcXCQiKQpwPXQuaW5kZXhPZigiXFwkbWV0aG9kXFwkIikKbz10LmluZGV4T2Yo
-IlxcJHJlY2VpdmVyXFwkIikKcmV0dXJuIG5ldyBILlpyKGEucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxc
-XFwkYXJndW1lbnRzXFxcXFxcJCcsJ2cnKSwnKCg/Onh8W154XSkqKScpLnJlcGxhY2UobmV3IFJlZ0V4
-cCgnXFxcXFxcJGFyZ3VtZW50c0V4cHJcXFxcXFwkJywnZycpLCcoKD86eHxbXnhdKSopJykucmVwbGFj
-ZShuZXcgUmVnRXhwKCdcXFxcXFwkZXhwclxcXFxcXCQnLCdnJyksJygoPzp4fFteeF0pKiknKS5yZXBs
-YWNlKG5ldyBSZWdFeHAoJ1xcXFxcXCRtZXRob2RcXFxcXFwkJywnZycpLCcoKD86eHxbXnhdKSopJyku
-cmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcXFwkcmVjZWl2ZXJcXFxcXFwkJywnZycpLCcoKD86eHxbXnhd
-KSopJykscyxyLHEscCxvKX0sClM3OmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigkZXhwciQpe3Zh
-ciAkYXJndW1lbnRzRXhwciQ9JyRhcmd1bWVudHMkJwp0cnl7JGV4cHIkLiRtZXRob2QkKCRhcmd1bWVu
-dHNFeHByJCl9Y2F0Y2godCl7cmV0dXJuIHQubWVzc2FnZX19KGEpfSwKTWo6ZnVuY3Rpb24oYSl7cmV0
-dXJuIGZ1bmN0aW9uKCRleHByJCl7dHJ5eyRleHByJC4kbWV0aG9kJH1jYXRjaCh0KXtyZXR1cm4gdC5t
-ZXNzYWdlfX0oYSl9LApJajpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgSC5XMChhLGI9PW51bGw/bnVs
-bDpiLm1ldGhvZCl9LApUMzpmdW5jdGlvbihhLGIpe3ZhciB0PWI9PW51bGwscz10P251bGw6Yi5tZXRo
-b2QKcmV0dXJuIG5ldyBILmF6KGEscyx0P251bGw6Yi5yZWNlaXZlcil9LApSdTpmdW5jdGlvbihhKXt2
-YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGY9bnVsbCxlPW5ldyBILkFtKGEpCmlmKGE9PW51
-bGwpcmV0dXJuCmlmKGEgaW5zdGFuY2VvZiBILmJxKXJldHVybiBlLiQxKGEuYSkKaWYodHlwZW9mIGEh
-PT0ib2JqZWN0IilyZXR1cm4gYQppZigiZGFydEV4Y2VwdGlvbiIgaW4gYSlyZXR1cm4gZS4kMShhLmRh
-cnRFeGNlcHRpb24pCmVsc2UgaWYoISgibWVzc2FnZSIgaW4gYSkpcmV0dXJuIGEKdD1hLm1lc3NhZ2UK
-aWYoIm51bWJlciIgaW4gYSYmdHlwZW9mIGEubnVtYmVyPT0ibnVtYmVyIil7cz1hLm51bWJlcgpyPXMm
-NjU1MzUKaWYoKEMuam4ud0cocywxNikmODE5MSk9PT0xMClzd2l0Y2gocil7Y2FzZSA0Mzg6cmV0dXJu
-IGUuJDEoSC5UMyhILmQodCkrIiAoRXJyb3IgIityKyIpIixmKSkKY2FzZSA0NDU6Y2FzZSA1MDA3OnJl
-dHVybiBlLiQxKEguSWooSC5kKHQpKyIgKEVycm9yICIrcisiKSIsZikpfX1pZihhIGluc3RhbmNlb2Yg
-VHlwZUVycm9yKXtxPSQuU24oKQpwPSQubHEoKQpvPSQuTjkoKQpuPSQuaUkoKQptPSQuS2YoKQpsPSQu
-WmgoKQprPSQuY1AoKQokLmMzKCkKaj0kLkhLKCkKaT0kLnIxKCkKaD1xLnFTKHQpCmlmKGghPW51bGwp
-cmV0dXJuIGUuJDEoSC5UMyhILnkodCksaCkpCmVsc2V7aD1wLnFTKHQpCmlmKGghPW51bGwpe2gubWV0
-aG9kPSJjYWxsIgpyZXR1cm4gZS4kMShILlQzKEgueSh0KSxoKSl9ZWxzZXtoPW8ucVModCkKaWYoaD09
-bnVsbCl7aD1uLnFTKHQpCmlmKGg9PW51bGwpe2g9bS5xUyh0KQppZihoPT1udWxsKXtoPWwucVModCkK
-aWYoaD09bnVsbCl7aD1rLnFTKHQpCmlmKGg9PW51bGwpe2g9bi5xUyh0KQppZihoPT1udWxsKXtoPWou
-cVModCkKaWYoaD09bnVsbCl7aD1pLnFTKHQpCmc9aCE9bnVsbH1lbHNlIGc9ITB9ZWxzZSBnPSEwfWVs
-c2UgZz0hMH1lbHNlIGc9ITB9ZWxzZSBnPSEwfWVsc2UgZz0hMH1lbHNlIGc9ITAKaWYoZylyZXR1cm4g
-ZS4kMShILklqKEgueSh0KSxoKSl9fXJldHVybiBlLiQxKG5ldyBILnZWKHR5cGVvZiB0PT0ic3RyaW5n
-Ij90OiIiKSl9aWYoYSBpbnN0YW5jZW9mIFJhbmdlRXJyb3Ipe2lmKHR5cGVvZiB0PT0ic3RyaW5nIiYm
-dC5pbmRleE9mKCJjYWxsIHN0YWNrIikhPT0tMSlyZXR1cm4gbmV3IFAuS1koKQp0PWZ1bmN0aW9uKGIp
-e3RyeXtyZXR1cm4gU3RyaW5nKGIpfWNhdGNoKGQpe31yZXR1cm4gbnVsbH0oYSkKcmV0dXJuIGUuJDEo
-bmV3IFAudSghMSxmLGYsdHlwZW9mIHQ9PSJzdHJpbmciP3QucmVwbGFjZSgvXlJhbmdlRXJyb3I6XHMq
-LywiIik6dCkpfWlmKHR5cGVvZiBJbnRlcm5hbEVycm9yPT0iZnVuY3Rpb24iJiZhIGluc3RhbmNlb2Yg
-SW50ZXJuYWxFcnJvcilpZih0eXBlb2YgdD09InN0cmluZyImJnQ9PT0idG9vIG11Y2ggcmVjdXJzaW9u
-IilyZXR1cm4gbmV3IFAuS1koKQpyZXR1cm4gYX0sCnRzOmZ1bmN0aW9uKGEpe3ZhciB0CmlmKGEgaW5z
-dGFuY2VvZiBILmJxKXJldHVybiBhLmIKaWYoYT09bnVsbClyZXR1cm4gbmV3IEguWE8oYSkKdD1hLiRj
-YWNoZWRUcmFjZQppZih0IT1udWxsKXJldHVybiB0CnJldHVybiBhLiRjYWNoZWRUcmFjZT1uZXcgSC5Y
-TyhhKX0sCkI3OmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHE9YS5sZW5ndGgKZm9yKHQ9MDt0PHE7dD1y
-KXtzPXQrMQpyPXMrMQpiLlkoMCxhW3RdLGFbc10pfXJldHVybiBifSwKZnQ6ZnVuY3Rpb24oYSxiLGMs
-ZCxlLGYpe3UuWi5iKGEpCnN3aXRjaChILlNjKGIpKXtjYXNlIDA6cmV0dXJuIGEuJDAoKQpjYXNlIDE6
-cmV0dXJuIGEuJDEoYykKY2FzZSAyOnJldHVybiBhLiQyKGMsZCkKY2FzZSAzOnJldHVybiBhLiQzKGMs
-ZCxlKQpjYXNlIDQ6cmV0dXJuIGEuJDQoYyxkLGUsZil9dGhyb3cgSC5iKG5ldyBQLkNEKCJVbnN1cHBv
-cnRlZCBudW1iZXIgb2YgYXJndW1lbnRzIGZvciB3cmFwcGVkIGNsb3N1cmUiKSl9LAp0UjpmdW5jdGlv
-bihhLGIpe3ZhciB0CmlmKGE9PW51bGwpcmV0dXJuCnQ9YS4kaWRlbnRpdHkKaWYoISF0KXJldHVybiB0
-CnQ9ZnVuY3Rpb24oYyxkLGUpe3JldHVybiBmdW5jdGlvbihmLGcsaCxpKXtyZXR1cm4gZShjLGQsZixn
-LGgsaSl9fShhLGIsSC5mdCkKYS4kaWRlbnRpdHk9dApyZXR1cm4gdH0sCmlBOmZ1bmN0aW9uKGEsYixj
-LGQsZSxmLGcpe3ZhciB0LHMscixxLHAsbyxuLG0sbD1udWxsLGs9YlswXSxqPWsuJGNhbGxOYW1lLGk9
-ZT9PYmplY3QuY3JlYXRlKG5ldyBILnp4KCkuY29uc3RydWN0b3IucHJvdG90eXBlKTpPYmplY3QuY3Jl
-YXRlKG5ldyBILnJUKGwsbCxsLGwpLmNvbnN0cnVjdG9yLnByb3RvdHlwZSkKaS4kaW5pdGlhbGl6ZT1p
-LmNvbnN0cnVjdG9yCmlmKGUpdD1mdW5jdGlvbiBzdGF0aWNfdGVhcl9vZmYoKXt0aGlzLiRpbml0aWFs
-aXplKCl9CmVsc2V7cz0kLnlqCmlmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIHMuaCgpCiQueWo9
-cysxCnM9bmV3IEZ1bmN0aW9uKCJhLGIsYyxkIitzLCJ0aGlzLiRpbml0aWFsaXplKGEsYixjLGQiK3Mr
-IikiKQp0PXN9aS5jb25zdHJ1Y3Rvcj10CnQucHJvdG90eXBlPWkKaWYoIWUpe3I9SC5ieChhLGssZikK
-ci4kcmVmbGVjdGlvbkluZm89ZH1lbHNle2kuJHN0YXRpY19uYW1lPWcKcj1rfXE9SC5pbShkLGUsZikK
-aS4kUz1xCmlbal09cgpmb3IocD1yLG89MTtvPGIubGVuZ3RoOysrbyl7bj1iW29dCm09bi4kY2FsbE5h
-bWUKaWYobSE9bnVsbCl7bj1lP246SC5ieChhLG4sZikKaVttXT1ufWlmKG89PT1jKXtuLiRyZWZsZWN0
-aW9uSW5mbz1kCnA9bn19aS4kQz1wCmkuJFI9ay4kUgppLiREPWsuJEQKcmV0dXJuIHR9LAppbTpmdW5j
-dGlvbihhLGIsYyl7dmFyIHQKaWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBmdW5jdGlvbihkLGUp
-e3JldHVybiBmdW5jdGlvbigpe3JldHVybiBkKGUpfX0oSC5CcCxhKQppZih0eXBlb2YgYT09InN0cmlu
-ZyIpe2lmKGIpdGhyb3cgSC5iKCJDYW5ub3QgY29tcHV0ZSBzaWduYXR1cmUgZm9yIHN0YXRpYyB0ZWFy
-b2ZmLiIpCnQ9Yz9ILlBXOkguVG4KcmV0dXJuIGZ1bmN0aW9uKGQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7
-cmV0dXJuIGUodGhpcyxkKX19KGEsdCl9dGhyb3cgSC5iKCJFcnJvciBpbiBmdW5jdGlvblR5cGUgb2Yg
-dGVhcm9mZiIpfSwKdnE6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQ9SC5EVgpzd2l0Y2goYj8tMTphKXtj
-YXNlIDA6cmV0dXJuIGZ1bmN0aW9uKGUsZil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGYodGhpcylb
-ZV0oKX19KGMsdCkKY2FzZSAxOnJldHVybiBmdW5jdGlvbihlLGYpe3JldHVybiBmdW5jdGlvbihnKXty
-ZXR1cm4gZih0aGlzKVtlXShnKX19KGMsdCkKY2FzZSAyOnJldHVybiBmdW5jdGlvbihlLGYpe3JldHVy
-biBmdW5jdGlvbihnLGgpe3JldHVybiBmKHRoaXMpW2VdKGcsaCl9fShjLHQpCmNhc2UgMzpyZXR1cm4g
-ZnVuY3Rpb24oZSxmKXtyZXR1cm4gZnVuY3Rpb24oZyxoLGkpe3JldHVybiBmKHRoaXMpW2VdKGcsaCxp
-KX19KGMsdCkKY2FzZSA0OnJldHVybiBmdW5jdGlvbihlLGYpe3JldHVybiBmdW5jdGlvbihnLGgsaSxq
-KXtyZXR1cm4gZih0aGlzKVtlXShnLGgsaSxqKX19KGMsdCkKY2FzZSA1OnJldHVybiBmdW5jdGlvbihl
-LGYpe3JldHVybiBmdW5jdGlvbihnLGgsaSxqLGspe3JldHVybiBmKHRoaXMpW2VdKGcsaCxpLGosayl9
-fShjLHQpCmRlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKGUsZil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJu
-IGUuYXBwbHkoZih0aGlzKSxhcmd1bWVudHMpfX0oZCx0KX19LApieDpmdW5jdGlvbihhLGIsYyl7dmFy
-IHQscyxyLHEscCxvLG4KaWYoYylyZXR1cm4gSC5IZihhLGIpCnQ9Yi4kc3R1Yk5hbWUKcz1iLmxlbmd0
-aApyPWFbdF0KcT1iPT1udWxsP3I9PW51bGw6Yj09PXIKcD0hcXx8cz49MjcKaWYocClyZXR1cm4gSC52
-cShzLCFxLHQsYikKaWYocz09PTApe3E9JC55agppZih0eXBlb2YgcSE9PSJudW1iZXIiKXJldHVybiBx
-LmgoKQokLnlqPXErMQpvPSJzZWxmIitxCnE9InJldHVybiBmdW5jdGlvbigpe3ZhciAiK28rIiA9IHRo
-aXMuIgpwPSQubUoKcmV0dXJuIG5ldyBGdW5jdGlvbihxK0guZChwPT1udWxsPyQubUo9SC5FMigic2Vs
-ZiIpOnApKyI7cmV0dXJuICIrbysiLiIrSC5kKHQpKyIoKTt9IikoKX1uPSJhYmNkZWZnaGlqa2xtbm9w
-cXJzdHV2d3h5eiIuc3BsaXQoIiIpLnNwbGljZSgwLHMpLmpvaW4oIiwiKQpxPSQueWoKaWYodHlwZW9m
-IHEhPT0ibnVtYmVyIilyZXR1cm4gcS5oKCkKJC55aj1xKzEKbis9cQpxPSJyZXR1cm4gZnVuY3Rpb24o
-IituKyIpe3JldHVybiB0aGlzLiIKcD0kLm1KCnJldHVybiBuZXcgRnVuY3Rpb24ocStILmQocD09bnVs
-bD8kLm1KPUguRTIoInNlbGYiKTpwKSsiLiIrSC5kKHQpKyIoIituKyIpO30iKSgpfSwKWjQ6ZnVuY3Rp
-b24oYSxiLGMsZCl7dmFyIHQ9SC5EVixzPUgueVMKc3dpdGNoKGI/LTE6YSl7Y2FzZSAwOnRocm93IEgu
-YihILkVmKCJJbnRlcmNlcHRlZCBmdW5jdGlvbiB3aXRoIG5vIGFyZ3VtZW50cy4iKSkKY2FzZSAxOnJl
-dHVybiBmdW5jdGlvbihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGYodGhpcylbZV0oZyh0
-aGlzKSl9fShjLHQscykKY2FzZSAyOnJldHVybiBmdW5jdGlvbihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9u
-KGgpe3JldHVybiBmKHRoaXMpW2VdKGcodGhpcyksaCl9fShjLHQscykKY2FzZSAzOnJldHVybiBmdW5j
-dGlvbihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9uKGgsaSl7cmV0dXJuIGYodGhpcylbZV0oZyh0aGlzKSxo
-LGkpfX0oYyx0LHMpCmNhc2UgNDpyZXR1cm4gZnVuY3Rpb24oZSxmLGcpe3JldHVybiBmdW5jdGlvbiho
-LGksail7cmV0dXJuIGYodGhpcylbZV0oZyh0aGlzKSxoLGksail9fShjLHQscykKY2FzZSA1OnJldHVy
-biBmdW5jdGlvbihlLGYsZyl7cmV0dXJuIGZ1bmN0aW9uKGgsaSxqLGspe3JldHVybiBmKHRoaXMpW2Vd
-KGcodGhpcyksaCxpLGosayl9fShjLHQscykKY2FzZSA2OnJldHVybiBmdW5jdGlvbihlLGYsZyl7cmV0
-dXJuIGZ1bmN0aW9uKGgsaSxqLGssbCl7cmV0dXJuIGYodGhpcylbZV0oZyh0aGlzKSxoLGksaixrLGwp
-fX0oYyx0LHMpCmRlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKGUsZixnLGgpe3JldHVybiBmdW5jdGlvbigp
-e2g9W2codGhpcyldCkFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGgsYXJndW1lbnRzKQpyZXR1cm4g
-ZS5hcHBseShmKHRoaXMpLGgpfX0oZCx0LHMpfX0sCkhmOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEs
-cCxvLG4sbT0kLm1KCmlmKG09PW51bGwpbT0kLm1KPUguRTIoInNlbGYiKQp0PSQuUDQKaWYodD09bnVs
-bCl0PSQuUDQ9SC5FMigicmVjZWl2ZXIiKQpzPWIuJHN0dWJOYW1lCnI9Yi5sZW5ndGgKcT1hW3NdCnA9
-Yj09bnVsbD9xPT1udWxsOmI9PT1xCm89IXB8fHI+PTI4CmlmKG8pcmV0dXJuIEguWjQociwhcCxzLGIp
-CmlmKHI9PT0xKXttPSJyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4iK0guZChtKSsiLiIrSC5k
-KHMpKyIodGhpcy4iK0guZCh0KSsiKTsiCnQ9JC55agppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVy
-biB0LmgoKQokLnlqPXQrMQpyZXR1cm4gbmV3IEZ1bmN0aW9uKG0rdCsifSIpKCl9bj0iYWJjZGVmZ2hp
-amtsbW5vcHFyc3R1dnd4eXoiLnNwbGl0KCIiKS5zcGxpY2UoMCxyLTEpLmpvaW4oIiwiKQptPSJyZXR1
-cm4gZnVuY3Rpb24oIituKyIpe3JldHVybiB0aGlzLiIrSC5kKG0pKyIuIitILmQocykrIih0aGlzLiIr
-SC5kKHQpKyIsICIrbisiKTsiCnQ9JC55agppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiB0Lmgo
-KQokLnlqPXQrMQpyZXR1cm4gbmV3IEZ1bmN0aW9uKG0rdCsifSIpKCl9LApLcTpmdW5jdGlvbihhLGIs
-YyxkLGUsZixnKXtyZXR1cm4gSC5pQShhLGIsYyxkLCEhZSwhIWYsZyl9LApUbjpmdW5jdGlvbihhLGIp
-e3JldHVybiBILmNFKHYudHlwZVVuaXZlcnNlLEgueksoYS5hKSxiKX0sClBXOmZ1bmN0aW9uKGEsYil7
-cmV0dXJuIEguY0Uodi50eXBlVW5pdmVyc2UsSC56SyhhLmMpLGIpfSwKRFY6ZnVuY3Rpb24oYSl7cmV0
-dXJuIGEuYX0sCnlTOmZ1bmN0aW9uKGEpe3JldHVybiBhLmN9LApFMjpmdW5jdGlvbihhKXt2YXIgdCxz
-LHIscT1uZXcgSC5yVCgic2VsZiIsInRhcmdldCIsInJlY2VpdmVyIiwibmFtZSIpLHA9Si5FcChPYmpl
-Y3QuZ2V0T3duUHJvcGVydHlOYW1lcyhxKSkKZm9yKHQ9cC5sZW5ndGgscz0wO3M8dDsrK3Mpe3I9cFtz
-XQppZihxW3JdPT09YSlyZXR1cm4gcn19LApvVDpmdW5jdGlvbihhKXtpZihhPT1udWxsKUguZk8oImJv
-b2xlYW4gZXhwcmVzc2lvbiBtdXN0IG5vdCBiZSBudWxsIikKcmV0dXJuIGF9LApmTzpmdW5jdGlvbihh
-KXt0aHJvdyBILmIobmV3IEgua1koYSkpfSwKYWc6ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKG5ldyBQLmMo
-YSkpfSwKRWY6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILkVxKGEpfSwKWWc6ZnVuY3Rpb24oYSl7cmV0
-dXJuIHYuZ2V0SXNvbGF0ZVRhZyhhKX0sClZNOmZ1bmN0aW9uKGEsYil7YS4kdGk9YgpyZXR1cm4gYX0s
-Cm9YOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpcmV0dXJuCnJldHVybiBhLiR0aX0sCklNOmZ1bmN0aW9u
-KGEsYixjKXtyZXR1cm4gSC5ZOShhWyIkYSIrSC5kKGMpXSxILm9YKGIpKX0sClk5OmZ1bmN0aW9uKGEs
-Yil7aWYoYT09bnVsbClyZXR1cm4gYgphPWEuYXBwbHkobnVsbCxiKQppZihhPT1udWxsKXJldHVybgpp
-ZihBcnJheS5pc0FycmF5KGEpKXJldHVybiBhCmlmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJldHVybiBh
-LmFwcGx5KG51bGwsYikKcmV0dXJuIGJ9LApJRzpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGEuYXBwbHko
-YixILlk5KEouaWEoYilbIiRhIitILmQoYyldLEgub1goYikpKX0sCml3OmZ1bmN0aW9uKGEsYixjKXtP
-YmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLHt2YWx1ZTpjLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6
-dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0pfSwKdzM6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscD1ILnko
-JC5ORi4kMShhKSksbz0kLm53W3BdCmlmKG8hPW51bGwpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLHYu
-ZGlzcGF0Y2hQcm9wZXJ0eU5hbWUse3ZhbHVlOm8sZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVl
-LGNvbmZpZ3VyYWJsZTp0cnVlfSkKcmV0dXJuIG8uaX10PSQudnZbcF0KaWYodCE9bnVsbClyZXR1cm4g
-dApzPXYuaW50ZXJjZXB0b3JzQnlUYWdbcF0KaWYocz09bnVsbCl7cD1ILnkoJC5UWC4kMihhLHApKQpp
-ZihwIT1udWxsKXtvPSQubndbcF0KaWYobyE9bnVsbCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsdi5k
-aXNwYXRjaFByb3BlcnR5TmFtZSx7dmFsdWU6byxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUs
-Y29uZmlndXJhYmxlOnRydWV9KQpyZXR1cm4gby5pfXQ9JC52dltwXQppZih0IT1udWxsKXJldHVybiB0
-CnM9di5pbnRlcmNlcHRvcnNCeVRhZ1twXX19aWYocz09bnVsbClyZXR1cm4KdD1zLnByb3RvdHlwZQpy
-PXBbMF0KaWYocj09PSIhIil7bz1ILlZhKHQpCiQubndbcF09bwpPYmplY3QuZGVmaW5lUHJvcGVydHko
-YSx2LmRpc3BhdGNoUHJvcGVydHlOYW1lLHt2YWx1ZTpvLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6
-dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0pCnJldHVybiBvLml9aWYocj09PSJ+Iil7JC52dltwXT10CnJl
-dHVybiB0fWlmKHI9PT0iLSIpe3E9SC5WYSh0KQpPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0Lmdl
-dFByb3RvdHlwZU9mKGEpLHYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWUse3ZhbHVlOnEsZW51bWVyYWJsZTpm
-YWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfSkKcmV0dXJuIHEuaX1pZihyPT09Iisi
-KXJldHVybiBILkxjKGEsdCkKaWYocj09PSIqIil0aHJvdyBILmIoUC5TWShwKSkKaWYodi5sZWFmVGFn
-c1twXT09PXRydWUpe3E9SC5WYSh0KQpPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LmdldFByb3Rv
-dHlwZU9mKGEpLHYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWUse3ZhbHVlOnEsZW51bWVyYWJsZTpmYWxzZSx3
-cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfSkKcmV0dXJuIHEuaX1lbHNlIHJldHVybiBILkxj
-KGEsdCl9LApMYzpmdW5jdGlvbihhLGIpe3ZhciB0PU9iamVjdC5nZXRQcm90b3R5cGVPZihhKQpPYmpl
-Y3QuZGVmaW5lUHJvcGVydHkodCx2LmRpc3BhdGNoUHJvcGVydHlOYW1lLHt2YWx1ZTpKLlF1KGIsdCxu
-dWxsLG51bGwpLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0p
-CnJldHVybiBifSwKVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouUXUoYSwhMSxudWxsLCEhYS4kaVhqKX0s
-ClZGOmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1iLnByb3RvdHlwZQppZih2LmxlYWZUYWdzW2FdPT09dHJ1
-ZSlyZXR1cm4gSC5WYSh0KQplbHNlIHJldHVybiBKLlF1KHQsYyxudWxsLG51bGwpfSwKWEQ6ZnVuY3Rp
-b24oKXtpZighMD09PSQuQnYpcmV0dXJuCiQuQnY9ITAKSC5aMSgpfSwKWjE6ZnVuY3Rpb24oKXt2YXIg
-dCxzLHIscSxwLG8sbixtCiQubnc9T2JqZWN0LmNyZWF0ZShudWxsKQokLnZ2PU9iamVjdC5jcmVhdGUo
-bnVsbCkKSC5rTygpCnQ9di5pbnRlcmNlcHRvcnNCeVRhZwpzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5h
-bWVzKHQpCmlmKHR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiKXt3aW5kb3cKcj1mdW5jdGlvbigpe30K
-Zm9yKHE9MDtxPHMubGVuZ3RoOysrcSl7cD1zW3FdCm89JC54Ny4kMShwKQppZihvIT1udWxsKXtuPUgu
-VkYocCx0W3BdLG8pCmlmKG4hPW51bGwpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShvLHYuZGlzcGF0Y2hQ
-cm9wZXJ0eU5hbWUse3ZhbHVlOm4sZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3Vy
-YWJsZTp0cnVlfSkKci5wcm90b3R5cGU9b319fX1mb3IocT0wO3E8cy5sZW5ndGg7KytxKXtwPXNbcV0K
-aWYoL15bQS1aYS16X10vLnRlc3QocCkpe209dFtwXQp0WyIhIitwXT1tCnRbIn4iK3BdPW0KdFsiLSIr
-cF09bQp0WyIrIitwXT1tCnRbIioiK3BdPW19fX0sCmtPOmZ1bmN0aW9uKCl7dmFyIHQscyxyLHEscCxv
-LG49Qy5ZcSgpCm49SC51ZChDLktVLEgudWQoQy5mUSxILnVkKEMuaTcsSC51ZChDLmk3LEgudWQoQy54
-aSxILnVkKEMuZGssSC51ZChDLndiKEMuTzQpLG4pKSkpKSkpCmlmKHR5cGVvZiBkYXJ0TmF0aXZlRGlz
-cGF0Y2hIb29rc1RyYW5zZm9ybWVyIT0idW5kZWZpbmVkIil7dD1kYXJ0TmF0aXZlRGlzcGF0Y2hIb29r
-c1RyYW5zZm9ybWVyCmlmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXQ9W3RdCmlmKHQuY29uc3RydWN0b3I9
-PUFycmF5KWZvcihzPTA7czx0Lmxlbmd0aDsrK3Mpe3I9dFtzXQppZih0eXBlb2Ygcj09ImZ1bmN0aW9u
-IiluPXIobil8fG59fXE9bi5nZXRUYWcKcD1uLmdldFVua25vd25UYWcKbz1uLnByb3RvdHlwZUZvclRh
-ZwokLk5GPW5ldyBILmRDKHEpCiQuVFg9bmV3IEgud04ocCkKJC54Nz1uZXcgSC5WWChvKX0sCnVkOmZ1
-bmN0aW9uKGEsYil7cmV0dXJuIGEoYil8fGJ9LAp2NDpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIHQ9
-Yj8ibSI6IiIscz1jPyIiOiJpIixyPWQ/InUiOiIiLHE9ZT8icyI6IiIscD1mPyJnIjoiIixvPWZ1bmN0
-aW9uKGcsaCl7dHJ5e3JldHVybiBuZXcgUmVnRXhwKGcsaCl9Y2F0Y2gobil7cmV0dXJuIG59fShhLHQr
-cytyK3ErcCkKaWYobyBpbnN0YW5jZW9mIFJlZ0V4cClyZXR1cm4gbwp0aHJvdyBILmIoUC5ycigiSWxs
-ZWdhbCBSZWdFeHAgcGF0dGVybiAoIitTdHJpbmcobykrIikiLGEsbnVsbCkpfSwKbTI6ZnVuY3Rpb24o
-YSxiLGMpe3ZhciB0CmlmKHR5cGVvZiBiPT0ic3RyaW5nIilyZXR1cm4gYS5pbmRleE9mKGIsYyk+PTAK
-ZWxzZSBpZihiIGluc3RhbmNlb2YgSC5WUil7dD1DLnhCLkcoYSxjKQpyZXR1cm4gYi5iLnRlc3QodCl9
-ZWxzZXt0PUouRkwoYixDLnhCLkcoYSxjKSkKcmV0dXJuIXQuZ2wwKHQpfX0sCkE0OmZ1bmN0aW9uKGEp
-e2lmKGEuaW5kZXhPZigiJCIsMCk+PTApcmV0dXJuIGEucmVwbGFjZSgvXCQvZywiJCQkJCIpCnJldHVy
-biBhfSwKZUE6ZnVuY3Rpb24oYSl7aWYoL1tbXF17fSgpKis/LlxcXiR8XS8udGVzdChhKSlyZXR1cm4g
-YS5yZXBsYWNlKC9bW1xde30oKSorPy5cXF4kfF0vZywiXFwkJiIpCnJldHVybiBhfSwKeXM6ZnVuY3Rp
-b24oYSxiLGMpe3ZhciB0PUgubk0oYSxiLGMpCnJldHVybiB0fSwKbk06ZnVuY3Rpb24oYSxiLGMpe3Zh
-ciB0LHMscixxCmlmKGI9PT0iIil7aWYoYT09PSIiKXJldHVybiBjCnQ9YS5sZW5ndGgKZm9yKHM9Yyxy
-PTA7cjx0OysrcilzPXMrYVtyXStjCnJldHVybiBzLmNoYXJDb2RlQXQoMCk9PTA/czpzfXE9YS5pbmRl
-eE9mKGIsMCkKaWYocTwwKXJldHVybiBhCmlmKGEubGVuZ3RoPDUwMHx8Yy5pbmRleE9mKCIkIiwwKT49
-MClyZXR1cm4gYS5zcGxpdChiKS5qb2luKGMpCnJldHVybiBhLnJlcGxhY2UobmV3IFJlZ0V4cChILmVB
-KGIpLCdnJyksSC5BNChjKSl9LApQRDpmdW5jdGlvbiBQRChhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9
-LApXVTpmdW5jdGlvbiBXVSgpe30sCkxQOmZ1bmN0aW9uIExQKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5h
-PWEKXy5iPWIKXy5jPWMKXy4kdGk9ZH0sCkxJOmZ1bmN0aW9uIExJKGEsYixjLGQsZSl7dmFyIF89dGhp
-cwpfLmE9YQpfLmM9YgpfLmQ9YwpfLmU9ZApfLmY9ZX0sCkNqOmZ1bmN0aW9uIENqKGEsYixjKXt0aGlz
-LmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClpyOmZ1bmN0aW9uIFpyKGEsYixjLGQsZSxmKXt2YXIgXz10
-aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mfSwKVzA6ZnVuY3Rpb24gVzAoYSxi
-KXt0aGlzLmE9YQp0aGlzLmI9Yn0sCmF6OmZ1bmN0aW9uIGF6KGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9
-Ygp0aGlzLmM9Y30sCnZWOmZ1bmN0aW9uIHZWKGEpe3RoaXMuYT1hfSwKYnE6ZnVuY3Rpb24gYnEoYSxi
-KXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkFtOmZ1bmN0aW9uIEFtKGEpe3RoaXMuYT1hfSwKWE86ZnVuY3Rp
-b24gWE8oYSl7dGhpcy5hPWEKdGhpcy5iPW51bGx9LApUcDpmdW5jdGlvbiBUcCgpe30sCmxjOmZ1bmN0
-aW9uIGxjKCl7fSwKeng6ZnVuY3Rpb24gengoKXt9LApyVDpmdW5jdGlvbiByVChhLGIsYyxkKXt2YXIg
-Xz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kfSwKRXE6ZnVuY3Rpb24gRXEoYSl7dGhpcy5hPWF9
-LAprWTpmdW5jdGlvbiBrWShhKXt0aGlzLmE9YX0sCk41OmZ1bmN0aW9uIE41KGEpe3ZhciBfPXRoaXMK
-Xy5hPTAKXy5mPV8uZT1fLmQ9Xy5jPV8uYj1udWxsCl8ucj0wCl8uJHRpPWF9LApkYjpmdW5jdGlvbiBk
-YihhLGIpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5kPV8uYz1udWxsfSwKaTU6ZnVuY3Rpb24gaTUo
-YSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKTjY6ZnVuY3Rpb24gTjYoYSxiLGMpe3ZhciBfPXRoaXMK
-Xy5hPWEKXy5iPWIKXy5kPV8uYz1udWxsCl8uJHRpPWN9LApkQzpmdW5jdGlvbiBkQyhhKXt0aGlzLmE9
-YX0sCndOOmZ1bmN0aW9uIHdOKGEpe3RoaXMuYT1hfSwKVlg6ZnVuY3Rpb24gVlgoYSl7dGhpcy5hPWF9
-LApWUjpmdW5jdGlvbiBWUihhLGIpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5kPV8uYz1udWxsfSwK
-RUs6ZnVuY3Rpb24gRUsoYSl7dGhpcy5iPWF9LApLVzpmdW5jdGlvbiBLVyhhLGIsYyl7dGhpcy5hPWEK
-dGhpcy5iPWIKdGhpcy5jPWN9LApQYjpmdW5jdGlvbiBQYihhLGIsYyl7dmFyIF89dGhpcwpfLmE9YQpf
-LmI9YgpfLmM9YwpfLmQ9bnVsbH0sCnRROmZ1bmN0aW9uIHRRKGEsYil7dGhpcy5hPWEKdGhpcy5jPWJ9
-LAp1bjpmdW5jdGlvbiB1bihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApTZDpmdW5j
-dGlvbiBTZChhLGIsYyl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9bnVsbH0sClhGOmZ1
-bmN0aW9uKGEpe3JldHVybiBhfSwKRFE6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBJbnQ4QXJyYXkoYSl9
-LApvZDpmdW5jdGlvbihhLGIsYyl7aWYoYT4+PjAhPT1hfHxhPj1jKXRocm93IEguYihILkhZKGIsYSkp
-fSwKck06ZnVuY3Rpb24oYSxiLGMpe3ZhciB0CmlmKCEoYT4+PjAhPT1hKSl0PWI+Pj4wIT09Ynx8YT5i
-fHxiPmMKZWxzZSB0PSEwCmlmKHQpdGhyb3cgSC5iKEguYXUoYSxiLGMpKQpyZXR1cm4gYn0sCkVUOmZ1
-bmN0aW9uIEVUKCl7fSwKYjA6ZnVuY3Rpb24gYjAoKXt9LApEZzpmdW5jdGlvbiBEZygpe30sClBnOmZ1
-bmN0aW9uIFBnKCl7fSwKeGo6ZnVuY3Rpb24geGooKXt9LApkRTpmdW5jdGlvbiBkRSgpe30sClpBOmZ1
-bmN0aW9uIFpBKCl7fSwKd2Y6ZnVuY3Rpb24gd2YoKXt9LApQcTpmdW5jdGlvbiBQcSgpe30sCmVFOmZ1
-bmN0aW9uIGVFKCl7fSwKVjY6ZnVuY3Rpb24gVjYoKXt9LApSRzpmdW5jdGlvbiBSRygpe30sClZQOmZ1
-bmN0aW9uIFZQKCl7fSwKV0I6ZnVuY3Rpb24gV0IoKXt9LApaRzpmdW5jdGlvbiBaRygpe30sCnhaOmZ1
-bmN0aW9uKGEsYil7dmFyIHQ9Yi5kCnJldHVybiB0PT1udWxsP2IuZD1ILkooYSwiYjgiLFtiLlFdKTp0
-fSwKUTE6ZnVuY3Rpb24oYSl7dmFyIHQ9YS56CmlmKHQ9PT02fHx0PT09N3x8dD09PTgpcmV0dXJuIEgu
-UTEoYS5RKQpyZXR1cm4gdD09PTExfHx0PT09MTJ9LAptRDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kYn0s
-Ck4wOmZ1bmN0aW9uKGEpe3JldHVybiBILkUodi50eXBlVW5pdmVyc2UsYSl9LApKUzpmdW5jdGlvbihh
-KXt2YXIgdD1hLiRTCmlmKHQhPW51bGwpe2lmKHR5cGVvZiB0PT0ibnVtYmVyIilyZXR1cm4gSC5CcCh0
-KQpyZXR1cm4gYS4kUygpfXJldHVybn0sClVlOmZ1bmN0aW9uKGEsYil7dmFyIHQKaWYoSC5RMShiKSlp
-ZihhIGluc3RhbmNlb2YgSC5UcCl7dD1ILkpTKGEpCmlmKHQhPW51bGwpcmV0dXJuIHR9cmV0dXJuIEgu
-eksoYSl9LAp6SzpmdW5jdGlvbihhKXt2YXIgdAppZihhIGluc3RhbmNlb2YgUC5rKXt0PWEuJHRpCnJl
-dHVybiB0IT1udWxsP3Q6SC5WVShhKX1pZihBcnJheS5pc0FycmF5KGEpKXJldHVybiBILnQ2KGEpCnJl
-dHVybiBILlZVKEouaWEoYSkpfSwKdDY6ZnVuY3Rpb24oYSl7dmFyIHQ9YS4kdGkscz11Lm0KaWYodD09
-bnVsbClyZXR1cm4gcwppZih0LmNvbnN0cnVjdG9yIT09cy5jb25zdHJ1Y3RvcilyZXR1cm4gcwpyZXR1
-cm4gdH0sCkxoOmZ1bmN0aW9uKGEpe3ZhciB0PWEuJHRpCnJldHVybiB0IT1udWxsP3Q6SC5WVShhKX0s
-ClZVOmZ1bmN0aW9uKGEpe3ZhciB0PWEuY29uc3RydWN0b3Iscz10LiRjY2FjaGUKaWYocyE9bnVsbCly
-ZXR1cm4gcwpyZXR1cm4gSC5yOShhLHQpfSwKcjk6ZnVuY3Rpb24oYSxiKXt2YXIgdD1hIGluc3RhbmNl
-b2YgSC5UcD9hLl9fcHJvdG9fXy5fX3Byb3RvX18uY29uc3RydWN0b3I6YixzPUguYWkodi50eXBlVW5p
-dmVyc2UsdC5uYW1lKQpiLiRjY2FjaGU9cwpyZXR1cm4gc30sCkJwOmZ1bmN0aW9uKGEpe3ZhciB0LHM9
-YSxyPXYudHlwZXMscT1yW3NdCmlmKHR5cGVvZiBxPT0ic3RyaW5nIil7dD1ILkUodi50eXBlVW5pdmVy
-c2UscSkKcltzXT10CnJldHVybiB0fXJldHVybiBxfSwKSko6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlz
-LHI9cy56LHE9SC5ZTwppZihILmNjKHMsITApKXtxPUguSXcKcy5iPXMuYT1ILmhufWVsc2UgaWYocj09
-PTkpe3Q9cy5kYgppZigiS04iPT09dClxPUgub2sKZWxzZSBpZigiQ1AiPT09dClxPUguS0gKZWxzZSBp
-ZigiRksiPT09dClxPUguS0gKZWxzZSBpZigicVUiPT09dClxPUguTU0KZWxzZSBpZigiYTIiPT09dClx
-PUgubAplbHNle3I9cy5RCmlmKHMuY2guZXZlcnkoSC5yTikpe3MueD0iJGkiK3IKcT1ILnQ0fX19cy5j
-PXEKcmV0dXJuIHMuYyhhKX0sCllPOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMKcmV0dXJuIEguV2Uodi50
-eXBlVW5pdmVyc2UsSC5VZShhLHQpLG51bGwsdCxudWxsLCEwKX0sCnQ0OmZ1bmN0aW9uKGEpe3ZhciB0
-PXRoaXMueAppZihhIGluc3RhbmNlb2YgUC5rKXJldHVybiEhYVt0XQpyZXR1cm4hIUouaWEoYSlbdF19
-LApPejpmdW5jdGlvbihhKXt2YXIgdAppZihhPT1udWxsKXJldHVybiBhCnQ9dGhpcwppZih0LmMoYSkp
-cmV0dXJuIGEKdGhyb3cgSC5iKEguUTUoSC5XSyhhLEguVWUoYSx0KSxILmRtKHQsbnVsbCkpKSl9LApB
-djpmdW5jdGlvbihhKXt2YXIgdAppZihhPT1udWxsKXJldHVybiBhCnQ9dGhpcwppZih0LmMoYSkpcmV0
-dXJuIGEKdGhyb3cgSC5iKEguWmMoSC5XSyhhLEguVWUoYSx0KSxILmRtKHQsbnVsbCkpKSl9LApEaDpm
-dW5jdGlvbihhLGIsYyxkKXt2YXIgdD1udWxsCmlmKEguV2Uodi50eXBlVW5pdmVyc2UsYSx0LGIsdCwh
-MCkpcmV0dXJuIGEKdGhyb3cgSC5iKEguWmMoIlRoZSB0eXBlIGFyZ3VtZW50ICciK0guZChILmRtKGEs
-dCkpKyInIGlzIG5vdCBhIHN1YnR5cGUgb2YgdGhlIHR5cGUgdmFyaWFibGUgYm91bmQgJyIrSC5kKEgu
-ZG0oYix0KSkrIicgb2YgdHlwZSB2YXJpYWJsZSAnIitjKyInIGluICciK0guZChkKSsiJy4iKSl9LApX
-SzpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9UC5wKGEpLHM9SC5kbShiPT1udWxsP0gueksoYSk6YixudWxs
-KQpyZXR1cm4gdCsiOiB0eXBlICciK0guZChzKSsiJyBpcyBub3QgYSBzdWJ0eXBlIG9mIHR5cGUgJyIr
-SC5kKGMpKyInIn0sClE1OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5oeigiQ2FzdEVycm9yOiAiK2Ep
-fSwKUHY6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IEguaHooIkNhc3RFcnJvcjogIitILldLKGEsbnVs
-bCxiKSl9LApaYzpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguaU0oIlR5cGVFcnJvcjogIithKX0sCnE6
-ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IEguaU0oIlR5cGVFcnJvcjogIitILldLKGEsbnVsbCxiKSl9
-LApJdzpmdW5jdGlvbihhKXtyZXR1cm4hMH0sCmhuOmZ1bmN0aW9uKGEpe3JldHVybiBhfSwKbDpmdW5j
-dGlvbihhKXtyZXR1cm4hMD09PWF8fCExPT09YX0sCkU5OmZ1bmN0aW9uKGEpe2lmKCEwPT09YXx8ITE9
-PT1hKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEguUHYoYSwiYm9vbCIpKX0s
-CnhkOmZ1bmN0aW9uKGEpe2lmKCEwPT09YXx8ITE9PT1hKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJu
-IGEKdGhyb3cgSC5iKEgucShhLCJib29sIikpfSwKZGo6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJu
-dW1iZXIiKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEguUHYoYSwiZG91Ymxl
-IikpfSwKSWc6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBhCmlmKGE9PW51
-bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShhLCJkb3VibGUiKSl9LApvazpmdW5jdGlvbihhKXtyZXR1
-cm4gdHlwZW9mIGE9PSJudW1iZXIiJiZNYXRoLmZsb29yKGEpPT09YX0sClNIOmZ1bmN0aW9uKGEpe2lm
-KHR5cGVvZiBhPT0ibnVtYmVyIiYmTWF0aC5mbG9vcihhKT09PWEpcmV0dXJuIGEKaWYoYT09bnVsbCly
-ZXR1cm4gYQp0aHJvdyBILmIoSC5QdihhLCJpbnQiKSl9LApTYzpmdW5jdGlvbihhKXtpZih0eXBlb2Yg
-YT09Im51bWJlciImJk1hdGguZmxvb3IoYSk9PT1hKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEK
-dGhyb3cgSC5iKEgucShhLCJpbnQiKSl9LApLSDpmdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGE9PSJu
-dW1iZXIifSwKdVU6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBhCmlmKGE9
-PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEguUHYoYSwibnVtIikpfSwKRE46ZnVuY3Rpb24oYSl7aWYo
+cCxvLG49bnVsbAppZih0eXBlb2YgYSE9InN0cmluZyIpSC52aChILnRMKGEpKQp0PS9eXHMqWystXT8o
+KDB4W2EtZjAtOV0rKXwoXGQrKXwoW2EtejAtOV0rKSlccyokL2kuZXhlYyhhKQppZih0PT1udWxsKXJl
+dHVybiBuCmlmKDM+PXQubGVuZ3RoKXJldHVybiBILk9IKHQsMykKcz1ILnkodFszXSkKaWYoYj09bnVs
+bCl7aWYocyE9bnVsbClyZXR1cm4gcGFyc2VJbnQoYSwxMCkKaWYodFsyXSE9bnVsbClyZXR1cm4gcGFy
+c2VJbnQoYSwxNikKcmV0dXJuIG59aWYoYjwyfHxiPjM2KXRocm93IEguYihQLlRFKGIsMiwzNiwicmFk
+aXgiLG4pKQppZihiPT09MTAmJnMhPW51bGwpcmV0dXJuIHBhcnNlSW50KGEsMTApCmlmKGI8MTB8fHM9
+PW51bGwpe3I9Yjw9MTA/NDcrYjo4NitiCnE9dFsxXQpmb3IocD1xLmxlbmd0aCxvPTA7bzxwOysrbylp
+ZigoQy54Qi5XKHEsbyl8MzIpPnIpcmV0dXJuIG59cmV0dXJuIHBhcnNlSW50KGEsYil9LApNOmZ1bmN0
+aW9uKGEpe3ZhciB0PUguSDUoYSkKcmV0dXJuIHR9LApINTpmdW5jdGlvbihhKXt2YXIgdCxzLHIKaWYo
+YSBpbnN0YW5jZW9mIFAuaylyZXR1cm4gSC5kbShILnpLKGEpLG51bGwpCmlmKEouaWEoYSk9PT1DLk9r
+fHx1LmFrLmMoYSkpe3Q9Qy5PNChhKQppZihILmYodCkpcmV0dXJuIHQKcz1hLmNvbnN0cnVjdG9yCmlm
+KHR5cGVvZiBzPT0iZnVuY3Rpb24iKXtyPXMubmFtZQppZih0eXBlb2Ygcj09InN0cmluZyImJkguZihy
+KSlyZXR1cm4gcn19cmV0dXJuIEguZG0oSC56SyhhKSxudWxsKX0sCmY6ZnVuY3Rpb24oYSl7dmFyIHQ9
+YSE9PSJPYmplY3QiJiZhIT09IiIKcmV0dXJuIHR9LApNMDpmdW5jdGlvbigpe2lmKCEhc2VsZi5sb2Nh
+dGlvbilyZXR1cm4gc2VsZi5sb2NhdGlvbi5ocmVmCnJldHVybiBudWxsfSwKVks6ZnVuY3Rpb24oYSl7
+dmFyIHQscyxyLHEscD1hLmxlbmd0aAppZihwPD01MDApcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUu
+YXBwbHkobnVsbCxhKQpmb3IodD0iIixzPTA7czxwO3M9cil7cj1zKzUwMApxPXI8cD9yOnAKdCs9U3Ry
+aW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGEuc2xpY2UocyxxKSl9cmV0dXJuIHR9LApQTDpmdW5j
+dGlvbihhKXt2YXIgdCxzLHIscT1ILlZNKFtdLHUudCkKZm9yKHQ9YS5sZW5ndGgscz0wO3M8YS5sZW5n
+dGg7YS5sZW5ndGg9PT10fHwoMCxILmxrKShhKSwrK3Mpe3I9YVtzXQppZighSC5vayhyKSl0aHJvdyBI
+LmIoSC50TChyKSkKaWYocjw9NjU1MzUpQy5ObS5pKHEscikKZWxzZSBpZihyPD0xMTE0MTExKXtDLk5t
+LmkocSw1NTI5NisoQy5qbi53RyhyLTY1NTM2LDEwKSYxMDIzKSkKQy5ObS5pKHEsNTYzMjArKHImMTAy
+MykpfWVsc2UgdGhyb3cgSC5iKEgudEwocikpfXJldHVybiBILlZLKHEpfSwKZVQ6ZnVuY3Rpb24oYSl7
+dmFyIHQscyxyCmZvcih0PWEubGVuZ3RoLHM9MDtzPHQ7KytzKXtyPWFbc10KaWYoIUgub2socikpdGhy
+b3cgSC5iKEgudEwocikpCmlmKHI8MCl0aHJvdyBILmIoSC50TChyKSkKaWYocj42NTUzNSlyZXR1cm4g
+SC5QTChhKX1yZXR1cm4gSC5WSyhhKX0sCmZ3OmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscQppZihj
+PD01MDAmJmI9PT0wJiZjPT09YS5sZW5ndGgpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHko
+bnVsbCxhKQpmb3IodD1iLHM9IiI7dDxjO3Q9cil7cj10KzUwMApxPXI8Yz9yOmMKcys9U3RyaW5nLmZy
+b21DaGFyQ29kZS5hcHBseShudWxsLGEuc3ViYXJyYXkodCxxKSl9cmV0dXJuIHN9LApMdzpmdW5jdGlv
+bihhKXt2YXIgdAppZigwPD1hKXtpZihhPD02NTUzNSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShh
+KQppZihhPD0xMTE0MTExKXt0PWEtNjU1MzYKcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoKDU1Mjk2
+fEMuam4ud0codCwxMCkpPj4+MCw1NjMyMHx0JjEwMjMpfX10aHJvdyBILmIoUC5URShhLDAsMTExNDEx
+MSxudWxsLG51bGwpKX0sCm8yOmZ1bmN0aW9uKGEpe2lmKGEuZGF0ZT09PXZvaWQgMClhLmRhdGU9bmV3
+IERhdGUoYS5hKQpyZXR1cm4gYS5kYXRlfSwKdEo6ZnVuY3Rpb24oYSl7dmFyIHQ9SC5vMihhKS5nZXRG
+dWxsWWVhcigpKzAKcmV0dXJuIHR9LApOUzpmdW5jdGlvbihhKXt2YXIgdD1ILm8yKGEpLmdldE1vbnRo
+KCkrMQpyZXR1cm4gdH0sCmpBOmZ1bmN0aW9uKGEpe3ZhciB0PUgubzIoYSkuZ2V0RGF0ZSgpKzAKcmV0
+dXJuIHR9LApLTDpmdW5jdGlvbihhKXt2YXIgdD1ILm8yKGEpLmdldEhvdXJzKCkrMApyZXR1cm4gdH0s
+CmNoOmZ1bmN0aW9uKGEpe3ZhciB0PUgubzIoYSkuZ2V0TWludXRlcygpKzAKcmV0dXJuIHR9LApKZDpm
+dW5jdGlvbihhKXt2YXIgdD1ILm8yKGEpLmdldFNlY29uZHMoKSswCnJldHVybiB0fSwKbzE6ZnVuY3Rp
+b24oYSl7dmFyIHQ9SC5vMihhKS5nZXRNaWxsaXNlY29uZHMoKSswCnJldHVybiB0fSwKem86ZnVuY3Rp
+b24oYSxiLGMpe3ZhciB0LHMscj17fQpyLmE9MAp0PVtdCnM9W10Kci5hPWIubGVuZ3RoCkMuTm0uRlYo
+dCxiKQpyLmI9IiIKaWYoYyE9bnVsbCYmYy5hIT09MCljLksoMCxuZXcgSC5DaihyLHMsdCkpCiIiK3Iu
+YQpyZXR1cm4gSi5KeShhLG5ldyBILkxJKEMuVGUsMCx0LHMsMCkpfSwKRWs6ZnVuY3Rpb24oYSxiLGMp
+e3ZhciB0LHMscixxCmlmKGIgaW5zdGFuY2VvZiBBcnJheSl0PWM9PW51bGx8fGMuYT09PTAKZWxzZSB0
+PSExCmlmKHQpe3M9YgpyPXMubGVuZ3RoCmlmKHI9PT0wKXtpZighIWEuJDApcmV0dXJuIGEuJDAoKX1l
+bHNlIGlmKHI9PT0xKXtpZighIWEuJDEpcmV0dXJuIGEuJDEoc1swXSl9ZWxzZSBpZihyPT09Mil7aWYo
+ISFhLiQyKXJldHVybiBhLiQyKHNbMF0sc1sxXSl9ZWxzZSBpZihyPT09Myl7aWYoISFhLiQzKXJldHVy
+biBhLiQzKHNbMF0sc1sxXSxzWzJdKX1lbHNlIGlmKHI9PT00KXtpZighIWEuJDQpcmV0dXJuIGEuJDQo
+c1swXSxzWzFdLHNbMl0sc1szXSl9ZWxzZSBpZihyPT09NSlpZighIWEuJDUpcmV0dXJuIGEuJDUoc1sw
+XSxzWzFdLHNbMl0sc1szXSxzWzRdKQpxPWFbIiIrIiQiK3JdCmlmKHEhPW51bGwpcmV0dXJuIHEuYXBw
+bHkoYSxzKX1yZXR1cm4gSC5FdyhhLGIsYyl9LApFdzpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHEs
+cCxvLG4sbSxsLGs9YiBpbnN0YW5jZW9mIEFycmF5P2I6UC5DSChiLCEwLHUueiksaj1rLmxlbmd0aCxp
+PWEuJFIKaWYoajxpKXJldHVybiBILnpvKGEsayxjKQp0PWEuJEQKcz10PT1udWxsCnI9IXM/dCgpOm51
+bGwKcT1KLmlhKGEpCnA9cS4kQwppZih0eXBlb2YgcD09InN0cmluZyIpcD1xW3BdCmlmKHMpe2lmKGMh
+PW51bGwmJmMuYSE9PTApcmV0dXJuIEguem8oYSxrLGMpCmlmKGo9PT1pKXJldHVybiBwLmFwcGx5KGEs
+aykKcmV0dXJuIEguem8oYSxrLGMpfWlmKHIgaW5zdGFuY2VvZiBBcnJheSl7aWYoYyE9bnVsbCYmYy5h
+IT09MClyZXR1cm4gSC56byhhLGssYykKaWYoaj5pK3IubGVuZ3RoKXJldHVybiBILnpvKGEsayxudWxs
+KQpDLk5tLkZWKGssci5zbGljZShqLWkpKQpyZXR1cm4gcC5hcHBseShhLGspfWVsc2V7aWYoaj5pKXJl
+dHVybiBILnpvKGEsayxjKQpvPU9iamVjdC5rZXlzKHIpCmlmKGM9PW51bGwpZm9yKHM9by5sZW5ndGgs
+bj0wO248by5sZW5ndGg7by5sZW5ndGg9PT1zfHwoMCxILmxrKShvKSwrK24pQy5ObS5pKGsscltILnko
+b1tuXSldKQplbHNle2ZvcihzPW8ubGVuZ3RoLG09MCxuPTA7bjxvLmxlbmd0aDtvLmxlbmd0aD09PXN8
+fCgwLEgubGspKG8pLCsrbil7bD1ILnkob1tuXSkKaWYoYy54NChsKSl7KyttCkMuTm0uaShrLGMucSgw
+LGwpKX1lbHNlIEMuTm0uaShrLHJbbF0pfWlmKG0hPT1jLmEpcmV0dXJuIEguem8oYSxrLGMpfXJldHVy
+biBwLmFwcGx5KGEsayl9fSwKcFk6ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKEgudEwoYSkpfSwKT0g6ZnVu
+Y3Rpb24oYSxiKXtpZihhPT1udWxsKUouSG0oYSkKdGhyb3cgSC5iKEguSFkoYSxiKSl9LApIWTpmdW5j
+dGlvbihhLGIpe3ZhciB0LHMscj0iaW5kZXgiCmlmKCFILm9rKGIpKXJldHVybiBuZXcgUC51KCEwLGIs
+cixudWxsKQp0PUguU2MoSi5IbShhKSkKaWYoIShiPDApKXtpZih0eXBlb2YgdCE9PSJudW1iZXIiKXJl
+dHVybiBILnBZKHQpCnM9Yj49dH1lbHNlIHM9ITAKaWYocylyZXR1cm4gUC5DZihiLGEscixudWxsLHQp
+CnJldHVybiBQLngoYixyKX0sCmF1OmZ1bmN0aW9uKGEsYixjKXt2YXIgdD0iSW52YWxpZCB2YWx1ZSIK
+aWYoYT5jKXJldHVybiBuZXcgUC5iSigwLGMsITAsYSwic3RhcnQiLHQpCmlmKGIhPW51bGwpe2lmKCFI
+Lm9rKGIpKXJldHVybiBuZXcgUC51KCEwLGIsImVuZCIsbnVsbCkKaWYoYjxhfHxiPmMpcmV0dXJuIG5l
+dyBQLmJKKGEsYywhMCxiLCJlbmQiLHQpfXJldHVybiBuZXcgUC51KCEwLGIsImVuZCIsbnVsbCl9LAp0
+TDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAudSghMCxhLG51bGwsbnVsbCl9LApiOmZ1bmN0aW9uKGEp
+e3ZhciB0CmlmKGE9PW51bGwpYT1uZXcgUC5uKCkKdD1uZXcgRXJyb3IoKQp0LmRhcnRFeGNlcHRpb249
+YQppZigiZGVmaW5lUHJvcGVydHkiIGluIE9iamVjdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIm1l
+c3NhZ2UiLHtnZXQ6SC5ofSkKdC5uYW1lPSIifWVsc2UgdC50b1N0cmluZz1ILmgKcmV0dXJuIHR9LApo
+OmZ1bmN0aW9uKCl7cmV0dXJuIEouaih0aGlzLmRhcnRFeGNlcHRpb24pfSwKdmg6ZnVuY3Rpb24oYSl7
+dGhyb3cgSC5iKGEpfSwKbGs6ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKFAuYTQoYSkpfSwKY006ZnVuY3Rp
+b24oYSl7dmFyIHQscyxyLHEscCxvCmE9SC5lQShhLnJlcGxhY2UoU3RyaW5nKHt9KSwnJHJlY2VpdmVy
+JCcpKQp0PWEubWF0Y2goL1xcXCRbYS16QS1aXStcXFwkL2cpCmlmKHQ9PW51bGwpdD1ILlZNKFtdLHUu
+cykKcz10LmluZGV4T2YoIlxcJGFyZ3VtZW50c1xcJCIpCnI9dC5pbmRleE9mKCJcXCRhcmd1bWVudHNF
+eHByXFwkIikKcT10LmluZGV4T2YoIlxcJGV4cHJcXCQiKQpwPXQuaW5kZXhPZigiXFwkbWV0aG9kXFwk
+IikKbz10LmluZGV4T2YoIlxcJHJlY2VpdmVyXFwkIikKcmV0dXJuIG5ldyBILmY5KGEucmVwbGFjZShu
+ZXcgUmVnRXhwKCdcXFxcXFwkYXJndW1lbnRzXFxcXFxcJCcsJ2cnKSwnKCg/Onh8W154XSkqKScpLnJl
+cGxhY2UobmV3IFJlZ0V4cCgnXFxcXFxcJGFyZ3VtZW50c0V4cHJcXFxcXFwkJywnZycpLCcoKD86eHxb
+XnhdKSopJykucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcXFwkZXhwclxcXFxcXCQnLCdnJyksJygoPzp4
+fFteeF0pKiknKS5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFxcXCRtZXRob2RcXFxcXFwkJywnZycpLCco
+KD86eHxbXnhdKSopJykucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcXFwkcmVjZWl2ZXJcXFxcXFwkJywn
+ZycpLCcoKD86eHxbXnhdKSopJykscyxyLHEscCxvKX0sClM3OmZ1bmN0aW9uKGEpe3JldHVybiBmdW5j
+dGlvbigkZXhwciQpe3ZhciAkYXJndW1lbnRzRXhwciQ9JyRhcmd1bWVudHMkJwp0cnl7JGV4cHIkLiRt
+ZXRob2QkKCRhcmd1bWVudHNFeHByJCl9Y2F0Y2godCl7cmV0dXJuIHQubWVzc2FnZX19KGEpfSwKTWo6
+ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCRleHByJCl7dHJ5eyRleHByJC4kbWV0aG9kJH1jYXRj
+aCh0KXtyZXR1cm4gdC5tZXNzYWdlfX0oYSl9LApJajpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgSC5X
+MChhLGI9PW51bGw/bnVsbDpiLm1ldGhvZCl9LApUMzpmdW5jdGlvbihhLGIpe3ZhciB0PWI9PW51bGws
+cz10P251bGw6Yi5tZXRob2QKcmV0dXJuIG5ldyBILmF6KGEscyx0P251bGw6Yi5yZWNlaXZlcil9LApS
+dTpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGY9bnVsbCxlPW5ldyBI
+LkFtKGEpCmlmKGE9PW51bGwpcmV0dXJuIGYKaWYoYSBpbnN0YW5jZW9mIEguYnEpcmV0dXJuIGUuJDEo
+YS5hKQppZih0eXBlb2YgYSE9PSJvYmplY3QiKXJldHVybiBhCmlmKCJkYXJ0RXhjZXB0aW9uIiBpbiBh
+KXJldHVybiBlLiQxKGEuZGFydEV4Y2VwdGlvbikKZWxzZSBpZighKCJtZXNzYWdlIiBpbiBhKSlyZXR1
+cm4gYQp0PWEubWVzc2FnZQppZigibnVtYmVyIiBpbiBhJiZ0eXBlb2YgYS5udW1iZXI9PSJudW1iZXIi
+KXtzPWEubnVtYmVyCnI9cyY2NTUzNQppZigoQy5qbi53RyhzLDE2KSY4MTkxKT09PTEwKXN3aXRjaChy
+KXtjYXNlIDQzODpyZXR1cm4gZS4kMShILlQzKEguZCh0KSsiIChFcnJvciAiK3IrIikiLGYpKQpjYXNl
+IDQ0NTpjYXNlIDUwMDc6cmV0dXJuIGUuJDEoSC5JaihILmQodCkrIiAoRXJyb3IgIityKyIpIixmKSl9
+fWlmKGEgaW5zdGFuY2VvZiBUeXBlRXJyb3Ipe3E9JC5TbigpCnA9JC5scSgpCm89JC5OOSgpCm49JC5p
+SSgpCm09JC5LZigpCmw9JC5aaCgpCms9JC5yTigpCiQuYzMoKQpqPSQuSEsoKQppPSQucjEoKQpoPXEu
+cVModCkKaWYoaCE9bnVsbClyZXR1cm4gZS4kMShILlQzKEgueSh0KSxoKSkKZWxzZXtoPXAucVModCkK
+aWYoaCE9bnVsbCl7aC5tZXRob2Q9ImNhbGwiCnJldHVybiBlLiQxKEguVDMoSC55KHQpLGgpKX1lbHNl
+e2g9by5xUyh0KQppZihoPT1udWxsKXtoPW4ucVModCkKaWYoaD09bnVsbCl7aD1tLnFTKHQpCmlmKGg9
+PW51bGwpe2g9bC5xUyh0KQppZihoPT1udWxsKXtoPWsucVModCkKaWYoaD09bnVsbCl7aD1uLnFTKHQp
+CmlmKGg9PW51bGwpe2g9ai5xUyh0KQppZihoPT1udWxsKXtoPWkucVModCkKZz1oIT1udWxsfWVsc2Ug
+Zz0hMH1lbHNlIGc9ITB9ZWxzZSBnPSEwfWVsc2UgZz0hMH1lbHNlIGc9ITB9ZWxzZSBnPSEwfWVsc2Ug
+Zz0hMAppZihnKXJldHVybiBlLiQxKEguSWooSC55KHQpLGgpKX19cmV0dXJuIGUuJDEobmV3IEgudlYo
+dHlwZW9mIHQ9PSJzdHJpbmciP3Q6IiIpKX1pZihhIGluc3RhbmNlb2YgUmFuZ2VFcnJvcil7aWYodHlw
+ZW9mIHQ9PSJzdHJpbmciJiZ0LmluZGV4T2YoImNhbGwgc3RhY2siKSE9PS0xKXJldHVybiBuZXcgUC5L
+WSgpCnQ9ZnVuY3Rpb24oYil7dHJ5e3JldHVybiBTdHJpbmcoYil9Y2F0Y2goZCl7fXJldHVybiBudWxs
+fShhKQpyZXR1cm4gZS4kMShuZXcgUC51KCExLGYsZix0eXBlb2YgdD09InN0cmluZyI/dC5yZXBsYWNl
+KC9eUmFuZ2VFcnJvcjpccyovLCIiKTp0KSl9aWYodHlwZW9mIEludGVybmFsRXJyb3I9PSJmdW5jdGlv
+biImJmEgaW5zdGFuY2VvZiBJbnRlcm5hbEVycm9yKWlmKHR5cGVvZiB0PT0ic3RyaW5nIiYmdD09PSJ0
+b28gbXVjaCByZWN1cnNpb24iKXJldHVybiBuZXcgUC5LWSgpCnJldHVybiBhfSwKdHM6ZnVuY3Rpb24o
+YSl7dmFyIHQKaWYoYSBpbnN0YW5jZW9mIEguYnEpcmV0dXJuIGEuYgppZihhPT1udWxsKXJldHVybiBu
+ZXcgSC5YTyhhKQp0PWEuJGNhY2hlZFRyYWNlCmlmKHQhPW51bGwpcmV0dXJuIHQKcmV0dXJuIGEuJGNh
+Y2hlZFRyYWNlPW5ldyBILlhPKGEpfSwKQjc6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscT1hLmxlbmd0
+aApmb3IodD0wO3Q8cTt0PXIpe3M9dCsxCnI9cysxCmIuWSgwLGFbdF0sYVtzXSl9cmV0dXJuIGJ9LApm
+dDpmdW5jdGlvbihhLGIsYyxkLGUsZil7dS5aLmIoYSkKc3dpdGNoKEguU2MoYikpe2Nhc2UgMDpyZXR1
+cm4gYS4kMCgpCmNhc2UgMTpyZXR1cm4gYS4kMShjKQpjYXNlIDI6cmV0dXJuIGEuJDIoYyxkKQpjYXNl
+IDM6cmV0dXJuIGEuJDMoYyxkLGUpCmNhc2UgNDpyZXR1cm4gYS4kNChjLGQsZSxmKX10aHJvdyBILmIo
+bmV3IFAuQ0QoIlVuc3VwcG9ydGVkIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIHdyYXBwZWQgY2xvc3Vy
+ZSIpKX0sCnRSOmZ1bmN0aW9uKGEsYil7dmFyIHQKaWYoYT09bnVsbClyZXR1cm4gbnVsbAp0PWEuJGlk
+ZW50aXR5CmlmKCEhdClyZXR1cm4gdAp0PWZ1bmN0aW9uKGMsZCxlKXtyZXR1cm4gZnVuY3Rpb24oZixn
+LGgsaSl7cmV0dXJuIGUoYyxkLGYsZyxoLGkpfX0oYSxiLEguZnQpCmEuJGlkZW50aXR5PXQKcmV0dXJu
+IHR9LAppQTpmdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIgdCxzLHIscSxwLG8sbixtLGw9bnVsbCxr
+PWJbMF0saj1rLiRjYWxsTmFtZSxpPWU/T2JqZWN0LmNyZWF0ZShuZXcgSC56eCgpLmNvbnN0cnVjdG9y
+LnByb3RvdHlwZSk6T2JqZWN0LmNyZWF0ZShuZXcgSC5yVChsLGwsbCxsKS5jb25zdHJ1Y3Rvci5wcm90
+b3R5cGUpCmkuJGluaXRpYWxpemU9aS5jb25zdHJ1Y3RvcgppZihlKXQ9ZnVuY3Rpb24gc3RhdGljX3Rl
+YXJfb2ZmKCl7dGhpcy4kaW5pdGlhbGl6ZSgpfQplbHNle3M9JC55agppZih0eXBlb2YgcyE9PSJudW1i
+ZXIiKXJldHVybiBzLmgoKQokLnlqPXMrMQpzPW5ldyBGdW5jdGlvbigiYSxiLGMsZCIrcywidGhpcy4k
+aW5pdGlhbGl6ZShhLGIsYyxkIitzKyIpIikKdD1zfWkuY29uc3RydWN0b3I9dAp0LnByb3RvdHlwZT1p
+CmlmKCFlKXtyPUguYngoYSxrLGYpCnIuJHJlZmxlY3Rpb25JbmZvPWR9ZWxzZXtpLiRzdGF0aWNfbmFt
+ZT1nCnI9a31xPUguaW0oZCxlLGYpCmkuJFM9cQppW2pdPXIKZm9yKHA9cixvPTE7bzxiLmxlbmd0aDsr
+K28pe249YltvXQptPW4uJGNhbGxOYW1lCmlmKG0hPW51bGwpe249ZT9uOkguYngoYSxuLGYpCmlbbV09
+bn1pZihvPT09Yyl7bi4kcmVmbGVjdGlvbkluZm89ZApwPW59fWkuJEM9cAppLiRSPWsuJFIKaS4kRD1r
+LiRECnJldHVybiB0fSwKaW06ZnVuY3Rpb24oYSxiLGMpe3ZhciB0CmlmKHR5cGVvZiBhPT0ibnVtYmVy
+IilyZXR1cm4gZnVuY3Rpb24oZCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZChlKX19KEguQnAs
+YSkKaWYodHlwZW9mIGE9PSJzdHJpbmciKXtpZihiKXRocm93IEguYigiQ2Fubm90IGNvbXB1dGUgc2ln
+bmF0dXJlIGZvciBzdGF0aWMgdGVhcm9mZi4iKQp0PWM/SC5QVzpILlRuCnJldHVybiBmdW5jdGlvbihk
+LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlKHRoaXMsZCl9fShhLHQpfXRocm93IEguYigiRXJy
+b3IgaW4gZnVuY3Rpb25UeXBlIG9mIHRlYXJvZmYiKX0sCnZxOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0
+PUguRFYKc3dpdGNoKGI/LTE6YSl7Y2FzZSAwOnJldHVybiBmdW5jdGlvbihlLGYpe3JldHVybiBmdW5j
+dGlvbigpe3JldHVybiBmKHRoaXMpW2VdKCl9fShjLHQpCmNhc2UgMTpyZXR1cm4gZnVuY3Rpb24oZSxm
+KXtyZXR1cm4gZnVuY3Rpb24oZyl7cmV0dXJuIGYodGhpcylbZV0oZyl9fShjLHQpCmNhc2UgMjpyZXR1
+cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm4gZnVuY3Rpb24oZyxoKXtyZXR1cm4gZih0aGlzKVtlXShnLGgp
+fX0oYyx0KQpjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKGUsZil7cmV0dXJuIGZ1bmN0aW9uKGcsaCxpKXty
+ZXR1cm4gZih0aGlzKVtlXShnLGgsaSl9fShjLHQpCmNhc2UgNDpyZXR1cm4gZnVuY3Rpb24oZSxmKXty
+ZXR1cm4gZnVuY3Rpb24oZyxoLGksail7cmV0dXJuIGYodGhpcylbZV0oZyxoLGksail9fShjLHQpCmNh
+c2UgNTpyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm4gZnVuY3Rpb24oZyxoLGksaixrKXtyZXR1cm4g
+Zih0aGlzKVtlXShnLGgsaSxqLGspfX0oYyx0KQpkZWZhdWx0OnJldHVybiBmdW5jdGlvbihlLGYpe3Jl
+dHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KGYodGhpcyksYXJndW1lbnRzKX19KGQsdCl9fSwK
+Yng6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscixxLHAsbyxuCmlmKGMpcmV0dXJuIEguSGYoYSxiKQp0
+PWIuJHN0dWJOYW1lCnM9Yi5sZW5ndGgKcj1hW3RdCnE9Yj09bnVsbD9yPT1udWxsOmI9PT1yCnA9IXF8
+fHM+PTI3CmlmKHApcmV0dXJuIEgudnEocywhcSx0LGIpCmlmKHM9PT0wKXtxPSQueWoKaWYodHlwZW9m
+IHEhPT0ibnVtYmVyIilyZXR1cm4gcS5oKCkKJC55aj1xKzEKbz0ic2VsZiIrcQpxPSJyZXR1cm4gZnVu
+Y3Rpb24oKXt2YXIgIitvKyIgPSB0aGlzLiIKcD0kLm1KCnJldHVybiBuZXcgRnVuY3Rpb24ocStILmQo
+cD09bnVsbD8kLm1KPUguRTIoInNlbGYiKTpwKSsiO3JldHVybiAiK28rIi4iK0guZCh0KSsiKCk7fSIp
+KCl9bj0iYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLnNwbGl0KCIiKS5zcGxpY2UoMCxzKS5qb2lu
+KCIsIikKcT0kLnlqCmlmKHR5cGVvZiBxIT09Im51bWJlciIpcmV0dXJuIHEuaCgpCiQueWo9cSsxCm4r
+PXEKcT0icmV0dXJuIGZ1bmN0aW9uKCIrbisiKXtyZXR1cm4gdGhpcy4iCnA9JC5tSgpyZXR1cm4gbmV3
+IEZ1bmN0aW9uKHErSC5kKHA9PW51bGw/JC5tSj1ILkUyKCJzZWxmIik6cCkrIi4iK0guZCh0KSsiKCIr
+bisiKTt9IikoKX0sClo0OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0PUguRFYscz1ILnlTCnN3aXRjaChi
+Py0xOmEpe2Nhc2UgMDp0aHJvdyBILmIoSC5FZigiSW50ZXJjZXB0ZWQgZnVuY3Rpb24gd2l0aCBubyBh
+cmd1bWVudHMuIikpCmNhc2UgMTpyZXR1cm4gZnVuY3Rpb24oZSxmLGcpe3JldHVybiBmdW5jdGlvbigp
+e3JldHVybiBmKHRoaXMpW2VdKGcodGhpcykpfX0oYyx0LHMpCmNhc2UgMjpyZXR1cm4gZnVuY3Rpb24o
+ZSxmLGcpe3JldHVybiBmdW5jdGlvbihoKXtyZXR1cm4gZih0aGlzKVtlXShnKHRoaXMpLGgpfX0oYyx0
+LHMpCmNhc2UgMzpyZXR1cm4gZnVuY3Rpb24oZSxmLGcpe3JldHVybiBmdW5jdGlvbihoLGkpe3JldHVy
+biBmKHRoaXMpW2VdKGcodGhpcyksaCxpKX19KGMsdCxzKQpjYXNlIDQ6cmV0dXJuIGZ1bmN0aW9uKGUs
+ZixnKXtyZXR1cm4gZnVuY3Rpb24oaCxpLGope3JldHVybiBmKHRoaXMpW2VdKGcodGhpcyksaCxpLGop
+fX0oYyx0LHMpCmNhc2UgNTpyZXR1cm4gZnVuY3Rpb24oZSxmLGcpe3JldHVybiBmdW5jdGlvbihoLGks
+aixrKXtyZXR1cm4gZih0aGlzKVtlXShnKHRoaXMpLGgsaSxqLGspfX0oYyx0LHMpCmNhc2UgNjpyZXR1
+cm4gZnVuY3Rpb24oZSxmLGcpe3JldHVybiBmdW5jdGlvbihoLGksaixrLGwpe3JldHVybiBmKHRoaXMp
+W2VdKGcodGhpcyksaCxpLGosayxsKX19KGMsdCxzKQpkZWZhdWx0OnJldHVybiBmdW5jdGlvbihlLGYs
+ZyxoKXtyZXR1cm4gZnVuY3Rpb24oKXtoPVtnKHRoaXMpXQpBcnJheS5wcm90b3R5cGUucHVzaC5hcHBs
+eShoLGFyZ3VtZW50cykKcmV0dXJuIGUuYXBwbHkoZih0aGlzKSxoKX19KGQsdCxzKX19LApIZjpmdW5j
+dGlvbihhLGIpe3ZhciB0LHMscixxLHAsbyxuLG09JC5tSgppZihtPT1udWxsKW09JC5tSj1ILkUyKCJz
+ZWxmIikKdD0kLlA0CmlmKHQ9PW51bGwpdD0kLlA0PUguRTIoInJlY2VpdmVyIikKcz1iLiRzdHViTmFt
+ZQpyPWIubGVuZ3RoCnE9YVtzXQpwPWI9PW51bGw/cT09bnVsbDpiPT09cQpvPSFwfHxyPj0yOAppZihv
+KXJldHVybiBILlo0KHIsIXAscyxiKQppZihyPT09MSl7bT0icmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJu
+IHRoaXMuIitILmQobSkrIi4iK0guZChzKSsiKHRoaXMuIitILmQodCkrIik7Igp0PSQueWoKaWYodHlw
+ZW9mIHQhPT0ibnVtYmVyIilyZXR1cm4gdC5oKCkKJC55aj10KzEKcmV0dXJuIG5ldyBGdW5jdGlvbiht
+K3QrIn0iKSgpfW49ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ii5zcGxpdCgiIikuc3BsaWNlKDAs
+ci0xKS5qb2luKCIsIikKbT0icmV0dXJuIGZ1bmN0aW9uKCIrbisiKXtyZXR1cm4gdGhpcy4iK0guZCht
+KSsiLiIrSC5kKHMpKyIodGhpcy4iK0guZCh0KSsiLCAiK24rIik7Igp0PSQueWoKaWYodHlwZW9mIHQh
+PT0ibnVtYmVyIilyZXR1cm4gdC5oKCkKJC55aj10KzEKcmV0dXJuIG5ldyBGdW5jdGlvbihtK3QrIn0i
+KSgpfSwKS3E6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7cmV0dXJuIEguaUEoYSxiLGMsZCwhIWUsISFm
+LGcpfSwKVG46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5jRSh2LnR5cGVVbml2ZXJzZSxILnpLKGEuYSks
+Yil9LApQVzpmdW5jdGlvbihhLGIpe3JldHVybiBILmNFKHYudHlwZVVuaXZlcnNlLEgueksoYS5jKSxi
+KX0sCkRWOmZ1bmN0aW9uKGEpe3JldHVybiBhLmF9LAp5UzpmdW5jdGlvbihhKXtyZXR1cm4gYS5jfSwK
+RTI6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHE9bmV3IEguclQoInNlbGYiLCJ0YXJnZXQiLCJyZWNlaXZl
+ciIsIm5hbWUiKSxwPUouRXAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocSkpCmZvcih0PXAubGVu
+Z3RoLHM9MDtzPHQ7KytzKXtyPXBbc10KaWYocVtyXT09PWEpcmV0dXJuIHJ9fSwKb1Q6ZnVuY3Rpb24o
+YSl7aWYoYT09bnVsbClILmZPKCJib29sZWFuIGV4cHJlc3Npb24gbXVzdCBub3QgYmUgbnVsbCIpCnJl
+dHVybiBhfSwKZk86ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKG5ldyBILmtZKGEpKX0sCmFnOmZ1bmN0aW9u
+KGEpe3Rocm93IEguYihuZXcgUC5jKGEpKX0sCkVmOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5FcShh
+KX0sCllnOmZ1bmN0aW9uKGEpe3JldHVybiB2LmdldElzb2xhdGVUYWcoYSl9LApWTTpmdW5jdGlvbihh
+LGIpe2EuJHRpPWIKcmV0dXJuIGF9LApvWDpmdW5jdGlvbihhKXtpZihhPT1udWxsKXJldHVybiBudWxs
+CnJldHVybiBhLiR0aX0sCklNOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSC5ZOShhWyIkYSIrSC5kKGMp
+XSxILm9YKGIpKX0sClk5OmZ1bmN0aW9uKGEsYil7aWYoYT09bnVsbClyZXR1cm4gYgphPWEuYXBwbHko
+bnVsbCxiKQppZihhPT1udWxsKXJldHVybiBudWxsCmlmKEFycmF5LmlzQXJyYXkoYSkpcmV0dXJuIGEK
+aWYodHlwZW9mIGE9PSJmdW5jdGlvbiIpcmV0dXJuIGEuYXBwbHkobnVsbCxiKQpyZXR1cm4gYn0sCklH
+OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYS5hcHBseShiLEguWTkoSi5pYShiKVsiJGEiK0guZChjKV0s
+SC5vWChiKSkpfSwKaXc6ZnVuY3Rpb24oYSxiLGMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse3Zh
+bHVlOmMsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfSl9LAp3
+MzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwPUgueSgkLk5GLiQxKGEpKSxvPSQubndbcF0KaWYobyE9
+bnVsbCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsdi5kaXNwYXRjaFByb3BlcnR5TmFtZSx7dmFsdWU6
+byxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9KQpyZXR1cm4g
+by5pfXQ9JC52dltwXQppZih0IT1udWxsKXJldHVybiB0CnM9di5pbnRlcmNlcHRvcnNCeVRhZ1twXQpp
+ZihzPT1udWxsKXtwPUgueSgkLlRYLiQyKGEscCkpCmlmKHAhPW51bGwpe289JC5ud1twXQppZihvIT1u
+dWxsKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSx2LmRpc3BhdGNoUHJvcGVydHlOYW1lLHt2YWx1ZTpv
+LGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0pCnJldHVybiBv
+Lml9dD0kLnZ2W3BdCmlmKHQhPW51bGwpcmV0dXJuIHQKcz12LmludGVyY2VwdG9yc0J5VGFnW3BdfX1p
+ZihzPT1udWxsKXJldHVybiBudWxsCnQ9cy5wcm90b3R5cGUKcj1wWzBdCmlmKHI9PT0iISIpe289SC5W
+YSh0KQokLm53W3BdPW8KT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsdi5kaXNwYXRjaFByb3BlcnR5TmFt
+ZSx7dmFsdWU6byxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9
+KQpyZXR1cm4gby5pfWlmKHI9PT0ifiIpeyQudnZbcF09dApyZXR1cm4gdH1pZihyPT09Ii0iKXtxPUgu
+VmEodCkKT2JqZWN0LmRlZmluZVByb3BlcnR5KE9iamVjdC5nZXRQcm90b3R5cGVPZihhKSx2LmRpc3Bh
+dGNoUHJvcGVydHlOYW1lLHt2YWx1ZTpxLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25m
+aWd1cmFibGU6dHJ1ZX0pCnJldHVybiBxLml9aWYocj09PSIrIilyZXR1cm4gSC5MYyhhLHQpCmlmKHI9
+PT0iKiIpdGhyb3cgSC5iKFAuU1kocCkpCmlmKHYubGVhZlRhZ3NbcF09PT10cnVlKXtxPUguVmEodCkK
+T2JqZWN0LmRlZmluZVByb3BlcnR5KE9iamVjdC5nZXRQcm90b3R5cGVPZihhKSx2LmRpc3BhdGNoUHJv
+cGVydHlOYW1lLHt2YWx1ZTpxLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFi
+bGU6dHJ1ZX0pCnJldHVybiBxLml9ZWxzZSByZXR1cm4gSC5MYyhhLHQpfSwKTGM6ZnVuY3Rpb24oYSxi
+KXt2YXIgdD1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYSkKT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsdi5k
+aXNwYXRjaFByb3BlcnR5TmFtZSx7dmFsdWU6Si5RdShiLHQsbnVsbCxudWxsKSxlbnVtZXJhYmxlOmZh
+bHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9KQpyZXR1cm4gYn0sClZhOmZ1bmN0aW9u
+KGEpe3JldHVybiBKLlF1KGEsITEsbnVsbCwhIWEuJGlYail9LApWRjpmdW5jdGlvbihhLGIsYyl7dmFy
+IHQ9Yi5wcm90b3R5cGUKaWYodi5sZWFmVGFnc1thXT09PXRydWUpcmV0dXJuIEguVmEodCkKZWxzZSBy
+ZXR1cm4gSi5RdSh0LGMsbnVsbCxudWxsKX0sClhEOmZ1bmN0aW9uKCl7aWYoITA9PT0kLkJ2KXJldHVy
+bgokLkJ2PSEwCkguWjEoKX0sCloxOmZ1bmN0aW9uKCl7dmFyIHQscyxyLHEscCxvLG4sbQokLm53PU9i
+amVjdC5jcmVhdGUobnVsbCkKJC52dj1PYmplY3QuY3JlYXRlKG51bGwpCkgua08oKQp0PXYuaW50ZXJj
+ZXB0b3JzQnlUYWcKcz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KQppZih0eXBlb2Ygd2luZG93
+IT0idW5kZWZpbmVkIil7d2luZG93CnI9ZnVuY3Rpb24oKXt9CmZvcihxPTA7cTxzLmxlbmd0aDsrK3Ep
+e3A9c1txXQpvPSQueDcuJDEocCkKaWYobyE9bnVsbCl7bj1ILlZGKHAsdFtwXSxvKQppZihuIT1udWxs
+KXtPYmplY3QuZGVmaW5lUHJvcGVydHkobyx2LmRpc3BhdGNoUHJvcGVydHlOYW1lLHt2YWx1ZTpuLGVu
+dW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX0pCnIucHJvdG90eXBl
+PW99fX19Zm9yKHE9MDtxPHMubGVuZ3RoOysrcSl7cD1zW3FdCmlmKC9eW0EtWmEtel9dLy50ZXN0KHAp
+KXttPXRbcF0KdFsiISIrcF09bQp0WyJ+IitwXT1tCnRbIi0iK3BdPW0KdFsiKyIrcF09bQp0WyIqIitw
+XT1tfX19LAprTzpmdW5jdGlvbigpe3ZhciB0LHMscixxLHAsbyxuPUMuWXEoKQpuPUgudWQoQy5LVSxI
+LnVkKEMuZlEsSC51ZChDLmk3LEgudWQoQy5pNyxILnVkKEMueGksSC51ZChDLmRrLEgudWQoQy53YihD
+Lk80KSxuKSkpKSkpKQppZih0eXBlb2YgZGFydE5hdGl2ZURpc3BhdGNoSG9va3NUcmFuc2Zvcm1lciE9
+InVuZGVmaW5lZCIpe3Q9ZGFydE5hdGl2ZURpc3BhdGNoSG9va3NUcmFuc2Zvcm1lcgppZih0eXBlb2Yg
+dD09ImZ1bmN0aW9uIil0PVt0XQppZih0LmNvbnN0cnVjdG9yPT1BcnJheSlmb3Iocz0wO3M8dC5sZW5n
+dGg7KytzKXtyPXRbc10KaWYodHlwZW9mIHI9PSJmdW5jdGlvbiIpbj1yKG4pfHxufX1xPW4uZ2V0VGFn
+CnA9bi5nZXRVbmtub3duVGFnCm89bi5wcm90b3R5cGVGb3JUYWcKJC5ORj1uZXcgSC5kQyhxKQokLlRY
+PW5ldyBILndOKHApCiQueDc9bmV3IEguVlgobyl9LAp1ZDpmdW5jdGlvbihhLGIpe3JldHVybiBhKGIp
+fHxifSwKdjQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciB0PWI/Im0iOiIiLHM9Yz8iIjoiaSIscj1k
+PyJ1IjoiIixxPWU/InMiOiIiLHA9Zj8iZyI6IiIsbz1mdW5jdGlvbihnLGgpe3RyeXtyZXR1cm4gbmV3
+IFJlZ0V4cChnLGgpfWNhdGNoKG4pe3JldHVybiBufX0oYSx0K3MrcitxK3ApCmlmKG8gaW5zdGFuY2Vv
+ZiBSZWdFeHApcmV0dXJuIG8KdGhyb3cgSC5iKFAucnIoIklsbGVnYWwgUmVnRXhwIHBhdHRlcm4gKCIr
+U3RyaW5nKG8pKyIpIixhLG51bGwpKX0sCm0yOmZ1bmN0aW9uKGEsYixjKXt2YXIgdAppZih0eXBlb2Yg
+Yj09InN0cmluZyIpcmV0dXJuIGEuaW5kZXhPZihiLGMpPj0wCmVsc2UgaWYoYiBpbnN0YW5jZW9mIEgu
+VlIpe3Q9Qy54Qi5HKGEsYykKcmV0dXJuIGIuYi50ZXN0KHQpfWVsc2V7dD1KLkZMKGIsQy54Qi5HKGEs
+YykpCnJldHVybiF0LmdsMCh0KX19LApBNDpmdW5jdGlvbihhKXtpZihhLmluZGV4T2YoIiQiLDApPj0w
+KXJldHVybiBhLnJlcGxhY2UoL1wkL2csIiQkJCQiKQpyZXR1cm4gYX0sCmVBOmZ1bmN0aW9uKGEpe2lm
+KC9bW1xde30oKSorPy5cXF4kfF0vLnRlc3QoYSkpcmV0dXJuIGEucmVwbGFjZSgvW1tcXXt9KCkqKz8u
+XFxeJHxdL2csIlxcJCYiKQpyZXR1cm4gYX0sCnlzOmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1ILm5NKGEs
+YixjKQpyZXR1cm4gdH0sCm5NOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscQppZihiPT09IiIpe2lm
+KGE9PT0iIilyZXR1cm4gYwp0PWEubGVuZ3RoCmZvcihzPWMscj0wO3I8dDsrK3Ipcz1zK2Fbcl0rYwpy
+ZXR1cm4gcy5jaGFyQ29kZUF0KDApPT0wP3M6c31xPWEuaW5kZXhPZihiLDApCmlmKHE8MClyZXR1cm4g
+YQppZihhLmxlbmd0aDw1MDB8fGMuaW5kZXhPZigiJCIsMCk+PTApcmV0dXJuIGEuc3BsaXQoYikuam9p
+bihjKQpyZXR1cm4gYS5yZXBsYWNlKG5ldyBSZWdFeHAoSC5lQShiKSwnZycpLEguQTQoYykpfSwKUEQ6
+ZnVuY3Rpb24gUEQoYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKV1U6ZnVuY3Rpb24gV1UoKXt9LApM
+UDpmdW5jdGlvbiBMUChhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uJHRpPWR9
+LApMSTpmdW5jdGlvbiBMSShhLGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5hPWEKXy5jPWIKXy5kPWMKXy5l
+PWQKXy5mPWV9LApDajpmdW5jdGlvbiBDaihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9
+LApmOTpmdW5jdGlvbiBmOShhLGIsYyxkLGUsZil7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9Ywpf
+LmQ9ZApfLmU9ZQpfLmY9Zn0sClcwOmZ1bmN0aW9uIFcwKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LAph
+ejpmdW5jdGlvbiBheihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LAp2VjpmdW5jdGlv
+biB2VihhKXt0aGlzLmE9YX0sCmJxOmZ1bmN0aW9uIGJxKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApB
+bTpmdW5jdGlvbiBBbShhKXt0aGlzLmE9YX0sClhPOmZ1bmN0aW9uIFhPKGEpe3RoaXMuYT1hCnRoaXMu
+Yj1udWxsfSwKVHA6ZnVuY3Rpb24gVHAoKXt9LApsYzpmdW5jdGlvbiBsYygpe30sCnp4OmZ1bmN0aW9u
+IHp4KCl7fSwKclQ6ZnVuY3Rpb24gclQoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9
+YwpfLmQ9ZH0sCkVxOmZ1bmN0aW9uIEVxKGEpe3RoaXMuYT1hfSwKa1k6ZnVuY3Rpb24ga1koYSl7dGhp
+cy5hPWF9LApONTpmdW5jdGlvbiBONShhKXt2YXIgXz10aGlzCl8uYT0wCl8uZj1fLmU9Xy5kPV8uYz1f
+LmI9bnVsbApfLnI9MApfLiR0aT1hfSwKZGI6ZnVuY3Rpb24gZGIoYSxiKXt2YXIgXz10aGlzCl8uYT1h
+Cl8uYj1iCl8uZD1fLmM9bnVsbH0sCmk1OmZ1bmN0aW9uIGk1KGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9
+Yn0sCk42OmZ1bmN0aW9uIE42KGEsYixjKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uZD1fLmM9bnVs
+bApfLiR0aT1jfSwKZEM6ZnVuY3Rpb24gZEMoYSl7dGhpcy5hPWF9LAp3TjpmdW5jdGlvbiB3TihhKXt0
+aGlzLmE9YX0sClZYOmZ1bmN0aW9uIFZYKGEpe3RoaXMuYT1hfSwKVlI6ZnVuY3Rpb24gVlIoYSxiKXt2
+YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uZD1fLmM9bnVsbH0sCkVLOmZ1bmN0aW9uIEVLKGEpe3RoaXMu
+Yj1hfSwKS1c6ZnVuY3Rpb24gS1coYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKUGI6
+ZnVuY3Rpb24gUGIoYSxiLGMpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPW51bGx9LAp0
+UTpmdW5jdGlvbiB0UShhLGIpe3RoaXMuYT1hCnRoaXMuYz1ifSwKdW46ZnVuY3Rpb24gdW4oYSxiLGMp
+e3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKU2Q6ZnVuY3Rpb24gU2QoYSxiLGMpe3ZhciBfPXRo
+aXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPW51bGx9LApYRjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sCkRR
+OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSW50OEFycmF5KGEpfSwKb2Q6ZnVuY3Rpb24oYSxiLGMpe2lm
+KGE+Pj4wIT09YXx8YT49Yyl0aHJvdyBILmIoSC5IWShiLGEpKX0sCnJNOmZ1bmN0aW9uKGEsYixjKXt2
+YXIgdAppZighKGE+Pj4wIT09YSkpdD1iPj4+MCE9PWJ8fGE+Ynx8Yj5jCmVsc2UgdD0hMAppZih0KXRo
+cm93IEguYihILmF1KGEsYixjKSkKcmV0dXJuIGJ9LApFVDpmdW5jdGlvbiBFVCgpe30sCmIwOmZ1bmN0
+aW9uIGIwKCl7fSwKRGc6ZnVuY3Rpb24gRGcoKXt9LApQZzpmdW5jdGlvbiBQZygpe30sCnhqOmZ1bmN0
+aW9uIHhqKCl7fSwKZEU6ZnVuY3Rpb24gZEUoKXt9LApaQTpmdW5jdGlvbiBaQSgpe30sCndmOmZ1bmN0
+aW9uIHdmKCl7fSwKUHE6ZnVuY3Rpb24gUHEoKXt9LAplRTpmdW5jdGlvbiBlRSgpe30sClY2OmZ1bmN0
+aW9uIFY2KCl7fSwKUkc6ZnVuY3Rpb24gUkcoKXt9LApWUDpmdW5jdGlvbiBWUCgpe30sCldCOmZ1bmN0
+aW9uIFdCKCl7fSwKWkc6ZnVuY3Rpb24gWkcoKXt9LAp4WjpmdW5jdGlvbihhLGIpe3ZhciB0PWIuZApy
+ZXR1cm4gdD09bnVsbD9iLmQ9SC5KKGEsImI4IixbYi5RXSk6dH0sClExOmZ1bmN0aW9uKGEpe3ZhciB0
+PWEuegppZih0PT09Nnx8dD09PTd8fHQ9PT04KXJldHVybiBILlExKGEuUSkKcmV0dXJuIHQ9PT0xMXx8
+dD09PTEyfSwKbUQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGJ9LApOMDpmdW5jdGlvbihhKXtyZXR1cm4g
+SC5FKHYudHlwZVVuaXZlcnNlLGEpfSwKSlM6ZnVuY3Rpb24oYSl7dmFyIHQ9YS4kUwppZih0IT1udWxs
+KXtpZih0eXBlb2YgdD09Im51bWJlciIpcmV0dXJuIEguQnAodCkKcmV0dXJuIGEuJFMoKX1yZXR1cm4g
+bnVsbH0sClVlOmZ1bmN0aW9uKGEsYil7dmFyIHQKaWYoSC5RMShiKSlpZihhIGluc3RhbmNlb2YgSC5U
+cCl7dD1ILkpTKGEpCmlmKHQhPW51bGwpcmV0dXJuIHR9cmV0dXJuIEgueksoYSl9LAp6SzpmdW5jdGlv
+bihhKXt2YXIgdAppZihhIGluc3RhbmNlb2YgUC5rKXt0PWEuJHRpCnJldHVybiB0IT1udWxsP3Q6SC5W
+VShhKX1pZihBcnJheS5pc0FycmF5KGEpKXJldHVybiBILnQ2KGEpCnJldHVybiBILlZVKEouaWEoYSkp
+fSwKdDY6ZnVuY3Rpb24oYSl7dmFyIHQ9YS4kdGkscz11Lm0KaWYodD09bnVsbClyZXR1cm4gcwppZih0
+LmNvbnN0cnVjdG9yIT09cy5jb25zdHJ1Y3RvcilyZXR1cm4gcwpyZXR1cm4gdH0sCkxoOmZ1bmN0aW9u
+KGEpe3ZhciB0PWEuJHRpCnJldHVybiB0IT1udWxsP3Q6SC5WVShhKX0sClZVOmZ1bmN0aW9uKGEpe3Zh
+ciB0PWEuY29uc3RydWN0b3Iscz10LiRjY2FjaGUKaWYocyE9bnVsbClyZXR1cm4gcwpyZXR1cm4gSC5y
+OShhLHQpfSwKcjk6ZnVuY3Rpb24oYSxiKXt2YXIgdD1hIGluc3RhbmNlb2YgSC5UcD9hLl9fcHJvdG9f
+Xy5fX3Byb3RvX18uY29uc3RydWN0b3I6YixzPUguYWkodi50eXBlVW5pdmVyc2UsdC5uYW1lKQpiLiRj
+Y2FjaGU9cwpyZXR1cm4gc30sCkJwOmZ1bmN0aW9uKGEpe3ZhciB0LHM9YSxyPXYudHlwZXMscT1yW3Nd
+CmlmKHR5cGVvZiBxPT0ic3RyaW5nIil7dD1ILkUodi50eXBlVW5pdmVyc2UscSkKcltzXT10CnJldHVy
+biB0fXJldHVybiBxfSwKSko6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlzLHI9cy56LHE9SC5ZTwppZihI
+LmNjKHMpKXtxPUguSXcKcy5iPXMuYT1ILmhufWVsc2UgaWYocj09PTkpe3Q9cy5kYgppZigiS04iPT09
+dClxPUgub2sKZWxzZSBpZigiQ1AiPT09dClxPUguS0gKZWxzZSBpZigiRksiPT09dClxPUguS0gKZWxz
+ZSBpZigicVUiPT09dClxPUguTU0KZWxzZSBpZigiYTIiPT09dClxPUgubAplbHNle3I9cy5RCmlmKHMu
+Y2guZXZlcnkoSC5jYykpe3MueD0iJGkiK3IKcT1ILnQ0fX19cy5jPXEKcmV0dXJuIHMuYyhhKX0sCllP
+OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMKcmV0dXJuIEguV2Uodi50eXBlVW5pdmVyc2UsSC5VZShhLHQp
+LG51bGwsdCxudWxsKX0sCnQ0OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMueAppZihhIGluc3RhbmNlb2Yg
+UC5rKXJldHVybiEhYVt0XQpyZXR1cm4hIUouaWEoYSlbdF19LApPejpmdW5jdGlvbihhKXt2YXIgdApp
+ZihhPT1udWxsKXJldHVybiBhCnQ9dGhpcwppZih0LmMoYSkpcmV0dXJuIGEKdGhyb3cgSC5iKEguUTUo
+SC5XSyhhLEguVWUoYSx0KSxILmRtKHQsbnVsbCkpKSl9LApBdjpmdW5jdGlvbihhKXt2YXIgdAppZihh
+PT1udWxsKXJldHVybiBhCnQ9dGhpcwppZih0LmMoYSkpcmV0dXJuIGEKdGhyb3cgSC5iKEguWmMoSC5X
+SyhhLEguVWUoYSx0KSxILmRtKHQsbnVsbCkpKSl9LApEaDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgdD1u
+dWxsCmlmKEguV2Uodi50eXBlVW5pdmVyc2UsYSx0LGIsdCkpcmV0dXJuIGEKdGhyb3cgSC5iKEguWmMo
+IlRoZSB0eXBlIGFyZ3VtZW50ICciK0guZChILmRtKGEsdCkpKyInIGlzIG5vdCBhIHN1YnR5cGUgb2Yg
+dGhlIHR5cGUgdmFyaWFibGUgYm91bmQgJyIrSC5kKEguZG0oYix0KSkrIicgb2YgdHlwZSB2YXJpYWJs
+ZSAnIitjKyInIGluICciK0guZChkKSsiJy4iKSl9LApXSzpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9UC5w
+KGEpLHM9SC5kbShiPT1udWxsP0gueksoYSk6YixudWxsKQpyZXR1cm4gdCsiOiB0eXBlICciK0guZChz
+KSsiJyBpcyBub3QgYSBzdWJ0eXBlIG9mIHR5cGUgJyIrSC5kKGMpKyInIn0sClE1OmZ1bmN0aW9uKGEp
+e3JldHVybiBuZXcgSC5oeigiQ2FzdEVycm9yOiAiK2EpfSwKUHY6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
+bmV3IEguaHooIkNhc3RFcnJvcjogIitILldLKGEsbnVsbCxiKSl9LApaYzpmdW5jdGlvbihhKXtyZXR1
+cm4gbmV3IEguaU0oIlR5cGVFcnJvcjogIithKX0sCnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IEgu
+aU0oIlR5cGVFcnJvcjogIitILldLKGEsbnVsbCxiKSl9LApJdzpmdW5jdGlvbihhKXtyZXR1cm4hMH0s
+CmhuOmZ1bmN0aW9uKGEpe3JldHVybiBhfSwKbDpmdW5jdGlvbihhKXtyZXR1cm4hMD09PWF8fCExPT09
+YX0sCkU5OmZ1bmN0aW9uKGEpe2lmKCEwPT09YXx8ITE9PT1hKXJldHVybiBhCmlmKGE9PW51bGwpcmV0
+dXJuIGEKdGhyb3cgSC5iKEguUHYoYSwiYm9vbCIpKX0sCnhkOmZ1bmN0aW9uKGEpe2lmKCEwPT09YXx8
+ITE9PT1hKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShhLCJib29sIikp
+fSwKZGo6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBhCmlmKGE9PW51bGwp
+cmV0dXJuIGEKdGhyb3cgSC5iKEguUHYoYSwiZG91YmxlIikpfSwKSWc6ZnVuY3Rpb24oYSl7aWYodHlw
+ZW9mIGE9PSJudW1iZXIiKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShh
+LCJkb3VibGUiKSl9LApvazpmdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGE9PSJudW1iZXIiJiZNYXRo
+LmZsb29yKGEpPT09YX0sClNIOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ibnVtYmVyIiYmTWF0aC5m
+bG9vcihhKT09PWEpcmV0dXJuIGEKaWYoYT09bnVsbClyZXR1cm4gYQp0aHJvdyBILmIoSC5QdihhLCJp
+bnQiKSl9LApTYzpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09Im51bWJlciImJk1hdGguZmxvb3IoYSk9
+PT1hKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShhLCJpbnQiKSl9LApL
+SDpmdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGE9PSJudW1iZXIifSwKdVU6ZnVuY3Rpb24oYSl7aWYo
 dHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEgu
-cShhLCJudW0iKSl9LApNTTpmdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGE9PSJzdHJpbmcifSwKYzA6
-ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJu
-IGEKdGhyb3cgSC5iKEguUHYoYSwiU3RyaW5nIikpfSwKeTpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09
-InN0cmluZyIpcmV0dXJuIGEKaWYoYT09bnVsbClyZXR1cm4gYQp0aHJvdyBILmIoSC5xKGEsIlN0cmlu
-ZyIpKX0sCmlvOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyCmZvcih0PSIiLHM9IiIscj0wO3I8YS5sZW5n
-dGg7KytyLHM9IiwgIil0Kz1DLnhCLmgocyxILmRtKGFbcl0sYikpCnJldHVybiB0fSwKYkk6ZnVuY3Rp
-b24oYTAsYTEsYTIpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlLGQsYyxiLGE9Iiwg
-IgppZihhMiE9bnVsbCl7dD1hMi5sZW5ndGgKaWYoYTE9PW51bGwpe2ExPUguVk0oW10sdS5zKQpzPW51
-bGx9ZWxzZSBzPWExLmxlbmd0aApyPWExLmxlbmd0aApmb3IocT10O3E+MDstLXEpQy5ObS5pKGExLCJU
-IisocitxKSkKZm9yKHA9IjwiLG89IiIscT0wO3E8dDsrK3Esbz1hKXtwKz1vCm49YTEubGVuZ3RoCm09
-bi0xLXEKaWYobTwwKXJldHVybiBILk9IKGExLG0pCnA9Qy54Qi5oKHAsYTFbbV0pCmw9YTJbcV0KaWYo
-IUguY2MobCwhMCkpcCs9Qy54Qi5oKCIgZXh0ZW5kcyAiLEguZG0obCxhMSkpfXArPSI+In1lbHNle3A9
-IiIKcz1udWxsfW49YTAuUQprPWEwLmNoCmo9ay5hCmk9ai5sZW5ndGgKaD1rLmIKZz1oLmxlbmd0aApm
-PWsuYwplPWYubGVuZ3RoCmQ9SC5kbShuLGExKQpmb3IoYz0iIixiPSIiLHE9MDtxPGk7KytxLGI9YSlj
-Kz1DLnhCLmgoYixILmRtKGpbcV0sYTEpKQppZihnPjApe2MrPWIrIlsiCmZvcihiPSIiLHE9MDtxPGc7
-KytxLGI9YSljKz1DLnhCLmgoYixILmRtKGhbcV0sYTEpKQpjKz0iXSJ9aWYoZT4wKXtjKz1iKyJ7Igpm
-b3IoYj0iIixxPTA7cTxlO3ErPTIsYj1hKWMrPUMueEIuaChiLEguZG0oZltxKzFdLGExKSkrIiAiK2Zb
-cV0KYys9In0ifWlmKHMhPW51bGwpYTEubGVuZ3RoPXMKcmV0dXJuIHArIigiK2MrIikgPT4gIitILmQo
-ZCl9LApkbTpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHA9YS56CmlmKHA9PT01KXJldHVybiJlcmFz
-ZWQiCmlmKHA9PT0yKXJldHVybiJkeW5hbWljIgppZihwPT09MylyZXR1cm4idm9pZCIKaWYocD09PTEp
-cmV0dXJuIk5ldmVyIgppZihwPT09NClyZXR1cm4iYW55IgppZihwPT09NilyZXR1cm4gSC5kKEguZG0o
-YS5RLGIpKSsiKiIKaWYocD09PTcpcmV0dXJuIEguZChILmRtKGEuUSxiKSkrIj8iCmlmKHA9PT04KXJl
-dHVybiJGdXR1cmVPcjwiK0guZChILmRtKGEuUSxiKSkrIj4iCmlmKHA9PT05KXt0PUgubzMoYS5RKQpz
-PWEuY2gKcmV0dXJuIHMubGVuZ3RoIT09MD90KygiPCIrSC5pbyhzLGIpKyI+Iik6dH1pZihwPT09MTEp
-cmV0dXJuIEguYkkoYSxiLG51bGwpCmlmKHA9PT0xMilyZXR1cm4gSC5iSShhLlEsYixhLmNoKQppZihw
-PT09MTMpe3I9YS5RCnE9Yi5sZW5ndGgKcj1xLTEtcgppZihyPDB8fHI+PXEpcmV0dXJuIEguT0goYixy
-KQpyZXR1cm4gYltyXX1yZXR1cm4iPyJ9LApvMzpmdW5jdGlvbihhKXt2YXIgdCxzPUguSmcoYSkKaWYo
-cyE9bnVsbClyZXR1cm4gcwp0PSJtaW5pZmllZDoiK2EKcmV0dXJuIHR9LApRbzpmdW5jdGlvbihhLGIp
-e3ZhciB0PWEudFJbYl0KZm9yKDt0eXBlb2YgdD09InN0cmluZyI7KXQ9YS50Ult0XQpyZXR1cm4gdH0s
-CmFpOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvPWEuZVQsbj1vW2JdCmlmKG49PW51bGwpcmV0
-dXJuIEguRShhLGIpCmVsc2UgaWYodHlwZW9mIG49PSJudW1iZXIiKXt0PW4Kcz1ILm0oYSw1LCIjIikK
-cj1bXQpmb3IocT0wO3E8dDsrK3Epci5wdXNoKHMpCnA9SC5KKGEsYixyKQpvW2JdPXAKcmV0dXJuIHB9
-ZWxzZSByZXR1cm4gbn0sCnhiOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEguSXgoYS50UixiKX0sCkZGOmZ1
-bmN0aW9uKGEsYil7cmV0dXJuIEguSXgoYS5lVCxiKX0sCkU6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPWEu
-ZUMscj1zLmdldChiKQppZihyIT1udWxsKXJldHVybiByCnQ9SC56KGEsbnVsbCxiKQpzLnNldChiLHQp
-CnJldHVybiB0fSwKY0U6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscj1iLmN4CmlmKHI9PW51bGwpcj1i
-LmN4PW5ldyBNYXAoKQp0PXIuZ2V0KGMpCmlmKHQhPW51bGwpcmV0dXJuIHQKcz1ILnooYSxiLGMpCnIu
-c2V0KGMscykKcmV0dXJuIHN9LAp2NTpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHE9Yi5jeQppZihx
-PT1udWxsKXE9Yi5jeT1uZXcgTWFwKCkKdD1jLmRiCnM9cS5nZXQodCkKaWYocyE9bnVsbClyZXR1cm4g
-cwpyPUguYShhLGIsYy56PT09MTA/Yy5jaDpbY10pCnEuc2V0KHQscikKcmV0dXJuIHJ9LAp6OmZ1bmN0
-aW9uKGEsYixjKXt2YXIgdD1ILmkoSC5vKGEsYixjKSkKcmV0dXJuIHR9LApXRzpmdW5jdGlvbihhLGIp
-e3ZhciB0PWIuZGIKYS5lQy5zZXQodCxiKQpiLmE9SC5PegpiLmI9SC5BdgpiLmM9SC5KSgpyZXR1cm4g
-Yn0sCm06ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHM9YS5lQy5nZXQoYykKaWYocyE9bnVsbClyZXR1cm4g
-cwp0PW5ldyBILkpjKG51bGwsbnVsbCxudWxsKQp0Lno9Ygp0LmRiPWMKcmV0dXJuIEguV0coYSx0KX0s
-CnY6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscz1hLmVDLmdldChkKQppZihzIT1udWxsKXJldHVybiBz
-CnQ9bmV3IEguSmMobnVsbCxudWxsLG51bGwpCnQuej1iCnQuUT1jCnQuZGI9ZApyZXR1cm4gSC5XRyhh
-LHQpfSwKSDpmdW5jdGlvbihhLGIpe3ZhciB0LHM9IiIrYisiXiIscj1hLmVDLmdldChzKQppZihyIT1u
-dWxsKXJldHVybiByCnQ9bmV3IEguSmMobnVsbCxudWxsLG51bGwpCnQuej0xMwp0LlE9Ygp0LmRiPXMK
-cmV0dXJuIEguV0coYSx0KX0sClV4OmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxPWEubGVuZ3RoCmZvcih0
-PSIiLHM9IiIscj0wO3I8cTsrK3Iscz0iLCIpdCs9cythW3JdLmRiCnJldHVybiB0fSwKUzQ6ZnVuY3Rp
-b24oYSl7dmFyIHQscyxyLHEscCxvPWEubGVuZ3RoCmZvcih0PSIiLHM9IiIscj0wO3I8bztyKz0yLHM9
-IiwiKXtxPWFbcl0KcD1hW3IrMV0uZGIKdCs9cytxKyI6IitwfXJldHVybiB0fSwKSjpmdW5jdGlvbihh
-LGIsYyl7dmFyIHQscyxyPWIKaWYoYy5sZW5ndGghPT0wKXIrPSI8IitILlV4KGMpKyI+Igp0PWEuZUMu
-Z2V0KHIpCmlmKHQhPW51bGwpcmV0dXJuIHQKcz1uZXcgSC5KYyhudWxsLG51bGwsbnVsbCkKcy56PTkK
-cy5RPWIKcy5jaD1jCmlmKGMubGVuZ3RoPjApcy5kPWNbMF0Kcy5kYj1yCnJldHVybiBILldHKGEscyl9
-LAphOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxwCmlmKGIuej09PTEwKXt0PWIuUQpzPWIuY2gu
-Y29uY2F0KGMpfWVsc2V7cz1jCnQ9Yn1yPXQuZGIrIjsiKygiPCIrSC5VeChzKSsiPiIpCnE9YS5lQy5n
-ZXQocikKaWYocSE9bnVsbClyZXR1cm4gcQpwPW5ldyBILkpjKG51bGwsbnVsbCxudWxsKQpwLno9MTAK
-cC5RPXQKcC5jaD1zCnAuZGI9cgpyZXR1cm4gSC5XRyhhLHApfSwKQzpmdW5jdGlvbihhLGIsYyl7dmFy
-IHQscyxyLHE9Yi5kYixwPWMuYSxvPXAubGVuZ3RoLG49Yy5iLG09bi5sZW5ndGgsbD1jLmMsaz1sLmxl
-bmd0aCxqPSIoIitILlV4KHApCmlmKG0+MClqKz0obz4wPyIsIjoiIikrIlsiK0guVXgobikrIl0iCmlm
-KGs+MClqKz0obz4wPyIsIjoiIikrInsiK0guUzQobCkrIn0iCnQ9cSsoaisiKSIpCnM9YS5lQy5nZXQo
-dCkKaWYocyE9bnVsbClyZXR1cm4gcwpyPW5ldyBILkpjKG51bGwsbnVsbCxudWxsKQpyLno9MTEKci5R
-PWIKci5jaD1jCnIuZGI9dApyZXR1cm4gSC5XRyhhLHIpfSwKRDpmdW5jdGlvbihhLGIsYyl7dmFyIHQs
-cz1iLmRiKyI8IitILlV4KGMpKyI+IixyPWEuZUMuZ2V0KHMpCmlmKHIhPW51bGwpcmV0dXJuIHIKdD1u
-ZXcgSC5KYyhudWxsLG51bGwsbnVsbCkKdC56PTEyCnQuUT1iCnQuY2g9Ywp0LmRiPXMKcmV0dXJuIEgu
-V0coYSx0KX0sCm86ZnVuY3Rpb24oYSxiLGMpe3JldHVybnt1OmEsZTpiLHI6YyxzOltdLHA6MH19LApp
-OmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGc9YS5yLGY9YS5zCmZvcih0
-PWcubGVuZ3RoLHM9MDtzPHQ7KXtyPWcuY2hhckNvZGVBdChzKQppZihyPj00OCYmcjw9NTcpcz1ILkEo
-cysxLHIsZyxmKQplbHNlIGlmKCgoKHJ8MzIpPj4+MCktOTcmNjU1MzUpPDI2fHxyPT09OTV8fHI9PT0z
-NilzPUgudChhLHMsZyxmLCExKQplbHNlIGlmKHI9PT00NilzPUgudChhLHMsZyxmLCEwKQplbHNleysr
-cwpzd2l0Y2gocil7Y2FzZSA0NDpicmVhawpjYXNlIDU4OmJyZWFrCmNhc2UgNTk6Zi5wdXNoKEguSyhh
-LnUsYS5lLGYucG9wKCkpKQpicmVhawpjYXNlIDk0OmYucHVzaChILkgoYS51LGYucG9wKCkpKQpicmVh
-awpjYXNlIDM1OmYucHVzaChILm0oYS51LDUsIiMiKSkKYnJlYWsKY2FzZSA2NDpmLnB1c2goSC5tKGEu
-dSwyLCJAIikpCmJyZWFrCmNhc2UgMTI2OmYucHVzaChILm0oYS51LDMsIn4iKSkKYnJlYWsKY2FzZSA2
-MDpmLnB1c2goYS5wKQphLnA9Zi5sZW5ndGgKYnJlYWsKY2FzZSA2MjpxPWEudQpwPWYuc3BsaWNlKGEu
-cCkKSC5yKGEudSxhLmUscCkKYS5wPWYucG9wKCkKbz1mLnBvcCgpCmlmKHR5cGVvZiBvPT0ic3RyaW5n
-IilmLnB1c2goSC5KKHEsbyxwKSkKZWxzZXtuPUguSyhxLGEuZSxvKQpzd2l0Y2gobi56KXtjYXNlIDEx
-OmYucHVzaChILkQocSxuLHApKQpicmVhawpkZWZhdWx0OmYucHVzaChILmEocSxuLHApKQpicmVha319
-YnJlYWsKY2FzZSAzODpILkkoYSxmKQpicmVhawpjYXNlIDQyOm09YS51Cmw9SC5LKG0sYS5lLGYucG9w
-KCkpCmYucHVzaChILnYobSw2LGwsbC5kYisiKiIpKQpicmVhawpjYXNlIDYzOm09YS51Cmw9SC5LKG0s
-YS5lLGYucG9wKCkpCmYucHVzaChILnYobSw3LGwsbC5kYisiPyIpKQpicmVhawpjYXNlIDQ3Om09YS51
-Cmw9SC5LKG0sYS5lLGYucG9wKCkpCmYucHVzaChILnYobSw4LGwsbC5kYisiLyIpKQpicmVhawpjYXNl
-IDQwOmYucHVzaChhLnApCmEucD1mLmxlbmd0aApicmVhawpjYXNlIDQxOnE9YS51Cms9bmV3IEguRygp
-Cmo9cS5zRUEKaT1xLnNFQQpvPWYucG9wKCkKaWYodHlwZW9mIG89PSJudW1iZXIiKXN3aXRjaChvKXtj
-YXNlLTE6aj1mLnBvcCgpCmJyZWFrCmNhc2UtMjppPWYucG9wKCkKYnJlYWsKZGVmYXVsdDpmLnB1c2go
-bykKYnJlYWt9ZWxzZSBmLnB1c2gobykKcD1mLnNwbGljZShhLnApCkgucihhLnUsYS5lLHApCmEucD1m
-LnBvcCgpCmsuYT1wCmsuYj1qCmsuYz1pCmYucHVzaChILkMocSxILksocSxhLmUsZi5wb3AoKSksaykp
-CmJyZWFrCmNhc2UgOTE6Zi5wdXNoKGEucCkKYS5wPWYubGVuZ3RoCmJyZWFrCmNhc2UgOTM6cD1mLnNw
-bGljZShhLnApCkgucihhLnUsYS5lLHApCmEucD1mLnBvcCgpCmYucHVzaChwKQpmLnB1c2goLTEpCmJy
-ZWFrCmNhc2UgMTIzOmYucHVzaChhLnApCmEucD1mLmxlbmd0aApicmVhawpjYXNlIDEyNTpwPWYuc3Bs
-aWNlKGEucCkKSC5CKGEudSxhLmUscCkKYS5wPWYucG9wKCkKZi5wdXNoKHApCmYucHVzaCgtMikKYnJl
-YWsKZGVmYXVsdDp0aHJvdyJCYWQgY2hhcmFjdGVyICIrcn19fWg9Zi5wb3AoKQpyZXR1cm4gSC5LKGEu
-dSxhLmUsaCl9LApBOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscj1iLTQ4CmZvcih0PWMubGVuZ3Ro
-O2E8dDsrK2Epe3M9Yy5jaGFyQ29kZUF0KGEpCmlmKCEocz49NDgmJnM8PTU3KSlicmVhawpyPXIqMTAr
-KHMtNDgpfWQucHVzaChyKQpyZXR1cm4gYX0sCnQ6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgdCxzLHIs
-cSxwLG8sbj1iKzEKZm9yKHQ9Yy5sZW5ndGg7bjx0Oysrbil7cz1jLmNoYXJDb2RlQXQobikKaWYocz09
-PTQ2KXtpZihlKWJyZWFrCmU9ITB9ZWxzZXtpZighKCgoKHN8MzIpPj4+MCktOTcmNjU1MzUpPDI2fHxz
-PT09OTV8fHM9PT0zNikpcj1zPj00OCYmczw9NTcKZWxzZSByPSEwCmlmKCFyKWJyZWFrfX1xPWMuc3Vi
-c3RyaW5nKGIsbikKaWYoZSl7dD1hLnUKcD1hLmUKaWYocC56PT09MTApcD1wLlEKbz1ILlFvKHQscC5R
-KVtxXQppZihvPT1udWxsKUgudmgoJ05vICInK3ErJyIgaW4gIicrSC5tRChwKSsnIicpCmQucHVzaChI
-LmNFKHQscCxvKSl9ZWxzZSBkLnB1c2gocSkKcmV0dXJuIG59LApJOmZ1bmN0aW9uKGEsYil7dmFyIHQ9
-Yi5wb3AoKQppZigwPT09dCl7Yi5wdXNoKEgubShhLnUsMSwiMCYiKSkKcmV0dXJufWlmKDE9PT10KXti
-LnB1c2goSC5tKGEudSw0LCIxJiIpKQpyZXR1cm59dGhyb3cgSC5iKFAuaFYoIlVuZXhwZWN0ZWQgZXh0
-ZW5kZWQgb3BlcmF0aW9uICIrSC5kKHQpKSl9LApLOmZ1bmN0aW9uKGEsYixjKXtpZih0eXBlb2YgYz09
-InN0cmluZyIpcmV0dXJuIEguSihhLGMsYS5zRUEpCmVsc2UgaWYodHlwZW9mIGM9PSJudW1iZXIiKXJl
-dHVybiBILlRWKGEsYixjKQplbHNlIHJldHVybiBjfSwKcjpmdW5jdGlvbihhLGIsYyl7dmFyIHQscz1j
-Lmxlbmd0aApmb3IodD0wO3Q8czsrK3QpY1t0XT1ILksoYSxiLGNbdF0pfSwKQjpmdW5jdGlvbihhLGIs
-Yyl7dmFyIHQscz1jLmxlbmd0aApmb3IodD0xO3Q8czt0Kz0yKWNbdF09SC5LKGEsYixjW3RdKX0sClRW
-OmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHI9Yi56CmlmKHI9PT0xMCl7aWYoYz09PTApcmV0dXJuIGIu
-UQp0PWIuY2gKcz10Lmxlbmd0aAppZihjPD1zKXJldHVybiB0W2MtMV0KYy09cwpiPWIuUQpyPWIuen1l
-bHNlIGlmKGM9PT0wKXJldHVybiBiCmlmKHIhPT05KXRocm93IEguYihQLmhWKCJJbmRleGVkIGJhc2Ug
-bXVzdCBiZSBhbiBpbnRlcmZhY2UgdHlwZSIpKQp0PWIuY2gKaWYoYzw9dC5sZW5ndGgpcmV0dXJuIHRb
-Yy0xXQp0aHJvdyBILmIoUC5oVigiQmFkIGluZGV4ICIrYysiIGZvciAiK2IudygwKSkpfSwKV2U6ZnVu
-Y3Rpb24oYSxiLGMsZCxlLGYpe3ZhciB0LHMscixxLHAsbwppZihiPT09ZClyZXR1cm4hMAppZihILmNj
-KGQsITApKXJldHVybiEwCnQ9Yi56CmlmKHQ9PT00KXJldHVybiEwCmlmKEguY2MoYiwhMCkpcmV0dXJu
-ITEKaWYoYj09PXUuUClyZXR1cm4hMApzPXQ9PT0xMwppZihzKWlmKEguV2UoYSxjW2IuUV0sYyxkLGUs
-ITApKXJldHVybiEwCnI9ZC56CmlmKHQ9PT02KXJldHVybiBILldlKGEsYi5RLGMsZCxlLCEwKQppZihy
-PT09Nil7cT1kLlEKcmV0dXJuIEguV2UoYSxiLGMscSxlLCEwKX1pZih0PT09OCl7aWYoIUguV2UoYSxi
-LlEsYyxkLGUsITApKXJldHVybiExCnJldHVybiBILldlKGEsSC54WihhLGIpLGMsZCxlLCEwKX1pZih0
-PT09Nyl7cT1ILldlKGEsYi5RLGMsZCxlLCEwKQpyZXR1cm4gcX1pZihyPT09OCl7aWYoSC5XZShhLGIs
-YyxkLlEsZSwhMCkpcmV0dXJuITAKcmV0dXJuIEguV2UoYSxiLGMsSC54WihhLGQpLGUsITApfWlmKHI9
-PT03KXtxPUguV2UoYSxiLGMsZC5RLGUsITApCnJldHVybiBxfWlmKHMpcmV0dXJuITEKcT10IT09MTEK
-aWYoKCFxfHx0PT09MTIpJiZkPT09dS5aKXJldHVybiEwCmlmKHI9PT0xMil7aWYoYj09PXUuZylyZXR1
-cm4hMAppZih0IT09MTIpcmV0dXJuITEKcD1iLmNoCm89ZC5jaAppZighSC56dShwLG8sITApKXJldHVy
-biExCmM9Yz09bnVsbD9wOnAuY29uY2F0KGMpCmU9ZT09bnVsbD9vOm8uY29uY2F0KGUpCnJldHVybiBI
-LmJPKGEsYi5RLGMsZC5RLGUsITApfWlmKHI9PT0xMSl7aWYoYj09PXUuZylyZXR1cm4hMAppZihxKXJl
-dHVybiExCnJldHVybiBILmJPKGEsYixjLGQsZSwhMCl9aWYodD09PTkpe2lmKHIhPT05KXJldHVybiEx
-CnJldHVybiBILnBHKGEsYixjLGQsZSwhMCl9cmV0dXJuITF9LApiTzpmdW5jdGlvbihhMCxhMSxhMixh
-MyxhNCxhNSl7dmFyIHQscyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZCxjLGIsYQppZighSC5X
-ZShhMCxhMS5RLGEyLGEzLlEsYTQsITApKXJldHVybiExCnQ9YTEuY2gKcz1hMy5jaApyPXQuYQpxPXMu
-YQpwPXIubGVuZ3RoCm89cS5sZW5ndGgKaWYocD5vKXJldHVybiExCm49by1wCm09dC5iCmw9cy5iCms9
-bS5sZW5ndGgKaj1sLmxlbmd0aAppZihwK2s8bytqKXJldHVybiExCmZvcihpPTA7aTxwOysraSl7aD1y
-W2ldCmlmKCFILldlKGEwLHFbaV0sYTQsaCxhMiwhMCkpcmV0dXJuITF9Zm9yKGk9MDtpPG47KytpKXto
-PW1baV0KaWYoIUguV2UoYTAscVtwK2ldLGE0LGgsYTIsITApKXJldHVybiExfWZvcihpPTA7aTxqOysr
-aSl7aD1tW24raV0KaWYoIUguV2UoYTAsbFtpXSxhNCxoLGEyLCEwKSlyZXR1cm4hMX1nPXQuYwpmPXMu
-YwplPWcubGVuZ3RoCmQ9Zi5sZW5ndGgKZm9yKGk9MCxjPTA7YzxkO2MrPTIpe2I9ZltjXQpkb3tpZihp
-Pj1lKXJldHVybiExCmE9Z1tpXQppKz0yfXdoaWxlKGE8YikKaWYoYjxhKXJldHVybiExCmg9Z1tpLTFd
-CmlmKCFILldlKGEwLGZbYysxXSxhNCxoLGEyLCEwKSlyZXR1cm4hMX1yZXR1cm4hMH0sCnBHOmZ1bmN0
-aW9uKGEsYixjLGQsZSxmKXt2YXIgdCxzLHIscSxwLG8sbixtLGw9Yi5RLGs9ZC5RCmlmKGw9PT1rKXt0
-PWIuY2gKcz1kLmNoCnI9dC5sZW5ndGgKZm9yKHE9MDtxPHI7KytxKXtwPXRbcV0Kbz1zW3FdCmlmKCFI
-LldlKGEscCxjLG8sZSwhMCkpcmV0dXJuITF9cmV0dXJuITB9bj1ILlFvKGEsbCkKaWYobj09bnVsbCly
-ZXR1cm4hMQptPW5ba10KaWYobT09bnVsbClyZXR1cm4hMQpyPW0ubGVuZ3RoCnM9ZC5jaApmb3IocT0w
-O3E8cjsrK3EpaWYoIUguV2UoYSxILmNFKGEsYixtW3FdKSxjLHNbcV0sZSwhMCkpcmV0dXJuITEKcmV0
-dXJuITB9LApyYTpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyCmlmKGE9PT1iKXJldHVybiEwCmlmKEgu
-Y2MoYSwhMCkpcmV0dXJuIEguY2MoYiwhMCkKdD1hLnoKaWYodCE9PWIueilyZXR1cm4hMQpzd2l0Y2go
-dCl7Y2FzZSA2OmNhc2UgNzpjYXNlIDg6cmV0dXJuIEgucmEoYS5RLGIuUSwhMCkKY2FzZSA5OmlmKGEu
-USE9PWIuUSlyZXR1cm4hMQpyZXR1cm4gSC56dShhLmNoLGIuY2gsITApCmNhc2UgMTA6cmV0dXJuIEgu
-cmEoYS5RLGIuUSwhMCkmJkguenUoYS5jaCxiLmNoLCEwKQpjYXNlIDExOmlmKEgucmEoYS5RLGIuUSwh
-MCkpe3M9YS5jaApyPWIuY2gKcz1ILnp1KHMuYSxyLmEsITApJiZILnp1KHMuYixyLmIsITApJiZILlhz
-KHMuYyxyLmMsITApfWVsc2Ugcz0hMQpyZXR1cm4gcwpjYXNlIDEyOnJldHVybiBILnJhKGEuUSxiLlEs
-ITApJiZILnp1KGEuY2gsYi5jaCwhMCkKZGVmYXVsdDpyZXR1cm4hMX19LAp6dTpmdW5jdGlvbihhLGIs
-Yyl7dmFyIHQscz1hLmxlbmd0aAppZihzIT09Yi5sZW5ndGgpcmV0dXJuITEKZm9yKHQ9MDt0PHM7Kyt0
-KWlmKCFILnJhKGFbdF0sYlt0XSwhMCkpcmV0dXJuITEKcmV0dXJuITB9LApYczpmdW5jdGlvbihhLGIs
-Yyl7dmFyIHQscyxyPWEubGVuZ3RoCmlmKHIhPT1iLmxlbmd0aClyZXR1cm4hMQpmb3IodD0wO3Q8cjt0
-Kz0yKXtpZihhW3RdIT09Ylt0XSlyZXR1cm4hMQpzPXQrMQppZighSC5yYShhW3NdLGJbc10sITApKXJl
-dHVybiExfXJldHVybiEwfSwKck46ZnVuY3Rpb24oYSl7cmV0dXJuIEguY2MoYSwhMCl9LApjYzpmdW5j
-dGlvbihhLGIpe3ZhciB0LHMKaWYoYT09PXUuSylyZXR1cm4hMAp0PWEuegppZih0IT09MilpZih0IT09
-MylpZih0IT09NClpZih0IT09NSlzPXQ9PT04JiZILmNjKGEuUSwhMCkKZWxzZSBzPSEwCmVsc2Ugcz0h
-MAplbHNlIHM9ITAKZWxzZSBzPSEwCnJldHVybiBzfSwKSXg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHI9
-T2JqZWN0LmtleXMoYikscT1yLmxlbmd0aApmb3IodD0wO3Q8cTsrK3Qpe3M9clt0XQphW3NdPWJbc119
-fSwKSmM6ZnVuY3Rpb24gSmMoYSxiLGMpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy55PV8u
-eD1fLmQ9bnVsbApfLno9MApfLmRiPV8uY3k9Xy5jeD1fLmNoPV8uUT1udWxsfSwKRzpmdW5jdGlvbiBH
-KCl7dGhpcy5jPXRoaXMuYj10aGlzLmE9bnVsbH0sCnU5OmZ1bmN0aW9uIHU5KCl7fSwKaHo6ZnVuY3Rp
-b24gaHooYSl7dGhpcy5hPWF9LAppTTpmdW5jdGlvbiBpTShhKXt0aGlzLmE9YX0sClI5OmZ1bmN0aW9u
-KGEpe3JldHVybiB1LmQuYyhhKXx8dS5CLmMoYSl8fHUuZHouYyhhKXx8dS5JLmMoYSl8fHUuQS5jKGEp
-fHx1Lmc0LmMoYSl8fHUuZzIuYyhhKX0sCkpnOmZ1bmN0aW9uKGEpe3JldHVybiB2Lm1hbmdsZWRHbG9i
-YWxOYW1lc1thXX19LEo9ewpRdTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm57aTphLHA6YixlOmMseDpk
-fX0sCmtzOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHA9YVt2LmRpc3BhdGNoUHJvcGVydHlOYW1lXQpp
-ZihwPT1udWxsKWlmKCQuQnY9PW51bGwpe0guWEQoKQpwPWFbdi5kaXNwYXRjaFByb3BlcnR5TmFtZV19
-aWYocCE9bnVsbCl7dD1wLnAKaWYoITE9PT10KXJldHVybiBwLmkKaWYoITA9PT10KXJldHVybiBhCnM9
-T2JqZWN0LmdldFByb3RvdHlwZU9mKGEpCmlmKHQ9PT1zKXJldHVybiBwLmkKaWYocC5lPT09cyl0aHJv
-dyBILmIoUC5TWSgiUmV0dXJuIGludGVyY2VwdG9yIGZvciAiK0guZCh0KGEscCkpKSl9cj1hLmNvbnN0
-cnVjdG9yCnE9cj09bnVsbD9udWxsOnJbJC5VTigpXQppZihxIT1udWxsKXJldHVybiBxCnE9SC53Myhh
-KQppZihxIT1udWxsKXJldHVybiBxCmlmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJldHVybiBDLkRHCnQ9
-T2JqZWN0LmdldFByb3RvdHlwZU9mKGEpCmlmKHQ9PW51bGwpcmV0dXJuIEMuWlEKaWYodD09PU9iamVj
-dC5wcm90b3R5cGUpcmV0dXJuIEMuWlEKaWYodHlwZW9mIHI9PSJmdW5jdGlvbiIpe09iamVjdC5kZWZp
-bmVQcm9wZXJ0eShyLCQuVU4oKSx7dmFsdWU6Qy52QixlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRy
-dWUsY29uZmlndXJhYmxlOnRydWV9KQpyZXR1cm4gQy52Qn1yZXR1cm4gQy52Qn0sClFpOmZ1bmN0aW9u
-KGEsYil7aWYoYTwwfHxhPjQyOTQ5NjcyOTUpdGhyb3cgSC5iKFAuVEUoYSwwLDQyOTQ5NjcyOTUsImxl
-bmd0aCIsbnVsbCkpCnJldHVybiBKLnB5KG5ldyBBcnJheShhKSxiKX0sCnB5OmZ1bmN0aW9uKGEsYil7
-cmV0dXJuIEouRXAoSC5WTShhLGIuQygiamQ8MD4iKSkpfSwKRXA6ZnVuY3Rpb24oYSl7YS5maXhlZCRs
-ZW5ndGg9QXJyYXkKcmV0dXJuIGF9LAp6QzpmdW5jdGlvbihhKXthLmZpeGVkJGxlbmd0aD1BcnJheQph
-LmltbXV0YWJsZSRsaXN0PUFycmF5CnJldHVybiBhfSwKR2E6ZnVuY3Rpb24oYSl7aWYoYTwyNTYpc3dp
-dGNoKGEpe2Nhc2UgOTpjYXNlIDEwOmNhc2UgMTE6Y2FzZSAxMjpjYXNlIDEzOmNhc2UgMzI6Y2FzZSAx
-MzM6Y2FzZSAxNjA6cmV0dXJuITAKZGVmYXVsdDpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSA1NzYwOmNh
-c2UgODE5MjpjYXNlIDgxOTM6Y2FzZSA4MTk0OmNhc2UgODE5NTpjYXNlIDgxOTY6Y2FzZSA4MTk3OmNh
-c2UgODE5ODpjYXNlIDgxOTk6Y2FzZSA4MjAwOmNhc2UgODIwMTpjYXNlIDgyMDI6Y2FzZSA4MjMyOmNh
-c2UgODIzMzpjYXNlIDgyMzk6Y2FzZSA4Mjg3OmNhc2UgMTIyODg6Y2FzZSA2NTI3OTpyZXR1cm4hMApk
-ZWZhdWx0OnJldHVybiExfX0sCm1tOmZ1bmN0aW9uKGEsYil7dmFyIHQscwpmb3IodD1hLmxlbmd0aDti
-PHQ7KXtzPUMueEIuVyhhLGIpCmlmKHMhPT0zMiYmcyE9PTEzJiYhSi5HYShzKSlicmVhazsrK2J9cmV0
-dXJuIGJ9LApjMTpmdW5jdGlvbihhLGIpe3ZhciB0LHMKZm9yKDtiPjA7Yj10KXt0PWItMQpzPUMueEIu
-bShhLHQpCmlmKHMhPT0zMiYmcyE9PTEzJiYhSi5HYShzKSlicmVha31yZXR1cm4gYn0sClJFOmZ1bmN0
-aW9uKGEpe2lmKGE9PW51bGwpcmV0dXJuIGEKaWYodHlwZW9mIGEhPSJvYmplY3QiKXtpZih0eXBlb2Yg
-YT09ImZ1bmN0aW9uIilyZXR1cm4gSi5jNS5wcm90b3R5cGUKcmV0dXJuIGF9aWYoYSBpbnN0YW5jZW9m
-IFAuaylyZXR1cm4gYQpyZXR1cm4gSi5rcyhhKX0sClRKOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0i
-bnVtYmVyIilyZXR1cm4gSi5xSS5wcm90b3R5cGUKaWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBK
-LkRyLnByb3RvdHlwZQppZihhPT1udWxsKXJldHVybiBhCmlmKGEuY29uc3RydWN0b3I9PUFycmF5KXJl
-dHVybiBKLmpkLnByb3RvdHlwZQppZih0eXBlb2YgYSE9Im9iamVjdCIpe2lmKHR5cGVvZiBhPT0iZnVu
-Y3Rpb24iKXJldHVybiBKLmM1LnByb3RvdHlwZQpyZXR1cm4gYX1pZihhIGluc3RhbmNlb2YgUC5rKXJl
-dHVybiBhCnJldHVybiBKLmtzKGEpfSwKVTY6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJzdHJpbmci
-KXJldHVybiBKLkRyLnByb3RvdHlwZQppZihhPT1udWxsKXJldHVybiBhCmlmKGEuY29uc3RydWN0b3I9
-PUFycmF5KXJldHVybiBKLmpkLnByb3RvdHlwZQppZih0eXBlb2YgYSE9Im9iamVjdCIpe2lmKHR5cGVv
-ZiBhPT0iZnVuY3Rpb24iKXJldHVybiBKLmM1LnByb3RvdHlwZQpyZXR1cm4gYX1pZihhIGluc3RhbmNl
-b2YgUC5rKXJldHVybiBhCnJldHVybiBKLmtzKGEpfSwKaWE6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9
-PSJudW1iZXIiKXtpZihNYXRoLmZsb29yKGEpPT1hKXJldHVybiBKLnVyLnByb3RvdHlwZQpyZXR1cm4g
-Si5WQS5wcm90b3R5cGV9aWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBKLkRyLnByb3RvdHlwZQpp
-ZihhPT1udWxsKXJldHVybiBKLllFLnByb3RvdHlwZQppZih0eXBlb2YgYT09ImJvb2xlYW4iKXJldHVy
-biBKLnlFLnByb3RvdHlwZQppZihhLmNvbnN0cnVjdG9yPT1BcnJheSlyZXR1cm4gSi5qZC5wcm90b3R5
-cGUKaWYodHlwZW9mIGEhPSJvYmplY3QiKXtpZih0eXBlb2YgYT09ImZ1bmN0aW9uIilyZXR1cm4gSi5j
-NS5wcm90b3R5cGUKcmV0dXJuIGF9aWYoYSBpbnN0YW5jZW9mIFAuaylyZXR1cm4gYQpyZXR1cm4gSi5r
-cyhhKX0sCnJZOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4gSi5Eci5wcm90
-b3R5cGUKaWYoYT09bnVsbClyZXR1cm4gYQppZighKGEgaW5zdGFuY2VvZiBQLmspKXJldHVybiBKLmtk
-LnByb3RvdHlwZQpyZXR1cm4gYX0sCncxOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpcmV0dXJuIGEKaWYo
-YS5jb25zdHJ1Y3Rvcj09QXJyYXkpcmV0dXJuIEouamQucHJvdG90eXBlCmlmKHR5cGVvZiBhIT0ib2Jq
-ZWN0Iil7aWYodHlwZW9mIGE9PSJmdW5jdGlvbiIpcmV0dXJuIEouYzUucHJvdG90eXBlCnJldHVybiBh
-fWlmKGEgaW5zdGFuY2VvZiBQLmspcmV0dXJuIGEKcmV0dXJuIEoua3MoYSl9LApBTTpmdW5jdGlvbihh
-LGIpe3JldHVybiBKLncxKGEpLkUoYSxiKX0sCkNNOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBKLlJF
-KGEpLmR1KGEsYixjLGQpfSwKRkw6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5yWShhKS5kZChhLGIpfSwK
-R3I6ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ21XKGEpfSwKSG06ZnVuY3Rpb24oYSl7cmV0dXJu
-IEouVTYoYSkuZ0EoYSl9LApJVDpmdW5jdGlvbihhKXtyZXR1cm4gSi53MShhKS5na3ooYSl9LApKeTpm
-dW5jdGlvbihhLGIpe3JldHVybiBKLmlhKGEpLmU3KGEsYil9LApLVjpmdW5jdGlvbihhLGIpe3JldHVy
-biBKLnJZKGEpLkcoYSxiKX0sCkx0OmZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLndnKGEpfSwKTTE6
-ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBKLncxKGEpLkUyKGEsYixjKX0sClF6OmZ1bmN0aW9uKGEsYil7
-cmV0dXJuIEouclkoYSkuVyhhLGIpfSwKUk06ZnVuY3Rpb24oYSxiKXtpZihhPT1udWxsKXJldHVybiBi
-PT1udWxsCmlmKHR5cGVvZiBhIT0ib2JqZWN0IilyZXR1cm4gYiE9bnVsbCYmYT09PWIKcmV0dXJuIEou
-aWEoYSkuRE4oYSxiKX0sClQwOmZ1bmN0aW9uKGEpe3JldHVybiBKLnJZKGEpLmJTKGEpfSwKYTY6ZnVu
-Y3Rpb24oYSxiKXtyZXR1cm4gSi5yWShhKS5tKGEsYil9LApiVDpmdW5jdGlvbihhKXtyZXR1cm4gSi5S
-RShhKS5ENChhKX0sCmJiOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGE9PSJudW1iZXIiJiZ0eXBlb2Yg
-Yj09Im51bWJlciIpcmV0dXJuIGErYgpyZXR1cm4gSi5USihhKS5oKGEsYil9LApjSDpmdW5jdGlvbihh
-KXtyZXR1cm4gSi5yWShhKS5oYyhhKX0sCmRSOmZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdEKGEp
-fSwKZFo6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIEouUkUoYSkuT24oYSxiLGMsZCl9LApkaDpmdW5j
-dGlvbihhKXtyZXR1cm4gSi5SRShhKS50bihhKX0sCmhmOmZ1bmN0aW9uKGEpe3JldHVybiBKLmlhKGEp
-LmdpTyhhKX0sCmlnOmZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdRZyhhKX0sCmo6ZnVuY3Rpb24o
-YSl7cmV0dXJuIEouaWEoYSkudyhhKX0sCmw1OmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc2hm
-KGEsYil9LApsZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEouclkoYSkuTmooYSxiLGMpfSwKcTA6ZnVu
-Y3Rpb24oYSxiLGMpe3JldHVybiBKLnJZKGEpLlFpKGEsYixjKX0sCnFGOmZ1bmN0aW9uKGEpe3JldHVy
-biBKLlJFKGEpLmdWbChhKX0sCnRIOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSi5SRShhKS5wayhhLGIs
-Yyl9LAp3MjpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiPT09Im51bWJlciIpaWYoYS5jb25zdHJ1Y3Rv
-cj09QXJyYXl8fHR5cGVvZiBhPT0ic3RyaW5nInx8SC53VihhLGFbdi5kaXNwYXRjaFByb3BlcnR5TmFt
-ZV0pKWlmKGI+Pj4wPT09YiYmYjxhLmxlbmd0aClyZXR1cm4gYVtiXQpyZXR1cm4gSi5VNihhKS5xKGEs
-Yil9LAp5UTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gSi5yWShhKS5pNyhhLGIsYyxkKX0sCnpsOmZ1
-bmN0aW9uKGEsYil7cmV0dXJuIEouVTYoYSkudGcoYSxiKX0sCnZCOmZ1bmN0aW9uIHZCKCl7fSwKeUU6
-ZnVuY3Rpb24geUUoKXt9LApZRTpmdW5jdGlvbiBZRSgpe30sCk1GOmZ1bmN0aW9uIE1GKCl7fSwKaUM6
-ZnVuY3Rpb24gaUMoKXt9LAprZDpmdW5jdGlvbiBrZCgpe30sCmM1OmZ1bmN0aW9uIGM1KCl7fSwKamQ6
-ZnVuY3Rpb24gamQoYSl7dGhpcy4kdGk9YX0sClBvOmZ1bmN0aW9uIFBvKGEpe3RoaXMuJHRpPWF9LApt
-MTpmdW5jdGlvbiBtMShhLGIsYyl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9MApfLmQ9bnVsbApf
-LiR0aT1jfSwKcUk6ZnVuY3Rpb24gcUkoKXt9LAp1cjpmdW5jdGlvbiB1cigpe30sClZBOmZ1bmN0aW9u
-IFZBKCl7fSwKRHI6ZnVuY3Rpb24gRHIoKXt9fSxQPXsKT2o6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9e30K
-aWYoc2VsZi5zY2hlZHVsZUltbWVkaWF0ZSE9bnVsbClyZXR1cm4gUC5FWCgpCmlmKHNlbGYuTXV0YXRp
-b25PYnNlcnZlciE9bnVsbCYmc2VsZi5kb2N1bWVudCE9bnVsbCl7dD1zZWxmLmRvY3VtZW50LmNyZWF0
-ZUVsZW1lbnQoImRpdiIpCnM9c2VsZi5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIikKci5hPW51
-bGwKbmV3IHNlbGYuTXV0YXRpb25PYnNlcnZlcihILnRSKG5ldyBQLnRoKHIpLDEpKS5vYnNlcnZlKHQs
-e2NoaWxkTGlzdDp0cnVlfSkKcmV0dXJuIG5ldyBQLmhhKHIsdCxzKX1lbHNlIGlmKHNlbGYuc2V0SW1t
-ZWRpYXRlIT1udWxsKXJldHVybiBQLnl0KCkKcmV0dXJuIFAucVcoKX0sClpWOmZ1bmN0aW9uKGEpe3Nl
-bGYuc2NoZWR1bGVJbW1lZGlhdGUoSC50UihuZXcgUC5Wcyh1Lk0uYihhKSksMCkpfSwKb0E6ZnVuY3Rp
-b24oYSl7c2VsZi5zZXRJbW1lZGlhdGUoSC50UihuZXcgUC5GdCh1Lk0uYihhKSksMCkpfSwKQno6ZnVu
-Y3Rpb24oYSl7dS5NLmIoYSkKUC5RTigwLGEpfSwKUU46ZnVuY3Rpb24oYSxiKXt2YXIgdD1uZXcgUC5X
-MygpCnQuQ1koYSxiKQpyZXR1cm4gdH0sCkZYOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5paChuZXcg
-UC52cygkLlgzLGEuQygidnM8MD4iKSksYS5DKCJpaDwwPiIpKX0sCkRJOmZ1bmN0aW9uKGEsYil7YS4k
-MigwLG51bGwpCmIuYj0hMApyZXR1cm4gYi5hfSwKalE6ZnVuY3Rpb24oYSxiKXtQLkplKGEsYil9LAp5
-QzpmdW5jdGlvbihhLGIpe2IuYU0oMCxhKX0sCmYzOmZ1bmN0aW9uKGEsYil7Yi53MChILlJ1KGEpLEgu
-dHMoYSkpfSwKSmU6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHI9bmV3IFAuV00oYikscT1uZXcgUC5TWChi
-KQppZihhIGluc3RhbmNlb2YgUC52cylhLlFkKHIscSx1LnopCmVsc2V7dD11LnoKaWYodS5jLmMoYSkp
-YS5TcShyLHEsdCkKZWxzZXtzPW5ldyBQLnZzKCQuWDMsdS5fKQpzLmE9NApzLmM9YQpzLlFkKHIsbnVs
-bCx0KX19fSwKbHo6ZnVuY3Rpb24oYSl7dmFyIHQ9ZnVuY3Rpb24oYixjKXtyZXR1cm4gZnVuY3Rpb24o
-ZCxlKXt3aGlsZSh0cnVlKXRyeXtiKGQsZSkKYnJlYWt9Y2F0Y2gocyl7ZT1zCmQ9Y319fShhLDEpCnJl
-dHVybiAkLlgzLkxqKG5ldyBQLkdzKHQpLHUuUCx1LmVnLHUueil9LAprMzpmdW5jdGlvbihhLGIpe3Zh
-ciB0LHMscgpiLmE9MQp0cnl7YS5TcShuZXcgUC5wVihiKSxuZXcgUC5VNyhiKSx1LlApfWNhdGNoKHIp
-e3Q9SC5SdShyKQpzPUgudHMocikKUC5yYihuZXcgUC52cihiLHQscykpfX0sCkE5OmZ1bmN0aW9uKGEs
-Yil7dmFyIHQscyxyCmZvcih0PXUuXztzPWEuYSxzPT09MjspYT10LmIoYS5jKQppZihzPj00KXtyPWIu
-YWgoKQpiLmE9YS5hCmIuYz1hLmMKUC5IWihiLHIpfWVsc2V7cj11LnguYihiLmMpCmIuYT0yCmIuYz1h
-CmEualEocil9fSwKSFo6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxn
-LGYsZT1udWxsLGQ9e30sYz1kLmE9YQpmb3IodD11Lm4scz11Lngscj11LmM7ITA7KXtxPXt9CnA9Yy5h
-PT09OAppZihiPT1udWxsKXtpZihwKXtvPXQuYihjLmMpClAuTDIoZSxlLGMuYixvLmEsby5iKX1yZXR1
-cm59Zm9yKDtuPWIuYSxuIT1udWxsO2I9bil7Yi5hPW51bGwKUC5IWihkLmEsYil9Yz1kLmEKbT1jLmMK
-cS5hPXAKcS5iPW0KbD0hcAppZihsKXtrPWIuYwprPShrJjEpIT09MHx8KGsmMTUpPT09OH1lbHNlIGs9
-ITAKaWYoayl7az1iLmIKaj1rLmIKaWYocCl7aT1jLmI9PT1qCmk9IShpfHxpKX1lbHNlIGk9ITEKaWYo
-aSl7dC5iKG0pClAuTDIoZSxlLGMuYixtLmEsbS5iKQpyZXR1cm59aD0kLlgzCmlmKGghPT1qKSQuWDM9
-agplbHNlIGg9ZQpjPWIuYwppZigoYyYxNSk9PT04KW5ldyBQLlJUKGQscSxiLHApLiQwKCkKZWxzZSBp
-ZihsKXtpZigoYyYxKSE9PTApbmV3IFAucnEocSxiLG0pLiQwKCl9ZWxzZSBpZigoYyYyKSE9PTApbmV3
-IFAuUlcoZCxxLGIpLiQwKCkKaWYoaCE9bnVsbCkkLlgzPWgKYz1xLmIKaWYoci5jKGMpKXtpZihjLmE+
-PTQpe2c9cy5iKGsuYykKay5jPW51bGwKYj1rLk44KGcpCmsuYT1jLmEKay5jPWMuYwpkLmE9Ywpjb250
-aW51ZX1lbHNlIFAuQTkoYyxrKQpyZXR1cm59fWY9Yi5iCmc9cy5iKGYuYykKZi5jPW51bGwKYj1mLk44
-KGcpCmM9cS5hCmw9cS5iCmlmKCFjKXtmLiR0aS5kLmIobCkKZi5hPTQKZi5jPWx9ZWxzZXt0LmIobCkK
-Zi5hPTgKZi5jPWx9ZC5hPWYKYz1mfX0sClZIOmZ1bmN0aW9uKGEsYil7dmFyIHQKaWYodS5XLmMoYSkp
-cmV0dXJuIGIuTGooYSx1LnosdS5LLHUubCkKdD11LnkKaWYodC5jKGEpKXJldHVybiB0LmIoYSkKdGhy
-b3cgSC5iKFAuTDMoYSwib25FcnJvciIsIkVycm9yIGhhbmRsZXIgbXVzdCBhY2NlcHQgb25lIE9iamVj
-dCBvciBvbmUgT2JqZWN0IGFuZCBhIFN0YWNrVHJhY2UgYXMgYXJndW1lbnRzLCBhbmQgcmV0dXJuIGEg
-YSB2YWxpZCByZXN1bHQiKSl9LApwdTpmdW5jdGlvbigpe3ZhciB0LHMKZm9yKDt0PSQuUzYsdCE9bnVs
-bDspeyQubWc9bnVsbApzPXQuYgokLlM2PXMKaWYocz09bnVsbCkkLms4PW51bGwKdC5hLiQwKCl9fSwK
-ZU46ZnVuY3Rpb24oKXskLlVEPSEwCnRyeXtQLnB1KCl9ZmluYWxseXskLm1nPW51bGwKJC5VRD0hMQpp
-ZigkLlM2IT1udWxsKSQudXQoKS4kMShQLlVJKCkpfX0sCmVXOmZ1bmN0aW9uKGEpe3ZhciB0PW5ldyBQ
-Lk9NKGEpCmlmKCQuUzY9PW51bGwpeyQuUzY9JC5rOD10CmlmKCEkLlVEKSQudXQoKS4kMShQLlVJKCkp
-fWVsc2UgJC5rOD0kLms4LmI9dH0sCnJSOmZ1bmN0aW9uKGEpe3ZhciB0LHMscj0kLlM2CmlmKHI9PW51
-bGwpe1AuZVcoYSkKJC5tZz0kLms4CnJldHVybn10PW5ldyBQLk9NKGEpCnM9JC5tZwppZihzPT1udWxs
-KXt0LmI9cgokLlM2PSQubWc9dH1lbHNle3QuYj1zLmIKJC5tZz1zLmI9dAppZih0LmI9PW51bGwpJC5r
-OD10fX0sCnJiOmZ1bmN0aW9uKGEpe3ZhciB0PW51bGwscz0kLlgzCmlmKEMuTlU9PT1zKXtQLlRrKHQs
-dCxDLk5VLGEpCnJldHVybn1QLlRrKHQsdCxzLHUuTS5iKHMuR1koYSkpKX0sClF3OmZ1bmN0aW9uKGEs
-Yil7aWYoYT09bnVsbClILnZoKFAuRWUoInN0cmVhbSIpKQpyZXR1cm4gbmV3IFAueEkoYi5DKCJ4STww
-PiIpKX0sCkwyOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQ9e30KdC5hPWQKUC5yUihuZXcgUC5wSyh0
-LGUpKX0sClQ4OmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQscz0kLlgzCmlmKHM9PT1jKXJldHVybiBk
-LiQwKCkKJC5YMz1jCnQ9cwp0cnl7cz1kLiQwKCkKcmV0dXJuIHN9ZmluYWxseXskLlgzPXR9fSwKeXY6
-ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIHQscz0kLlgzCmlmKHM9PT1jKXJldHVybiBkLiQxKGUp
-CiQuWDM9Ywp0PXMKdHJ5e3M9ZC4kMShlKQpyZXR1cm4gc31maW5hbGx5eyQuWDM9dH19LApReDpmdW5j
-dGlvbihhLGIsYyxkLGUsZixnLGgsaSl7dmFyIHQscz0kLlgzCmlmKHM9PT1jKXJldHVybiBkLiQyKGUs
-ZikKJC5YMz1jCnQ9cwp0cnl7cz1kLiQyKGUsZikKcmV0dXJuIHN9ZmluYWxseXskLlgzPXR9fSwKVGs6
-ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQKdS5NLmIoZCkKdD1DLk5VIT09YwppZih0KWQ9ISghdHx8ITEp
-P2MuR1koZCk6Yy5SVChkLHUuSCkKUC5lVyhkKX0sCnRoOmZ1bmN0aW9uIHRoKGEpe3RoaXMuYT1hfSwK
-aGE6ZnVuY3Rpb24gaGEoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKVnM6ZnVuY3Rp
-b24gVnMoYSl7dGhpcy5hPWF9LApGdDpmdW5jdGlvbiBGdChhKXt0aGlzLmE9YX0sClczOmZ1bmN0aW9u
-IFczKCl7fSwKeUg6ZnVuY3Rpb24geUgoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCmloOmZ1bmN0aW9u
-IGloKGEsYil7dGhpcy5hPWEKdGhpcy5iPSExCnRoaXMuJHRpPWJ9LApXTTpmdW5jdGlvbiBXTShhKXt0
-aGlzLmE9YX0sClNYOmZ1bmN0aW9uIFNYKGEpe3RoaXMuYT1hfSwKR3M6ZnVuY3Rpb24gR3MoYSl7dGhp
-cy5hPWF9LApQZjpmdW5jdGlvbiBQZigpe30sClpmOmZ1bmN0aW9uIFpmKGEsYil7dGhpcy5hPWEKdGhp
-cy4kdGk9Yn0sCkZlOmZ1bmN0aW9uIEZlKGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmE9bnVsbApfLmI9
-YQpfLmM9YgpfLmQ9YwpfLmU9ZApfLiR0aT1lfSwKdnM6ZnVuY3Rpb24gdnMoYSxiKXt2YXIgXz10aGlz
-Cl8uYT0wCl8uYj1hCl8uYz1udWxsCl8uJHRpPWJ9LApkYTpmdW5jdGlvbiBkYShhLGIpe3RoaXMuYT1h
-CnRoaXMuYj1ifSwKb1E6ZnVuY3Rpb24gb1EoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCnBWOmZ1bmN0
-aW9uIHBWKGEpe3RoaXMuYT1hfSwKVTc6ZnVuY3Rpb24gVTcoYSl7dGhpcy5hPWF9LAp2cjpmdW5jdGlv
-biB2cihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApySDpmdW5jdGlvbiBySChhLGIp
-e3RoaXMuYT1hCnRoaXMuYj1ifSwKS0Y6ZnVuY3Rpb24gS0YoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0s
-ClpMOmZ1bmN0aW9uIFpMKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClJUOmZ1bmN0
-aW9uIFJUKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9LApqWjpmdW5j
-dGlvbiBqWihhKXt0aGlzLmE9YX0sCnJxOmZ1bmN0aW9uIHJxKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9
-Ygp0aGlzLmM9Y30sClJXOmZ1bmN0aW9uIFJXKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9
-Y30sCk9NOmZ1bmN0aW9uIE9NKGEpe3RoaXMuYT1hCnRoaXMuYj1udWxsfSwKcWg6ZnVuY3Rpb24gcWgo
-KXt9LApCNTpmdW5jdGlvbiBCNShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKUEk6ZnVuY3Rpb24gUEko
-YSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCk1POmZ1bmN0aW9uIE1PKCl7fSwKa1Q6ZnVuY3Rpb24ga1Qo
-KXt9LAp4STpmdW5jdGlvbiB4SShhKXt0aGlzLiR0aT1hfSwKQ3c6ZnVuY3Rpb24gQ3coYSxiKXt0aGlz
-LmE9YQp0aGlzLmI9Yn0sCm0wOmZ1bmN0aW9uIG0wKCl7fSwKcEs6ZnVuY3Rpb24gcEsoYSxiKXt0aGlz
-LmE9YQp0aGlzLmI9Yn0sCkppOmZ1bmN0aW9uIEppKCl7fSwKaGo6ZnVuY3Rpb24gaGooYSxiLGMpe3Ro
-aXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKVnA6ZnVuY3Rpb24gVnAoYSxiKXt0aGlzLmE9YQp0aGlz
-LmI9Yn0sCk9SOmZ1bmN0aW9uIE9SKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCkVG
-OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYi5DKCJAPDA+IikuS3EoYykuQygiRm88MSwyPiIpLmIoSC5C
-NyhhLG5ldyBILk41KGIuQygiQDwwPiIpLktxKGMpLkMoIk41PDEsMj4iKSkpKX0sCkZsOmZ1bmN0aW9u
-KGEsYil7cmV0dXJuIG5ldyBILk41KGEuQygiQDwwPiIpLktxKGIpLkMoIk41PDEsMj4iKSl9LApMczpm
-dW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuYjYoYS5DKCJiNjwwPiIpKX0sClQyOmZ1bmN0aW9uKCl7dmFy
-IHQ9T2JqZWN0LmNyZWF0ZShudWxsKQp0WyI8bm9uLWlkZW50aWZpZXIta2V5PiJdPXQKZGVsZXRlIHRb
-Ijxub24taWRlbnRpZmllci1rZXk+Il0KcmV0dXJuIHR9LApyajpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9
-bmV3IFAubG0oYSxiLGMuQygibG08MD4iKSkKdC5jPWEuZQpyZXR1cm4gdH0sCkVQOmZ1bmN0aW9uKGEs
-YixjKXt2YXIgdCxzCmlmKFAuaEIoYSkpe2lmKGI9PT0iKCImJmM9PT0iKSIpcmV0dXJuIiguLi4pIgpy
-ZXR1cm4gYisiLi4uIitjfXQ9SC5WTShbXSx1LnMpCkMuTm0uaSgkLnhnLGEpCnRyeXtQLlZyKGEsdCl9
-ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aClyZXR1cm4gSC5PSCgkLnhnLC0xKQokLnhnLnBvcCgpfXM9
-UC52ZyhiLHUuUi5iKHQpLCIsICIpK2MKcmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9LApXRTpm
-dW5jdGlvbihhLGIsYyl7dmFyIHQscwppZihQLmhCKGEpKXJldHVybiBiKyIuLi4iK2MKdD1uZXcgUC5S
-bihiKQpDLk5tLmkoJC54ZyxhKQp0cnl7cz10CnMuYT1QLnZnKHMuYSxhLCIsICIpfWZpbmFsbHl7aWYo
-MD49JC54Zy5sZW5ndGgpcmV0dXJuIEguT0goJC54ZywtMSkKJC54Zy5wb3AoKX10LmErPWMKcz10LmEK
-cmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9LApoQjpmdW5jdGlvbihhKXt2YXIgdCxzCmZvcih0
-PSQueGcubGVuZ3RoLHM9MDtzPHQ7KytzKWlmKGE9PT0kLnhnW3NdKXJldHVybiEwCnJldHVybiExfSwK
-VnI6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwLG8sbixtPWEuZ2t6KGEpLGw9MCxrPTAKd2hpbGUo
-ITApe2lmKCEobDw4MHx8azwzKSlicmVhawppZighbS5GKCkpcmV0dXJuCnQ9SC5kKG0uZ2woKSkKQy5O
-bS5pKGIsdCkKbCs9dC5sZW5ndGgrMjsrK2t9aWYoIW0uRigpKXtpZihrPD01KXJldHVybgppZigwPj1i
-Lmxlbmd0aClyZXR1cm4gSC5PSChiLC0xKQpzPWIucG9wKCkKaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEgu
-T0goYiwtMSkKcj1iLnBvcCgpfWVsc2V7cT1tLmdsKCk7KytrCmlmKCFtLkYoKSl7aWYoazw9NCl7Qy5O
-bS5pKGIsSC5kKHEpKQpyZXR1cm59cz1ILmQocSkKaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwt
-MSkKcj1iLnBvcCgpCmwrPXMubGVuZ3RoKzJ9ZWxzZXtwPW0uZ2woKTsrK2sKZm9yKDttLkYoKTtxPXAs
-cD1vKXtvPW0uZ2woKTsrK2sKaWYoaz4xMDApe3doaWxlKCEwKXtpZighKGw+NzUmJms+MykpYnJlYWsK
-aWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKbC09Yi5wb3AoKS5sZW5ndGgrMjstLWt9Qy5O
-bS5pKGIsIi4uLiIpCnJldHVybn19cj1ILmQocSkKcz1ILmQocCkKbCs9cy5sZW5ndGgrci5sZW5ndGgr
-NH19aWYoaz5iLmxlbmd0aCsyKXtsKz01Cm49Ii4uLiJ9ZWxzZSBuPW51bGwKd2hpbGUoITApe2lmKCEo
-bD44MCYmYi5sZW5ndGg+MykpYnJlYWsKaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKbC09
-Yi5wb3AoKS5sZW5ndGgrMgppZihuPT1udWxsKXtsKz01Cm49Ii4uLiJ9fWlmKG4hPW51bGwpQy5ObS5p
-KGIsbikKQy5ObS5pKGIscikKQy5ObS5pKGIscyl9LAp0TTpmdW5jdGlvbihhLGIpe3ZhciB0LHMscj1Q
-LkxzKGIpCmZvcih0PWEubGVuZ3RoLHM9MDtzPGEubGVuZ3RoO2EubGVuZ3RoPT09dHx8KDAsSC5sayko
-YSksKytzKXIuaSgwLGIuYihhW3NdKSkKcmV0dXJuIHJ9LApuTzpmdW5jdGlvbihhKXt2YXIgdCxzPXt9
-CmlmKFAuaEIoYSkpcmV0dXJuInsuLi59Igp0PW5ldyBQLlJuKCIiKQp0cnl7Qy5ObS5pKCQueGcsYSkK
-dC5hKz0ieyIKcy5hPSEwCmEuSygwLG5ldyBQLkdBKHMsdCkpCnQuYSs9In0ifWZpbmFsbHl7aWYoMD49
-JC54Zy5sZW5ndGgpcmV0dXJuIEguT0goJC54ZywtMSkKJC54Zy5wb3AoKX1zPXQuYQpyZXR1cm4gcy5j
-aGFyQ29kZUF0KDApPT0wP3M6c30sCmI2OmZ1bmN0aW9uIGI2KGEpe3ZhciBfPXRoaXMKXy5hPTAKXy5m
-PV8uZT1fLmQ9Xy5jPV8uYj1udWxsCl8ucj0wCl8uJHRpPWF9LApibjpmdW5jdGlvbiBibihhKXt0aGlz
-LmE9YQp0aGlzLmM9dGhpcy5iPW51bGx9LApsbTpmdW5jdGlvbiBsbShhLGIsYyl7dmFyIF89dGhpcwpf
-LmE9YQpfLmI9YgpfLmQ9Xy5jPW51bGwKXy4kdGk9Y30sCm1XOmZ1bmN0aW9uIG1XKCl7fSwKTFU6ZnVu
-Y3Rpb24gTFUoKXt9LApsRDpmdW5jdGlvbiBsRCgpe30sCmlsOmZ1bmN0aW9uIGlsKCl7fSwKR0E6ZnVu
-Y3Rpb24gR0EoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCllrOmZ1bmN0aW9uIFlrKCl7fSwKS1A6ZnVu
-Y3Rpb24gS1AoKXt9LApQbjpmdW5jdGlvbiBQbigpe30sCkdqOmZ1bmN0aW9uIEdqKGEsYil7dGhpcy5h
-PWEKdGhpcy4kdGk9Yn0sCmxmOmZ1bmN0aW9uIGxmKCl7fSwKVmo6ZnVuY3Rpb24gVmooKXt9LApYdjpm
-dW5jdGlvbiBYdigpe30sCm5ZOmZ1bmN0aW9uIG5ZKCl7fSwKV1k6ZnVuY3Rpb24gV1koKXt9LApSVTpm
-dW5jdGlvbiBSVSgpe30sCkJTOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEKaWYodHlwZW9mIGEhPSJz
-dHJpbmciKXRocm93IEguYihILnRMKGEpKQp0PW51bGwKdHJ5e3Q9SlNPTi5wYXJzZShhKX1jYXRjaChy
-KXtzPUguUnUocikKcT1QLnJyKFN0cmluZyhzKSxudWxsLG51bGwpCnRocm93IEguYihxKX1xPVAuUWUo
-dCkKcmV0dXJuIHF9LApRZTpmdW5jdGlvbihhKXt2YXIgdAppZihhPT1udWxsKXJldHVybgppZih0eXBl
-b2YgYSE9Im9iamVjdCIpcmV0dXJuIGEKaWYoT2JqZWN0LmdldFByb3RvdHlwZU9mKGEpIT09QXJyYXku
-cHJvdG90eXBlKXJldHVybiBuZXcgUC51dyhhLE9iamVjdC5jcmVhdGUobnVsbCkpCmZvcih0PTA7dDxh
-Lmxlbmd0aDsrK3QpYVt0XT1QLlFlKGFbdF0pCnJldHVybiBhfSwKa3k6ZnVuY3Rpb24oYSxiLGMsZCl7
-aWYoYiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpcmV0dXJuIFAuUlAoITEsYixjLGQpCnJldHVybn0sClJQ
-OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscj0kLnJmKCkKaWYocj09bnVsbClyZXR1cm4KdD0wPT09
-YwppZih0JiYhMClyZXR1cm4gUC5PUShyLGIpCnM9Yi5sZW5ndGgKZD1QLmpCKGMsZCxzKQppZih0JiZk
-PT09cylyZXR1cm4gUC5PUShyLGIpCnJldHVybiBQLk9RKHIsYi5zdWJhcnJheShjLGQpKX0sCk9ROmZ1
-bmN0aW9uKGEsYil7aWYoUC5CZShiKSlyZXR1cm4KcmV0dXJuIFAuSmgoYSxiKX0sCkpoOmZ1bmN0aW9u
-KGEsYil7dmFyIHQscwp0cnl7dD1hLmRlY29kZShiKQpyZXR1cm4gdH1jYXRjaChzKXtILlJ1KHMpfXJl
-dHVybn0sCkJlOmZ1bmN0aW9uKGEpe3ZhciB0LHM9YS5sZW5ndGgtMgpmb3IodD0wO3Q8czsrK3QpaWYo
-YVt0XT09PTIzNylpZigoYVt0KzFdJjIyNCk9PT0xNjApcmV0dXJuITAKcmV0dXJuITF9LApXSTpmdW5j
-dGlvbigpe3ZhciB0LHMKdHJ5e3Q9bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIse2ZhdGFsOnRydWV9KQpy
-ZXR1cm4gdH1jYXRjaChzKXtILlJ1KHMpfXJldHVybn0sCndHOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxz
-LHIKZm9yKHQ9Si5VNihhKSxzPWI7czxjOysrcyl7cj10LnEoYSxzKQppZih0eXBlb2YgciE9PSJudW1i
-ZXIiKXJldHVybiByLnpNKCkKaWYoKHImMTI3KSE9PXIpcmV0dXJuIHMtYn1yZXR1cm4gYy1ifSwKeE06
-ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKEMuam4uelkoZiw0KSE9PTApdGhyb3cgSC5iKFAucnIoIklu
-dmFsaWQgYmFzZTY0IHBhZGRpbmcsIHBhZGRlZCBsZW5ndGggbXVzdCBiZSBtdWx0aXBsZSBvZiBmb3Vy
-LCBpcyAiK2YsYSxjKSkKaWYoZCtlIT09Zil0aHJvdyBILmIoUC5ycigiSW52YWxpZCBiYXNlNjQgcGFk
-ZGluZywgJz0nIG5vdCBhdCB0aGUgZW5kIixhLGIpKQppZihlPjIpdGhyb3cgSC5iKFAucnIoIkludmFs
-aWQgYmFzZTY0IHBhZGRpbmcsIG1vcmUgdGhhbiB0d28gJz0nIGNoYXJhY3RlcnMiLGEsYikpfSwKdXc6
-ZnVuY3Rpb24gdXcoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9bnVsbH0sCmk4OmZ1bmN0aW9u
-IGk4KGEpe3RoaXMuYT1hfSwKQ1Y6ZnVuY3Rpb24gQ1YoKXt9LApVODpmdW5jdGlvbiBVOCgpe30sClVr
-OmZ1bmN0aW9uIFVrKCl7fSwKd0k6ZnVuY3Rpb24gd0koKXt9LApaaTpmdW5jdGlvbiBaaSgpe30sCmJ5
-OmZ1bmN0aW9uIGJ5KCl7fSwKTXg6ZnVuY3Rpb24gTXgoYSl7dGhpcy5hPWF9LAp1NTpmdW5jdGlvbiB1
-NSgpe30sCkUzOmZ1bmN0aW9uIEUzKCl7fSwKUnc6ZnVuY3Rpb24gUncoYSl7dGhpcy5iPTAKdGhpcy5j
-PWF9LApHWTpmdW5jdGlvbiBHWShhKXt0aGlzLmE9YX0sCmJ6OmZ1bmN0aW9uIGJ6KGEsYil7dmFyIF89
-dGhpcwpfLmE9YQpfLmI9YgpfLmM9ITAKXy5mPV8uZT1fLmQ9MH0sClFBOmZ1bmN0aW9uKGEsYixjKXt2
-YXIgdD1ILkhwKGEsYykKaWYodCE9bnVsbClyZXR1cm4gdAppZihiIT1udWxsKXJldHVybiBiLiQxKGEp
-CnRocm93IEguYihQLnJyKGEsbnVsbCxudWxsKSl9LApGOmZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2Vv
-ZiBILlRwKXJldHVybiBhLncoMCkKcmV0dXJuIkluc3RhbmNlIG9mICciK0guZChILk0oYSkpKyInIn0s
-Ck84OmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzPUouUWkoYSxjKQppZihhIT09MCYmITApZm9yKHQ9MDt0
-PHMubGVuZ3RoOysrdClDLk5tLlkocyx0LGIpCnJldHVybiBzfSwKQ0g6ZnVuY3Rpb24oYSxiLGMpe3Zh
-ciB0LHM9SC5WTShbXSxjLkMoImpkPDA+IikpCmZvcih0PUouSVQoYSk7dC5GKCk7KUMuTm0uaShzLGMu
-Yih0LmdsKCkpKQppZihiKXJldHVybiBzCnJldHVybiBjLkMoInpNPDA+IikuYihKLkVwKHMpKX0sCkFG
-OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuQygiek08MD4iKS5iKEouekMoUC5DSChhLCExLGIpKSl9LApI
-TTpmdW5jdGlvbihhLGIsYyl7dmFyIHQKaWYoQXJyYXkuaXNBcnJheShhKSl7dS50LmIoYSkKdD1hLmxl
-bmd0aApjPVAuakIoYixjLHQpCnJldHVybiBILmVUKGI+MHx8Yzx0P0MuTm0uRDYoYSxiLGMpOmEpfWlm
-KHUuYm0uYyhhKSlyZXR1cm4gSC5mdyhhLGIsUC5qQihiLGMsYS5sZW5ndGgpKQpyZXR1cm4gUC5idyhh
-LGIsYyl9LApPbzpmdW5jdGlvbihhKXtyZXR1cm4gSC5MdyhhKX0sCmJ3OmZ1bmN0aW9uKGEsYixjKXt2
-YXIgdCxzLHIscSxwPW51bGwKaWYoYjwwKXRocm93IEguYihQLlRFKGIsMCxKLkhtKGEpLHAscCkpCnQ9
-Yz09bnVsbAppZighdCYmYzxiKXRocm93IEguYihQLlRFKGMsYixKLkhtKGEpLHAscCkpCnM9Si5JVChh
-KQpmb3Iocj0wO3I8YjsrK3IpaWYoIXMuRigpKXRocm93IEguYihQLlRFKGIsMCxyLHAscCkpCnE9W10K
-aWYodClmb3IoO3MuRigpOylxLnB1c2gocy5nbCgpKQplbHNlIGZvcihyPWI7cjxjOysrcil7aWYoIXMu
-RigpKXRocm93IEguYihQLlRFKGMsYixyLHAscCkpCnEucHVzaChzLmdsKCkpfXJldHVybiBILmVUKHEp
-fSwKbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILlZSKGEsSC52NChhLCExLCEwLCExLCExLCExKSl9
-LAp2ZzpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9Si5JVChiKQppZighdC5GKCkpcmV0dXJuIGEKaWYoYy5s
-ZW5ndGg9PT0wKXtkbyBhKz1ILmQodC5nbCgpKQp3aGlsZSh0LkYoKSl9ZWxzZXthKz1ILmQodC5nbCgp
-KQpmb3IoO3QuRigpOylhPWErYytILmQodC5nbCgpKX1yZXR1cm4gYX0sCmxyOmZ1bmN0aW9uKGEsYixj
-LGQpe3JldHVybiBuZXcgUC5tcChhLGIsYyxkKX0sCnVvOmZ1bmN0aW9uKCl7dmFyIHQ9SC5NMCgpCmlm
-KHQhPW51bGwpcmV0dXJuIFAuaEsodCkKdGhyb3cgSC5iKFAuTDQoIidVcmkuYmFzZScgaXMgbm90IHN1
-cHBvcnRlZCIpKX0sCmVQOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscixxLHAsbyxuPSIwMTIzNDU2
-Nzg5QUJDREVGIgppZihjPT09Qy54TSl7dD0kLno0KCkuYgppZih0eXBlb2YgYiE9InN0cmluZyIpSC52
-aChILnRMKGIpKQp0PXQudGVzdChiKX1lbHNlIHQ9ITEKaWYodClyZXR1cm4gYgpILkxoKGMpLkMoIlVr
-LlMiKS5iKGIpCnM9Yy5nWkUoKS5XSihiKQpmb3IodD1zLmxlbmd0aCxyPTAscT0iIjtyPHQ7KytyKXtw
-PXNbcl0KaWYocDwxMjgpe289cD4+PjQKaWYobz49OClyZXR1cm4gSC5PSChhLG8pCm89KGFbb10mMTw8
-KHAmMTUpKSE9PTB9ZWxzZSBvPSExCmlmKG8pcSs9SC5MdyhwKQplbHNlIHE9ZCYmcD09PTMyP3ErIisi
-OnErIiUiK25bcD4+PjQmMTVdK25bcCYxNV19cmV0dXJuIHEuY2hhckNvZGVBdCgwKT09MD9xOnF9LApH
-cTpmdW5jdGlvbihhKXt2YXIgdD1NYXRoLmFicyhhKSxzPWE8MD8iLSI6IiIKaWYodD49MTAwMClyZXR1
-cm4iIithCmlmKHQ+PTEwMClyZXR1cm4gcysiMCIrdAppZih0Pj0xMClyZXR1cm4gcysiMDAiK3QKcmV0
-dXJuIHMrIjAwMCIrdH0sClZ4OmZ1bmN0aW9uKGEpe2lmKGE+PTEwMClyZXR1cm4iIithCmlmKGE+PTEw
-KXJldHVybiIwIithCnJldHVybiIwMCIrYX0sCmgwOmZ1bmN0aW9uKGEpe2lmKGE+PTEwKXJldHVybiIi
-K2EKcmV0dXJuIjAiK2F9LApwOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ibnVtYmVyInx8SC5sKGEp
-fHxudWxsPT1hKXJldHVybiBKLmooYSkKaWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBKU09OLnN0
-cmluZ2lmeShhKQpyZXR1cm4gUC5GKGEpfSwKaFY6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLkM2KGEp
-fSwKeFk6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLnUoITEsbnVsbCxudWxsLGEpfSwKTDM6ZnVuY3Rp
-b24oYSxiLGMpe3JldHVybiBuZXcgUC51KCEwLGEsYixjKX0sCkVlOmZ1bmN0aW9uKGEpe3JldHVybiBu
-ZXcgUC51KCExLG51bGwsYSwiTXVzdCBub3QgYmUgbnVsbCIpfSwKeDpmdW5jdGlvbihhLGIpe3JldHVy
-biBuZXcgUC5iSihudWxsLG51bGwsITAsYSxiLCJWYWx1ZSBub3QgaW4gcmFuZ2UiKX0sClRFOmZ1bmN0
-aW9uKGEsYixjLGQsZSl7cmV0dXJuIG5ldyBQLmJKKGIsYywhMCxhLGQsIkludmFsaWQgdmFsdWUiKX0s
-CndBOmZ1bmN0aW9uKGEsYixjLGQpe2lmKGE8Ynx8YT5jKXRocm93IEguYihQLlRFKGEsYixjLGQsbnVs
-bCkpfSwKakI6ZnVuY3Rpb24oYSxiLGMpe2lmKDA+YXx8YT5jKXRocm93IEguYihQLlRFKGEsMCxjLCJz
-dGFydCIsbnVsbCkpCmlmKGIhPW51bGwpe2lmKGE+Ynx8Yj5jKXRocm93IEguYihQLlRFKGIsYSxjLCJl
-bmQiLG51bGwpKQpyZXR1cm4gYn1yZXR1cm4gY30sCmsxOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGEh
-PT0ibnVtYmVyIilyZXR1cm4gYS5KKCkKaWYoYTwwKXRocm93IEguYihQLlRFKGEsMCxudWxsLGIsbnVs
-bCkpfSwKQ2Y6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgdD1ILlNjKGU9PW51bGw/Si5IbShiKTplKQpy
-ZXR1cm4gbmV3IFAuZVkodCwhMCxhLGMsIkluZGV4IG91dCBvZiByYW5nZSIpfSwKTDQ6ZnVuY3Rpb24o
-YSl7cmV0dXJuIG5ldyBQLnViKGEpfSwKU1k6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLmRzKGEpfSwK
-UFY6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLmxqKGEpfSwKYTQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG5l
-dyBQLlVWKGEpfSwKcnI6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgUC5hRShhLGIsYyl9LApkSDpm
-dW5jdGlvbihhLGIsYyxkKXt2YXIgdCxzPUguVk0oW10sZC5DKCJqZDwwPiIpKQpDLk5tLnNBKHMsYSkK
-Zm9yKHQ9MDt0PGE7Kyt0KUMuTm0uWShzLHQsYi4kMSh0KSkKcmV0dXJuIHN9LApoSzpmdW5jdGlvbihh
-KXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZT1udWxsLGQ9YS5sZW5ndGgKaWYoZD49
-NSl7dD0oKEouUXooYSw0KV41OCkqM3xDLnhCLlcoYSwwKV4xMDB8Qy54Qi5XKGEsMSleOTd8Qy54Qi5X
-KGEsMileMTE2fEMueEIuVyhhLDMpXjk3KT4+PjAKaWYodD09PTApcmV0dXJuIFAuS0QoZDxkP0MueEIu
-TmooYSwwLGQpOmEsNSxlKS5nbFIoKQplbHNlIGlmKHQ9PT0zMilyZXR1cm4gUC5LRChDLnhCLk5qKGEs
-NSxkKSwwLGUpLmdsUigpfXM9bmV3IEFycmF5KDgpCnMuZml4ZWQkbGVuZ3RoPUFycmF5CnI9SC5WTShz
-LHUudCkKQy5ObS5ZKHIsMCwwKQpDLk5tLlkociwxLC0xKQpDLk5tLlkociwyLC0xKQpDLk5tLlkociw3
-LC0xKQpDLk5tLlkociwzLDApCkMuTm0uWShyLDQsMCkKQy5ObS5ZKHIsNSxkKQpDLk5tLlkociw2LGQp
-CmlmKFAuVUIoYSwwLGQsMCxyKT49MTQpQy5ObS5ZKHIsNyxkKQpxPXJbMV0KaWYodHlwZW9mIHEhPT0i
-bnVtYmVyIilyZXR1cm4gcS50QigpCmlmKHE+PTApaWYoUC5VQihhLDAscSwyMCxyKT09PTIwKXJbN109
-cQpzPXJbMl0KaWYodHlwZW9mIHMhPT0ibnVtYmVyIilyZXR1cm4gcy5oKCkKcD1zKzEKbz1yWzNdCm49
-cls0XQptPXJbNV0KbD1yWzZdCmlmKHR5cGVvZiBsIT09Im51bWJlciIpcmV0dXJuIGwuSigpCmlmKHR5
-cGVvZiBtIT09Im51bWJlciIpcmV0dXJuIEgucFkobSkKaWYobDxtKW09bAppZih0eXBlb2YgbiE9PSJu
-dW1iZXIiKXJldHVybiBuLkooKQppZihuPHApbj1tCmVsc2UgaWYobjw9cSluPXErMQppZih0eXBlb2Yg
-byE9PSJudW1iZXIiKXJldHVybiBvLkooKQppZihvPHApbz1uCnM9cls3XQppZih0eXBlb2YgcyE9PSJu
-dW1iZXIiKXJldHVybiBzLkooKQprPXM8MAppZihrKWlmKHA+cSszKXtqPWUKaz0hMX1lbHNle3M9bz4w
-CmlmKHMmJm8rMT09PW4pe2o9ZQprPSExfWVsc2V7aWYoIShtPGQmJm09PT1uKzImJkoucTAoYSwiLi4i
-LG4pKSlpPW0+bisyJiZKLnEwKGEsIi8uLiIsbS0zKQplbHNlIGk9ITAKaWYoaSl7aj1lCms9ITF9ZWxz
-ZXtpZihxPT09NClpZihKLnEwKGEsImZpbGUiLDApKXtpZihwPD0wKXtpZighQy54Qi5RaShhLCIvIixu
-KSl7aD0iZmlsZTovLy8iCnQ9M31lbHNle2g9ImZpbGU6Ly8iCnQ9Mn1hPWgrQy54Qi5OaihhLG4sZCkK
-cS09MApzPXQtMAptKz1zCmwrPXMKZD1hLmxlbmd0aApwPTcKbz03Cm49N31lbHNlIGlmKG49PT1tKXtn
-PW0rMTsrK2wKYT1DLnhCLmk3KGEsbixtLCIvIik7KytkCm09Z31qPSJmaWxlIn1lbHNlIGlmKEMueEIu
-UWkoYSwiaHR0cCIsMCkpe2lmKHMmJm8rMz09PW4mJkMueEIuUWkoYSwiODAiLG8rMSkpe2Y9bi0zCm0t
-PTMKbC09MwphPUMueEIuaTcoYSxvLG4sIiIpCmQtPTMKbj1mfWo9Imh0dHAifWVsc2Ugaj1lCmVsc2Ug
-aWYocT09PTUmJkoucTAoYSwiaHR0cHMiLDApKXtpZihzJiZvKzQ9PT1uJiZKLnEwKGEsIjQ0MyIsbysx
-KSl7Zj1uLTQKbS09NApsLT00CmE9Si55UShhLG8sbiwiIikKZC09MwpuPWZ9aj0iaHR0cHMifWVsc2Ug
-aj1lCms9ITB9fX1lbHNlIGo9ZQppZihrKXtzPWEubGVuZ3RoCmlmKGQ8cyl7YT1KLmxkKGEsMCxkKQpx
-LT0wCnAtPTAKby09MApuLT0wCm0tPTAKbC09MH1yZXR1cm4gbmV3IFAuVWYoYSxxLHAsbyxuLG0sbCxq
-KX1yZXR1cm4gUC5qdihhLDAsZCxxLHAsbyxuLG0sbCxqKX0sCk10OmZ1bmN0aW9uKGEpe0gueShhKQpy
-ZXR1cm4gUC5rdShhLDAsYS5sZW5ndGgsQy54TSwhMSl9LApXWDpmdW5jdGlvbihhKXt2YXIgdD11Lk4K
-cmV0dXJuIEMuTm0uTjAoSC5WTShhLnNwbGl0KCImIiksdS5zKSxQLkZsKHQsdCksbmV3IFAubjEoQy54
-TSksdS5mKX0sCkhoOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxwLG8sbixtPW51bGwsbD0iSVB2
-NCBhZGRyZXNzIHNob3VsZCBjb250YWluIGV4YWN0bHkgNCBwYXJ0cyIsaz0iZWFjaCBwYXJ0IG11c3Qg
-YmUgaW4gdGhlIHJhbmdlIDAuLjI1NSIsaj1uZXcgUC5jUyhhKSxpPW5ldyBVaW50OEFycmF5KDQpCmZv
-cih0PWkubGVuZ3RoLHM9YixyPXMscT0wO3M8YzsrK3Mpe3A9Qy54Qi5tKGEscykKaWYocCE9PTQ2KXtp
-ZigocF40OCk+OSlqLiQyKCJpbnZhbGlkIGNoYXJhY3RlciIscyl9ZWxzZXtpZihxPT09MylqLiQyKGws
-cykKbz1QLlFBKEMueEIuTmooYSxyLHMpLG0sbSkKaWYodHlwZW9mIG8hPT0ibnVtYmVyIilyZXR1cm4g
-by5vcygpCmlmKG8+MjU1KWouJDIoayxyKQpuPXErMQppZihxPj10KXJldHVybiBILk9IKGkscSkKaVtx
-XT1vCnI9cysxCnE9bn19aWYocSE9PTMpai4kMihsLGMpCm89UC5RQShDLnhCLk5qKGEscixjKSxtLG0p
-CmlmKHR5cGVvZiBvIT09Im51bWJlciIpcmV0dXJuIG8ub3MoKQppZihvPjI1NSlqLiQyKGsscikKaWYo
-cT49dClyZXR1cm4gSC5PSChpLHEpCmlbcV09bwpyZXR1cm4gaX0sCmVnOmZ1bmN0aW9uKGEsYixhMCl7
-dmFyIHQscyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZD1uZXcgUC5WQyhhKSxjPW5ldyBQLnRw
-KGQsYSkKaWYoYS5sZW5ndGg8MilkLiQxKCJhZGRyZXNzIGlzIHRvbyBzaG9ydCIpCnQ9SC5WTShbXSx1
-LnQpCmZvcihzPWIscj1zLHE9ITEscD0hMTtzPGEwOysrcyl7bz1DLnhCLm0oYSxzKQppZihvPT09NTgp
-e2lmKHM9PT1iKXsrK3MKaWYoQy54Qi5tKGEscykhPT01OClkLiQyKCJpbnZhbGlkIHN0YXJ0IGNvbG9u
-LiIscykKcj1zfWlmKHM9PT1yKXtpZihxKWQuJDIoIm9ubHkgb25lIHdpbGRjYXJkIGA6OmAgaXMgYWxs
-b3dlZCIscykKQy5ObS5pKHQsLTEpCnE9ITB9ZWxzZSBDLk5tLmkodCxjLiQyKHIscykpCnI9cysxfWVs
-c2UgaWYobz09PTQ2KXA9ITB9aWYodC5sZW5ndGg9PT0wKWQuJDEoInRvbyBmZXcgcGFydHMiKQpuPXI9
-PT1hMAptPUMuTm0uZ3JaKHQpCmlmKG4mJm0hPT0tMSlkLiQyKCJleHBlY3RlZCBhIHBhcnQgYWZ0ZXIg
-bGFzdCBgOmAiLGEwKQppZighbilpZighcClDLk5tLmkodCxjLiQyKHIsYTApKQplbHNle2w9UC5IaChh
-LHIsYTApCkMuTm0uaSh0LChsWzBdPDw4fGxbMV0pPj4+MCkKQy5ObS5pKHQsKGxbMl08PDh8bFszXSk+
-Pj4wKX1pZihxKXtpZih0Lmxlbmd0aD43KWQuJDEoImFuIGFkZHJlc3Mgd2l0aCBhIHdpbGRjYXJkIG11
-c3QgaGF2ZSBsZXNzIHRoYW4gNyBwYXJ0cyIpfWVsc2UgaWYodC5sZW5ndGghPT04KWQuJDEoImFuIGFk
-ZHJlc3Mgd2l0aG91dCBhIHdpbGRjYXJkIG11c3QgY29udGFpbiBleGFjdGx5IDggcGFydHMiKQprPW5l
-dyBVaW50OEFycmF5KDE2KQpmb3IobT10Lmxlbmd0aCxqPWsubGVuZ3RoLGk9OS1tLHM9MCxoPTA7czxt
-Oysrcyl7Zz10W3NdCmlmKGc9PT0tMSlmb3IoZj0wO2Y8aTsrK2Ype2lmKGg8MHx8aD49ailyZXR1cm4g
-SC5PSChrLGgpCmtbaF09MAplPWgrMQppZihlPj1qKXJldHVybiBILk9IKGssZSkKa1tlXT0wCmgrPTJ9
-ZWxzZXtlPUMuam4ud0coZyw4KQppZihoPDB8fGg+PWopcmV0dXJuIEguT0goayxoKQprW2hdPWUKZT1o
-KzEKaWYoZT49ailyZXR1cm4gSC5PSChrLGUpCmtbZV09ZyYyNTUKaCs9Mn19cmV0dXJuIGt9LApqdjpm
-dW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSxqKXt2YXIgdCxzLHIscSxwLG8sbixtPW51bGwKaWYoaj09
-bnVsbClpZihkPmIpaj1QLlBpKGEsYixkKQplbHNle2lmKGQ9PT1iKVAuUjMoYSxiLCJJbnZhbGlkIGVt
-cHR5IHNjaGVtZSIpCmo9IiJ9aWYoZT5iKXt0PWQrMwpzPXQ8ZT9QLnpSKGEsdCxlLTEpOiIiCnI9UC5P
-ZShhLGUsZiwhMSkKaWYodHlwZW9mIGYhPT0ibnVtYmVyIilyZXR1cm4gZi5oKCkKcT1mKzEKaWYodHlw
-ZW9mIGchPT0ibnVtYmVyIilyZXR1cm4gSC5wWShnKQpwPXE8Zz9QLndCKFAuUUEoSi5sZChhLHEsZyks
-bmV3IFAuZTEoYSxmKSxtKSxqKTptfWVsc2V7cD1tCnI9cApzPSIifW89UC5rYShhLGcsaCxtLGosciE9
-bnVsbCkKaWYodHlwZW9mIGghPT0ibnVtYmVyIilyZXR1cm4gaC5KKCkKbj1oPGk/UC5sZShhLGgrMSxp
-LG0pOm0KcmV0dXJuIG5ldyBQLkRuKGoscyxyLHAsbyxuLGk8Yz9QLnRHKGEsaSsxLGMpOm0pfSwKd0s6
-ZnVuY3Rpb24oYSl7aWYoYT09PSJodHRwIilyZXR1cm4gODAKaWYoYT09PSJodHRwcyIpcmV0dXJuIDQ0
-MwpyZXR1cm4gMH0sClIzOmZ1bmN0aW9uKGEsYixjKXt0aHJvdyBILmIoUC5ycihjLGEsYikpfSwKa0U6
-ZnVuY3Rpb24oYSxiKXtDLk5tLksoYSxuZXcgUC5OWSghMSkpfSwKSE46ZnVuY3Rpb24oYSxiLGMpe3Zh
-ciB0LHMscgpmb3IodD1ILnFDKGEsYyxudWxsLEgudDYoYSkuZCksdD1uZXcgSC5hNyh0LHQuZ0EodCks
-dC4kdGkuQygiYTc8YUwuRT4iKSk7dC5GKCk7KXtzPXQuZApyPVAubnUoJ1siKi86PD4/XFxcXHxdJykK
-cy50b1N0cmluZwppZihILm0yKHMsciwwKSl7dD1QLkw0KCJJbGxlZ2FsIGNoYXJhY3RlciBpbiBwYXRo
-OiAiK3MpCnRocm93IEguYih0KX19fSwKcmc6ZnVuY3Rpb24oYSxiKXt2YXIgdAppZighKDY1PD1hJiZh
-PD05MCkpdD05Nzw9YSYmYTw9MTIyCmVsc2UgdD0hMAppZih0KXJldHVybgp0PVAuTDQoIklsbGVnYWwg
-ZHJpdmUgbGV0dGVyICIrUC5PbyhhKSkKdGhyb3cgSC5iKHQpfSwKd0I6ZnVuY3Rpb24oYSxiKXtpZihh
-IT1udWxsJiZhPT09UC53SyhiKSlyZXR1cm4KcmV0dXJuIGF9LApPZTpmdW5jdGlvbihhLGIsYyxkKXt2
-YXIgdCxzLHIscSxwLG8KaWYoYT09bnVsbClyZXR1cm4KaWYoYj09PWMpcmV0dXJuIiIKaWYoQy54Qi5t
-KGEsYik9PT05MSl7aWYodHlwZW9mIGMhPT0ibnVtYmVyIilyZXR1cm4gYy5ITigpCnQ9Yy0xCmlmKEMu
-eEIubShhLHQpIT09OTMpUC5SMyhhLGIsIk1pc3NpbmcgZW5kIGBdYCB0byBtYXRjaCBgW2AgaW4gaG9z
-dCIpCnM9YisxCnI9UC50byhhLHMsdCkKaWYodHlwZW9mIHIhPT0ibnVtYmVyIilyZXR1cm4gci5KKCkK
-aWYocjx0KXtxPXIrMQpwPVAuT0EoYSxDLnhCLlFpKGEsIjI1IixxKT9yKzM6cSx0LCIlMjUiKX1lbHNl
-IHA9IiIKUC5lZyhhLHMscikKcmV0dXJuIEMueEIuTmooYSxiLHIpLnRvTG93ZXJDYXNlKCkrcCsiXSJ9
-aWYodHlwZW9mIGMhPT0ibnVtYmVyIilyZXR1cm4gSC5wWShjKQpvPWIKZm9yKDtvPGM7KytvKWlmKEMu
-eEIubShhLG8pPT09NTgpe3I9Qy54Qi5YVShhLCIlIixiKQppZighKHI+PWImJnI8Yykpcj1jCmlmKHI8
-Yyl7cT1yKzEKcD1QLk9BKGEsQy54Qi5RaShhLCIyNSIscSk/ciszOnEsYywiJTI1Iil9ZWxzZSBwPSIi
-ClAuZWcoYSxiLHIpCnJldHVybiJbIitDLnhCLk5qKGEsYixyKStwKyJdIn1yZXR1cm4gUC5PTChhLGIs
-Yyl9LAp0bzpmdW5jdGlvbihhLGIsYyl7dmFyIHQscz1DLnhCLlhVKGEsIiUiLGIpCmlmKHM+PWIpe2lm
-KHR5cGVvZiBjIT09Im51bWJlciIpcmV0dXJuIEgucFkoYykKdD1zPGN9ZWxzZSB0PSExCnJldHVybiB0
-P3M6Y30sCk9BOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrPWQhPT0iIj9u
-ZXcgUC5SbihkKTpudWxsCmlmKHR5cGVvZiBjIT09Im51bWJlciIpcmV0dXJuIEgucFkoYykKdD1iCnM9
-dApyPSEwCmZvcig7dDxjOyl7cT1DLnhCLm0oYSx0KQppZihxPT09Mzcpe3A9UC5ydihhLHQsITApCm89
-cD09bnVsbAppZihvJiZyKXt0Kz0zCmNvbnRpbnVlfWlmKGs9PW51bGwpaz1uZXcgUC5SbigiIikKbj1r
-LmErPUMueEIuTmooYSxzLHQpCmlmKG8pcD1DLnhCLk5qKGEsdCx0KzMpCmVsc2UgaWYocD09PSIlIilQ
-LlIzKGEsdCwiWm9uZUlEIHNob3VsZCBub3QgY29udGFpbiAlIGFueW1vcmUiKQprLmE9bitwCnQrPTMK
-cz10CnI9ITB9ZWxzZXtpZihxPDEyNyl7bz1xPj4+NAppZihvPj04KXJldHVybiBILk9IKEMuRjMsbykK
-bz0oQy5GM1tvXSYxPDwocSYxNSkpIT09MH1lbHNlIG89ITEKaWYobyl7aWYociYmNjU8PXEmJjkwPj1x
-KXtpZihrPT1udWxsKWs9bmV3IFAuUm4oIiIpCmlmKHM8dCl7ay5hKz1DLnhCLk5qKGEscyx0KQpzPXR9
-cj0hMX0rK3R9ZWxzZXtpZigocSY2NDUxMik9PT01NTI5NiYmdCsxPGMpe209Qy54Qi5tKGEsdCsxKQpp
-ZigobSY2NDUxMik9PT01NjMyMCl7cT02NTUzNnwocSYxMDIzKTw8MTB8bSYxMDIzCmw9Mn1lbHNlIGw9
-MX1lbHNlIGw9MQppZihrPT1udWxsKWs9bmV3IFAuUm4oIiIpCmsuYSs9Qy54Qi5OaihhLHMsdCkKay5h
-Kz1QLkhIKHEpCnQrPWwKcz10fX19aWYoaz09bnVsbClyZXR1cm4gQy54Qi5OaihhLGIsYykKaWYoczxj
-KWsuYSs9Qy54Qi5OaihhLHMsYykKbz1rLmEKcmV0dXJuIG8uY2hhckNvZGVBdCgwKT09MD9vOm99LApP
-TDpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHEscCxvLG4sbSxsLGssagppZih0eXBlb2YgYyE9PSJu
-dW1iZXIiKXJldHVybiBILnBZKGMpCnQ9YgpzPXQKcj1udWxsCnE9ITAKZm9yKDt0PGM7KXtwPUMueEIu
-bShhLHQpCmlmKHA9PT0zNyl7bz1QLnJ2KGEsdCwhMCkKbj1vPT1udWxsCmlmKG4mJnEpe3QrPTMKY29u
-dGludWV9aWYocj09bnVsbClyPW5ldyBQLlJuKCIiKQptPUMueEIuTmooYSxzLHQpCmw9ci5hKz0hcT9t
-LnRvTG93ZXJDYXNlKCk6bQppZihuKXtvPUMueEIuTmooYSx0LHQrMykKaz0zfWVsc2UgaWYobz09PSIl
-Iil7bz0iJTI1IgprPTF9ZWxzZSBrPTMKci5hPWwrbwp0Kz1rCnM9dApxPSEwfWVsc2V7aWYocDwxMjcp
-e249cD4+PjQKaWYobj49OClyZXR1cm4gSC5PSChDLmVhLG4pCm49KEMuZWFbbl0mMTw8KHAmMTUpKSE9
-PTB9ZWxzZSBuPSExCmlmKG4pe2lmKHEmJjY1PD1wJiY5MD49cCl7aWYocj09bnVsbClyPW5ldyBQLlJu
-KCIiKQppZihzPHQpe3IuYSs9Qy54Qi5OaihhLHMsdCkKcz10fXE9ITF9Kyt0fWVsc2V7aWYocDw9OTMp
-e249cD4+PjQKaWYobj49OClyZXR1cm4gSC5PSChDLmFrLG4pCm49KEMuYWtbbl0mMTw8KHAmMTUpKSE9
-PTB9ZWxzZSBuPSExCmlmKG4pUC5SMyhhLHQsIkludmFsaWQgY2hhcmFjdGVyIikKZWxzZXtpZigocCY2
-NDUxMik9PT01NTI5NiYmdCsxPGMpe2o9Qy54Qi5tKGEsdCsxKQppZigoaiY2NDUxMik9PT01NjMyMCl7
-cD02NTUzNnwocCYxMDIzKTw8MTB8aiYxMDIzCms9Mn1lbHNlIGs9MX1lbHNlIGs9MQppZihyPT1udWxs
-KXI9bmV3IFAuUm4oIiIpCm09Qy54Qi5OaihhLHMsdCkKci5hKz0hcT9tLnRvTG93ZXJDYXNlKCk6bQpy
-LmErPVAuSEgocCkKdCs9awpzPXR9fX19aWYocj09bnVsbClyZXR1cm4gQy54Qi5OaihhLGIsYykKaWYo
-czxjKXttPUMueEIuTmooYSxzLGMpCnIuYSs9IXE/bS50b0xvd2VyQ2FzZSgpOm19bj1yLmEKcmV0dXJu
-IG4uY2hhckNvZGVBdCgwKT09MD9uOm59LApQaTpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHEKaWYo
-Yj09PWMpcmV0dXJuIiIKaWYoIVAuRXQoSi5yWShhKS5XKGEsYikpKVAuUjMoYSxiLCJTY2hlbWUgbm90
-IHN0YXJ0aW5nIHdpdGggYWxwaGFiZXRpYyBjaGFyYWN0ZXIiKQpmb3IodD1iLHM9ITE7dDxjOysrdCl7
-cj1DLnhCLlcoYSx0KQppZihyPDEyOCl7cT1yPj4+NAppZihxPj04KXJldHVybiBILk9IKEMubUsscSkK
-cT0oQy5tS1txXSYxPDwociYxNSkpIT09MH1lbHNlIHE9ITEKaWYoIXEpUC5SMyhhLHQsIklsbGVnYWwg
-c2NoZW1lIGNoYXJhY3RlciIpCmlmKDY1PD1yJiZyPD05MClzPSEwfWE9Qy54Qi5OaihhLGIsYykKcmV0
-dXJuIFAuWWEocz9hLnRvTG93ZXJDYXNlKCk6YSl9LApZYTpmdW5jdGlvbihhKXtpZihhPT09Imh0dHAi
-KXJldHVybiJodHRwIgppZihhPT09ImZpbGUiKXJldHVybiJmaWxlIgppZihhPT09Imh0dHBzIilyZXR1
-cm4iaHR0cHMiCmlmKGE9PT0icGFja2FnZSIpcmV0dXJuInBhY2thZ2UiCnJldHVybiBhfSwKelI6ZnVu
-Y3Rpb24oYSxiLGMpe2lmKGE9PW51bGwpcmV0dXJuIiIKcmV0dXJuIFAudU8oYSxiLGMsQy50bywhMSl9
-LAprYTpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIHQscz1lPT09ImZpbGUiLHI9c3x8ZixxPWE9PW51
-bGwKaWYocSYmITApcmV0dXJuIHM/Ii8iOiIiCnQ9IXE/UC51TyhhLGIsYyxDLldkLCEwKTpDLmpOLkUy
-KGQsbmV3IFAuUlooKSx1Lk4pLkgoMCwiLyIpCmlmKHQubGVuZ3RoPT09MCl7aWYocylyZXR1cm4iLyJ9
-ZWxzZSBpZihyJiYhQy54Qi5uKHQsIi8iKSl0PSIvIit0CnJldHVybiBQLkpyKHQsZSxmKX0sCkpyOmZ1
-bmN0aW9uKGEsYixjKXt2YXIgdD1iLmxlbmd0aD09PTAKaWYodCYmIWMmJiFDLnhCLm4oYSwiLyIpKXJl
-dHVybiBQLndGKGEsIXR8fGMpCnJldHVybiBQLnhlKGEpfSwKbGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFy
-IHQscz17fQppZihhIT1udWxsKXtpZihkIT1udWxsKXRocm93IEguYihQLnhZKCJCb3RoIHF1ZXJ5IGFu
-ZCBxdWVyeVBhcmFtZXRlcnMgc3BlY2lmaWVkIikpCnJldHVybiBQLnVPKGEsYixjLEMuVkMsITApfWlm
-KGQ9PW51bGwpcmV0dXJuCnQ9bmV3IFAuUm4oIiIpCnMuYT0iIgpkLksoMCxuZXcgUC55NShuZXcgUC5N
-RShzLHQpKSkKcz10LmEKcmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9LAp0RzpmdW5jdGlvbihh
-LGIsYyl7aWYoYT09bnVsbClyZXR1cm4KcmV0dXJuIFAudU8oYSxiLGMsQy5WQywhMCl9LApydjpmdW5j
-dGlvbihhLGIsYyl7dmFyIHQscyxyLHEscCxvPWIrMgppZihvPj1hLmxlbmd0aClyZXR1cm4iJSIKdD1D
-LnhCLm0oYSxiKzEpCnM9Qy54Qi5tKGEsbykKcj1ILm9vKHQpCnE9SC5vbyhzKQppZihyPDB8fHE8MCly
-ZXR1cm4iJSIKcD1yKjE2K3EKaWYocDwxMjcpe289Qy5qbi53RyhwLDQpCmlmKG8+PTgpcmV0dXJuIEgu
-T0goQy5GMyxvKQpvPShDLkYzW29dJjE8PChwJjE1KSkhPT0wfWVsc2Ugbz0hMQppZihvKXJldHVybiBI
-Lkx3KGMmJjY1PD1wJiY5MD49cD8ocHwzMik+Pj4wOnApCmlmKHQ+PTk3fHxzPj05NylyZXR1cm4gQy54
-Qi5OaihhLGIsYiszKS50b1VwcGVyQ2FzZSgpCnJldHVybn0sCkhIOmZ1bmN0aW9uKGEpe3ZhciB0LHMs
-cixxLHAsbyxuPSIwMTIzNDU2Nzg5QUJDREVGIgppZihhPDEyOCl7dD1uZXcgQXJyYXkoMykKdC5maXhl
-ZCRsZW5ndGg9QXJyYXkKcz1ILlZNKHQsdS50KQpDLk5tLlkocywwLDM3KQpDLk5tLlkocywxLEMueEIu
-VyhuLGE+Pj40KSkKQy5ObS5ZKHMsMixDLnhCLlcobixhJjE1KSl9ZWxzZXtpZihhPjIwNDcpaWYoYT42
-NTUzNSl7cj0yNDAKcT00fWVsc2V7cj0yMjQKcT0zfWVsc2V7cj0xOTIKcT0yfXQ9bmV3IEFycmF5KDMq
-cSkKdC5maXhlZCRsZW5ndGg9QXJyYXkKcz1ILlZNKHQsdS50KQpmb3IocD0wOy0tcSxxPj0wO3I9MTI4
-KXtvPUMuam4uYmYoYSw2KnEpJjYzfHIKQy5ObS5ZKHMscCwzNykKQy5ObS5ZKHMscCsxLEMueEIuVyhu
-LG8+Pj40KSkKQy5ObS5ZKHMscCsyLEMueEIuVyhuLG8mMTUpKQpwKz0zfX1yZXR1cm4gUC5ITShzLDAs
-bnVsbCl9LAp1TzpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciB0PVAuVWwoYSxiLGMsZCxlKQpyZXR1cm4g
-dD09bnVsbD9DLnhCLk5qKGEsYixjKTp0fSwKVWw6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgdCxzLHIs
-cSxwLG89IWUsbj1iLG09bixsPW51bGwKd2hpbGUoITApe2lmKHR5cGVvZiBuIT09Im51bWJlciIpcmV0
-dXJuIG4uSigpCmlmKHR5cGVvZiBjIT09Im51bWJlciIpcmV0dXJuIEgucFkoYykKaWYoIShuPGMpKWJy
-ZWFrCmMkMDp7dD1DLnhCLm0oYSxuKQppZih0PDEyNyl7cz10Pj4+NAppZihzPj04KXJldHVybiBILk9I
-KGQscykKcz0oZFtzXSYxPDwodCYxNSkpIT09MH1lbHNlIHM9ITEKaWYocykrK24KZWxzZXtpZih0PT09
-Mzcpe3I9UC5ydihhLG4sITEpCmlmKHI9PW51bGwpe24rPTMKYnJlYWsgYyQwfWlmKCIlIj09PXIpe3I9
-IiUyNSIKcT0xfWVsc2UgcT0zfWVsc2V7aWYobylpZih0PD05Myl7cz10Pj4+NAppZihzPj04KXJldHVy
-biBILk9IKEMuYWsscykKcz0oQy5ha1tzXSYxPDwodCYxNSkpIT09MH1lbHNlIHM9ITEKZWxzZSBzPSEx
-CmlmKHMpe1AuUjMoYSxuLCJJbnZhbGlkIGNoYXJhY3RlciIpCnI9bnVsbApxPW51bGx9ZWxzZXtpZigo
-dCY2NDUxMik9PT01NTI5Nil7cz1uKzEKaWYoczxjKXtwPUMueEIubShhLHMpCmlmKChwJjY0NTEyKT09
-PTU2MzIwKXt0PTY1NTM2fCh0JjEwMjMpPDwxMHxwJjEwMjMKcT0yfWVsc2UgcT0xfWVsc2UgcT0xfWVs
-c2UgcT0xCnI9UC5ISCh0KX19aWYobD09bnVsbClsPW5ldyBQLlJuKCIiKQpsLmErPUMueEIuTmooYSxt
-LG4pCmwuYSs9SC5kKHIpCmlmKHR5cGVvZiBxIT09Im51bWJlciIpcmV0dXJuIEgucFkocSkKbis9cQpt
-PW59fX1pZihsPT1udWxsKXJldHVybgppZih0eXBlb2YgbSE9PSJudW1iZXIiKXJldHVybiBtLkooKQpp
-ZihtPGMpbC5hKz1DLnhCLk5qKGEsbSxjKQpvPWwuYQpyZXR1cm4gby5jaGFyQ29kZUF0KDApPT0wP286
-b30sCnlCOmZ1bmN0aW9uKGEpe2lmKEMueEIubihhLCIuIikpcmV0dXJuITAKcmV0dXJuIEMueEIuT1ko
-YSwiLy4iKSE9PS0xfSwKeGU6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG4KaWYoIVAueUIoYSkp
-cmV0dXJuIGEKdD1ILlZNKFtdLHUucykKZm9yKHM9YS5zcGxpdCgiLyIpLHI9cy5sZW5ndGgscT0hMSxw
-PTA7cDxyOysrcCl7bz1zW3BdCmlmKEouUk0obywiLi4iKSl7bj10Lmxlbmd0aAppZihuIT09MCl7aWYo
-MD49bilyZXR1cm4gSC5PSCh0LC0xKQp0LnBvcCgpCmlmKHQubGVuZ3RoPT09MClDLk5tLmkodCwiIil9
-cT0hMH1lbHNlIGlmKCIuIj09PW8pcT0hMAplbHNle0MuTm0uaSh0LG8pCnE9ITF9fWlmKHEpQy5ObS5p
-KHQsIiIpCnJldHVybiBDLk5tLkgodCwiLyIpfSwKd0Y6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxw
-LG8KaWYoIVAueUIoYSkpcmV0dXJuIWI/UC5DMShhKTphCnQ9SC5WTShbXSx1LnMpCmZvcihzPWEuc3Bs
-aXQoIi8iKSxyPXMubGVuZ3RoLHE9ITEscD0wO3A8cjsrK3Ape289c1twXQppZigiLi4iPT09bylpZih0
-Lmxlbmd0aCE9PTAmJkMuTm0uZ3JaKHQpIT09Ii4uIil7aWYoMD49dC5sZW5ndGgpcmV0dXJuIEguT0go
-dCwtMSkKdC5wb3AoKQpxPSEwfWVsc2V7Qy5ObS5pKHQsIi4uIikKcT0hMX1lbHNlIGlmKCIuIj09PW8p
-cT0hMAplbHNle0MuTm0uaSh0LG8pCnE9ITF9fXM9dC5sZW5ndGgKaWYocyE9PTApaWYocz09PTEpe2lm
-KDA+PXMpcmV0dXJuIEguT0godCwwKQpzPXRbMF0ubGVuZ3RoPT09MH1lbHNlIHM9ITEKZWxzZSBzPSEw
-CmlmKHMpcmV0dXJuIi4vIgppZihxfHxDLk5tLmdyWih0KT09PSIuLiIpQy5ObS5pKHQsIiIpCmlmKCFi
-KXtpZigwPj10Lmxlbmd0aClyZXR1cm4gSC5PSCh0LDApCkMuTm0uWSh0LDAsUC5DMSh0WzBdKSl9cmV0
-dXJuIEMuTm0uSCh0LCIvIil9LApDMTpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT1hLmxlbmd0aAppZihx
-Pj0yJiZQLkV0KEouUXooYSwwKSkpZm9yKHQ9MTt0PHE7Kyt0KXtzPUMueEIuVyhhLHQpCmlmKHM9PT01
-OClyZXR1cm4gQy54Qi5OaihhLDAsdCkrIiUzQSIrQy54Qi5HKGEsdCsxKQppZihzPD0xMjcpe3I9cz4+
-PjQKaWYocj49OClyZXR1cm4gSC5PSChDLm1LLHIpCnI9KEMubUtbcl0mMTw8KHMmMTUpKT09PTB9ZWxz
-ZSByPSEwCmlmKHIpYnJlYWt9cmV0dXJuIGF9LAptbjpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT1hLmdG
-aigpLHA9cS5sZW5ndGgKaWYocD4wJiZKLkhtKHFbMF0pPT09MiYmSi5hNihxWzBdLDEpPT09NTgpe2lm
-KDA+PXApcmV0dXJuIEguT0gocSwwKQpQLnJnKEouYTYocVswXSwwKSwhMSkKUC5ITihxLCExLDEpCnQ9
-ITB9ZWxzZXtQLkhOKHEsITEsMCkKdD0hMX1zPWEuZ3RUKCkmJiF0PyJcXCI6IiIKaWYoYS5nY2ooKSl7
-cj1hLmdKZihhKQppZihyLmxlbmd0aCE9PTApcz1zKyJcXCIrcisiXFwifXM9UC52ZyhzLHEsIlxcIikK
-cD10JiZwPT09MT9zKyJcXCI6cwpyZXR1cm4gcC5jaGFyQ29kZUF0KDApPT0wP3A6cH0sCkloOmZ1bmN0
-aW9uKGEsYil7dmFyIHQscyxyCmZvcih0PTAscz0wO3M8MjsrK3Mpe3I9Qy54Qi5XKGEsYitzKQppZig0
-ODw9ciYmcjw9NTcpdD10KjE2K3ItNDgKZWxzZXtyfD0zMgppZig5Nzw9ciYmcjw9MTAyKXQ9dCoxNity
-LTg3CmVsc2UgdGhyb3cgSC5iKFAueFkoIkludmFsaWQgVVJMIGVuY29kaW5nIikpfX1yZXR1cm4gdH0s
-Cmt1OmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQscyxyLHEscD1KLnJZKGEpLG89Ygp3aGlsZSghMCl7
-aWYoIShvPGMpKXt0PSEwCmJyZWFrfXM9cC5XKGEsbykKaWYoczw9MTI3KWlmKHMhPT0zNylyPWUmJnM9
-PT00MwplbHNlIHI9ITAKZWxzZSByPSEwCmlmKHIpe3Q9ITEKYnJlYWt9KytvfWlmKHQpe2lmKEMueE0h
-PT1kKXI9ITEKZWxzZSByPSEwCmlmKHIpcmV0dXJuIHAuTmooYSxiLGMpCmVsc2UgcT1uZXcgSC5xaihw
-Lk5qKGEsYixjKSl9ZWxzZXtxPUguVk0oW10sdS50KQpmb3Iobz1iO288YzsrK28pe3M9cC5XKGEsbykK
-aWYocz4xMjcpdGhyb3cgSC5iKFAueFkoIklsbGVnYWwgcGVyY2VudCBlbmNvZGluZyBpbiBVUkkiKSkK
-aWYocz09PTM3KXtpZihvKzM+YS5sZW5ndGgpdGhyb3cgSC5iKFAueFkoIlRydW5jYXRlZCBVUkkiKSkK
-Qy5ObS5pKHEsUC5JaChhLG8rMSkpCm8rPTJ9ZWxzZSBpZihlJiZzPT09NDMpQy5ObS5pKHEsMzIpCmVs
-c2UgQy5ObS5pKHEscyl9fXUuTC5iKHEpCnJldHVybiBuZXcgUC5HWSghMSkuV0oocSl9LApFdDpmdW5j
-dGlvbihhKXt2YXIgdD1hfDMyCnJldHVybiA5Nzw9dCYmdDw9MTIyfSwKS0Q6ZnVuY3Rpb24oYSxiLGMp
-e3ZhciB0LHMscixxLHAsbyxuLG0sbD0iSW52YWxpZCBNSU1FIHR5cGUiLGs9SC5WTShbYi0xXSx1LnQp
-CmZvcih0PWEubGVuZ3RoLHM9YixyPS0xLHE9bnVsbDtzPHQ7KytzKXtxPUMueEIuVyhhLHMpCmlmKHE9
-PT00NHx8cT09PTU5KWJyZWFrCmlmKHE9PT00Nyl7aWYocjwwKXtyPXMKY29udGludWV9dGhyb3cgSC5i
-KFAucnIobCxhLHMpKX19aWYocjwwJiZzPmIpdGhyb3cgSC5iKFAucnIobCxhLHMpKQpmb3IoO3EhPT00
-NDspe0MuTm0uaShrLHMpOysrcwpmb3IocD0tMTtzPHQ7KytzKXtxPUMueEIuVyhhLHMpCmlmKHE9PT02
-MSl7aWYocDwwKXA9c31lbHNlIGlmKHE9PT01OXx8cT09PTQ0KWJyZWFrfWlmKHA+PTApQy5ObS5pKGss
-cCkKZWxzZXtvPUMuTm0uZ3JaKGspCmlmKHEhPT00NHx8cyE9PW8rN3x8IUMueEIuUWkoYSwiYmFzZTY0
-IixvKzEpKXRocm93IEguYihQLnJyKCJFeHBlY3RpbmcgJz0nIixhLHMpKQpicmVha319Qy5ObS5pKGss
-cykKbj1zKzEKaWYoKGsubGVuZ3RoJjEpPT09MSlhPUMuaDkueXIoYSxuLHQpCmVsc2V7bT1QLlVsKGEs
-bix0LEMuVkMsITApCmlmKG0hPW51bGwpYT1DLnhCLmk3KGEsbix0LG0pfXJldHVybiBuZXcgUC5QRShh
-LGssYyl9LAp1eDpmdW5jdGlvbigpe3ZhciB0PSIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RV
-VldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei0uX34hJCYnKCkqKyw7PSIscz0iLiIscj0iOiIs
-cT0iLyIscD0iPyIsbz0iIyIsbj11LmdjLG09UC5kSCgyMixuZXcgUC5xMygpLCEwLG4pLGw9bmV3IFAu
-eUkobSksaz1uZXcgUC5jNigpLGo9bmV3IFAucWQoKSxpPW4uYihsLiQyKDAsMjI1KSkKay4kMyhpLHQs
-MSkKay4kMyhpLHMsMTQpCmsuJDMoaSxyLDM0KQprLiQzKGkscSwzKQprLiQzKGkscCwxNzIpCmsuJDMo
-aSxvLDIwNSkKaT1uLmIobC4kMigxNCwyMjUpKQprLiQzKGksdCwxKQprLiQzKGkscywxNSkKay4kMyhp
-LHIsMzQpCmsuJDMoaSxxLDIzNCkKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5iKGwuJDIo
-MTUsMjI1KSkKay4kMyhpLHQsMSkKay4kMyhpLCIlIiwyMjUpCmsuJDMoaSxyLDM0KQprLiQzKGkscSw5
-KQprLiQzKGkscCwxNzIpCmsuJDMoaSxvLDIwNSkKaT1uLmIobC4kMigxLDIyNSkpCmsuJDMoaSx0LDEp
-CmsuJDMoaSxyLDM0KQprLiQzKGkscSwxMCkKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5i
-KGwuJDIoMiwyMzUpKQprLiQzKGksdCwxMzkpCmsuJDMoaSxxLDEzMSkKay4kMyhpLHMsMTQ2KQprLiQz
-KGkscCwxNzIpCmsuJDMoaSxvLDIwNSkKaT1uLmIobC4kMigzLDIzNSkpCmsuJDMoaSx0LDExKQprLiQz
-KGkscSw2OCkKay4kMyhpLHMsMTgpCmsuJDMoaSxwLDE3MikKay4kMyhpLG8sMjA1KQppPW4uYihsLiQy
-KDQsMjI5KSkKay4kMyhpLHQsNSkKai4kMyhpLCJBWiIsMjI5KQprLiQzKGksciwxMDIpCmsuJDMoaSwi
-QCIsNjgpCmsuJDMoaSwiWyIsMjMyKQprLiQzKGkscSwxMzgpCmsuJDMoaSxwLDE3MikKay4kMyhpLG8s
-MjA1KQppPW4uYihsLiQyKDUsMjI5KSkKay4kMyhpLHQsNSkKai4kMyhpLCJBWiIsMjI5KQprLiQzKGks
-ciwxMDIpCmsuJDMoaSwiQCIsNjgpCmsuJDMoaSxxLDEzOCkKay4kMyhpLHAsMTcyKQprLiQzKGksbywy
-MDUpCmk9bi5iKGwuJDIoNiwyMzEpKQpqLiQzKGksIjE5Iiw3KQprLiQzKGksIkAiLDY4KQprLiQzKGks
-cSwxMzgpCmsuJDMoaSxwLDE3MikKay4kMyhpLG8sMjA1KQppPW4uYihsLiQyKDcsMjMxKSkKai4kMyhp
-LCIwOSIsNykKay4kMyhpLCJAIiw2OCkKay4kMyhpLHEsMTM4KQprLiQzKGkscCwxNzIpCmsuJDMoaSxv
-LDIwNSkKay4kMyhuLmIobC4kMig4LDgpKSwiXSIsNSkKaT1uLmIobC4kMig5LDIzNSkpCmsuJDMoaSx0
-LDExKQprLiQzKGkscywxNikKay4kMyhpLHEsMjM0KQprLiQzKGkscCwxNzIpCmsuJDMoaSxvLDIwNSkK
-aT1uLmIobC4kMigxNiwyMzUpKQprLiQzKGksdCwxMSkKay4kMyhpLHMsMTcpCmsuJDMoaSxxLDIzNCkK
-ay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5iKGwuJDIoMTcsMjM1KSkKay4kMyhpLHQsMTEp
-CmsuJDMoaSxxLDkpCmsuJDMoaSxwLDE3MikKay4kMyhpLG8sMjA1KQppPW4uYihsLiQyKDEwLDIzNSkp
-CmsuJDMoaSx0LDExKQprLiQzKGkscywxOCkKay4kMyhpLHEsMjM0KQprLiQzKGkscCwxNzIpCmsuJDMo
-aSxvLDIwNSkKaT1uLmIobC4kMigxOCwyMzUpKQprLiQzKGksdCwxMSkKay4kMyhpLHMsMTkpCmsuJDMo
-aSxxLDIzNCkKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5iKGwuJDIoMTksMjM1KSkKay4k
-MyhpLHQsMTEpCmsuJDMoaSxxLDIzNCkKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5iKGwu
-JDIoMTEsMjM1KSkKay4kMyhpLHQsMTEpCmsuJDMoaSxxLDEwKQprLiQzKGkscCwxNzIpCmsuJDMoaSxv
-LDIwNSkKaT1uLmIobC4kMigxMiwyMzYpKQprLiQzKGksdCwxMikKay4kMyhpLHAsMTIpCmsuJDMoaSxv
-LDIwNSkKaT1uLmIobC4kMigxMywyMzcpKQprLiQzKGksdCwxMykKay4kMyhpLHAsMTMpCmouJDMobi5i
-KGwuJDIoMjAsMjQ1KSksImF6IiwyMSkKbD1uLmIobC4kMigyMSwyNDUpKQpqLiQzKGwsImF6IiwyMSkK
-ai4kMyhsLCIwOSIsMjEpCmsuJDMobCwiKy0uIiwyMSkKcmV0dXJuIG19LApVQjpmdW5jdGlvbihhLGIs
-YyxkLGUpe3ZhciB0LHMscixxLHAsbz0kLnZaKCkKZm9yKHQ9Si5yWShhKSxzPWI7czxjOysrcyl7aWYo
-ZDwwfHxkPj1vLmxlbmd0aClyZXR1cm4gSC5PSChvLGQpCnI9b1tkXQpxPXQuVyhhLHMpXjk2CmlmKHE+
-OTUpcT0zMQppZihxPj1yLmxlbmd0aClyZXR1cm4gSC5PSChyLHEpCnA9cltxXQpkPXAmMzEKQy5ObS5Z
-KGUscD4+PjUscyl9cmV0dXJuIGR9LApXRjpmdW5jdGlvbiBXRihhLGIpe3RoaXMuYT1hCnRoaXMuYj1i
-fSwKYTI6ZnVuY3Rpb24gYTIoKXt9LAppUDpmdW5jdGlvbiBpUChhLGIpe3RoaXMuYT1hCnRoaXMuYj1i
-fSwKQ1A6ZnVuY3Rpb24gQ1AoKXt9LApYUzpmdW5jdGlvbiBYUygpe30sCkM2OmZ1bmN0aW9uIEM2KGEp
-e3RoaXMuYT1hfSwKbjpmdW5jdGlvbiBuKCl7fSwKdTpmdW5jdGlvbiB1KGEsYixjLGQpe3ZhciBfPXRo
-aXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9LApiSjpmdW5jdGlvbiBiSihhLGIsYyxkLGUsZil7dmFy
-IF89dGhpcwpfLmU9YQpfLmY9YgpfLmE9YwpfLmI9ZApfLmM9ZQpfLmQ9Zn0sCmVZOmZ1bmN0aW9uIGVZ
-KGEsYixjLGQsZSl7dmFyIF89dGhpcwpfLmY9YQpfLmE9YgpfLmI9YwpfLmM9ZApfLmQ9ZX0sCm1wOmZ1
-bmN0aW9uIG1wKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWR9LAp1Yjpm
-dW5jdGlvbiB1YihhKXt0aGlzLmE9YX0sCmRzOmZ1bmN0aW9uIGRzKGEpe3RoaXMuYT1hfSwKbGo6ZnVu
-Y3Rpb24gbGooYSl7dGhpcy5hPWF9LApVVjpmdW5jdGlvbiBVVihhKXt0aGlzLmE9YX0sCms1OmZ1bmN0
-aW9uIGs1KCl7fSwKS1k6ZnVuY3Rpb24gS1koKXt9LApjOmZ1bmN0aW9uIGMoYSl7dGhpcy5hPWF9LApD
-RDpmdW5jdGlvbiBDRChhKXt0aGlzLmE9YX0sCmFFOmZ1bmN0aW9uIGFFKGEsYixjKXt0aGlzLmE9YQp0
-aGlzLmI9Ygp0aGlzLmM9Y30sCkVIOmZ1bmN0aW9uIEVIKCl7fSwKS046ZnVuY3Rpb24gS04oKXt9LApj
-WDpmdW5jdGlvbiBjWCgpe30sCkFuOmZ1bmN0aW9uIEFuKCl7fSwKek06ZnVuY3Rpb24gek0oKXt9LApa
-MDpmdW5jdGlvbiBaMCgpe30sCmM4OmZ1bmN0aW9uIGM4KCl7fSwKRks6ZnVuY3Rpb24gRksoKXt9LApr
-OmZ1bmN0aW9uIGsoKXt9LApPZDpmdW5jdGlvbiBPZCgpe30sCmliOmZ1bmN0aW9uIGliKCl7fSwKeHU6
-ZnVuY3Rpb24geHUoKXt9LApHejpmdW5jdGlvbiBHeigpe30sCnFVOmZ1bmN0aW9uIHFVKCl7fSwKUm46
-ZnVuY3Rpb24gUm4oYSl7dGhpcy5hPWF9LApHRDpmdW5jdGlvbiBHRCgpe30sCm4xOmZ1bmN0aW9uIG4x
-KGEpe3RoaXMuYT1hfSwKY1M6ZnVuY3Rpb24gY1MoYSl7dGhpcy5hPWF9LApWQzpmdW5jdGlvbiBWQyhh
-KXt0aGlzLmE9YX0sCnRwOmZ1bmN0aW9uIHRwKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApEbjpmdW5j
-dGlvbiBEbihhLGIsYyxkLGUsZixnKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kCl8u
-ZT1lCl8uZj1mCl8ucj1nCl8uUT1fLno9Xy55PV8ueD1udWxsfSwKZTE6ZnVuY3Rpb24gZTEoYSxiKXt0
-aGlzLmE9YQp0aGlzLmI9Yn0sCk5ZOmZ1bmN0aW9uIE5ZKGEpe3RoaXMuYT1hfSwKUlo6ZnVuY3Rpb24g
-UlooKXt9LApNRTpmdW5jdGlvbiBNRShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKeTU6ZnVuY3Rpb24g
-eTUoYSl7dGhpcy5hPWF9LApQRTpmdW5jdGlvbiBQRShhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhp
-cy5jPWN9LApxMzpmdW5jdGlvbiBxMygpe30sCnlJOmZ1bmN0aW9uIHlJKGEpe3RoaXMuYT1hfSwKYzY6
-ZnVuY3Rpb24gYzYoKXt9LApxZDpmdW5jdGlvbiBxZCgpe30sClVmOmZ1bmN0aW9uIFVmKGEsYixjLGQs
-ZSxmLGcsaCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZApfLmU9ZQpfLmY9ZgpfLnI9
-ZwpfLng9aApfLnk9bnVsbH0sCnFlOmZ1bmN0aW9uIHFlKGEsYixjLGQsZSxmLGcpe3ZhciBfPXRoaXMK
-Xy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5lPWUKXy5mPWYKXy5yPWcKXy5RPV8uej1fLnk9Xy54PW51
-bGx9LAppSjpmdW5jdGlvbiBpSigpe30sCmxSOmZ1bmN0aW9uIGxSKGEsYil7dGhpcy5hPWEKdGhpcy5i
-PWJ9LApqZzpmdW5jdGlvbiBqZyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKQmY6ZnVuY3Rpb24gQmYo
-YSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkFzOmZ1bmN0aW9uIEFzKCl7fSwKR0U6ZnVuY3Rpb24gR0Uo
-YSl7dGhpcy5hPWF9LApONzpmdW5jdGlvbiBONyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKdVE6ZnVu
-Y3Rpb24gdVEoKXt9LApoRjpmdW5jdGlvbiBoRigpe30sClI0OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0
-LHMscgpILnhkKGIpCnUuai5iKGQpCmlmKEgub1QoYikpe3Q9W2NdCkMuTm0uRlYodCxkKQpkPXR9cz11
-LnoKcj1QLkNIKEouTTEoZCxQLncwKCkscyksITAscykKdS5aLmIoYSkKcmV0dXJuIFAud1koSC5Fayhh
-LHIsbnVsbCkpfSwKRG06ZnVuY3Rpb24oYSxiLGMpe3ZhciB0CnRyeXtpZihPYmplY3QuaXNFeHRlbnNp
-YmxlKGEpJiYhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYikpe09iamVjdC5k
-ZWZpbmVQcm9wZXJ0eShhLGIse3ZhbHVlOmN9KQpyZXR1cm4hMH19Y2F0Y2godCl7SC5SdSh0KX1yZXR1
-cm4hMX0sCk9tOmZ1bmN0aW9uKGEsYil7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5j
-YWxsKGEsYikpcmV0dXJuIGFbYl0KcmV0dXJufSwKd1k6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbHx8dHlw
-ZW9mIGE9PSJzdHJpbmcifHx0eXBlb2YgYT09Im51bWJlciJ8fEgubChhKSlyZXR1cm4gYQppZihhIGlu
-c3RhbmNlb2YgUC5FNClyZXR1cm4gYS5hCmlmKEguUjkoYSkpcmV0dXJuIGEKaWYodS53LmMoYSkpcmV0
-dXJuIGEKaWYoYSBpbnN0YW5jZW9mIFAuaVApcmV0dXJuIEgubzIoYSkKaWYodS5aLmMoYSkpcmV0dXJu
-IFAuaEUoYSwiJGRhcnRfanNGdW5jdGlvbiIsbmV3IFAuUEMoKSkKcmV0dXJuIFAuaEUoYSwiXyRkYXJ0
-X2pzT2JqZWN0IixuZXcgUC5ZbSgkLmtJKCkpKX0sCmhFOmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1QLk9t
-KGEsYikKaWYodD09bnVsbCl7dD1jLiQxKGEpClAuRG0oYSxiLHQpfXJldHVybiB0fSwKTDc6ZnVuY3Rp
-b24oYSl7dmFyIHQscwppZihhPT1udWxsfHx0eXBlb2YgYT09InN0cmluZyJ8fHR5cGVvZiBhPT0ibnVt
-YmVyInx8dHlwZW9mIGE9PSJib29sZWFuIilyZXR1cm4gYQplbHNlIGlmKGEgaW5zdGFuY2VvZiBPYmpl
-Y3QmJkguUjkoYSkpcmV0dXJuIGEKZWxzZSBpZihhIGluc3RhbmNlb2YgT2JqZWN0JiZ1LncuYyhhKSly
-ZXR1cm4gYQplbHNlIGlmKGEgaW5zdGFuY2VvZiBEYXRlKXt0PUguU2MoYS5nZXRUaW1lKCkpCmlmKE1h
-dGguYWJzKHQpPD04NjRlMTMpcz0hMQplbHNlIHM9ITAKaWYocylILnZoKFAueFkoIkRhdGVUaW1lIGlz
-IG91dHNpZGUgdmFsaWQgcmFuZ2U6ICIrdCkpCnJldHVybiBuZXcgUC5pUCh0LCExKX1lbHNlIGlmKGEu
-Y29uc3RydWN0b3I9PT0kLmtJKCkpcmV0dXJuIGEubwplbHNlIHJldHVybiBQLk5EKGEpfSwKTkQ6ZnVu
-Y3Rpb24oYSl7aWYodHlwZW9mIGE9PSJmdW5jdGlvbiIpcmV0dXJuIFAuaVEoYSwkLncoKSxuZXcgUC5O
-eigpKQppZihhIGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIFAuaVEoYSwkLlI4KCksbmV3IFAubnAoKSkK
-cmV0dXJuIFAuaVEoYSwkLlI4KCksbmV3IFAuVXQoKSl9LAppUTpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9
-UC5PbShhLGIpCmlmKHQ9PW51bGx8fCEoYSBpbnN0YW5jZW9mIE9iamVjdCkpe3Q9Yy4kMShhKQpQLkRt
-KGEsYix0KX1yZXR1cm4gdH0sClBDOmZ1bmN0aW9uIFBDKCl7fSwKWW06ZnVuY3Rpb24gWW0oYSl7dGhp
-cy5hPWF9LApOejpmdW5jdGlvbiBOeigpe30sCm5wOmZ1bmN0aW9uIG5wKCl7fSwKVXQ6ZnVuY3Rpb24g
-VXQoKXt9LApFNDpmdW5jdGlvbiBFNChhKXt0aGlzLmE9YX0sCnI3OmZ1bmN0aW9uIHI3KGEpe3RoaXMu
-YT1hfSwKVHo6ZnVuY3Rpb24gVHooYSxiKXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKY286ZnVuY3Rpb24g
-Y28oKXt9LApuZDpmdW5jdGlvbiBuZCgpe30sCktlOmZ1bmN0aW9uIEtlKGEpe3RoaXMuYT1hfSwKZDU6
-ZnVuY3Rpb24gZDUoKXt9LApuNjpmdW5jdGlvbiBuNigpe319LFc9ewpVOTpmdW5jdGlvbihhLGIsYyl7
-dmFyIHQ9ZG9jdW1lbnQuYm9keSxzPSh0JiZDLlJZKS5yNih0LGEsYixjKQpzLnRvU3RyaW5nCnQ9dS5h
-Ywp0PW5ldyBILlU1KG5ldyBXLmU3KHMpLHQuQygiYTIobEQuRSkiKS5iKG5ldyBXLkN2KCkpLHQuQygi
-VTU8bEQuRT4iKSkKcmV0dXJuIHUuaC5iKHQuZ3I4KHQpKX0sCnJTOmZ1bmN0aW9uKGEpe3ZhciB0LHMs
-cj0iZWxlbWVudCB0YWcgdW5hdmFpbGFibGUiCnRyeXt0PUouUkUoYSkKaWYodHlwZW9mIHQuZ25zKGEp
-PT0ic3RyaW5nIilyPXQuZ25zKGEpfWNhdGNoKHMpe0guUnUocyl9cmV0dXJuIHJ9LApxRDpmdW5jdGlv
-bihhLGIsYyl7dmFyIHQscyxyLHE9bmV3IFAudnMoJC5YMyx1LmFvKSxwPW5ldyBQLlpmKHEsdS5iaiks
-bz1uZXcgWE1MSHR0cFJlcXVlc3QoKQpDLkR0LmVvKG8sYj09bnVsbD8iR0VUIjpiLGEsITApCmMuSygw
-LG5ldyBXLmJVKG8pKQp0PXUuYW4Kcz10LmIobmV3IFcuaEgobyxwKSkKdS5NLmIobnVsbCkKcj11LnAK
-Vy5KRShvLCJsb2FkIixzLCExLHIpClcuSkUobywiZXJyb3IiLHQuYihwLmdZSigpKSwhMSxyKQpvLnNl
-bmQoKQpyZXR1cm4gcX0sCkMwOmZ1bmN0aW9uKGEsYil7YT01MzY4NzA5MTEmYStiCmE9NTM2ODcwOTEx
-JmErKCg1MjQyODcmYSk8PDEwKQpyZXR1cm4gYV5hPj4+Nn0sCnJFOmZ1bmN0aW9uKGEsYixjLGQpe3Zh
-ciB0PVcuQzAoVy5DMChXLkMwKFcuQzAoMCxhKSxiKSxjKSxkKSxzPTUzNjg3MDkxMSZ0KygoNjcxMDg4
-NjMmdCk8PDMpCnNePXM+Pj4xMQpyZXR1cm4gNTM2ODcwOTExJnMrKCgxNjM4MyZzKTw8MTUpfSwKVE46
-ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHI9YS5jbGFzc0xpc3QKZm9yKHQ9Yi5sZW5ndGgscz0wO3M8Yi5s
-ZW5ndGg7Yi5sZW5ndGg9PT10fHwoMCxILmxrKShiKSwrK3Mpci5hZGQoYltzXSl9LApKRTpmdW5jdGlv
-bihhLGIsYyxkLGUpe3ZhciB0PVcuYUYobmV3IFcudk4oYyksdS5CKQppZih0IT1udWxsJiYhMClKLmRa
-KGEsYix0LCExKQpyZXR1cm4gbmV3IFcueEMoYSxiLHQsITEsZS5DKCJ4QzwwPiIpKX0sClR3OmZ1bmN0
-aW9uKGEpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxzPW5ldyBXLm1rKHQsd2luZG93
-LmxvY2F0aW9uKQpzPW5ldyBXLkpRKHMpCnMuQ1koYSkKcmV0dXJuIHN9LAp5VzpmdW5jdGlvbihhLGIs
-YyxkKXt1LmguYihhKQpILnkoYikKSC55KGMpCnUuTy5iKGQpCnJldHVybiEwfSwKUVc6ZnVuY3Rpb24o
-YSxiLGMsZCl7dmFyIHQscyxyCnUuaC5iKGEpCkgueShiKQpILnkoYykKdD11Lk8uYihkKS5hCnM9dC5h
-CnMuaHJlZj1jCnI9cy5ob3N0bmFtZQp0PXQuYgppZighKHI9PXQuaG9zdG5hbWUmJnMucG9ydD09dC5w
-b3J0JiZzLnByb3RvY29sPT10LnByb3RvY29sKSlpZihyPT09IiIpaWYocy5wb3J0PT09IiIpe3Q9cy5w
-cm90b2NvbAp0PXQ9PT0iOiJ8fHQ9PT0iIn1lbHNlIHQ9ITEKZWxzZSB0PSExCmVsc2UgdD0hMApyZXR1
-cm4gdH0sCkJsOmZ1bmN0aW9uKCl7dmFyIHQ9dS5OLHM9UC50TShDLlF4LHQpLHI9dS5kRy5iKG5ldyBX
-LklBKCkpLHE9SC5WTShbIlRFTVBMQVRFIl0sdS5zKQp0PW5ldyBXLmN0KHMsUC5Mcyh0KSxQLkxzKHQp
-LFAuTHModCksbnVsbCkKdC5DWShudWxsLG5ldyBILkE4KEMuUXgscix1LmR2KSxxLG51bGwpCnJldHVy
-biB0fSwKdVY6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbClyZXR1cm4KcmV0dXJuIFcuUDEoYSl9LApxYzpm
-dW5jdGlvbihhKXt2YXIgdAppZihhPT1udWxsKXJldHVybgppZigicG9zdE1lc3NhZ2UiIGluIGEpe3Q9
-Vy5QMShhKQpyZXR1cm4gdH1lbHNlIHJldHVybiB1LmFTLmIoYSl9LApQMTpmdW5jdGlvbihhKXtpZihh
-PT09d2luZG93KXJldHVybiB1LmNpLmIoYSkKZWxzZSByZXR1cm4gbmV3IFcuZFcoYSl9LAp6WDpmdW5j
-dGlvbihhKXtpZihhPT09d2luZG93LmxvY2F0aW9uKXJldHVybiBhCmVsc2UgcmV0dXJuIG5ldyBXLkZi
-KCl9LAphRjpmdW5jdGlvbihhLGIpe3ZhciB0PSQuWDMKaWYodD09PUMuTlUpcmV0dXJuIGEKcmV0dXJu
-IHQuUHkoYSxiKX0sCnFFOmZ1bmN0aW9uIHFFKCl7fSwKR2g6ZnVuY3Rpb24gR2goKXt9LApmWTpmdW5j
-dGlvbiBmWSgpe30sCm5COmZ1bmN0aW9uIG5CKCl7fSwKQXo6ZnVuY3Rpb24gQXooKXt9LApRUDpmdW5j
-dGlvbiBRUCgpe30sCm54OmZ1bmN0aW9uIG54KCl7fSwKb0o6ZnVuY3Rpb24gb0ooKXt9LAppZDpmdW5j
-dGlvbiBpZCgpe30sClFGOmZ1bmN0aW9uIFFGKCl7fSwKTmg6ZnVuY3Rpb24gTmgoKXt9LApJQjpmdW5j
-dGlvbiBJQigpe30sCm43OmZ1bmN0aW9uIG43KCl7fSwKd3o6ZnVuY3Rpb24gd3ooYSxiKXt0aGlzLmE9
-YQp0aGlzLiR0aT1ifSwKY3Y6ZnVuY3Rpb24gY3YoKXt9LApDdjpmdW5jdGlvbiBDdigpe30sCmVhOmZ1
-bmN0aW9uIGVhKCl7fSwKRDA6ZnVuY3Rpb24gRDAoKXt9LApUNTpmdW5jdGlvbiBUNSgpe30sCmg0OmZ1
-bmN0aW9uIGg0KCl7fSwKYnI6ZnVuY3Rpb24gYnIoKXt9LApWYjpmdW5jdGlvbiBWYigpe30sCk83OmZ1
-bmN0aW9uIE83KCl7fSwKYlU6ZnVuY3Rpb24gYlUoYSl7dGhpcy5hPWF9LApoSDpmdW5jdGlvbiBoSChh
-LGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKd2E6ZnVuY3Rpb24gd2EoKXt9LApTZzpmdW5jdGlvbiBTZygp
-e30sCnU4OmZ1bmN0aW9uIHU4KCl7fSwKQWo6ZnVuY3Rpb24gQWooKXt9LAplNzpmdW5jdGlvbiBlNyhh
-KXt0aGlzLmE9YX0sCnVIOmZ1bmN0aW9uIHVIKCl7fSwKQkg6ZnVuY3Rpb24gQkgoKXt9LApTTjpmdW5j
-dGlvbiBTTigpe30sCmV3OmZ1bmN0aW9uIGV3KCl7fSwKbHA6ZnVuY3Rpb24gbHAoKXt9LApUYjpmdW5j
-dGlvbiBUYigpe30sCkl2OmZ1bmN0aW9uIEl2KCl7fSwKQlQ6ZnVuY3Rpb24gQlQoKXt9LAp5WTpmdW5j
-dGlvbiB5WSgpe30sCnc2OmZ1bmN0aW9uIHc2KCl7fSwKSzU6ZnVuY3Rpb24gSzUoKXt9LApDbTpmdW5j
-dGlvbiBDbSgpe30sCkNROmZ1bmN0aW9uIENRKCl7fSwKdzQ6ZnVuY3Rpb24gdzQoKXt9LApyaDpmdW5j
-dGlvbiByaCgpe30sCkQ5OmZ1bmN0aW9uIEQ5KCl7fSwKaTc6ZnVuY3Rpb24gaTcoYSl7dGhpcy5hPWF9
-LApTeTpmdW5jdGlvbiBTeShhKXt0aGlzLmE9YX0sCktTOmZ1bmN0aW9uIEtTKGEsYil7dGhpcy5hPWEK
-dGhpcy5iPWJ9LApBMzpmdW5jdGlvbiBBMyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKSTQ6ZnVuY3Rp
-b24gSTQoYSl7dGhpcy5hPWF9LApGazpmdW5jdGlvbiBGayhhLGIpe3RoaXMuYT1hCnRoaXMuJHRpPWJ9
-LApSTzpmdW5jdGlvbiBSTyhhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uJHRp
-PWR9LApDcTpmdW5jdGlvbiBDcShhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8u
-JHRpPWR9LAp4QzpmdW5jdGlvbiB4QyhhLGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5iPWEKXy5jPWIKXy5k
-PWMKXy5lPWQKXy4kdGk9ZX0sCnZOOmZ1bmN0aW9uIHZOKGEpe3RoaXMuYT1hfSwKSlE6ZnVuY3Rpb24g
-SlEoYSl7dGhpcy5hPWF9LApHbTpmdW5jdGlvbiBHbSgpe30sCnZEOmZ1bmN0aW9uIHZEKGEpe3RoaXMu
-YT1hfSwKVXY6ZnVuY3Rpb24gVXYoYSl7dGhpcy5hPWF9LApFZzpmdW5jdGlvbiBFZyhhLGIsYyl7dGhp
-cy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LAptNjpmdW5jdGlvbiBtNigpe30sCkVvOmZ1bmN0aW9uIEVv
-KCl7fSwKV2s6ZnVuY3Rpb24gV2soKXt9LApjdDpmdW5jdGlvbiBjdChhLGIsYyxkLGUpe3ZhciBfPXRo
-aXMKXy5lPWEKXy5hPWIKXy5iPWMKXy5jPWQKXy5kPWV9LApJQTpmdW5jdGlvbiBJQSgpe30sCk93OmZ1
-bmN0aW9uIE93KCl7fSwKVzk6ZnVuY3Rpb24gVzkoYSxiLGMpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIK
-Xy5jPS0xCl8uZD1udWxsCl8uJHRpPWN9LApkVzpmdW5jdGlvbiBkVyhhKXt0aGlzLmE9YX0sCkZiOmZ1
-bmN0aW9uIEZiKCl7fSwKa0Y6ZnVuY3Rpb24ga0YoKXt9LAptazpmdW5jdGlvbiBtayhhLGIpe3RoaXMu
-YT1hCnRoaXMuYj1ifSwKS286ZnVuY3Rpb24gS28oYSl7dGhpcy5hPWF9LApmbTpmdW5jdGlvbiBmbShh
-KXt0aGlzLmE9YX0sCkxlOmZ1bmN0aW9uIExlKCl7fSwKSzc6ZnVuY3Rpb24gSzcoKXt9LApyQjpmdW5j
-dGlvbiByQigpe30sClhXOmZ1bmN0aW9uIFhXKCl7fSwKb2E6ZnVuY3Rpb24gb2EoKXt9fSxVPXsKeXU6
-ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG49SC5WTShbXSx1LmJQKQpmb3IodD1KLlU2KGEpLHM9
-Si5JVCh1LlIuYih0LnEoYSwiZGV0YWlscyIpKSk7cy5GKCk7KXtyPXMuZ2woKQpxPUouVTYocikKcD1I
-LnkocS5xKHIsImRlc2NyaXB0aW9uIikpCnE9cS5xKHIsImxpbmsiKQppZihxPT1udWxsKXE9bnVsbApl
-bHNle289Si5VNihxKQpxPW5ldyBVLk1sKEgueShvLnEocSwiaHJlZiIpKSxILlNjKG8ucShxLCJsaW5l
-IikpLEgueShvLnEocSwicGF0aCIpKSl9Qy5ObS5pKG4sbmV3IFUudUYocCxxKSl9cmV0dXJuIG5ldyBV
-LmQyKG4sVS5qZih0LnEoYSwiZWRpdHMiKSksSC55KHQucShhLCJleHBsYW5hdGlvbiIpKSxILlNjKHQu
-cShhLCJsaW5lIikpLEgueSh0LnEoYSwicGF0aCIpKSxVLk5kKHQucShhLCJ0cmFjZXMiKSkpfSwKamY6
-ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEKaWYoYT09bnVsbCl0PW51bGwKZWxzZXt0PUguVk0oW10sdS5m
-QSkKZm9yKHM9Si5JVCh1LlIuYihhKSk7cy5GKCk7KXtyPXMuZ2woKQpxPUouVTYocikKQy5ObS5pKHQs
-bmV3IFUuU2UoSC55KHEucShyLCJkZXNjcmlwdGlvbiIpKSxILnkocS5xKHIsImhyZWYiKSkpKX19cmV0
-dXJuIHR9LApOZDpmdW5jdGlvbihhKXt2YXIgdCxzCmlmKGE9PW51bGwpdD1udWxsCmVsc2V7dD1ILlZN
-KFtdLHUuaGgpCmZvcihzPUouSVQodS5SLmIoYSkpO3MuRigpOylDLk5tLmkodCxVLk5mKHMuZ2woKSkp
-fXJldHVybiB0fSwKTmY6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvPSJkZXNjcmlwdGlvbiIsbj1K
-LlU2KGEpLG09SC55KG4ucShhLG8pKSxsPUguVk0oW10sdS5hSikKZm9yKG49Si5JVCh1LlIuYihuLnEo
-YSwiZW50cmllcyIpKSk7bi5GKCk7KXt0PW4uZ2woKQpzPUouVTYodCkKcj1ILnkocy5xKHQsbykpCnE9
-SC55KHMucSh0LCJmdW5jdGlvbiIpKQpzPXMucSh0LCJsaW5rIikKaWYocz09bnVsbClzPW51bGwKZWxz
-ZXtwPUouVTYocykKcz1uZXcgVS5NbChILnkocC5xKHMsImhyZWYiKSksSC5TYyhwLnEocywibGluZSIp
-KSxILnkocC5xKHMsInBhdGgiKSkpfUMuTm0uaShsLG5ldyBVLndiKHIscSxzKSl9cmV0dXJuIG5ldyBV
-LnlEKG0sbCl9LApkMjpmdW5jdGlvbiBkMihhLGIsYyxkLGUsZil7dmFyIF89dGhpcwpfLmE9YQpfLmI9
-YgpfLmM9YwpfLmQ9ZApfLmU9ZQpfLmY9Zn0sClNlOmZ1bmN0aW9uIFNlKGEsYil7dGhpcy5hPWEKdGhp
-cy5iPWJ9LAp1RjpmdW5jdGlvbiB1RihhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKTWw6ZnVuY3Rpb24g
-TWwoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKeUQ6ZnVuY3Rpb24geUQoYSxiKXt0
-aGlzLmE9YQp0aGlzLmI9Yn0sCndiOmZ1bmN0aW9uIHdiKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0
-aGlzLmM9Y319LEI9ewpZZjpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT1ILnkoYS5xKDAsInJlZ2lvbnMi
-KSkscD1ILnkoYS5xKDAsIm5hdmlnYXRpb25Db250ZW50IikpLG89SC55KGEucSgwLCJzb3VyY2VDb2Rl
-IikpLG49SC5WTShbXSx1LnUpCmZvcih0PUouSVQodS5SLmIoYS5xKDAsImVkaXRzIikpKTt0LkYoKTsp
-e3M9dC5nbCgpCnI9Si5VNihzKQpDLk5tLmkobixuZXcgQi5qOChILlNjKHIucShzLCJsaW5lIikpLEgu
-eShyLnEocywiZXhwbGFuYXRpb24iKSksSC5TYyhyLnEocywib2Zmc2V0IikpKSl9cmV0dXJuIG5ldyBC
-LnFwKHEscCxvLG4pfSwKajg6ZnVuY3Rpb24gajgoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMu
-Yz1jfSwKcXA6ZnVuY3Rpb24gcXAoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9Ywpf
-LmQ9ZH0sCkx1OmZ1bmN0aW9uIEx1KCl7fSwKT1M6ZnVuY3Rpb24oYSl7dmFyIHQKaWYoIShhPj02NSYm
-YTw9OTApKXQ9YT49OTcmJmE8PTEyMgplbHNlIHQ9ITAKcmV0dXJuIHR9LApZdTpmdW5jdGlvbihhLGIp
-e3ZhciB0PWEubGVuZ3RoLHM9YisyCmlmKHQ8cylyZXR1cm4hMQppZighQi5PUyhDLnhCLm0oYSxiKSkp
-cmV0dXJuITEKaWYoQy54Qi5tKGEsYisxKSE9PTU4KXJldHVybiExCmlmKHQ9PT1zKXJldHVybiEwCnJl
-dHVybiBDLnhCLm0oYSxzKT09PTQ3fX0sVD17R1Y6ZnVuY3Rpb24gR1YoKXt9fSxMPXsKSXE6ZnVuY3Rp
-b24oKXtDLkJaLkIoZG9jdW1lbnQsIkRPTUNvbnRlbnRMb2FkZWQiLG5ldyBMLmUoKSkKQy5vbC5CKHdp
-bmRvdywicG9wc3RhdGUiLG5ldyBMLkwoKSl9LAprejpmdW5jdGlvbihhKXt2YXIgdCxzPXUuaC5hKGEu
-cGFyZW50Tm9kZSkucXVlcnlTZWxlY3RvcigiOnNjb3BlID4gdWwiKSxyPXMuc3R5bGUscT0iIitDLkNE
-LnpRKHMub2Zmc2V0SGVpZ2h0KSoyKyJweCIKci5tYXhIZWlnaHQ9cQpyPUoucUYoYSkKcT1yLiR0aQp0
-PXEuQygifigxKSIpLmIobmV3IEwuV3gocyxhKSkKdS5NLmIobnVsbCkKVy5KRShyLmEsci5iLHQsITEs
-cS5kKX0sCnlYOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbz0icXVlcnlTZWxlY3RvckFsbCIsbj1k
-b2N1bWVudC5xdWVyeVNlbGVjdG9yKGEpLG09dS5oCm4udG9TdHJpbmcKSC5EaChtLG0sIlQiLG8pCnQ9
-dS5TCnM9bmV3IFcud3oobi5xdWVyeVNlbGVjdG9yQWxsKCIubmF2LWxpbmsiKSx0KQpzLksocyxuZXcg
-TC5BTygpKQpILkRoKG0sbSwiVCIsbykKcj1uZXcgVy53eihuLnF1ZXJ5U2VsZWN0b3JBbGwoIi5yZWdp
-b24iKSx0KQppZihyLmdBKHIpIT09MCl7cT1uLnF1ZXJ5U2VsZWN0b3IoInRhYmxlW2RhdGEtcGF0aF0i
-KQpxLnRvU3RyaW5nCnIuSyhyLG5ldyBMLkhvKHEuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3ko
-bmV3IFcuaTcocSkpLk8oInBhdGgiKSkpKX1ILkRoKG0sbSwiVCIsbykKcD1uZXcgVy53eihuLnF1ZXJ5
-U2VsZWN0b3JBbGwoIi5wb3N0LWxpbmsiKSx0KQpwLksocCxuZXcgTC5JQygpKX0sCnR5OmZ1bmN0aW9u
-KGEpe3ZhciB0PXUuTgpyZXR1cm4gVy5xRChhLCJQT1NUIixQLkVGKFsiQ29udGVudC1UeXBlIiwiYXBw
-bGljYXRpb24vanNvbjsgY2hhcnNldD1VVEYtOCJdLHQsdCkpLlc3KG5ldyBMLkwxKCksdS5yKX0sCmFL
-OmZ1bmN0aW9uKGEpe3ZhciB0PVAuaEsoYSkuZ2hZKCkucSgwLCJsaW5lIikKcmV0dXJuIHQ9PW51bGw/
-bnVsbDpILkhwKHQsbnVsbCl9LApHNjpmdW5jdGlvbihhKXt2YXIgdD1QLmhLKGEpLmdoWSgpLnEoMCwi
-b2Zmc2V0IikKcmV0dXJuIHQ9PW51bGw/bnVsbDpILkhwKHQsbnVsbCl9LAp0MjpmdW5jdGlvbihhLGIp
-e3ZhciB0LHMscixxLHAsbyxuPXt9CnUuVi5iKGEpCnQ9bi5hPXUuaC5iKFcucWMoYS5jdXJyZW50VGFy
-Z2V0KSkuZ2V0QXR0cmlidXRlKCJocmVmIikKaWYoSi56bCh0LCI/Iikpe3M9Qy54Qi5Oaih0LDAsQy54
-Qi5PWSh0LCI/IikpCm4uYT1zCnI9c31lbHNlIHI9dAppZihiIT1udWxsKXtxPSQublUoKQpyPW4uYT1x
-Lm81KEQubnIocS50TShiKSxyKSl9cD1MLkc2KHQpCm89TC5hSyh0KQppZihwIT1udWxsKUwuYWYocixw
-LG8sbmV3IEwublQobixwLG8pKQplbHNlIEwuYWYocixudWxsLG51bGwsbmV3IEwuQloobikpCmEucHJl
-dmVudERlZmF1bHQoKX0sCnVtOmZ1bmN0aW9uKGEpe3JldHVybiBMLlFTKHUuVi5iKGEpKX0sClFTOmZ1
-bmN0aW9uKGEpe3ZhciB0PTAscz1QLkZYKHUueikscj0xLHEscD1bXSxvLG4sbSxsLGssagp2YXIgJGFz
-eW5jJHVtPVAubHooZnVuY3Rpb24oYixjKXtpZihiPT09MSl7cT1jCnQ9cn13aGlsZSh0cnVlKXN3aXRj
-aCh0KXtjYXNlIDA6az11LmguYShXLnFjKGEuY3VycmVudFRhcmdldCkpLmdldEF0dHJpYnV0ZSgiaHJl
-ZiIpCmEucHJldmVudERlZmF1bHQoKQptPWRvY3VtZW50Cm0uYm9keS5jbGFzc0xpc3QuYWRkKCJyZXJ1
-bm5pbmciKQpyPTMKdD02CnJldHVybiBQLmpRKEwudHkoayksJGFzeW5jJHVtKQpjYXNlIDY6dS5GLmEo
-Si5HcihXLnVWKG0uZGVmYXVsdFZpZXcpKSkucmVsb2FkKCkKcC5wdXNoKDUpCnQ9NApicmVhawpjYXNl
-IDM6cj0yCmo9cQpvPUguUnUoaikKbj1ILnRzKGopCkwucUooImhhbmRsZVBvc3RMaW5rQ2xpY2s6ICIr
-SC5kKG8pLG4pCndpbmRvdy5hbGVydCgiQ291bGQgbm90IGxvYWQgIitILmQoaykrIiAoIitILmQobykr
-IikuIikKcC5wdXNoKDUpCnQ9NApicmVhawpjYXNlIDI6cD1bMV0KY2FzZSA0OnI9MQptLmJvZHkuY2xh
-c3NMaXN0LnJlbW92ZSgicmVydW5uaW5nIikKdD1wLnBvcCgpCmJyZWFrCmNhc2UgNTpyZXR1cm4gUC55
-QyhudWxsLHMpCmNhc2UgMTpyZXR1cm4gUC5mMyhxLHMpfX0pCnJldHVybiBQLkRJKCRhc3luYyR1bSxz
-KX0sCnZVOmZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQscz11LmgKSC5EaChzLHMsIlQiLCJxdWVyeVNl
-bGVjdG9yQWxsIikKdD1uZXcgVy53eih0LnF1ZXJ5U2VsZWN0b3JBbGwoIi5jb2RlIiksdS5TKQp0Lkso
-dCxuZXcgTC5HSCgpKX0sCmhYOmZ1bmN0aW9uKGEsYil7dmFyIHQ9dS5OClcucUQoSC5kKGEpKyI/cmVn
-aW9uPXJlZ2lvbiZvZmZzZXQ9IitILmQoYiksbnVsbCxQLkVGKFsiQ29udGVudC1UeXBlIiwiYXBwbGlj
-YXRpb24vanNvbjsgY2hhcnNldD1VVEYtOCJdLHQsdCkpLlc3KG5ldyBMLkRUKCksdS5QKS5PQShuZXcg
-TC5lSChhKSl9LApHNzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgdCxzCmlmKCFKLnJZKGEpLlRjKGEsIi5k
-YXJ0Iikpe0wuQkUoYSxuZXcgQi5xcCgiIiwiIiwiIixDLnhEKSkKTC5CWChhLG51bGwpCmlmKGQhPW51
-bGwpZC4kMCgpCnJldHVybn10PUMueEIudGcoYSwiPyIpP2ErIiZpbmxpbmU9dHJ1ZSI6YSsiP2lubGlu
-ZT10cnVlIgpzPXUuTgpXLnFEKHQsbnVsbCxQLkVGKFsiQ29udGVudC1UeXBlIiwiYXBwbGljYXRpb24v
-anNvbjsgY2hhcnNldD1VVEYtOCJdLHMscykpLlc3KG5ldyBMLnpEKGEsYixjLGQpLHUuUCkuT0EobmV3
-IEwuT0UoYSkpfSwKR2U6ZnVuY3Rpb24oKXt2YXIgdD0iL19wcmV2aWV3L25hdmlnYXRpb25UcmVlLmpz
-b24iLHM9dS5OClcucUQodCxudWxsLFAuRUYoWyJDb250ZW50LVR5cGUiLCJhcHBsaWNhdGlvbi9qc29u
-OyBjaGFyc2V0PVVURi04Il0scyxzKSkuVzcobmV3IEwuVFcoKSx1LlApLk9BKG5ldyBMLnhyKHQpKX0s
-CnFKOmZ1bmN0aW9uKGEsYil7dmFyIHQKd2luZG93CmlmKHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVk
-Iil3aW5kb3cuY29uc29sZS5lcnJvcihhKQp3aW5kb3cKdD1ILmQoYikKaWYodHlwZW9mIGNvbnNvbGUh
-PSJ1bmRlZmluZWQiKXdpbmRvdy5jb25zb2xlLmVycm9yKHQpfSwKcU86ZnVuY3Rpb24oYSl7dmFyIHQ9
-YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxzPXQuYm90dG9tLHI9d2luZG93LmlubmVySGVpZ2h0Cmlm
-KHR5cGVvZiByIT09Im51bWJlciIpcmV0dXJuIEgucFkocikKaWYocz5yKUouZGgoYSkKZWxzZSBpZih0
-LnRvcDwwKUouZGgoYSl9LApmRzpmdW5jdGlvbihhLGIpe3ZhciB0LHMscgppZihhIT1udWxsKXt0PWRv
-Y3VtZW50CnM9dC5nZXRFbGVtZW50QnlJZCgibyIrSC5kKGEpKQpyPXQucXVlcnlTZWxlY3RvcigiLmxp
-bmUtIitILmQoYikpCmlmKHMhPW51bGwpe0wucU8ocykKSi5kUihzKS5pKDAsInRhcmdldCIpfWVsc2Ug
-aWYociE9bnVsbClMLnFPKHIucGFyZW50RWxlbWVudCkKaWYociE9bnVsbClKLmRSKHUuaC5hKHIucGFy
-ZW50Tm9kZSkpLmkoMCwiaGlnaGxpZ2h0Iil9ZWxzZSBMLnFPKGRvY3VtZW50LmdldEVsZW1lbnRCeUlk
-KCJ1bml0LW5hbWUiKSl9LAphZjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgdCxzLHI9TC5HNih3aW5kb3cu
-bG9jYXRpb24uaHJlZikscT1MLmFLKHdpbmRvdy5sb2NhdGlvbi5ocmVmKQppZihyIT1udWxsKXt0PWRv
-Y3VtZW50LmdldEVsZW1lbnRCeUlkKCJvIitILmQocikpCmlmKHQhPW51bGwpSi5kUih0KS5SKDAsInRh
-cmdldCIpfWlmKHEhPW51bGwpe3M9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmxpbmUtIitILmQocSkp
-CmlmKHMhPW51bGwpSi5kUihzLnBhcmVudEVsZW1lbnQpLlIoMCwiaGlnaGxpZ2h0Iil9aWYoYT09d2lu
-ZG93LmxvY2F0aW9uLnBhdGhuYW1lKXtMLmZHKGIsYykKZC4kMCgpfWVsc2UgTC5HNyhhLGIsYyxkKX0s
-Ckx4OmZ1bmN0aW9uKGEsYil7dmFyIHQKaWYoYT09PTEpdD1iCmVsc2UgdD1iKyJzIgpyZXR1cm4gdH0s
-ClQxOmZ1bmN0aW9uKGIwKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGMsYixh
-LGEwLGExLGEyLGEzLGE0LGE1LGE2LGE3LGE4PWRvY3VtZW50LGE5PWE4LnF1ZXJ5U2VsZWN0b3IoIi5l
-ZGl0LXBhbmVsIC5wYW5lbC1jb250ZW50IikKSi5sNShhOSwiIikKaWYoYjA9PW51bGwpe2E4PWE4LmNy
-ZWF0ZUVsZW1lbnQoInAiKQphOC50ZXh0Q29udGVudD0iU2VlIGRldGFpbHMgYWJvdXQgYSBwcm9wb3Nl
-ZCBlZGl0LiIKQy5MdC5zRChhOCxILlZNKFsicGxhY2Vob2xkZXIiXSx1LnMpKQphOS5hcHBlbmRDaGls
-ZChhOCkKcmV0dXJufXQ9YjAuZQpzPSQublUoKQpyPXMudE0odCkKcT1iMC5jCnA9cy5IUCh0LEouVDAo
-YTgucXVlcnlTZWxlY3RvcigiLnJvb3QiKS50ZXh0Q29udGVudCkpCm89YjAuZApzPWE4LmNyZWF0ZUVs
-ZW1lbnQoInAiKQpuPXUuaApuLmIoYTkuYXBwZW5kQ2hpbGQocykpLmFwcGVuZENoaWxkKGE4LmNyZWF0
-ZVRleHROb2RlKEguZChxKSsiIGF0ICIrSC5kKHApKyI6IitILmQobykrIi4iKSkKcz1iMC5hCmlmKHMu
-bGVuZ3RoIT09MCl7bT1hOC5jcmVhdGVFbGVtZW50KCJwIikKbS50ZXh0Q29udGVudD0iRWRpdCByYXRp
-b25hbGU6IgphOS5hcHBlbmRDaGlsZChtKQptPWE4LmNyZWF0ZUVsZW1lbnQoInVsIikKbD1uLmIoYTku
-YXBwZW5kQ2hpbGQobSkpCmZvcihtPXMubGVuZ3RoLGs9MDtrPHMubGVuZ3RoO3MubGVuZ3RoPT09bXx8
-KDAsSC5saykocyksKytrKXtqPXNba10KaT1hOC5jcmVhdGVFbGVtZW50KCJsaSIpCmg9bC5hcHBlbmRD
-aGlsZChpKQpoLmFwcGVuZENoaWxkKGE4LmNyZWF0ZVRleHROb2RlKGouYSkpCmc9ai5iCmlmKGchPW51
-bGwpe2guYXBwZW5kQ2hpbGQoYTguY3JlYXRlVGV4dE5vZGUoIiAoIikpCmguYXBwZW5kQ2hpbGQoTC5j
-NChnLHIpKQpoLmFwcGVuZENoaWxkKGE4LmNyZWF0ZVRleHROb2RlKCIpIikpfX19cz1iMC5iCmlmKHMh
-PW51bGwpZm9yKG09cy5sZW5ndGgsaT11LnMsZj11Llgsaz0wO2s8cy5sZW5ndGg7cy5sZW5ndGg9PT1t
-fHwoMCxILmxrKShzKSwrK2spe2U9c1trXQpkPWE4LmNyZWF0ZUVsZW1lbnQoInAiKQpjPW4uYihhOS5h
-cHBlbmRDaGlsZChkKSkKZD1hOC5jcmVhdGVFbGVtZW50KCJhIikKYj1uLmIoYy5hcHBlbmRDaGlsZChk
-KSkKYi5hcHBlbmRDaGlsZChhOC5jcmVhdGVUZXh0Tm9kZShlLmEpKQpiLnNldEF0dHJpYnV0ZSgiaHJl
-ZiIsZS5iKQpkPWYuYihILlZNKFsicG9zdC1saW5rIiwiYmVmb3JlLWFwcGx5Il0saSkpCmE9Si5kUihi
-KQphLlYxKDApCmEuRlYoMCxkKX1mb3Iocz1iMC5mLG49cy5sZW5ndGgsbT11LnMsaT11Llgsaz0wO2s8
-cy5sZW5ndGg7cy5sZW5ndGg9PT1ufHwoMCxILmxrKShzKSwrK2spe2EwPXNba10KZj1hOC5jcmVhdGVF
-bGVtZW50KCJwIikKZD1pLmIoSC5WTShbInRyYWNlIl0sbSkpCmE9Si5kUihmKQphLlYxKDApCmEuRlYo
-MCxkKQphMT1hOS5hcHBlbmRDaGlsZChmKQphMS5hcHBlbmRDaGlsZChhOC5jcmVhdGVUZXh0Tm9kZSgi
-TnVsbGFiaWxpdHkgdHJhY2UgZm9yOiAiKSkKZj1hOC5jcmVhdGVFbGVtZW50KCJzcGFuIikKZD1pLmIo
-SC5WTShbInR5cGUtZGVzY3JpcHRpb24iXSxtKSkKYT1KLmRSKGYpCmEuVjEoMCkKYS5GVigwLGQpCmYu
-YXBwZW5kQ2hpbGQoYTguY3JlYXRlVGV4dE5vZGUoYTAuYSkpCmExLmFwcGVuZENoaWxkKGYpCmY9YTgu
-Y3JlYXRlRWxlbWVudCgidWwiKQpkPWkuYihILlZNKFsidHJhY2UiXSxtKSkKYT1KLmRSKGYpCmEuVjEo
-MCkKYS5GVigwLGQpCmEyPWExLmFwcGVuZENoaWxkKGYpCmZvcihmPWEwLmIsZD1mLmxlbmd0aCxhMz0w
-O2EzPGYubGVuZ3RoO2YubGVuZ3RoPT09ZHx8KDAsSC5saykoZiksKythMyl7YTQ9ZlthM10KYTU9YTgu
-Y3JlYXRlRWxlbWVudCgibGkiKQpKLmw1KGE1LCImI3gyNzRGOyAiKQphNj1hMi5hcHBlbmRDaGlsZChh
-NSkKYTU9YTguY3JlYXRlRWxlbWVudCgic3BhbiIpCmE3PWkuYihILlZNKFsiZnVuY3Rpb24iXSxtKSkK
-YT1KLmRSKGE1KQphLlYxKDApCmEuRlYoMCxhNykKYTc9YTQuYgppZihhNz09bnVsbClhNz0idW5rbm93
-biIKYTUuYXBwZW5kQ2hpbGQoYTguY3JlYXRlVGV4dE5vZGUoYTcpKQphNi5hcHBlbmRDaGlsZChhNSkK
-Zz1hNC5jCmlmKGchPW51bGwpe2E2LmFwcGVuZENoaWxkKGE4LmNyZWF0ZVRleHROb2RlKCIgKCIpKQph
-Ni5hcHBlbmRDaGlsZChMLmM0KGcscikpCmE2LmFwcGVuZENoaWxkKGE4LmNyZWF0ZVRleHROb2RlKCIp
-IikpfWE2LmFwcGVuZENoaWxkKGE4LmNyZWF0ZVRleHROb2RlKCI6ICIpKQphNi5hcHBlbmRDaGlsZChh
-OC5jcmVhdGVUZXh0Tm9kZShhNC5hKSl9fX0sCkxIOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxv
-LG4sbSxsLGssaixpLGgsZyxmLGUsZD1kb2N1bWVudCxjPWQucXVlcnlTZWxlY3RvcigiLmVkaXQtbGlz
-dCAucGFuZWwtY29udGVudCIpCkoubDUoYywiIikKdD1kLmNyZWF0ZUVsZW1lbnQoInAiKQpzPXUuaApy
-PXMuYihjLmFwcGVuZENoaWxkKHQpKQpxPWIubGVuZ3RoCmlmKHE9PT0wKXIuYXBwZW5kQ2hpbGQoZC5j
-cmVhdGVUZXh0Tm9kZSgiTm8gcHJvcG9zZWQgZWRpdHMiKSkKZWxzZSByLmFwcGVuZENoaWxkKGQuY3Jl
-YXRlVGV4dE5vZGUoIiIrcSsiIHByb3Bvc2VkICIrTC5MeChxLCJlZGl0IikrIjoiKSkKdD1kLmNyZWF0
-ZUVsZW1lbnQoInVsIikKcD1zLmIoYy5hcHBlbmRDaGlsZCh0KSkKZm9yKHQ9Yi5sZW5ndGgsbz11Lmks
-bj11LlEsbT1uLkMoIn4oMSkiKSxsPXUuTSxuPW4uZCxrPTA7azxiLmxlbmd0aDtiLmxlbmd0aD09PXR8
-fCgwLEgubGspKGIpLCsrayl7aj1iW2tdCmk9ZC5jcmVhdGVFbGVtZW50KCJsaSIpCmg9cy5iKHAuYXBw
-ZW5kQ2hpbGQoaSkpCkouZFIoaCkuaSgwLCJlZGl0IikKaT1kLmNyZWF0ZUVsZW1lbnQoImEiKQpnPW8u
-YihoLmFwcGVuZENoaWxkKGkpKQpnLmNsYXNzTGlzdC5hZGQoImVkaXQtbGluayIpCmY9ai5jCmk9SC5k
-KGYpCmcuc2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTcoZykpLk8oIm9mZnNldCIp
-LGkpCmU9ai5hCmk9SC5kKGUpCmcuc2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTco
-ZykpLk8oImxpbmUiKSxpKQpnLmFwcGVuZENoaWxkKGQuY3JlYXRlVGV4dE5vZGUoImxpbmUgIitILmQo
-ZSkpKQppPW0uYihuZXcgTC5FRShmLGUsYSkpCmwuYihudWxsKQpXLkpFKGcsImNsaWNrIixpLCExLG4p
-CmguYXBwZW5kQ2hpbGQoZC5jcmVhdGVUZXh0Tm9kZSgiOiAiK0guZChqLmIpKSl9TC5UMShudWxsKX0s
-CkZyOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscT13aW5kb3cubG9jYXRpb24scD1QLmhLKChxJiZD
-LkV4KS5nRHIocSkrSC5kKGEpKQpxPXUuegp0PVAuRmwodS5OLHEpCmlmKGIhPW51bGwpdC5ZKDAsIm9m
-ZnNldCIsSC5kKGIpKQppZihjIT1udWxsKXQuWSgwLCJsaW5lIixILmQoYykpCnA9cC5ubSgwLHQuYT09
-PTA/bnVsbDp0KQpzPXdpbmRvdy5oaXN0b3J5CnI9cC53KDApCnMudG9TdHJpbmcKcy5wdXNoU3RhdGUo
-bmV3IFAuQmYoW10sW10pLlB2KFAuRmwocSxxKSksIiIscil9LApFbjpmdW5jdGlvbihhKXt2YXIgdD1K
-LmJiKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5yb290IikudGV4dENvbnRlbnQsIi8iKQppZihDLnhC
-Lm4oYSx0KSlyZXR1cm4gQy54Qi5HKGEsdC5sZW5ndGgpCmVsc2UgcmV0dXJuIGF9LApCWDpmdW5jdGlv
-bihhLGIpe3ZhciB0LHMscj17fQpyLmE9YQphPUwuRW4oYSkKci5hPWEKdD1kb2N1bWVudAp0LnF1ZXJ5
-U2VsZWN0b3IoIiN1bml0LW5hbWUiKS50ZXh0Q29udGVudD1hCnM9dS5oCkguRGgocyxzLCJUIiwicXVl
-cnlTZWxlY3RvckFsbCIpCnQ9bmV3IFcud3oodC5xdWVyeVNlbGVjdG9yQWxsKCIubmF2LXBhbmVsIC5u
-YXYtbGluayIpLHUuUykKdC5LKHQsbmV3IEwuVlMocikpfSwKQkU6ZnVuY3Rpb24oYSxiKXt2YXIgdD0i
-LnJlZ2lvbnMiLHM9ZG9jdW1lbnQscj1zLnF1ZXJ5U2VsZWN0b3IodCkscT1zLnF1ZXJ5U2VsZWN0b3Io
-Ii5jb2RlIikKSi50SChyLGIuYSwkLktHKCkpCkoudEgocSxiLmIsJC5LRygpKQpMLkxIKGEsYi5kKQpM
-LnZVKCkKTC55WCgiLmNvZGUiKQpMLnlYKHQpfSwKdFg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxw
-LG8sbixtLGwsayxqPWRvY3VtZW50LGk9ai5jcmVhdGVFbGVtZW50KCJ1bCIpLGg9dS5oLGc9aC5iKGEu
-YXBwZW5kQ2hpbGQoaSkpCmZvcihpPWIubGVuZ3RoLHQ9dS5NLHM9MDtzPGIubGVuZ3RoO2IubGVuZ3Ro
-PT09aXx8KDAsSC5saykoYiksKytzKXtyPWJbc10KcT1qLmNyZWF0ZUVsZW1lbnQoImxpIikKcD1oLmIo
-Zy5hcHBlbmRDaGlsZChxKSkKcT1KLlJFKHApCmlmKHIuYT09PUMuWTIpe3EuZ0QocCkuaSgwLCJkaXIi
-KQpxPWouY3JlYXRlRWxlbWVudCgic3BhbiIpCm89aC5iKHAuYXBwZW5kQ2hpbGQocSkpCnE9Si5SRShv
-KQpxLmdEKG8pLmkoMCwiYXJyb3ciKQpxLnNoZihvLCImI3gyNUJDOyIpCnE9ai5jcmVhdGVFbGVtZW50
-KCJzcGFuIikKSi5sNShoLmIocC5hcHBlbmRDaGlsZChxKSksIiYjeDFGNEMxOyIpCnAuYXBwZW5kQ2hp
-bGQoai5jcmVhdGVUZXh0Tm9kZShyLmIpKQpMLnRYKHAsci5jKQpMLmt6KG8pfWVsc2V7cS5zaGYocCwi
-JiN4MUY0QzQ7IikKcT1qLmNyZWF0ZUVsZW1lbnQoImEiKQpuPWguYihwLmFwcGVuZENoaWxkKHEpKQpx
-PUouUkUobikKcS5nRChuKS5pKDAsIm5hdi1saW5rIikKbi5zZXRBdHRyaWJ1dGUoImRhdGEtIituZXcg
-Vy5TeShuZXcgVy5pNyhuKSkuTygibmFtZSIpLHIuZCkKbi5zZXRBdHRyaWJ1dGUoImhyZWYiLHIuZSkK
-bi5hcHBlbmRDaGlsZChqLmNyZWF0ZVRleHROb2RlKHIuYikpCnE9cS5nVmwobikKbT1xLiR0aQptLkMo
-In4oMSkiKS5iKEwuWE4oKSkKdC5iKG51bGwpClcuSkUocS5hLHEuYixMLlhOKCksITEsbS5kKQpsPXIu
-ZgppZih0eXBlb2YgbCE9PSJudW1iZXIiKXJldHVybiBsLm9zKCkKaWYobD4wKXtxPWouY3JlYXRlRWxl
-bWVudCgic3BhbiIpCms9aC5iKHAuYXBwZW5kQ2hpbGQocSkpCkouZFIoaykuaSgwLCJlZGl0LWNvdW50
-IikKcT0iIitsKyIgIgppZihsPT09MSltPSJlZGl0IgplbHNlIG09ImVkaXRzIgprLnNldEF0dHJpYnV0
-ZSgidGl0bGUiLHErbSkKay5hcHBlbmRDaGlsZChqLmNyZWF0ZVRleHROb2RlKEMuam4udyhsKSkpfX19
-fSwKYzQ6ZnVuY3Rpb24oYSxiKXt2YXIgdD1kb2N1bWVudCxzPXQuY3JlYXRlRWxlbWVudCgiYSIpCnUu
-aS5iKHMpCnMuYXBwZW5kQ2hpbGQodC5jcmVhdGVUZXh0Tm9kZShILmQoYS5jKSsiOiIrSC5kKGEuYikp
-KQp0PUQubnIoYixhLmEpCnMuc2V0QXR0cmlidXRlKCJocmVmIiwkLm5VKCkubzUodCkpCnMuY2xhc3NM
-aXN0LmFkZCgibmF2LWxpbmsiKQpyZXR1cm4gc30sCmU6ZnVuY3Rpb24gZSgpe30sClZXOmZ1bmN0aW9u
-IFZXKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCm9aOmZ1bmN0aW9uIG9aKCl7fSwK
-anI6ZnVuY3Rpb24ganIoKXt9LApxbDpmdW5jdGlvbiBxbCgpe30sCkw6ZnVuY3Rpb24gTCgpe30sCld4
-OmZ1bmN0aW9uIFd4KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApBTzpmdW5jdGlvbiBBTygpe30sCmRO
-OmZ1bmN0aW9uIGROKCl7fSwKSG86ZnVuY3Rpb24gSG8oYSl7dGhpcy5hPWF9LAp4ejpmdW5jdGlvbiB4
-eihhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKSUM6ZnVuY3Rpb24gSUMoKXt9LApMMTpmdW5jdGlvbiBM
-MSgpe30sCm5UOmZ1bmN0aW9uIG5UKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCkJa
-OmZ1bmN0aW9uIEJaKGEpe3RoaXMuYT1hfSwKR0g6ZnVuY3Rpb24gR0goKXt9LApEVDpmdW5jdGlvbiBE
-VCgpe30sCmVIOmZ1bmN0aW9uIGVIKGEpe3RoaXMuYT1hfSwKekQ6ZnVuY3Rpb24gekQoYSxiLGMsZCl7
-dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZH0sCk9FOmZ1bmN0aW9uIE9FKGEpe3RoaXMu
-YT1hfSwKVFc6ZnVuY3Rpb24gVFcoKXt9LAp4cjpmdW5jdGlvbiB4cihhKXt0aGlzLmE9YX0sCkVFOmZ1
-bmN0aW9uIEVFKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClFMOmZ1bmN0aW9uIFFM
-KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApWUzpmdW5jdGlvbiBWUyhhKXt0aGlzLmE9YX0sClhBOmZ1
-bmN0aW9uIFhBKCl7fSwKbUs6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG49SC5WTShbXSx1LmZo
-KQpmb3IodD1KLklUKHUuUi5iKGEpKTt0LkYoKTspe3M9dC5nbCgpCnI9Si5VNihzKQpxPUwucDIoSC55
-KHIucShzLCJ0eXBlIikpKQpwPUgueShyLnEocywibmFtZSIpKQpvPXIucShzLCJzdWJ0cmVlIikKbz1v
-PT1udWxsP251bGw6TC5tSyhvKQpDLk5tLmkobixuZXcgTC5aWihxLHAsbyxILnkoci5xKHMsInBhdGgi
-KSksSC55KHIucShzLCJocmVmIikpLEguU2Moci5xKHMsImVkaXRDb3VudCIpKSkpfXJldHVybiBufSwK
-cDI6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UiZGlyZWN0b3J5IjpyZXR1cm4gQy5ZMgpjYXNlImZp
-bGUiOnJldHVybiBDLnJmCmRlZmF1bHQ6dGhyb3cgSC5iKFAuUFYoIlVucmVjb2duaXplZCBuYXZpZ2F0
-aW9uIHRyZWUgbm9kZSB0eXBlOiAiK0guZChhKSkpfX0sClpaOmZ1bmN0aW9uIFpaKGEsYixjLGQsZSxm
-KXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mfSwKeTg6ZnVuY3Rp
-b24geTgoYSl7dGhpcy5iPWF9LApJVjpmdW5jdGlvbiBJVihhLGIsYyxkKXt2YXIgXz10aGlzCl8uZD1h
-Cl8uZT1iCl8uZj1jCl8ucj1kfX0sTT17CllGOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvLG4K
-Zm9yKHQ9Yi5sZW5ndGgscz0xO3M8dDsrK3Mpe2lmKGJbc109PW51bGx8fGJbcy0xXSE9bnVsbCljb250
-aW51ZQpmb3IoO3Q+PTE7dD1yKXtyPXQtMQppZihiW3JdIT1udWxsKWJyZWFrfXE9bmV3IFAuUm4oIiIp
-CnA9YSsiKCIKcS5hPXAKbz1ILnFDKGIsMCx0LEgudDYoYikuZCkKbj1vLiR0aQpuPXArbmV3IEguQTgo
-byxuLkMoInFVKGFMLkUpIikuYihuZXcgTS5ObygpKSxuLkMoIkE4PGFMLkUscVU+IikpLkgoMCwiLCAi
-KQpxLmE9bgpxLmE9bisoIik6IHBhcnQgIisocy0xKSsiIHdhcyBudWxsLCBidXQgcGFydCAiK3MrIiB3
-YXMgbm90LiIpCnRocm93IEguYihQLnhZKHEudygwKSkpfX0sCmxJOmZ1bmN0aW9uIGxJKGEpe3RoaXMu
-YT1hfSwKTWk6ZnVuY3Rpb24gTWkoKXt9LApxNzpmdW5jdGlvbiBxNygpe30sCk5vOmZ1bmN0aW9uIE5v
-KCl7fX0sWD17CkNMOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvPWIueFooYSkKYi5oSyhhKQpp
-ZihvIT1udWxsKWE9Si5LVihhLG8ubGVuZ3RoKQp0PXUucwpzPUguVk0oW10sdCkKcj1ILlZNKFtdLHQp
-CnQ9YS5sZW5ndGgKaWYodCE9PTAmJmIucjQoQy54Qi5XKGEsMCkpKXtpZigwPj10KXJldHVybiBILk9I
-KGEsMCkKQy5ObS5pKHIsYVswXSkKcT0xfWVsc2V7Qy5ObS5pKHIsIiIpCnE9MH1mb3IocD1xO3A8dDsr
-K3ApaWYoYi5yNChDLnhCLlcoYSxwKSkpe0MuTm0uaShzLEMueEIuTmooYSxxLHApKQpDLk5tLmkocixh
-W3BdKQpxPXArMX1pZihxPHQpe0MuTm0uaShzLEMueEIuRyhhLHEpKQpDLk5tLmkociwiIil9cmV0dXJu
-IG5ldyBYLldEKGIsbyxzLHIpfSwKV0Q6ZnVuY3Rpb24gV0QoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9
-YQpfLmI9YgpfLmQ9YwpfLmU9ZH0sCnFSOmZ1bmN0aW9uIHFSKGEpe3RoaXMuYT1hfSwKSlQ6ZnVuY3Rp
-b24oYSl7cmV0dXJuIG5ldyBYLmR2KGEpfSwKZHY6ZnVuY3Rpb24gZHYoYSl7dGhpcy5hPWF9fSxPPXsK
-Umg6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGk9bnVsbAppZihQLnVvKCkuZ0Zp
-KCkhPT0iZmlsZSIpcmV0dXJuICQuRWIoKQp0PVAudW8oKQppZighQy54Qi5UYyh0LmdJaSh0KSwiLyIp
-KXJldHVybiAkLkViKCkKcz1QLlBpKGksMCwwKQpyPVAuelIoaSwwLDApCnE9UC5PZShpLDAsMCwhMSkK
-cD1QLmxlKGksMCwwLGkpCm89UC50RyhpLDAsMCkKbj1QLndCKGkscykKbT1zPT09ImZpbGUiCmlmKHE9
-PW51bGwpdD1yLmxlbmd0aCE9PTB8fG4hPW51bGx8fG0KZWxzZSB0PSExCmlmKHQpcT0iIgp0PXE9PW51
-bGwKbD0hdAprPVAua2EoImEvYiIsMCwzLGkscyxsKQpqPXMubGVuZ3RoPT09MAppZihqJiZ0JiYhQy54
-Qi5uKGssIi8iKSlrPVAud0Yoaywhanx8bCkKZWxzZSBrPVAueGUoaykKaWYobmV3IFAuRG4ocyxyLHQm
-JkMueEIubihrLCIvLyIpPyIiOnEsbixrLHAsbykudDQoKT09PSJhXFxiIilyZXR1cm4gJC5LaygpCnJl
-dHVybiAkLmJEKCl9LAp6TDpmdW5jdGlvbiB6TCgpe319LEU9e09GOmZ1bmN0aW9uIE9GKGEsYixjKXt0
-aGlzLmQ9YQp0aGlzLmU9Ygp0aGlzLmY9Y319LEY9e3J1OmZ1bmN0aW9uIHJ1KGEsYixjLGQpe3ZhciBf
-PXRoaXMKXy5kPWEKXy5lPWIKXy5mPWMKXy5yPWR9fSxEPXsKUlg6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9
-UC51bygpCmlmKEouUk0ociwkLkk2KSlyZXR1cm4gJC5GZgokLkk2PXIKaWYoJC5IaygpPT0kLkViKCkp
-cmV0dXJuICQuRmY9ci5aSSgiLiIpLncoMCkKZWxzZXt0PXIudDQoKQpzPXQubGVuZ3RoLTEKcmV0dXJu
-ICQuRmY9cz09PTA/dDpDLnhCLk5qKHQsMCxzKX19LApucjpmdW5jdGlvbihhLGIpe3ZhciB0PW51bGwK
-cmV0dXJuICQublUoKS5xNygwLGEsYix0LHQsdCx0LHQsdCl9fQp2YXIgdz1bQyxILEosUCxXLFUsQixU
-LEwsTSxYLE8sRSxGLERdCmh1bmtIZWxwZXJzLnNldEZ1bmN0aW9uTmFtZXNJZk5lY2Vzc2FyeSh3KQp2
-YXIgJD17fQpILmVvLnByb3RvdHlwZT17fQpKLnZCLnByb3RvdHlwZT17CkROOmZ1bmN0aW9uKGEsYil7
-cmV0dXJuIGE9PT1ifSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBILmVRKGEpfSwKdzpmdW5jdGlvbihh
-KXtyZXR1cm4iSW5zdGFuY2Ugb2YgJyIrSC5kKEguTShhKSkrIicifSwKZTc6ZnVuY3Rpb24oYSxiKXt1
-Lm8uYihiKQp0aHJvdyBILmIoUC5scihhLGIuZ1dhKCksYi5nbmQoKSxiLmdWbSgpKSl9fQpKLnlFLnBy
-b3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKX0sCmdpTzpmdW5jdGlvbihhKXty
-ZXR1cm4gYT81MTkwMTg6MjE4MTU5fSwKJGlhMjoxfQpKLllFLnByb3RvdHlwZT17CkROOmZ1bmN0aW9u
-KGEsYil7cmV0dXJuIG51bGw9PWJ9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiJudWxsIn0sCmdpTzpmdW5j
-dGlvbihhKXtyZXR1cm4gMH0sCmU3OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuU2ooYSx1Lm8uYihi
-KSl9LAokaWM4OjF9CkouTUYucHJvdG90eXBlPXsKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiAwfSwKdzpm
-dW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEpfSwKJGl2bToxfQpKLmlDLnByb3RvdHlwZT17fQpKLmtk
-LnByb3RvdHlwZT17fQpKLmM1LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHQ9YVskLncoKV0K
-aWYodD09bnVsbClyZXR1cm4gdGhpcy50KGEpCnJldHVybiJKYXZhU2NyaXB0IGZ1bmN0aW9uIGZvciAi
-K0guZChKLmoodCkpfSwKJFM6ZnVuY3Rpb24oKXtyZXR1cm57ZnVuYzoxLG9wdDpbLCwsLCwsLCwsLCws
-LCwsLF19fSwKJGlFSDoxfQpKLmpkLnByb3RvdHlwZT17Cmk6ZnVuY3Rpb24oYSxiKXtILnQ2KGEpLmQu
-YihiKQppZighIWEuZml4ZWQkbGVuZ3RoKUgudmgoUC5MNCgiYWRkIikpCmEucHVzaChiKX0sClc0OmZ1
-bmN0aW9uKGEsYil7dmFyIHQKaWYoISFhLmZpeGVkJGxlbmd0aClILnZoKFAuTDQoInJlbW92ZUF0Iikp
-CnQ9YS5sZW5ndGgKaWYoYj49dCl0aHJvdyBILmIoUC54KGIsbnVsbCkpCnJldHVybiBhLnNwbGljZShi
-LDEpWzBdfSwKVUc6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscgpILnQ2KGEpLkMoImNYPDE+IikuYihj
-KQppZighIWEuZml4ZWQkbGVuZ3RoKUgudmgoUC5MNCgiaW5zZXJ0QWxsIikpCnQ9YS5sZW5ndGgKUC53
-QShiLDAsdCwiaW5kZXgiKQpzPWMubGVuZ3RoCnRoaXMuc0EoYSx0K3MpCnI9YitzCnRoaXMuWVcoYSxy
-LGEubGVuZ3RoLGEsYikKdGhpcy52ZyhhLGIscixjKX0sCm12OmZ1bmN0aW9uKGEpe2lmKCEhYS5maXhl
-ZCRsZW5ndGgpSC52aChQLkw0KCJyZW1vdmVMYXN0IikpCmlmKGEubGVuZ3RoPT09MCl0aHJvdyBILmIo
-SC5IWShhLC0xKSkKcmV0dXJuIGEucG9wKCl9LApGVjpmdW5jdGlvbihhLGIpe3ZhciB0CkgudDYoYSku
-QygiY1g8MT4iKS5iKGIpCmlmKCEhYS5maXhlZCRsZW5ndGgpSC52aChQLkw0KCJhZGRBbGwiKSkKZm9y
-KHQ9Si5JVChiKTt0LkYoKTspYS5wdXNoKHQuZ2woKSl9LApLOmZ1bmN0aW9uKGEsYil7dmFyIHQscwpI
-LnQ2KGEpLkMoIn4oMSkiKS5iKGIpCnQ9YS5sZW5ndGgKZm9yKHM9MDtzPHQ7KytzKXtiLiQxKGFbc10p
-CmlmKGEubGVuZ3RoIT09dCl0aHJvdyBILmIoUC5hNChhKSl9fSwKRTI6ZnVuY3Rpb24oYSxiLGMpe3Zh
-ciB0PUgudDYoYSkKcmV0dXJuIG5ldyBILkE4KGEsdC5LcShjKS5DKCIxKDIpIikuYihiKSx0LkMoIkA8
-MT4iKS5LcShjKS5DKCJBODwxLDI+IikpfSwKSDpmdW5jdGlvbihhLGIpe3ZhciB0LHM9bmV3IEFycmF5
-KGEubGVuZ3RoKQpzLmZpeGVkJGxlbmd0aD1BcnJheQpmb3IodD0wO3Q8YS5sZW5ndGg7Kyt0KXRoaXMu
-WShzLHQsSC5kKGFbdF0pKQpyZXR1cm4gcy5qb2luKGIpfSwKTjA6ZnVuY3Rpb24oYSxiLGMsZCl7dmFy
-IHQscyxyCmQuYihiKQpILnQ2KGEpLktxKGQpLkMoIjEoMSwyKSIpLmIoYykKdD1hLmxlbmd0aApmb3Io
-cz1iLHI9MDtyPHQ7KytyKXtzPWMuJDIocyxhW3JdKQppZihhLmxlbmd0aCE9PXQpdGhyb3cgSC5iKFAu
-YTQoYSkpfXJldHVybiBzfSwKRTpmdW5jdGlvbihhLGIpe2lmKGI8MHx8Yj49YS5sZW5ndGgpcmV0dXJu
-IEguT0goYSxiKQpyZXR1cm4gYVtiXX0sCkQ2OmZ1bmN0aW9uKGEsYixjKXtpZihiPDB8fGI+YS5sZW5n
-dGgpdGhyb3cgSC5iKFAuVEUoYiwwLGEubGVuZ3RoLCJzdGFydCIsbnVsbCkpCmlmKGM8Ynx8Yz5hLmxl
-bmd0aCl0aHJvdyBILmIoUC5URShjLGIsYS5sZW5ndGgsImVuZCIsbnVsbCkpCmlmKGI9PT1jKXJldHVy
-biBILlZNKFtdLEgudDYoYSkpCnJldHVybiBILlZNKGEuc2xpY2UoYixjKSxILnQ2KGEpKX0sCmdyWjpm
-dW5jdGlvbihhKXt2YXIgdD1hLmxlbmd0aAppZih0PjApcmV0dXJuIGFbdC0xXQp0aHJvdyBILmIoSC5X
-cCgpKX0sCllXOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQscyxyPUgudDYoYSkKci5DKCJjWDwxPiIp
-LmIoZCkKaWYoISFhLmltbXV0YWJsZSRsaXN0KUgudmgoUC5MNCgic2V0UmFuZ2UiKSkKUC5qQihiLGMs
-YS5sZW5ndGgpCnQ9Yy1iCmlmKHQ9PT0wKXJldHVybgpQLmsxKGUsInNraXBDb3VudCIpCnIuQygiek08
-MT4iKS5iKGQpCnI9Si5VNihkKQppZihlK3Q+ci5nQShkKSl0aHJvdyBILmIoSC5hcigpKQppZihlPGIp
-Zm9yKHM9dC0xO3M+PTA7LS1zKWFbYitzXT1yLnEoZCxlK3MpCmVsc2UgZm9yKHM9MDtzPHQ7KytzKWFb
-YitzXT1yLnEoZCxlK3MpfSwKdmc6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuWVcoYSxiLGMs
-ZCwwKX0sClZyOmZ1bmN0aW9uKGEsYil7dmFyIHQscwpILnQ2KGEpLkMoImEyKDEpIikuYihiKQp0PWEu
-bGVuZ3RoCmZvcihzPTA7czx0Oysrcyl7aWYoSC5vVChiLiQxKGFbc10pKSlyZXR1cm4hMAppZihhLmxl
-bmd0aCE9PXQpdGhyb3cgSC5iKFAuYTQoYSkpfXJldHVybiExfSwKdGc6ZnVuY3Rpb24oYSxiKXt2YXIg
-dApmb3IodD0wO3Q8YS5sZW5ndGg7Kyt0KWlmKEouUk0oYVt0XSxiKSlyZXR1cm4hMApyZXR1cm4hMX0s
-Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuV0UoYSwiWyIsIl0iKX0sCmdrejpmdW5jdGlvbihhKXtyZXR1
-cm4gbmV3IEoubTEoYSxhLmxlbmd0aCxILnQ2KGEpLkMoIm0xPDE+IikpfSwKZ2lPOmZ1bmN0aW9uKGEp
-e3JldHVybiBILmVRKGEpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKc0E6ZnVuY3Rp
-b24oYSxiKXtpZighIWEuZml4ZWQkbGVuZ3RoKUgudmgoUC5MNCgic2V0IGxlbmd0aCIpKQppZihiPDAp
-dGhyb3cgSC5iKFAuVEUoYiwwLG51bGwsIm5ld0xlbmd0aCIsbnVsbCkpCmEubGVuZ3RoPWJ9LApxOmZ1
-bmN0aW9uKGEsYil7SC5TYyhiKQppZihiPj1hLmxlbmd0aHx8YjwwKXRocm93IEguYihILkhZKGEsYikp
-CnJldHVybiBhW2JdfSwKWTpmdW5jdGlvbihhLGIsYyl7SC50NihhKS5kLmIoYykKaWYoISFhLmltbXV0
-YWJsZSRsaXN0KUgudmgoUC5MNCgiaW5kZXhlZCBzZXQiKSkKaWYoYj49YS5sZW5ndGh8fGI8MCl0aHJv
-dyBILmIoSC5IWShhLGIpKQphW2JdPWN9LAokaWNYOjEsCiRpek06MX0KSi5Qby5wcm90b3R5cGU9e30K
-Si5tMS5wcm90b3R5cGU9ewpnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR9LApGOmZ1bmN0aW9uKCl7
-dmFyIHQscz10aGlzLHI9cy5hLHE9ci5sZW5ndGgKaWYocy5iIT09cSl0aHJvdyBILmIoSC5sayhyKSkK
-dD1zLmMKaWYodD49cSl7cy5zTShudWxsKQpyZXR1cm4hMX1zLnNNKHJbdF0pOysrcy5jCnJldHVybiEw
-fSwKc006ZnVuY3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLmQuYihhKX0sCiRpQW46MX0KSi5xSS5wcm90
-b3R5cGU9ewp5dTpmdW5jdGlvbihhKXt2YXIgdAppZihhPj0tMjE0NzQ4MzY0OCYmYTw9MjE0NzQ4MzY0
-NylyZXR1cm4gYXwwCmlmKGlzRmluaXRlKGEpKXt0PWE8MD9NYXRoLmNlaWwoYSk6TWF0aC5mbG9vcihh
-KQpyZXR1cm4gdCswfXRocm93IEguYihQLkw0KCIiK2ErIi50b0ludCgpIikpfSwKelE6ZnVuY3Rpb24o
-YSl7aWYoYT4wKXtpZihhIT09MS8wKXJldHVybiBNYXRoLnJvdW5kKGEpfWVsc2UgaWYoYT4tMS8wKXJl
-dHVybiAwLU1hdGgucm91bmQoMC1hKQp0aHJvdyBILmIoUC5MNCgiIithKyIucm91bmQoKSIpKX0sClda
-OmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEKaWYoYjwyfHxiPjM2KXRocm93IEguYihQLlRFKGIsMiwz
-NiwicmFkaXgiLG51bGwpKQp0PWEudG9TdHJpbmcoYikKaWYoQy54Qi5tKHQsdC5sZW5ndGgtMSkhPT00
-MSlyZXR1cm4gdApzPS9eKFtcZGEtel0rKSg/OlwuKFtcZGEtel0rKSk/XChlXCsoXGQrKVwpJC8uZXhl
-Yyh0KQppZihzPT1udWxsKUgudmgoUC5MNCgiVW5leHBlY3RlZCB0b1N0cmluZyByZXN1bHQ6ICIrdCkp
-CnI9cy5sZW5ndGgKaWYoMT49cilyZXR1cm4gSC5PSChzLDEpCnQ9c1sxXQppZigzPj1yKXJldHVybiBI
-Lk9IKHMsMykKcT0rc1szXQpyPXNbMl0KaWYociE9bnVsbCl7dCs9cgpxLT1yLmxlbmd0aH1yZXR1cm4g
-dCtDLnhCLkl4KCIwIixxKX0sCnc6ZnVuY3Rpb24oYSl7aWYoYT09PTAmJjEvYTwwKXJldHVybiItMC4w
-IgplbHNlIHJldHVybiIiK2F9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscD1hfDAKaWYoYT09
-PXApcmV0dXJuIDUzNjg3MDkxMSZwCnQ9TWF0aC5hYnMoYSkKcz1NYXRoLmxvZyh0KS8wLjY5MzE0NzE4
-MDU1OTk0NTN8MApyPU1hdGgucG93KDIscykKcT10PDE/dC9yOnIvdApyZXR1cm4gNTM2ODcwOTExJigo
-cSo5MDA3MTk5MjU0NzQwOTkyfDApKyhxKjM1NDIyNDMxODExNzY1MjF8MCkpKjU5OTE5NytzKjEyNTl9
-LAp6WTpmdW5jdGlvbihhLGIpe3ZhciB0PWElYgppZih0PT09MClyZXR1cm4gMAppZih0PjApcmV0dXJu
-IHQKaWYoYjwwKXJldHVybiB0LWIKZWxzZSByZXR1cm4gdCtifSwKd0c6ZnVuY3Rpb24oYSxiKXt2YXIg
-dAppZihhPjApdD10aGlzLnAzKGEsYikKZWxzZXt0PWI+MzE/MzE6Ygp0PWE+PnQ+Pj4wfXJldHVybiB0
-fSwKYmY6ZnVuY3Rpb24oYSxiKXtpZihiPDApdGhyb3cgSC5iKEgudEwoYikpCnJldHVybiB0aGlzLnAz
-KGEsYil9LApwMzpmdW5jdGlvbihhLGIpe3JldHVybiBiPjMxPzA6YT4+PmJ9LAokaUNQOjEsCiRpRks6
-MX0KSi51ci5wcm90b3R5cGU9eyRpS046MX0KSi5WQS5wcm90b3R5cGU9e30KSi5Eci5wcm90b3R5cGU9
-ewptOmZ1bmN0aW9uKGEsYil7aWYoYjwwKXRocm93IEguYihILkhZKGEsYikpCmlmKGI+PWEubGVuZ3Ro
-KUgudmgoSC5IWShhLGIpKQpyZXR1cm4gYS5jaGFyQ29kZUF0KGIpfSwKVzpmdW5jdGlvbihhLGIpe2lm
-KGI+PWEubGVuZ3RoKXRocm93IEguYihILkhZKGEsYikpCnJldHVybiBhLmNoYXJDb2RlQXQoYil9LApk
-ZDpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgSC51bihiLGEsMCl9LApoOmZ1bmN0aW9uKGEsYil7aWYo
-dHlwZW9mIGIhPSJzdHJpbmciKXRocm93IEguYihQLkwzKGIsbnVsbCxudWxsKSkKcmV0dXJuIGErYn0s
-ClRjOmZ1bmN0aW9uKGEsYil7dmFyIHQ9Yi5sZW5ndGgscz1hLmxlbmd0aAppZih0PnMpcmV0dXJuITEK
-cmV0dXJuIGI9PT10aGlzLkcoYSxzLXQpfSwKaTc6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscwpjPVAu
-akIoYixjLGEubGVuZ3RoKQp0PWEuc3Vic3RyaW5nKDAsYikKcz1hLnN1YnN0cmluZyhjKQpyZXR1cm4g
-dCtkK3N9LApRaTpmdW5jdGlvbihhLGIsYyl7dmFyIHQKaWYoIUgub2soYykpSC52aChILnRMKGMpKQpp
-Zih0eXBlb2YgYyE9PSJudW1iZXIiKXJldHVybiBjLkooKQppZihjPDB8fGM+YS5sZW5ndGgpdGhyb3cg
-SC5iKFAuVEUoYywwLGEubGVuZ3RoLG51bGwsbnVsbCkpCnQ9YytiLmxlbmd0aAppZih0PmEubGVuZ3Ro
-KXJldHVybiExCnJldHVybiBiPT09YS5zdWJzdHJpbmcoYyx0KX0sCm46ZnVuY3Rpb24oYSxiKXtyZXR1
-cm4gdGhpcy5RaShhLGIsMCl9LApOajpmdW5jdGlvbihhLGIsYyl7aWYoIUgub2soYikpSC52aChILnRM
-KGIpKQppZihjPT1udWxsKWM9YS5sZW5ndGgKaWYodHlwZW9mIGIhPT0ibnVtYmVyIilyZXR1cm4gYi5K
-KCkKaWYoYjwwKXRocm93IEguYihQLngoYixudWxsKSkKaWYoYj5jKXRocm93IEguYihQLngoYixudWxs
-KSkKaWYoYz5hLmxlbmd0aCl0aHJvdyBILmIoUC54KGMsbnVsbCkpCnJldHVybiBhLnN1YnN0cmluZyhi
-LGMpfSwKRzpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLk5qKGEsYixudWxsKX0sCmhjOmZ1bmN0aW9u
-KGEpe3JldHVybiBhLnRvTG93ZXJDYXNlKCl9LApiUzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT1hLnRy
-aW0oKSxwPXEubGVuZ3RoCmlmKHA9PT0wKXJldHVybiBxCmlmKHRoaXMuVyhxLDApPT09MTMzKXt0PUou
-bW0ocSwxKQppZih0PT09cClyZXR1cm4iIn1lbHNlIHQ9MApzPXAtMQpyPXRoaXMubShxLHMpPT09MTMz
-P0ouYzEocSxzKTpwCmlmKHQ9PT0wJiZyPT09cClyZXR1cm4gcQpyZXR1cm4gcS5zdWJzdHJpbmcodCxy
-KX0sCkl4OmZ1bmN0aW9uKGEsYil7dmFyIHQscwppZigwPj1iKXJldHVybiIiCmlmKGI9PT0xfHxhLmxl
-bmd0aD09PTApcmV0dXJuIGEKaWYoYiE9PWI+Pj4wKXRocm93IEguYihDLkVxKQpmb3IodD1hLHM9IiI7
-ITA7KXtpZigoYiYxKT09PTEpcz10K3MKYj1iPj4+MQppZihiPT09MClicmVhawp0Kz10fXJldHVybiBz
-fSwKWFU6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0CmlmKGM8MHx8Yz5hLmxlbmd0aCl0aHJvdyBILmIoUC5U
-RShjLDAsYS5sZW5ndGgsbnVsbCxudWxsKSkKdD1hLmluZGV4T2YoYixjKQpyZXR1cm4gdH0sCk9ZOmZ1
-bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuWFUoYSxiLDApfSwKUGs6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0
-LHMKaWYoYz09bnVsbCljPWEubGVuZ3RoCmVsc2UgaWYoYzwwfHxjPmEubGVuZ3RoKXRocm93IEguYihQ
-LlRFKGMsMCxhLmxlbmd0aCxudWxsLG51bGwpKQp0PWIubGVuZ3RoCnM9YS5sZW5ndGgKaWYoYyt0PnMp
-Yz1zLXQKcmV0dXJuIGEubGFzdEluZGV4T2YoYixjKX0sCmNuOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRo
-aXMuUGsoYSxiLG51bGwpfSwKSXM6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PWEubGVuZ3RoCmlmKGM+dCl0
-aHJvdyBILmIoUC5URShjLDAsdCxudWxsLG51bGwpKQpyZXR1cm4gSC5tMihhLGIsYyl9LAp0ZzpmdW5j
-dGlvbihhLGIpe3JldHVybiB0aGlzLklzKGEsYiwwKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LApn
-aU86ZnVuY3Rpb24oYSl7dmFyIHQscyxyCmZvcih0PWEubGVuZ3RoLHM9MCxyPTA7cjx0Oysrcil7cz01
-MzY4NzA5MTEmcythLmNoYXJDb2RlQXQocikKcz01MzY4NzA5MTEmcysoKDUyNDI4NyZzKTw8MTApCnNe
-PXM+PjZ9cz01MzY4NzA5MTEmcysoKDY3MTA4ODYzJnMpPDwzKQpzXj1zPj4xMQpyZXR1cm4gNTM2ODcw
-OTExJnMrKCgxNjM4MyZzKTw8MTUpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpm
-dW5jdGlvbihhLGIpe0guU2MoYikKaWYoYj49YS5sZW5ndGh8fCExKXRocm93IEguYihILkhZKGEsYikp
-CnJldHVybiBhW2JdfSwKJGl2WDoxLAokaXFVOjF9CkgucWoucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24o
-YSl7cmV0dXJuIHRoaXMuYS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEMueEIubSh0aGlz
-LmEsSC5TYyhiKSl9fQpILmJRLnByb3RvdHlwZT17fQpILmFMLnByb3RvdHlwZT17CmdrejpmdW5jdGlv
-bihhKXt2YXIgdD10aGlzCnJldHVybiBuZXcgSC5hNyh0LHQuZ0EodCksSC5MaCh0KS5DKCJhNzxhTC5F
-PiIpKX0sCkg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscT10aGlzLHA9cS5nQShxKQppZihiLmxlbmd0
-aCE9PTApe2lmKHA9PT0wKXJldHVybiIiCnQ9SC5kKHEuRSgwLDApKQppZihwIT09cS5nQShxKSl0aHJv
-dyBILmIoUC5hNChxKSkKZm9yKHM9dCxyPTE7cjxwOysrcil7cz1zK2IrSC5kKHEuRSgwLHIpKQppZihw
-IT09cS5nQShxKSl0aHJvdyBILmIoUC5hNChxKSl9cmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9
-ZWxzZXtmb3Iocj0wLHM9IiI7cjxwOysrcil7cys9SC5kKHEuRSgwLHIpKQppZihwIT09cS5nQShxKSl0
-aHJvdyBILmIoUC5hNChxKSl9cmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9fSwKZXY6ZnVuY3Rp
-b24oYSxiKXtyZXR1cm4gdGhpcy5HRygwLEguTGgodGhpcykuQygiYTIoYUwuRSkiKS5iKGIpKX19Ckgu
-bkgucHJvdG90eXBlPXsKZ1VEOmZ1bmN0aW9uKCl7dmFyIHQ9Si5IbSh0aGlzLmEpLHM9dGhpcy5jCmlm
-KHM9PW51bGx8fHM+dClyZXR1cm4gdApyZXR1cm4gc30sCmdBczpmdW5jdGlvbigpe3ZhciB0PUouSG0o
-dGhpcy5hKSxzPXRoaXMuYgppZihzPnQpcmV0dXJuIHQKcmV0dXJuIHN9LApnQTpmdW5jdGlvbihhKXt2
-YXIgdCxzPUouSG0odGhpcy5hKSxyPXRoaXMuYgppZihyPj1zKXJldHVybiAwCnQ9dGhpcy5jCmlmKHQ9
-PW51bGx8fHQ+PXMpcmV0dXJuIHMtcgppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiB0LkhOKCkK
-cmV0dXJuIHQtcn0sCkU6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPXRoaXMscj1zLmdBcygpK2IKaWYoYj49
-MCl7dD1zLmdVRCgpCmlmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJuIEgucFkodCkKdD1yPj10fWVs
-c2UgdD0hMAppZih0KXRocm93IEguYihQLkNmKGIscywiaW5kZXgiLG51bGwsbnVsbCkpCnJldHVybiBK
-LkFNKHMuYSxyKX19CkguYTcucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwK
-RjpmdW5jdGlvbigpe3ZhciB0LHM9dGhpcyxyPXMuYSxxPUouVTYocikscD1xLmdBKHIpCmlmKHMuYiE9
-PXApdGhyb3cgSC5iKFAuYTQocikpCnQ9cy5jCmlmKHQ+PXApe3Muc0kobnVsbCkKcmV0dXJuITF9cy5z
-SShxLkUocix0KSk7KytzLmMKcmV0dXJuITB9LApzSTpmdW5jdGlvbihhKXt0aGlzLmQ9dGhpcy4kdGku
-ZC5iKGEpfSwKJGlBbjoxfQpILkE4LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBKLkht
-KHRoaXMuYSl9LApFOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYi4kMShKLkFNKHRoaXMuYSxiKSl9
-fQpILlU1LnByb3RvdHlwZT17CmdrejpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguU08oSi5JVCh0aGlz
-LmEpLHRoaXMuYix0aGlzLiR0aS5DKCJTTzwxPiIpKX19CkguU08ucHJvdG90eXBlPXsKRjpmdW5jdGlv
-bigpe3ZhciB0LHMKZm9yKHQ9dGhpcy5hLHM9dGhpcy5iO3QuRigpOylpZihILm9UKHMuJDEodC5nbCgp
-KSkpcmV0dXJuITAKcmV0dXJuITF9LApnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuZ2woKX19Ckgu
-U1UucHJvdG90eXBlPXt9CkguUmUucHJvdG90eXBlPXsKWTpmdW5jdGlvbihhLGIsYyl7SC5MaCh0aGlz
-KS5DKCJSZS5FIikuYihjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFi
-bGUgbGlzdCIpKX19CkguWEMucHJvdG90eXBlPXt9Ckgud3YucHJvdG90eXBlPXsKZ2lPOmZ1bmN0aW9u
-KGEpe3ZhciB0PXRoaXMuX2hhc2hDb2RlCmlmKHQhPW51bGwpcmV0dXJuIHQKdD01MzY4NzA5MTEmNjY0
-NTk3KkouaGYodGhpcy5hKQp0aGlzLl9oYXNoQ29kZT10CnJldHVybiB0fSwKdzpmdW5jdGlvbihhKXty
-ZXR1cm4nU3ltYm9sKCInK0guZCh0aGlzLmEpKyciKSd9LApETjpmdW5jdGlvbihhLGIpe2lmKGI9PW51
-bGwpcmV0dXJuITEKcmV0dXJuIGIgaW5zdGFuY2VvZiBILnd2JiZ0aGlzLmE9PWIuYX0sCiRpR0Q6MX0K
-SC5QRC5wcm90b3R5cGU9e30KSC5XVS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLm5P
-KHRoaXMpfSwKWTpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9SC5MaCh0aGlzKQp0LmQuYihiKQp0LmNoWzFd
-LmIoYykKcmV0dXJuIEguZGMoKX0sCiRpWjA6MX0KSC5MUC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihh
-KXtyZXR1cm4gdGhpcy5hfSwKeDQ6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPSJzdHJpbmciKXJldHVy
-biExCmlmKCJfX3Byb3RvX18iPT09YSlyZXR1cm4hMQpyZXR1cm4gdGhpcy5iLmhhc093blByb3BlcnR5
-KGEpfSwKcTpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLng0KGIpKXJldHVybgpyZXR1cm4gdGhpcy5xUChi
-KX0sCnFQOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJbSC55KGEpXX0sCks6ZnVuY3Rpb24oYSxiKXt2
-YXIgdCxzLHIscSxwPUguTGgodGhpcykKcC5DKCJ+KDEsMikiKS5iKGIpCnQ9dGhpcy5jCmZvcihzPXQu
-bGVuZ3RoLHA9cC5jaFsxXSxyPTA7cjxzOysrcil7cT10W3JdCmIuJDIocSxwLmIodGhpcy5xUChxKSkp
-fX19CkguTEkucHJvdG90eXBlPXsKZ1dhOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5hCnJldHVybiB0fSwK
-Z25kOmZ1bmN0aW9uKCl7dmFyIHQscyxyLHEscD10aGlzCmlmKHAuYz09PTEpcmV0dXJuIEMuaFUKdD1w
-LmQKcz10Lmxlbmd0aC1wLmUubGVuZ3RoLXAuZgppZihzPT09MClyZXR1cm4gQy5oVQpyPVtdCmZvcihx
-PTA7cTxzOysrcSl7aWYocT49dC5sZW5ndGgpcmV0dXJuIEguT0godCxxKQpyLnB1c2godFtxXSl9cmV0
-dXJuIEouekMocil9LApnVm06ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwLG8sbixtLGw9dGhpcwppZihs
-LmMhPT0wKXJldHVybiBDLkNNCnQ9bC5lCnM9dC5sZW5ndGgKcj1sLmQKcT1yLmxlbmd0aC1zLWwuZgpp
-ZihzPT09MClyZXR1cm4gQy5DTQpwPW5ldyBILk41KHUuZW8pCmZvcihvPTA7bzxzOysrbyl7aWYobz49
-dC5sZW5ndGgpcmV0dXJuIEguT0godCxvKQpuPXRbb10KbT1xK28KaWYobTwwfHxtPj1yLmxlbmd0aCly
-ZXR1cm4gSC5PSChyLG0pCnAuWSgwLG5ldyBILnd2KG4pLHJbbV0pfXJldHVybiBuZXcgSC5QRChwLHUu
-Z0YpfSwKJGl2UToxfQpILkNqLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHQKSC55KGEp
-CnQ9dGhpcy5hCnQuYj10LmIrIiQiK0guZChhKQpDLk5tLmkodGhpcy5iLGEpCkMuTm0uaSh0aGlzLmMs
-Yik7Kyt0LmF9LAokUzoxM30KSC5aci5wcm90b3R5cGU9ewpxUzpmdW5jdGlvbihhKXt2YXIgdCxzLHI9
-dGhpcyxxPW5ldyBSZWdFeHAoci5hKS5leGVjKGEpCmlmKHE9PW51bGwpcmV0dXJuCnQ9T2JqZWN0LmNy
-ZWF0ZShudWxsKQpzPXIuYgppZihzIT09LTEpdC5hcmd1bWVudHM9cVtzKzFdCnM9ci5jCmlmKHMhPT0t
-MSl0LmFyZ3VtZW50c0V4cHI9cVtzKzFdCnM9ci5kCmlmKHMhPT0tMSl0LmV4cHI9cVtzKzFdCnM9ci5l
-CmlmKHMhPT0tMSl0Lm1ldGhvZD1xW3MrMV0Kcz1yLmYKaWYocyE9PS0xKXQucmVjZWl2ZXI9cVtzKzFd
-CnJldHVybiB0fX0KSC5XMC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYgppZih0
-PT1udWxsKXJldHVybiJOb1N1Y2hNZXRob2RFcnJvcjogIitILmQodGhpcy5hKQpyZXR1cm4iTm9TdWNo
-TWV0aG9kRXJyb3I6IG1ldGhvZCBub3QgZm91bmQ6ICciK3QrIicgb24gbnVsbCJ9fQpILmF6LnByb3Rv
-dHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlzLHI9Ik5vU3VjaE1ldGhvZEVycm9yOiBtZXRo
-b2Qgbm90IGZvdW5kOiAnIixxPXMuYgppZihxPT1udWxsKXJldHVybiJOb1N1Y2hNZXRob2RFcnJvcjog
-IitILmQocy5hKQp0PXMuYwppZih0PT1udWxsKXJldHVybiByK3ErIicgKCIrSC5kKHMuYSkrIikiCnJl
-dHVybiByK3ErIicgb24gJyIrdCsiJyAoIitILmQocy5hKSsiKSJ9fQpILnZWLnByb3RvdHlwZT17Cnc6
-ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hCnJldHVybiB0Lmxlbmd0aD09PTA/IkVycm9yIjoiRXJyb3I6
-ICIrdH19CkguYnEucHJvdG90eXBlPXt9CkguQW0ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7aWYo
-dS5iVS5jKGEpKWlmKGEuJHRocm93bkpzRXJyb3I9PW51bGwpYS4kdGhyb3duSnNFcnJvcj10aGlzLmEK
-cmV0dXJuIGF9LAokUzozfQpILlhPLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlz
-LmIKaWYocyE9bnVsbClyZXR1cm4gcwpzPXRoaXMuYQp0PXMhPT1udWxsJiZ0eXBlb2Ygcz09PSJvYmpl
-Y3QiP3Muc3RhY2s6bnVsbApyZXR1cm4gdGhpcy5iPXQ9PW51bGw/IiI6dH0sCiRpR3o6MX0KSC5UcC5w
-cm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuY29uc3RydWN0b3Iscz10PT1udWxsP251
-bGw6dC5uYW1lCnJldHVybiJDbG9zdXJlICciK0guTlEocz09bnVsbD8idW5rbm93biI6cykrIicifSwK
-JGlFSDoxLApnUWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sCiRDOiIkMSIsCiRSOjEsCiREOm51bGx9
-CkgubGMucHJvdG90eXBlPXt9CkguengucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlz
-LiRzdGF0aWNfbmFtZQppZih0PT1udWxsKXJldHVybiJDbG9zdXJlIG9mIHVua25vd24gc3RhdGljIG1l
-dGhvZCIKcmV0dXJuIkNsb3N1cmUgJyIrSC5OUSh0KSsiJyJ9fQpILnJULnByb3RvdHlwZT17CkROOmZ1
-bmN0aW9uKGEsYil7dmFyIHQ9dGhpcwppZihiPT1udWxsKXJldHVybiExCmlmKHQ9PT1iKXJldHVybiEw
-CmlmKCEoYiBpbnN0YW5jZW9mIEguclQpKXJldHVybiExCnJldHVybiB0LmE9PT1iLmEmJnQuYj09PWIu
-YiYmdC5jPT09Yi5jfSwKZ2lPOmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcy5jCmlmKHM9PW51bGwpdD1I
-LmVRKHRoaXMuYSkKZWxzZSB0PXR5cGVvZiBzIT09Im9iamVjdCI/Si5oZihzKTpILmVRKHMpCnJldHVy
-bih0XkguZVEodGhpcy5iKSk+Pj4wfSwKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmMKaWYodD09bnVs
-bCl0PXRoaXMuYQpyZXR1cm4iQ2xvc3VyZSAnIitILmQodGhpcy5kKSsiJyBvZiAiKygiSW5zdGFuY2Ug
-b2YgJyIrSC5kKEguTSh0KSkrIiciKX19CkguRXEucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1
-cm4iUnVudGltZUVycm9yOiAiK0guZCh0aGlzLmEpfX0KSC5rWS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9u
-KGEpe3JldHVybiJBc3NlcnRpb24gZmFpbGVkOiAiK1AucCh0aGlzLmEpfX0KSC5ONS5wcm90b3R5cGU9
-ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfSwKZ1Y6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEgu
-aTUodGhpcyxILkxoKHRoaXMpLkMoImk1PDE+IikpfSwKeDQ6ZnVuY3Rpb24oYSl7dmFyIHQscwppZih0
-eXBlb2YgYT09InN0cmluZyIpe3Q9dGhpcy5iCmlmKHQ9PW51bGwpcmV0dXJuITEKcmV0dXJuIHRoaXMu
-WHUodCxhKX1lbHNle3M9dGhpcy5DWChhKQpyZXR1cm4gc319LApDWDpmdW5jdGlvbihhKXt2YXIgdD10
-aGlzLmQKaWYodD09bnVsbClyZXR1cm4hMQpyZXR1cm4gdGhpcy5GaCh0aGlzLkJ0KHQsSi5oZihhKSYw
-eDNmZmZmZmYpLGEpPj0wfSwKcTpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHA9dGhpcwppZih0eXBl
-b2YgYj09InN0cmluZyIpe3Q9cC5iCmlmKHQ9PW51bGwpcmV0dXJuCnM9cC5qMih0LGIpCnI9cz09bnVs
-bD9udWxsOnMuYgpyZXR1cm4gcn1lbHNlIGlmKHR5cGVvZiBiPT0ibnVtYmVyIiYmKGImMHgzZmZmZmZm
-KT09PWIpe3E9cC5jCmlmKHE9PW51bGwpcmV0dXJuCnM9cC5qMihxLGIpCnI9cz09bnVsbD9udWxsOnMu
-YgpyZXR1cm4gcn1lbHNlIHJldHVybiBwLmFhKGIpfSwKYWE6ZnVuY3Rpb24oYSl7dmFyIHQscyxyPXRo
-aXMuZAppZihyPT1udWxsKXJldHVybgp0PXRoaXMuQnQocixKLmhmKGEpJjB4M2ZmZmZmZikKcz10aGlz
-LkZoKHQsYSkKaWYoczwwKXJldHVybgpyZXR1cm4gdFtzXS5ifSwKWTpmdW5jdGlvbihhLGIsYyl7dmFy
-IHQscyxyLHEscCxvLG49dGhpcyxtPUguTGgobikKbS5kLmIoYikKbS5jaFsxXS5iKGMpCmlmKHR5cGVv
-ZiBiPT0ic3RyaW5nIil7dD1uLmIKbi5FSCh0PT1udWxsP24uYj1uLnpLKCk6dCxiLGMpfWVsc2UgaWYo
-dHlwZW9mIGI9PSJudW1iZXIiJiYoYiYweDNmZmZmZmYpPT09Yil7cz1uLmMKbi5FSChzPT1udWxsP24u
-Yz1uLnpLKCk6cyxiLGMpfWVsc2V7cj1uLmQKaWYocj09bnVsbClyPW4uZD1uLnpLKCkKcT1KLmhmKGIp
-JjB4M2ZmZmZmZgpwPW4uQnQocixxKQppZihwPT1udWxsKW4uRUkocixxLFtuLkhuKGIsYyldKQplbHNl
-e289bi5GaChwLGIpCmlmKG8+PTApcFtvXS5iPWMKZWxzZSBwLnB1c2gobi5IbihiLGMpKX19fSwKSzpm
-dW5jdGlvbihhLGIpe3ZhciB0LHMscj10aGlzCkguTGgocikuQygifigxLDIpIikuYihiKQp0PXIuZQpz
-PXIucgpmb3IoO3QhPW51bGw7KXtiLiQyKHQuYSx0LmIpCmlmKHMhPT1yLnIpdGhyb3cgSC5iKFAuYTQo
-cikpCnQ9dC5jfX0sCkVIOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzPXRoaXMscj1ILkxoKHMpCnIuZC5i
-KGIpCnIuY2hbMV0uYihjKQp0PXMuajIoYSxiKQppZih0PT1udWxsKXMuRUkoYSxiLHMuSG4oYixjKSkK
-ZWxzZSB0LmI9Y30sCmtzOmZ1bmN0aW9uKCl7dGhpcy5yPXRoaXMucisxJjY3MTA4ODYzfSwKSG46ZnVu
-Y3Rpb24oYSxiKXt2YXIgdCxzPXRoaXMscj1ILkxoKHMpLHE9bmV3IEguZGIoci5kLmIoYSksci5jaFsx
-XS5iKGIpKQppZihzLmU9PW51bGwpcy5lPXMuZj1xCmVsc2V7dD1zLmYKcS5kPXQKcy5mPXQuYz1xfSsr
-cy5hCnMua3MoKQpyZXR1cm4gcX0sCkZoOmZ1bmN0aW9uKGEsYil7dmFyIHQscwppZihhPT1udWxsKXJl
-dHVybi0xCnQ9YS5sZW5ndGgKZm9yKHM9MDtzPHQ7KytzKWlmKEouUk0oYVtzXS5hLGIpKXJldHVybiBz
-CnJldHVybi0xfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gUC5uTyh0aGlzKX0sCmoyOmZ1bmN0aW9uKGEs
-Yil7cmV0dXJuIGFbYl19LApCdDpmdW5jdGlvbihhLGIpe3JldHVybiBhW2JdfSwKRUk6ZnVuY3Rpb24o
-YSxiLGMpe2FbYl09Y30sCnJuOmZ1bmN0aW9uKGEsYil7ZGVsZXRlIGFbYl19LApYdTpmdW5jdGlvbihh
-LGIpe3JldHVybiB0aGlzLmoyKGEsYikhPW51bGx9LAp6SzpmdW5jdGlvbigpe3ZhciB0PSI8bm9uLWlk
-ZW50aWZpZXIta2V5PiIscz1PYmplY3QuY3JlYXRlKG51bGwpCnRoaXMuRUkocyx0LHMpCnRoaXMucm4o
-cyx0KQpyZXR1cm4gc30sCiRpRm86MX0KSC5kYi5wcm90b3R5cGU9e30KSC5pNS5wcm90b3R5cGU9ewpn
-QTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmF9LApna3o6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5h
-LHM9bmV3IEguTjYodCx0LnIsdGhpcy4kdGkuQygiTjY8MT4iKSkKcy5jPXQuZQpyZXR1cm4gc319Ckgu
-TjYucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwKRjpmdW5jdGlvbigpe3Zh
-ciB0PXRoaXMscz10LmEKaWYodC5iIT09cy5yKXRocm93IEguYihQLmE0KHMpKQplbHNle3M9dC5jCmlm
-KHM9PW51bGwpe3Quc3FZKG51bGwpCnJldHVybiExfWVsc2V7dC5zcVkocy5hKQp0LmM9dC5jLmMKcmV0
-dXJuITB9fX0sCnNxWTpmdW5jdGlvbihhKXt0aGlzLmQ9dGhpcy4kdGkuZC5iKGEpfSwKJGlBbjoxfQpI
-LmRDLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEoYSl9LAokUzozfQpILndO
-LnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYShhLGIpfSwKJFM6Mzh9Ckgu
-VlgucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYShILnkoYSkpfSwKJFM6Mzd9
-CkguVlIucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iUmVnRXhwLyIrdGhpcy5hKyIvIit0
-aGlzLmIuZmxhZ3N9LApnSGM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLHM9dC5jCmlmKHMhPW51bGwpcmV0
-dXJuIHMKcz10LmIKcmV0dXJuIHQuYz1ILnY0KHQuYSxzLm11bHRpbGluZSwhcy5pZ25vcmVDYXNlLHMu
-dW5pY29kZSxzLmRvdEFsbCwhMCl9LApkZDpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgSC5LVyh0aGlz
-LGIsMCl9LApVWjpmdW5jdGlvbihhLGIpe3ZhciB0LHM9dGhpcy5nSGMoKQpzLmxhc3RJbmRleD1iCnQ9
-cy5leGVjKGEpCmlmKHQ9PW51bGwpcmV0dXJuCnJldHVybiBuZXcgSC5FSyh0KX0sCiRpdlg6MSwKJGl3
-TDoxfQpILkVLLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXt2YXIgdApILlNjKGIpCnQ9dGhpcy5i
-CmlmKGI+PXQubGVuZ3RoKXJldHVybiBILk9IKHQsYikKcmV0dXJuIHRbYl19LAokaU9kOjEsCiRpaWI6
-MX0KSC5LVy5wcm90b3R5cGU9ewpna3o6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILlBiKHRoaXMuYSx0
-aGlzLmIsdGhpcy5jKX19CkguUGIucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5k
-fSwKRjpmdW5jdGlvbigpe3ZhciB0LHMscixxLHA9dGhpcyxvPXAuYgppZihvPT1udWxsKXJldHVybiEx
-CnQ9cC5jCmlmKHQ8PW8ubGVuZ3RoKXtzPXAuYQpyPXMuVVoobyx0KQppZihyIT1udWxsKXtwLmQ9cgpv
-PXIuYgp0PW8uaW5kZXgKcT10K29bMF0ubGVuZ3RoCmlmKHQ9PT1xKXtpZihzLmIudW5pY29kZSl7bz1w
-LmMKdD1vKzEKcz1wLmIKaWYodDxzLmxlbmd0aCl7bz1KLnJZKHMpLm0ocyxvKQppZihvPj01NTI5NiYm
-bzw9NTYzMTkpe289Qy54Qi5tKHMsdCkKbz1vPj01NjMyMCYmbzw9NTczNDN9ZWxzZSBvPSExfWVsc2Ug
-bz0hMX1lbHNlIG89ITEKcT0obz9xKzE6cSkrMX1wLmM9cQpyZXR1cm4hMH19cC5iPXAuZD1udWxsCnJl
-dHVybiExfSwKJGlBbjoxfQpILnRRLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtILlNjKGIpCmlm
-KGIhPT0wKUgudmgoUC54KGIsbnVsbCkpCnJldHVybiB0aGlzLmN9LAokaU9kOjF9CkgudW4ucHJvdG90
-eXBlPXsKZ2t6OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5TZCh0aGlzLmEsdGhpcy5iLHRoaXMuYyl9
-fQpILlNkLnByb3RvdHlwZT17CkY6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9dGhpcyxxPXIuYyxwPXIuYixv
-PXAubGVuZ3RoLG49ci5hLG09bi5sZW5ndGgKaWYocStvPm0pe3IuZD1udWxsCnJldHVybiExfXQ9bi5p
-bmRleE9mKHAscSkKaWYodDwwKXtyLmM9bSsxCnIuZD1udWxsCnJldHVybiExfXM9dCtvCnIuZD1uZXcg
-SC50USh0LHApCnIuYz1zPT09ci5jP3MrMTpzCnJldHVybiEwfSwKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4g
-dGhpcy5kfSwKJGlBbjoxfQpILkVULnByb3RvdHlwZT17JGlFVDoxLCRpQVM6MX0KSC5iMC5wcm90b3R5
-cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LAokaVhqOjF9CkguRGcucHJvdG90eXBl
-PXsKcTpmdW5jdGlvbihhLGIpe0guU2MoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfSwK
-WTpmdW5jdGlvbihhLGIsYyl7SC5JZyhjKQpILm9kKGIsYSxhLmxlbmd0aCkKYVtiXT1jfSwKJGljWDox
-LAokaXpNOjF9CkguUGcucHJvdG90eXBlPXsKWTpmdW5jdGlvbihhLGIsYyl7SC5TYyhjKQpILm9kKGIs
-YSxhLmxlbmd0aCkKYVtiXT1jfSwKJGljWDoxLAokaXpNOjF9CkgueGoucHJvdG90eXBlPXsKcTpmdW5j
-dGlvbihhLGIpe0guU2MoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC5kRS5wcm90
+UHYoYSwibnVtIikpfSwKRE46ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBh
+CmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEgucShhLCJudW0iKSl9LApNTTpmdW5jdGlvbihh
+KXtyZXR1cm4gdHlwZW9mIGE9PSJzdHJpbmcifSwKYzA6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJz
+dHJpbmciKXJldHVybiBhCmlmKGE9PW51bGwpcmV0dXJuIGEKdGhyb3cgSC5iKEguUHYoYSwiU3RyaW5n
+IikpfSwKeTpmdW5jdGlvbihhKXtpZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGEKaWYoYT09bnVs
+bClyZXR1cm4gYQp0aHJvdyBILmIoSC5xKGEsIlN0cmluZyIpKX0sCmlvOmZ1bmN0aW9uKGEsYil7dmFy
+IHQscyxyCmZvcih0PSIiLHM9IiIscj0wO3I8YS5sZW5ndGg7KytyLHM9IiwgIil0Kz1DLnhCLmgocyxI
+LmRtKGFbcl0sYikpCnJldHVybiB0fSwKYkk6ZnVuY3Rpb24oYTAsYTEsYTIpe3ZhciB0LHMscixxLHAs
+byxuLG0sbCxrLGosaSxoLGcsZixlLGQsYyxiLGE9IiwgIgppZihhMiE9bnVsbCl7dD1hMi5sZW5ndGgK
+aWYoYTE9PW51bGwpe2ExPUguVk0oW10sdS5zKQpzPW51bGx9ZWxzZSBzPWExLmxlbmd0aApyPWExLmxl
+bmd0aApmb3IocT10O3E+MDstLXEpQy5ObS5pKGExLCJUIisocitxKSkKZm9yKHA9IjwiLG89IiIscT0w
+O3E8dDsrK3Esbz1hKXtwKz1vCm49YTEubGVuZ3RoCm09bi0xLXEKaWYobTwwKXJldHVybiBILk9IKGEx
+LG0pCnA9Qy54Qi5oKHAsYTFbbV0pCmw9YTJbcV0KaWYoIUguY2MobCkpcCs9Qy54Qi5oKCIgZXh0ZW5k
+cyAiLEguZG0obCxhMSkpfXArPSI+In1lbHNle3A9IiIKcz1udWxsfW49YTAuUQprPWEwLmNoCmo9ay5h
+Cmk9ai5sZW5ndGgKaD1rLmIKZz1oLmxlbmd0aApmPWsuYwplPWYubGVuZ3RoCmQ9SC5kbShuLGExKQpm
+b3IoYz0iIixiPSIiLHE9MDtxPGk7KytxLGI9YSljKz1DLnhCLmgoYixILmRtKGpbcV0sYTEpKQppZihn
+PjApe2MrPWIrIlsiCmZvcihiPSIiLHE9MDtxPGc7KytxLGI9YSljKz1DLnhCLmgoYixILmRtKGhbcV0s
+YTEpKQpjKz0iXSJ9aWYoZT4wKXtjKz1iKyJ7Igpmb3IoYj0iIixxPTA7cTxlO3ErPTIsYj1hKWMrPUMu
+eEIuaChiLEguZG0oZltxKzFdLGExKSkrIiAiK2ZbcV0KYys9In0ifWlmKHMhPW51bGwpYTEubGVuZ3Ro
+PXMKcmV0dXJuIHArIigiK2MrIikgPT4gIitILmQoZCl9LApkbTpmdW5jdGlvbihhLGIpe3ZhciB0LHMs
+cixxLHA9YS56CmlmKHA9PT01KXJldHVybiJlcmFzZWQiCmlmKHA9PT0yKXJldHVybiJkeW5hbWljIgpp
+ZihwPT09MylyZXR1cm4idm9pZCIKaWYocD09PTEpcmV0dXJuIk5ldmVyIgppZihwPT09NClyZXR1cm4i
+YW55IgppZihwPT09NilyZXR1cm4gSC5kKEguZG0oYS5RLGIpKSsiKiIKaWYocD09PTcpcmV0dXJuIEgu
+ZChILmRtKGEuUSxiKSkrIj8iCmlmKHA9PT04KXJldHVybiJGdXR1cmVPcjwiK0guZChILmRtKGEuUSxi
+KSkrIj4iCmlmKHA9PT05KXt0PUgubzMoYS5RKQpzPWEuY2gKcmV0dXJuIHMubGVuZ3RoIT09MD90Kygi
+PCIrSC5pbyhzLGIpKyI+Iik6dH1pZihwPT09MTEpcmV0dXJuIEguYkkoYSxiLG51bGwpCmlmKHA9PT0x
+MilyZXR1cm4gSC5iSShhLlEsYixhLmNoKQppZihwPT09MTMpe3I9YS5RCnE9Yi5sZW5ndGgKcj1xLTEt
+cgppZihyPDB8fHI+PXEpcmV0dXJuIEguT0goYixyKQpyZXR1cm4gYltyXX1yZXR1cm4iPyJ9LApvMzpm
+dW5jdGlvbihhKXt2YXIgdCxzPUguSmcoYSkKaWYocyE9bnVsbClyZXR1cm4gcwp0PSJtaW5pZmllZDoi
+K2EKcmV0dXJuIHR9LApRbzpmdW5jdGlvbihhLGIpe3ZhciB0PWEudFJbYl0KZm9yKDt0eXBlb2YgdD09
+InN0cmluZyI7KXQ9YS50Ult0XQpyZXR1cm4gdH0sCmFpOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEs
+cCxvPWEuZVQsbj1vW2JdCmlmKG49PW51bGwpcmV0dXJuIEguRShhLGIpCmVsc2UgaWYodHlwZW9mIG49
+PSJudW1iZXIiKXt0PW4Kcz1ILm0oYSw1LCIjIikKcj1bXQpmb3IocT0wO3E8dDsrK3Epci5wdXNoKHMp
+CnA9SC5KKGEsYixyKQpvW2JdPXAKcmV0dXJuIHB9ZWxzZSByZXR1cm4gbn0sCnhiOmZ1bmN0aW9uKGEs
+Yil7cmV0dXJuIEguSXgoYS50UixiKX0sCkZGOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEguSXgoYS5lVCxi
+KX0sCkU6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPWEuZUMscj1zLmdldChiKQppZihyIT1udWxsKXJldHVy
+biByCnQ9SC56KGEsbnVsbCxiKQpzLnNldChiLHQpCnJldHVybiB0fSwKY0U6ZnVuY3Rpb24oYSxiLGMp
+e3ZhciB0LHMscj1iLmN4CmlmKHI9PW51bGwpcj1iLmN4PW5ldyBNYXAoKQp0PXIuZ2V0KGMpCmlmKHQh
+PW51bGwpcmV0dXJuIHQKcz1ILnooYSxiLGMpCnIuc2V0KGMscykKcmV0dXJuIHN9LAp2NTpmdW5jdGlv
+bihhLGIsYyl7dmFyIHQscyxyLHE9Yi5jeQppZihxPT1udWxsKXE9Yi5jeT1uZXcgTWFwKCkKdD1jLmRi
+CnM9cS5nZXQodCkKaWYocyE9bnVsbClyZXR1cm4gcwpyPUguYShhLGIsYy56PT09MTA/Yy5jaDpbY10p
+CnEuc2V0KHQscikKcmV0dXJuIHJ9LAp6OmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1ILmkoSC5vKGEsYixj
+KSkKcmV0dXJuIHR9LApXRzpmdW5jdGlvbihhLGIpe3ZhciB0PWIuZGIKYS5lQy5zZXQodCxiKQpiLmE9
+SC5PegpiLmI9SC5BdgpiLmM9SC5KSgpyZXR1cm4gYn0sCm06ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHM9
+YS5lQy5nZXQoYykKaWYocyE9bnVsbClyZXR1cm4gcwp0PW5ldyBILkpjKG51bGwsbnVsbCxudWxsKQp0
+Lno9Ygp0LmRiPWMKcmV0dXJuIEguV0coYSx0KX0sCnY6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscz1h
+LmVDLmdldChkKQppZihzIT1udWxsKXJldHVybiBzCnQ9bmV3IEguSmMobnVsbCxudWxsLG51bGwpCnQu
+ej1iCnQuUT1jCnQuZGI9ZApyZXR1cm4gSC5XRyhhLHQpfSwKSDpmdW5jdGlvbihhLGIpe3ZhciB0LHM9
+IiIrYisiXiIscj1hLmVDLmdldChzKQppZihyIT1udWxsKXJldHVybiByCnQ9bmV3IEguSmMobnVsbCxu
+dWxsLG51bGwpCnQuej0xMwp0LlE9Ygp0LmRiPXMKcmV0dXJuIEguV0coYSx0KX0sClV4OmZ1bmN0aW9u
+KGEpe3ZhciB0LHMscixxPWEubGVuZ3RoCmZvcih0PSIiLHM9IiIscj0wO3I8cTsrK3Iscz0iLCIpdCs9
+cythW3JdLmRiCnJldHVybiB0fSwKUzQ6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvPWEubGVuZ3Ro
+CmZvcih0PSIiLHM9IiIscj0wO3I8bztyKz0yLHM9IiwiKXtxPWFbcl0KcD1hW3IrMV0uZGIKdCs9cytx
+KyI6IitwfXJldHVybiB0fSwKSjpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyPWIKaWYoYy5sZW5ndGgh
+PT0wKXIrPSI8IitILlV4KGMpKyI+Igp0PWEuZUMuZ2V0KHIpCmlmKHQhPW51bGwpcmV0dXJuIHQKcz1u
+ZXcgSC5KYyhudWxsLG51bGwsbnVsbCkKcy56PTkKcy5RPWIKcy5jaD1jCmlmKGMubGVuZ3RoPjApcy5k
+PWNbMF0Kcy5kYj1yCnJldHVybiBILldHKGEscyl9LAphOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIs
+cSxwCmlmKGIuej09PTEwKXt0PWIuUQpzPWIuY2guY29uY2F0KGMpfWVsc2V7cz1jCnQ9Yn1yPXQuZGIr
+IjsiKygiPCIrSC5VeChzKSsiPiIpCnE9YS5lQy5nZXQocikKaWYocSE9bnVsbClyZXR1cm4gcQpwPW5l
+dyBILkpjKG51bGwsbnVsbCxudWxsKQpwLno9MTAKcC5RPXQKcC5jaD1zCnAuZGI9cgpyZXR1cm4gSC5X
+RyhhLHApfSwKQzpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHE9Yi5kYixwPWMuYSxvPXAubGVuZ3Ro
+LG49Yy5iLG09bi5sZW5ndGgsbD1jLmMsaz1sLmxlbmd0aCxqPSIoIitILlV4KHApCmlmKG0+MClqKz0o
+bz4wPyIsIjoiIikrIlsiK0guVXgobikrIl0iCmlmKGs+MClqKz0obz4wPyIsIjoiIikrInsiK0guUzQo
+bCkrIn0iCnQ9cSsoaisiKSIpCnM9YS5lQy5nZXQodCkKaWYocyE9bnVsbClyZXR1cm4gcwpyPW5ldyBI
+LkpjKG51bGwsbnVsbCxudWxsKQpyLno9MTEKci5RPWIKci5jaD1jCnIuZGI9dApyZXR1cm4gSC5XRyhh
+LHIpfSwKRDpmdW5jdGlvbihhLGIsYyl7dmFyIHQscz1iLmRiKyI8IitILlV4KGMpKyI+IixyPWEuZUMu
+Z2V0KHMpCmlmKHIhPW51bGwpcmV0dXJuIHIKdD1uZXcgSC5KYyhudWxsLG51bGwsbnVsbCkKdC56PTEy
+CnQuUT1iCnQuY2g9Ywp0LmRiPXMKcmV0dXJuIEguV0coYSx0KX0sCm86ZnVuY3Rpb24oYSxiLGMpe3Jl
+dHVybnt1OmEsZTpiLHI6YyxzOltdLHA6MH19LAppOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbyxu
+LG0sbCxrLGosaSxoLGc9YS5yLGY9YS5zCmZvcih0PWcubGVuZ3RoLHM9MDtzPHQ7KXtyPWcuY2hhckNv
+ZGVBdChzKQppZihyPj00OCYmcjw9NTcpcz1ILkEocysxLHIsZyxmKQplbHNlIGlmKCgoKHJ8MzIpPj4+
+MCktOTcmNjU1MzUpPDI2fHxyPT09OTV8fHI9PT0zNilzPUgudChhLHMsZyxmLCExKQplbHNlIGlmKHI9
+PT00NilzPUgudChhLHMsZyxmLCEwKQplbHNleysrcwpzd2l0Y2gocil7Y2FzZSA0NDpicmVhawpjYXNl
+IDU4OmJyZWFrCmNhc2UgNTk6Zi5wdXNoKEguSyhhLnUsYS5lLGYucG9wKCkpKQpicmVhawpjYXNlIDk0
+OmYucHVzaChILkgoYS51LGYucG9wKCkpKQpicmVhawpjYXNlIDM1OmYucHVzaChILm0oYS51LDUsIiMi
+KSkKYnJlYWsKY2FzZSA2NDpmLnB1c2goSC5tKGEudSwyLCJAIikpCmJyZWFrCmNhc2UgMTI2OmYucHVz
+aChILm0oYS51LDMsIn4iKSkKYnJlYWsKY2FzZSA2MDpmLnB1c2goYS5wKQphLnA9Zi5sZW5ndGgKYnJl
+YWsKY2FzZSA2MjpxPWEudQpwPWYuc3BsaWNlKGEucCkKSC5yKGEudSxhLmUscCkKYS5wPWYucG9wKCkK
+bz1mLnBvcCgpCmlmKHR5cGVvZiBvPT0ic3RyaW5nIilmLnB1c2goSC5KKHEsbyxwKSkKZWxzZXtuPUgu
+SyhxLGEuZSxvKQpzd2l0Y2gobi56KXtjYXNlIDExOmYucHVzaChILkQocSxuLHApKQpicmVhawpkZWZh
+dWx0OmYucHVzaChILmEocSxuLHApKQpicmVha319YnJlYWsKY2FzZSAzODpILkkoYSxmKQpicmVhawpj
+YXNlIDQyOm09YS51Cmw9SC5LKG0sYS5lLGYucG9wKCkpCmYucHVzaChILnYobSw2LGwsbC5kYisiKiIp
+KQpicmVhawpjYXNlIDYzOm09YS51Cmw9SC5LKG0sYS5lLGYucG9wKCkpCmYucHVzaChILnYobSw3LGws
+bC5kYisiPyIpKQpicmVhawpjYXNlIDQ3Om09YS51Cmw9SC5LKG0sYS5lLGYucG9wKCkpCmYucHVzaChI
+LnYobSw4LGwsbC5kYisiLyIpKQpicmVhawpjYXNlIDQwOmYucHVzaChhLnApCmEucD1mLmxlbmd0aApi
+cmVhawpjYXNlIDQxOnE9YS51Cms9bmV3IEguRygpCmo9cS5zRUEKaT1xLnNFQQpvPWYucG9wKCkKaWYo
+dHlwZW9mIG89PSJudW1iZXIiKXN3aXRjaChvKXtjYXNlLTE6aj1mLnBvcCgpCmJyZWFrCmNhc2UtMjpp
+PWYucG9wKCkKYnJlYWsKZGVmYXVsdDpmLnB1c2gobykKYnJlYWt9ZWxzZSBmLnB1c2gobykKcD1mLnNw
+bGljZShhLnApCkgucihhLnUsYS5lLHApCmEucD1mLnBvcCgpCmsuYT1wCmsuYj1qCmsuYz1pCmYucHVz
+aChILkMocSxILksocSxhLmUsZi5wb3AoKSksaykpCmJyZWFrCmNhc2UgOTE6Zi5wdXNoKGEucCkKYS5w
+PWYubGVuZ3RoCmJyZWFrCmNhc2UgOTM6cD1mLnNwbGljZShhLnApCkgucihhLnUsYS5lLHApCmEucD1m
+LnBvcCgpCmYucHVzaChwKQpmLnB1c2goLTEpCmJyZWFrCmNhc2UgMTIzOmYucHVzaChhLnApCmEucD1m
+Lmxlbmd0aApicmVhawpjYXNlIDEyNTpwPWYuc3BsaWNlKGEucCkKSC5CKGEudSxhLmUscCkKYS5wPWYu
+cG9wKCkKZi5wdXNoKHApCmYucHVzaCgtMikKYnJlYWsKZGVmYXVsdDp0aHJvdyJCYWQgY2hhcmFjdGVy
+ICIrcn19fWg9Zi5wb3AoKQpyZXR1cm4gSC5LKGEudSxhLmUsaCl9LApBOmZ1bmN0aW9uKGEsYixjLGQp
+e3ZhciB0LHMscj1iLTQ4CmZvcih0PWMubGVuZ3RoO2E8dDsrK2Epe3M9Yy5jaGFyQ29kZUF0KGEpCmlm
+KCEocz49NDgmJnM8PTU3KSlicmVhawpyPXIqMTArKHMtNDgpfWQucHVzaChyKQpyZXR1cm4gYX0sCnQ6
+ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgdCxzLHIscSxwLG8sbj1iKzEKZm9yKHQ9Yy5sZW5ndGg7bjx0
+Oysrbil7cz1jLmNoYXJDb2RlQXQobikKaWYocz09PTQ2KXtpZihlKWJyZWFrCmU9ITB9ZWxzZXtpZigh
+KCgoKHN8MzIpPj4+MCktOTcmNjU1MzUpPDI2fHxzPT09OTV8fHM9PT0zNikpcj1zPj00OCYmczw9NTcK
+ZWxzZSByPSEwCmlmKCFyKWJyZWFrfX1xPWMuc3Vic3RyaW5nKGIsbikKaWYoZSl7dD1hLnUKcD1hLmUK
+aWYocC56PT09MTApcD1wLlEKbz1ILlFvKHQscC5RKVtxXQppZihvPT1udWxsKUgudmgoJ05vICInK3Er
+JyIgaW4gIicrSC5tRChwKSsnIicpCmQucHVzaChILmNFKHQscCxvKSl9ZWxzZSBkLnB1c2gocSkKcmV0
+dXJuIG59LApJOmZ1bmN0aW9uKGEsYil7dmFyIHQ9Yi5wb3AoKQppZigwPT09dCl7Yi5wdXNoKEgubShh
+LnUsMSwiMCYiKSkKcmV0dXJufWlmKDE9PT10KXtiLnB1c2goSC5tKGEudSw0LCIxJiIpKQpyZXR1cm59
+dGhyb3cgSC5iKFAuaFYoIlVuZXhwZWN0ZWQgZXh0ZW5kZWQgb3BlcmF0aW9uICIrSC5kKHQpKSl9LApL
+OmZ1bmN0aW9uKGEsYixjKXtpZih0eXBlb2YgYz09InN0cmluZyIpcmV0dXJuIEguSihhLGMsYS5zRUEp
+CmVsc2UgaWYodHlwZW9mIGM9PSJudW1iZXIiKXJldHVybiBILlRWKGEsYixjKQplbHNlIHJldHVybiBj
+fSwKcjpmdW5jdGlvbihhLGIsYyl7dmFyIHQscz1jLmxlbmd0aApmb3IodD0wO3Q8czsrK3QpY1t0XT1I
+LksoYSxiLGNbdF0pfSwKQjpmdW5jdGlvbihhLGIsYyl7dmFyIHQscz1jLmxlbmd0aApmb3IodD0xO3Q8
+czt0Kz0yKWNbdF09SC5LKGEsYixjW3RdKX0sClRWOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHI9Yi56
+CmlmKHI9PT0xMCl7aWYoYz09PTApcmV0dXJuIGIuUQp0PWIuY2gKcz10Lmxlbmd0aAppZihjPD1zKXJl
+dHVybiB0W2MtMV0KYy09cwpiPWIuUQpyPWIuen1lbHNlIGlmKGM9PT0wKXJldHVybiBiCmlmKHIhPT05
+KXRocm93IEguYihQLmhWKCJJbmRleGVkIGJhc2UgbXVzdCBiZSBhbiBpbnRlcmZhY2UgdHlwZSIpKQp0
+PWIuY2gKaWYoYzw9dC5sZW5ndGgpcmV0dXJuIHRbYy0xXQp0aHJvdyBILmIoUC5oVigiQmFkIGluZGV4
+ICIrYysiIGZvciAiK2IudygwKSkpfSwKV2U6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgdCxzLHIscSxw
+LG8sbixtLGwsawppZihiPT09ZClyZXR1cm4hMAppZihILmNjKGQpKXJldHVybiEwCnQ9Yi56CmlmKHQ9
+PT00KXJldHVybiEwCmlmKEguY2MoYikpcmV0dXJuITEKaWYoYj09PXUuUClyZXR1cm4hMApzPXQ9PT0x
+MwppZihzKWlmKEguV2UoYSxjW2IuUV0sYyxkLGUpKXJldHVybiEwCnI9ZC56CmlmKHQ9PT02KXJldHVy
+biBILldlKGEsYi5RLGMsZCxlKQppZihyPT09Nil7cT1kLlEKcmV0dXJuIEguV2UoYSxiLGMscSxlKX1p
+Zih0PT09OCl7aWYoIUguV2UoYSxiLlEsYyxkLGUpKXJldHVybiExCnJldHVybiBILldlKGEsSC54Wihh
+LGIpLGMsZCxlKX1pZih0PT09Nyl7cT1ILldlKGEsYi5RLGMsZCxlKQpyZXR1cm4gcX1pZihyPT09OCl7
+aWYoSC5XZShhLGIsYyxkLlEsZSkpcmV0dXJuITAKcmV0dXJuIEguV2UoYSxiLGMsSC54WihhLGQpLGUp
+fWlmKHI9PT03KXtxPUguV2UoYSxiLGMsZC5RLGUpCnJldHVybiBxfWlmKHMpcmV0dXJuITEKcT10IT09
+MTEKaWYoKCFxfHx0PT09MTIpJiZkPT09dS5aKXJldHVybiEwCmlmKHI9PT0xMil7aWYoYj09PXUuZyly
+ZXR1cm4hMAppZih0IT09MTIpcmV0dXJuITEKcD1iLmNoCm89ZC5jaApuPXAubGVuZ3RoCmlmKG4hPT1v
+Lmxlbmd0aClyZXR1cm4hMQpmb3IocT11LmF2LG09MDttPG47KyttKXtsPXBbbV0Kaz1vW21dCnEuYihs
+KQpxLmIoaykKaWYoIUguV2UoYSxsLGMsayxlKXx8IUguV2UoYSxrLGUsbCxjKSlyZXR1cm4hMX1jPWM9
+PW51bGw/cDpwLmNvbmNhdChjKQplPWU9PW51bGw/bzpvLmNvbmNhdChlKQpyZXR1cm4gSC5iTyhhLGIu
+USxjLGQuUSxlKX1pZihyPT09MTEpe2lmKGI9PT11LmcpcmV0dXJuITAKaWYocSlyZXR1cm4hMQpyZXR1
+cm4gSC5iTyhhLGIsYyxkLGUpfWlmKHQ9PT05KXtpZihyIT09OSlyZXR1cm4hMQpyZXR1cm4gSC5wRyhh
+LGIsYyxkLGUpfXJldHVybiExfSwKYk86ZnVuY3Rpb24oYTAsYTEsYTIsYTMsYTQpe3ZhciB0LHMscixx
+LHAsbyxuLG0sbCxrLGosaSxoLGcsZixlLGQsYyxiLGEKaWYoIUguV2UoYTAsYTEuUSxhMixhMy5RLGE0
+KSlyZXR1cm4hMQp0PWExLmNoCnM9YTMuY2gKcj10LmEKcT1zLmEKcD1yLmxlbmd0aApvPXEubGVuZ3Ro
+CmlmKHA+bylyZXR1cm4hMQpuPW8tcAptPXQuYgpsPXMuYgprPW0ubGVuZ3RoCmo9bC5sZW5ndGgKaWYo
+cCtrPG8railyZXR1cm4hMQpmb3IoaT0wO2k8cDsrK2kpe2g9cltpXQppZighSC5XZShhMCxxW2ldLGE0
+LGgsYTIpKXJldHVybiExfWZvcihpPTA7aTxuOysraSl7aD1tW2ldCmlmKCFILldlKGEwLHFbcCtpXSxh
+NCxoLGEyKSlyZXR1cm4hMX1mb3IoaT0wO2k8ajsrK2kpe2g9bVtuK2ldCmlmKCFILldlKGEwLGxbaV0s
+YTQsaCxhMikpcmV0dXJuITF9Zz10LmMKZj1zLmMKZT1nLmxlbmd0aApkPWYubGVuZ3RoCmZvcihpPTAs
+Yz0wO2M8ZDtjKz0yKXtiPWZbY10KZG97aWYoaT49ZSlyZXR1cm4hMQphPWdbaV0KaSs9Mn13aGlsZShh
+PGIpCmlmKGI8YSlyZXR1cm4hMQpoPWdbaS0xXQppZighSC5XZShhMCxmW2MrMV0sYTQsaCxhMikpcmV0
+dXJuITF9cmV0dXJuITB9LApwRzpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciB0LHMscixxLHAsbyxuLG0s
+bD1iLlEsaz1kLlEKaWYobD09PWspe3Q9Yi5jaApzPWQuY2gKcj10Lmxlbmd0aApmb3IocT0wO3E8cjsr
+K3Epe3A9dFtxXQpvPXNbcV0KaWYoIUguV2UoYSxwLGMsbyxlKSlyZXR1cm4hMX1yZXR1cm4hMH1uPUgu
+UW8oYSxsKQppZihuPT1udWxsKXJldHVybiExCm09bltrXQppZihtPT1udWxsKXJldHVybiExCnI9bS5s
+ZW5ndGgKcz1kLmNoCmZvcihxPTA7cTxyOysrcSlpZighSC5XZShhLEguY0UoYSxiLG1bcV0pLGMsc1tx
+XSxlKSlyZXR1cm4hMQpyZXR1cm4hMH0sCmNjOmZ1bmN0aW9uKGEpe3ZhciB0LHMKaWYoYT09PXUuSyly
+ZXR1cm4hMAp0PWEuegppZih0IT09MilpZih0IT09MylpZih0IT09NClpZih0IT09NSlzPXQ9PT04JiZI
+LmNjKGEuUSkKZWxzZSBzPSEwCmVsc2Ugcz0hMAplbHNlIHM9ITAKZWxzZSBzPSEwCnJldHVybiBzfSwK
+SXg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHI9T2JqZWN0LmtleXMoYikscT1yLmxlbmd0aApmb3IodD0w
+O3Q8cTsrK3Qpe3M9clt0XQphW3NdPWJbc119fSwKSmM6ZnVuY3Rpb24gSmMoYSxiLGMpe3ZhciBfPXRo
+aXMKXy5hPWEKXy5iPWIKXy5jPWMKXy55PV8ueD1fLmQ9bnVsbApfLno9MApfLmRiPV8uY3k9Xy5jeD1f
+LmNoPV8uUT1udWxsfSwKRzpmdW5jdGlvbiBHKCl7dGhpcy5jPXRoaXMuYj10aGlzLmE9bnVsbH0sCnU5
+OmZ1bmN0aW9uIHU5KCl7fSwKaHo6ZnVuY3Rpb24gaHooYSl7dGhpcy5hPWF9LAppTTpmdW5jdGlvbiBp
+TShhKXt0aGlzLmE9YX0sClI5OmZ1bmN0aW9uKGEpe3JldHVybiB1LmQuYyhhKXx8dS5CLmMoYSl8fHUu
+ZHouYyhhKXx8dS5JLmMoYSl8fHUuQS5jKGEpfHx1Lmc0LmMoYSl8fHUuZzIuYyhhKX0sCkpnOmZ1bmN0
+aW9uKGEpe3JldHVybiB2Lm1hbmdsZWRHbG9iYWxOYW1lc1thXX19LEo9ewpRdTpmdW5jdGlvbihhLGIs
+YyxkKXtyZXR1cm57aTphLHA6YixlOmMseDpkfX0sCmtzOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHA9
+YVt2LmRpc3BhdGNoUHJvcGVydHlOYW1lXQppZihwPT1udWxsKWlmKCQuQnY9PW51bGwpe0guWEQoKQpw
+PWFbdi5kaXNwYXRjaFByb3BlcnR5TmFtZV19aWYocCE9bnVsbCl7dD1wLnAKaWYoITE9PT10KXJldHVy
+biBwLmkKaWYoITA9PT10KXJldHVybiBhCnM9T2JqZWN0LmdldFByb3RvdHlwZU9mKGEpCmlmKHQ9PT1z
+KXJldHVybiBwLmkKaWYocC5lPT09cyl0aHJvdyBILmIoUC5TWSgiUmV0dXJuIGludGVyY2VwdG9yIGZv
+ciAiK0guZCh0KGEscCkpKSl9cj1hLmNvbnN0cnVjdG9yCnE9cj09bnVsbD9udWxsOnJbJC5VTigpXQpp
+ZihxIT1udWxsKXJldHVybiBxCnE9SC53MyhhKQppZihxIT1udWxsKXJldHVybiBxCmlmKHR5cGVvZiBh
+PT0iZnVuY3Rpb24iKXJldHVybiBDLkRHCnQ9T2JqZWN0LmdldFByb3RvdHlwZU9mKGEpCmlmKHQ9PW51
+bGwpcmV0dXJuIEMuWlEKaWYodD09PU9iamVjdC5wcm90b3R5cGUpcmV0dXJuIEMuWlEKaWYodHlwZW9m
+IHI9PSJmdW5jdGlvbiIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCQuVU4oKSx7dmFsdWU6Qy52Qixl
+bnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9KQpyZXR1cm4gQy52
+Qn1yZXR1cm4gQy52Qn0sClFpOmZ1bmN0aW9uKGEsYil7aWYoYTwwfHxhPjQyOTQ5NjcyOTUpdGhyb3cg
+SC5iKFAuVEUoYSwwLDQyOTQ5NjcyOTUsImxlbmd0aCIsbnVsbCkpCnJldHVybiBKLnB5KG5ldyBBcnJh
+eShhKSxiKX0sCnB5OmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouRXAoSC5WTShhLGIuQygiamQ8MD4iKSkp
+fSwKRXA6ZnVuY3Rpb24oYSl7YS5maXhlZCRsZW5ndGg9QXJyYXkKcmV0dXJuIGF9LAp6QzpmdW5jdGlv
+bihhKXthLmZpeGVkJGxlbmd0aD1BcnJheQphLmltbXV0YWJsZSRsaXN0PUFycmF5CnJldHVybiBhfSwK
+R2E6ZnVuY3Rpb24oYSl7aWYoYTwyNTYpc3dpdGNoKGEpe2Nhc2UgOTpjYXNlIDEwOmNhc2UgMTE6Y2Fz
+ZSAxMjpjYXNlIDEzOmNhc2UgMzI6Y2FzZSAxMzM6Y2FzZSAxNjA6cmV0dXJuITAKZGVmYXVsdDpyZXR1
+cm4hMX1zd2l0Y2goYSl7Y2FzZSA1NzYwOmNhc2UgODE5MjpjYXNlIDgxOTM6Y2FzZSA4MTk0OmNhc2Ug
+ODE5NTpjYXNlIDgxOTY6Y2FzZSA4MTk3OmNhc2UgODE5ODpjYXNlIDgxOTk6Y2FzZSA4MjAwOmNhc2Ug
+ODIwMTpjYXNlIDgyMDI6Y2FzZSA4MjMyOmNhc2UgODIzMzpjYXNlIDgyMzk6Y2FzZSA4Mjg3OmNhc2Ug
+MTIyODg6Y2FzZSA2NTI3OTpyZXR1cm4hMApkZWZhdWx0OnJldHVybiExfX0sCm1tOmZ1bmN0aW9uKGEs
+Yil7dmFyIHQscwpmb3IodD1hLmxlbmd0aDtiPHQ7KXtzPUMueEIuVyhhLGIpCmlmKHMhPT0zMiYmcyE9
+PTEzJiYhSi5HYShzKSlicmVhazsrK2J9cmV0dXJuIGJ9LApjMTpmdW5jdGlvbihhLGIpe3ZhciB0LHMK
+Zm9yKDtiPjA7Yj10KXt0PWItMQpzPUMueEIubShhLHQpCmlmKHMhPT0zMiYmcyE9PTEzJiYhSi5HYShz
+KSlicmVha31yZXR1cm4gYn0sClJFOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpcmV0dXJuIGEKaWYodHlw
+ZW9mIGEhPSJvYmplY3QiKXtpZih0eXBlb2YgYT09ImZ1bmN0aW9uIilyZXR1cm4gSi5jNS5wcm90b3R5
+cGUKcmV0dXJuIGF9aWYoYSBpbnN0YW5jZW9mIFAuaylyZXR1cm4gYQpyZXR1cm4gSi5rcyhhKX0sClRK
+OmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ibnVtYmVyIilyZXR1cm4gSi5xSS5wcm90b3R5cGUKaWYo
+dHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBKLkRyLnByb3RvdHlwZQppZihhPT1udWxsKXJldHVybiBh
+CmlmKGEuY29uc3RydWN0b3I9PUFycmF5KXJldHVybiBKLmpkLnByb3RvdHlwZQppZih0eXBlb2YgYSE9
+Im9iamVjdCIpe2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJldHVybiBKLmM1LnByb3RvdHlwZQpyZXR1
+cm4gYX1pZihhIGluc3RhbmNlb2YgUC5rKXJldHVybiBhCnJldHVybiBKLmtzKGEpfSwKVTY6ZnVuY3Rp
+b24oYSl7aWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBKLkRyLnByb3RvdHlwZQppZihhPT1udWxs
+KXJldHVybiBhCmlmKGEuY29uc3RydWN0b3I9PUFycmF5KXJldHVybiBKLmpkLnByb3RvdHlwZQppZih0
+eXBlb2YgYSE9Im9iamVjdCIpe2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXJldHVybiBKLmM1LnByb3Rv
+dHlwZQpyZXR1cm4gYX1pZihhIGluc3RhbmNlb2YgUC5rKXJldHVybiBhCnJldHVybiBKLmtzKGEpfSwK
+aWE6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXtpZihNYXRoLmZsb29yKGEpPT1hKXJl
+dHVybiBKLnVyLnByb3RvdHlwZQpyZXR1cm4gSi5WQS5wcm90b3R5cGV9aWYodHlwZW9mIGE9PSJzdHJp
+bmciKXJldHVybiBKLkRyLnByb3RvdHlwZQppZihhPT1udWxsKXJldHVybiBKLllFLnByb3RvdHlwZQpp
+Zih0eXBlb2YgYT09ImJvb2xlYW4iKXJldHVybiBKLnlFLnByb3RvdHlwZQppZihhLmNvbnN0cnVjdG9y
+PT1BcnJheSlyZXR1cm4gSi5qZC5wcm90b3R5cGUKaWYodHlwZW9mIGEhPSJvYmplY3QiKXtpZih0eXBl
+b2YgYT09ImZ1bmN0aW9uIilyZXR1cm4gSi5jNS5wcm90b3R5cGUKcmV0dXJuIGF9aWYoYSBpbnN0YW5j
+ZW9mIFAuaylyZXR1cm4gYQpyZXR1cm4gSi5rcyhhKX0sCnJZOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBh
+PT0ic3RyaW5nIilyZXR1cm4gSi5Eci5wcm90b3R5cGUKaWYoYT09bnVsbClyZXR1cm4gYQppZighKGEg
+aW5zdGFuY2VvZiBQLmspKXJldHVybiBKLmtkLnByb3RvdHlwZQpyZXR1cm4gYX0sCncxOmZ1bmN0aW9u
+KGEpe2lmKGE9PW51bGwpcmV0dXJuIGEKaWYoYS5jb25zdHJ1Y3Rvcj09QXJyYXkpcmV0dXJuIEouamQu
+cHJvdG90eXBlCmlmKHR5cGVvZiBhIT0ib2JqZWN0Iil7aWYodHlwZW9mIGE9PSJmdW5jdGlvbiIpcmV0
+dXJuIEouYzUucHJvdG90eXBlCnJldHVybiBhfWlmKGEgaW5zdGFuY2VvZiBQLmspcmV0dXJuIGEKcmV0
+dXJuIEoua3MoYSl9LApDTTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gSi5SRShhKS5kdShhLGIsYyxk
+KX0sCkZMOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouclkoYSkuZGQoYSxiKX0sCkdBOmZ1bmN0aW9uKGEs
+Yil7cmV0dXJuIEoudzEoYSkuRShhLGIpfSwKR3I6ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ21X
+KGEpfSwKSG06ZnVuY3Rpb24oYSl7cmV0dXJuIEouVTYoYSkuZ0EoYSl9LApJVDpmdW5jdGlvbihhKXty
+ZXR1cm4gSi53MShhKS5na3ooYSl9LApKeTpmdW5jdGlvbihhLGIpe3JldHVybiBKLmlhKGEpLmU3KGEs
+Yil9LApLVjpmdW5jdGlvbihhLGIpe3JldHVybiBKLnJZKGEpLkcoYSxiKX0sCkx0OmZ1bmN0aW9uKGEp
+e3JldHVybiBKLlJFKGEpLndnKGEpfSwKTTE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBKLncxKGEpLkUy
+KGEsYixjKX0sClF6OmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouclkoYSkuVyhhLGIpfSwKUk06ZnVuY3Rp
+b24oYSxiKXtpZihhPT1udWxsKXJldHVybiBiPT1udWxsCmlmKHR5cGVvZiBhIT0ib2JqZWN0IilyZXR1
+cm4gYiE9bnVsbCYmYT09PWIKcmV0dXJuIEouaWEoYSkuRE4oYSxiKX0sClQwOmZ1bmN0aW9uKGEpe3Jl
+dHVybiBKLnJZKGEpLmJTKGEpfSwKYTY6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5yWShhKS5tKGEsYil9
+LApiVDpmdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5ENChhKX0sCmJiOmZ1bmN0aW9uKGEsYil7aWYo
+dHlwZW9mIGE9PSJudW1iZXIiJiZ0eXBlb2YgYj09Im51bWJlciIpcmV0dXJuIGErYgpyZXR1cm4gSi5U
+SihhKS5oKGEsYil9LApjSDpmdW5jdGlvbihhKXtyZXR1cm4gSi5yWShhKS5oYyhhKX0sCmRSOmZ1bmN0
+aW9uKGEpe3JldHVybiBKLlJFKGEpLmdEKGEpfSwKZFo6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIEou
+UkUoYSkuT24oYSxiLGMsZCl9LApkaDpmdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS50bihhKX0sCmhm
+OmZ1bmN0aW9uKGEpe3JldHVybiBKLmlhKGEpLmdpTyhhKX0sCmlnOmZ1bmN0aW9uKGEpe3JldHVybiBK
+LlJFKGEpLmdRZyhhKX0sCmo6ZnVuY3Rpb24oYSl7cmV0dXJuIEouaWEoYSkudyhhKX0sCmw1OmZ1bmN0
+aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc2hmKGEsYil9LApsZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJu
+IEouclkoYSkuTmooYSxiLGMpfSwKcTA6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBKLnJZKGEpLlFpKGEs
+YixjKX0sCnFGOmZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdWbChhKX0sCnRIOmZ1bmN0aW9uKGEs
+YixjKXtyZXR1cm4gSi5SRShhKS5wayhhLGIsYyl9LAp3MjpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBi
+PT09Im51bWJlciIpaWYoYS5jb25zdHJ1Y3Rvcj09QXJyYXl8fHR5cGVvZiBhPT0ic3RyaW5nInx8SC53
+VihhLGFbdi5kaXNwYXRjaFByb3BlcnR5TmFtZV0pKWlmKGI+Pj4wPT09YiYmYjxhLmxlbmd0aClyZXR1
+cm4gYVtiXQpyZXR1cm4gSi5VNihhKS5xKGEsYil9LAp5UTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4g
+Si5yWShhKS5pNyhhLGIsYyxkKX0sCnpsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouVTYoYSkudGcoYSxi
+KX0sCnZCOmZ1bmN0aW9uIHZCKCl7fSwKeUU6ZnVuY3Rpb24geUUoKXt9LApZRTpmdW5jdGlvbiBZRSgp
+e30sCk1GOmZ1bmN0aW9uIE1GKCl7fSwKaUM6ZnVuY3Rpb24gaUMoKXt9LAprZDpmdW5jdGlvbiBrZCgp
+e30sCmM1OmZ1bmN0aW9uIGM1KCl7fSwKamQ6ZnVuY3Rpb24gamQoYSl7dGhpcy4kdGk9YX0sClBvOmZ1
+bmN0aW9uIFBvKGEpe3RoaXMuJHRpPWF9LAptMTpmdW5jdGlvbiBtMShhLGIsYyl7dmFyIF89dGhpcwpf
+LmE9YQpfLmI9YgpfLmM9MApfLmQ9bnVsbApfLiR0aT1jfSwKcUk6ZnVuY3Rpb24gcUkoKXt9LAp1cjpm
+dW5jdGlvbiB1cigpe30sClZBOmZ1bmN0aW9uIFZBKCl7fSwKRHI6ZnVuY3Rpb24gRHIoKXt9fSxQPXsK
+T2o6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9e30KaWYoc2VsZi5zY2hlZHVsZUltbWVkaWF0ZSE9bnVsbCly
+ZXR1cm4gUC5FWCgpCmlmKHNlbGYuTXV0YXRpb25PYnNlcnZlciE9bnVsbCYmc2VsZi5kb2N1bWVudCE9
+bnVsbCl7dD1zZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCnM9c2VsZi5kb2N1bWVudC5j
+cmVhdGVFbGVtZW50KCJzcGFuIikKci5hPW51bGwKbmV3IHNlbGYuTXV0YXRpb25PYnNlcnZlcihILnRS
+KG5ldyBQLnRoKHIpLDEpKS5vYnNlcnZlKHQse2NoaWxkTGlzdDp0cnVlfSkKcmV0dXJuIG5ldyBQLmhh
+KHIsdCxzKX1lbHNlIGlmKHNlbGYuc2V0SW1tZWRpYXRlIT1udWxsKXJldHVybiBQLnl0KCkKcmV0dXJu
+IFAucVcoKX0sClpWOmZ1bmN0aW9uKGEpe3NlbGYuc2NoZWR1bGVJbW1lZGlhdGUoSC50UihuZXcgUC5W
+cyh1Lk0uYihhKSksMCkpfSwKb0E6ZnVuY3Rpb24oYSl7c2VsZi5zZXRJbW1lZGlhdGUoSC50UihuZXcg
+UC5GdCh1Lk0uYihhKSksMCkpfSwKQno6ZnVuY3Rpb24oYSl7dS5NLmIoYSkKUC5RTigwLGEpfSwKUU46
+ZnVuY3Rpb24oYSxiKXt2YXIgdD1uZXcgUC5XMygpCnQuQ1koYSxiKQpyZXR1cm4gdH0sCkZYOmZ1bmN0
+aW9uKGEpe3JldHVybiBuZXcgUC5paChuZXcgUC52cygkLlgzLGEuQygidnM8MD4iKSksYS5DKCJpaDww
+PiIpKX0sCkRJOmZ1bmN0aW9uKGEsYil7YS4kMigwLG51bGwpCmIuYj0hMApyZXR1cm4gYi5hfSwKalE6
+ZnVuY3Rpb24oYSxiKXtQLkplKGEsYil9LAp5QzpmdW5jdGlvbihhLGIpe2IuYU0oMCxhKX0sCmYzOmZ1
+bmN0aW9uKGEsYil7Yi53MChILlJ1KGEpLEgudHMoYSkpfSwKSmU6ZnVuY3Rpb24oYSxiKXt2YXIgdCxz
+LHI9bmV3IFAuV00oYikscT1uZXcgUC5TWChiKQppZihhIGluc3RhbmNlb2YgUC52cylhLlFkKHIscSx1
+LnopCmVsc2V7dD11LnoKaWYodS5jLmMoYSkpYS5TcShyLHEsdCkKZWxzZXtzPW5ldyBQLnZzKCQuWDMs
+dS5fKQpzLmE9NApzLmM9YQpzLlFkKHIsbnVsbCx0KX19fSwKbHo6ZnVuY3Rpb24oYSl7dmFyIHQ9ZnVu
+Y3Rpb24oYixjKXtyZXR1cm4gZnVuY3Rpb24oZCxlKXt3aGlsZSh0cnVlKXRyeXtiKGQsZSkKYnJlYWt9
+Y2F0Y2gocyl7ZT1zCmQ9Y319fShhLDEpCnJldHVybiAkLlgzLkxqKG5ldyBQLkdzKHQpLHUuUCx1LmVn
+LHUueil9LAprMzpmdW5jdGlvbihhLGIpe3ZhciB0LHMscgpiLmE9MQp0cnl7YS5TcShuZXcgUC5wVihi
+KSxuZXcgUC5VNyhiKSx1LlApfWNhdGNoKHIpe3Q9SC5SdShyKQpzPUgudHMocikKUC5yYihuZXcgUC52
+cihiLHQscykpfX0sCkE5OmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyCmZvcih0PXUuXztzPWEuYSxzPT09
+MjspYT10LmIoYS5jKQppZihzPj00KXtyPWIuYWgoKQpiLmE9YS5hCmIuYz1hLmMKUC5IWihiLHIpfWVs
+c2V7cj11LnguYihiLmMpCmIuYT0yCmIuYz1hCmEualEocil9fSwKSFo6ZnVuY3Rpb24oYSxiKXt2YXIg
+dCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZT1udWxsLGQ9e30sYz1kLmE9YQpmb3IodD11Lm4s
+cz11Lngscj11LmM7ITA7KXtxPXt9CnA9Yy5hPT09OAppZihiPT1udWxsKXtpZihwKXtvPXQuYihjLmMp
+ClAuTDIoZSxlLGMuYixvLmEsby5iKX1yZXR1cm59Zm9yKDtuPWIuYSxuIT1udWxsO2I9bil7Yi5hPW51
+bGwKUC5IWihkLmEsYil9Yz1kLmEKbT1jLmMKcS5hPXAKcS5iPW0KbD0hcAppZihsKXtrPWIuYwprPShr
+JjEpIT09MHx8KGsmMTUpPT09OH1lbHNlIGs9ITAKaWYoayl7az1iLmIKaj1rLmIKaWYocCl7aT1jLmI9
+PT1qCmk9IShpfHxpKX1lbHNlIGk9ITEKaWYoaSl7dC5iKG0pClAuTDIoZSxlLGMuYixtLmEsbS5iKQpy
+ZXR1cm59aD0kLlgzCmlmKGghPT1qKSQuWDM9agplbHNlIGg9ZQpjPWIuYwppZigoYyYxNSk9PT04KW5l
+dyBQLlJUKGQscSxiLHApLiQwKCkKZWxzZSBpZihsKXtpZigoYyYxKSE9PTApbmV3IFAucnEocSxiLG0p
+LiQwKCl9ZWxzZSBpZigoYyYyKSE9PTApbmV3IFAuUlcoZCxxLGIpLiQwKCkKaWYoaCE9bnVsbCkkLlgz
+PWgKYz1xLmIKaWYoci5jKGMpKXtpZihjLmE+PTQpe2c9cy5iKGsuYykKay5jPW51bGwKYj1rLk44KGcp
+CmsuYT1jLmEKay5jPWMuYwpkLmE9Ywpjb250aW51ZX1lbHNlIFAuQTkoYyxrKQpyZXR1cm59fWY9Yi5i
+Cmc9cy5iKGYuYykKZi5jPW51bGwKYj1mLk44KGcpCmM9cS5hCmw9cS5iCmlmKCFjKXtmLiR0aS5kLmIo
+bCkKZi5hPTQKZi5jPWx9ZWxzZXt0LmIobCkKZi5hPTgKZi5jPWx9ZC5hPWYKYz1mfX0sClZIOmZ1bmN0
+aW9uKGEsYil7dmFyIHQKaWYodS5XLmMoYSkpcmV0dXJuIGIuTGooYSx1LnosdS5LLHUubCkKdD11LnkK
+aWYodC5jKGEpKXJldHVybiB0LmIoYSkKdGhyb3cgSC5iKFAuTDMoYSwib25FcnJvciIsIkVycm9yIGhh
+bmRsZXIgbXVzdCBhY2NlcHQgb25lIE9iamVjdCBvciBvbmUgT2JqZWN0IGFuZCBhIFN0YWNrVHJhY2Ug
+YXMgYXJndW1lbnRzLCBhbmQgcmV0dXJuIGEgYSB2YWxpZCByZXN1bHQiKSl9LApwdTpmdW5jdGlvbigp
+e3ZhciB0LHMKZm9yKDt0PSQuUzYsdCE9bnVsbDspeyQubWc9bnVsbApzPXQuYgokLlM2PXMKaWYocz09
+bnVsbCkkLms4PW51bGwKdC5hLiQwKCl9fSwKZU46ZnVuY3Rpb24oKXskLlVEPSEwCnRyeXtQLnB1KCl9
+ZmluYWxseXskLm1nPW51bGwKJC5VRD0hMQppZigkLlM2IT1udWxsKSQudXQoKS4kMShQLlVJKCkpfX0s
+CmVXOmZ1bmN0aW9uKGEpe3ZhciB0PW5ldyBQLk9NKGEpCmlmKCQuUzY9PW51bGwpeyQuUzY9JC5rOD10
+CmlmKCEkLlVEKSQudXQoKS4kMShQLlVJKCkpfWVsc2UgJC5rOD0kLms4LmI9dH0sCnJSOmZ1bmN0aW9u
+KGEpe3ZhciB0LHMscj0kLlM2CmlmKHI9PW51bGwpe1AuZVcoYSkKJC5tZz0kLms4CnJldHVybn10PW5l
+dyBQLk9NKGEpCnM9JC5tZwppZihzPT1udWxsKXt0LmI9cgokLlM2PSQubWc9dH1lbHNle3QuYj1zLmIK
+JC5tZz1zLmI9dAppZih0LmI9PW51bGwpJC5rOD10fX0sCnJiOmZ1bmN0aW9uKGEpe3ZhciB0PW51bGws
+cz0kLlgzCmlmKEMuTlU9PT1zKXtQLlRrKHQsdCxDLk5VLGEpCnJldHVybn1QLlRrKHQsdCxzLHUuTS5i
+KHMuR1koYSkpKX0sClF3OmZ1bmN0aW9uKGEsYil7aWYoYT09bnVsbClILnZoKFAuRWUoInN0cmVhbSIp
+KQpyZXR1cm4gbmV3IFAueEkoYi5DKCJ4STwwPiIpKX0sCkwyOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFy
+IHQ9e30KdC5hPWQKUC5yUihuZXcgUC5wSyh0LGUpKX0sClQ4OmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFy
+IHQscz0kLlgzCmlmKHM9PT1jKXJldHVybiBkLiQwKCkKJC5YMz1jCnQ9cwp0cnl7cz1kLiQwKCkKcmV0
+dXJuIHN9ZmluYWxseXskLlgzPXR9fSwKeXY6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIHQscz0k
+LlgzCmlmKHM9PT1jKXJldHVybiBkLiQxKGUpCiQuWDM9Ywp0PXMKdHJ5e3M9ZC4kMShlKQpyZXR1cm4g
+c31maW5hbGx5eyQuWDM9dH19LApReDpmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSl7dmFyIHQscz0k
+LlgzCmlmKHM9PT1jKXJldHVybiBkLiQyKGUsZikKJC5YMz1jCnQ9cwp0cnl7cz1kLiQyKGUsZikKcmV0
+dXJuIHN9ZmluYWxseXskLlgzPXR9fSwKVGs6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQKdS5NLmIoZCkK
+dD1DLk5VIT09YwppZih0KWQ9ISghdHx8ITEpP2MuR1koZCk6Yy5SVChkLHUuSCkKUC5lVyhkKX0sCnRo
+OmZ1bmN0aW9uIHRoKGEpe3RoaXMuYT1hfSwKaGE6ZnVuY3Rpb24gaGEoYSxiLGMpe3RoaXMuYT1hCnRo
+aXMuYj1iCnRoaXMuYz1jfSwKVnM6ZnVuY3Rpb24gVnMoYSl7dGhpcy5hPWF9LApGdDpmdW5jdGlvbiBG
+dChhKXt0aGlzLmE9YX0sClczOmZ1bmN0aW9uIFczKCl7fSwKeUg6ZnVuY3Rpb24geUgoYSxiKXt0aGlz
+LmE9YQp0aGlzLmI9Yn0sCmloOmZ1bmN0aW9uIGloKGEsYil7dGhpcy5hPWEKdGhpcy5iPSExCnRoaXMu
+JHRpPWJ9LApXTTpmdW5jdGlvbiBXTShhKXt0aGlzLmE9YX0sClNYOmZ1bmN0aW9uIFNYKGEpe3RoaXMu
+YT1hfSwKR3M6ZnVuY3Rpb24gR3MoYSl7dGhpcy5hPWF9LApQZjpmdW5jdGlvbiBQZigpe30sClpmOmZ1
+bmN0aW9uIFpmKGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCkZlOmZ1bmN0aW9uIEZlKGEsYixjLGQs
+ZSl7dmFyIF89dGhpcwpfLmE9bnVsbApfLmI9YQpfLmM9YgpfLmQ9YwpfLmU9ZApfLiR0aT1lfSwKdnM6
+ZnVuY3Rpb24gdnMoYSxiKXt2YXIgXz10aGlzCl8uYT0wCl8uYj1hCl8uYz1udWxsCl8uJHRpPWJ9LApk
+YTpmdW5jdGlvbiBkYShhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKb1E6ZnVuY3Rpb24gb1EoYSxiKXt0
+aGlzLmE9YQp0aGlzLmI9Yn0sCnBWOmZ1bmN0aW9uIHBWKGEpe3RoaXMuYT1hfSwKVTc6ZnVuY3Rpb24g
+VTcoYSl7dGhpcy5hPWF9LAp2cjpmdW5jdGlvbiB2cihhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhp
+cy5jPWN9LApySDpmdW5jdGlvbiBySChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKS0Y6ZnVuY3Rpb24g
+S0YoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sClpMOmZ1bmN0aW9uIFpMKGEsYixjKXt0aGlzLmE9YQp0
+aGlzLmI9Ygp0aGlzLmM9Y30sClJUOmZ1bmN0aW9uIFJUKGEsYixjLGQpe3ZhciBfPXRoaXMKXy5hPWEK
+Xy5iPWIKXy5jPWMKXy5kPWR9LApqWjpmdW5jdGlvbiBqWihhKXt0aGlzLmE9YX0sCnJxOmZ1bmN0aW9u
+IHJxKGEsYixjKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sClJXOmZ1bmN0aW9uIFJXKGEsYixj
+KXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCk9NOmZ1bmN0aW9uIE9NKGEpe3RoaXMuYT1hCnRo
+aXMuYj1udWxsfSwKcWg6ZnVuY3Rpb24gcWgoKXt9LApCNTpmdW5jdGlvbiBCNShhLGIpe3RoaXMuYT1h
+CnRoaXMuYj1ifSwKUEk6ZnVuY3Rpb24gUEkoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCk1POmZ1bmN0
+aW9uIE1PKCl7fSwKa1Q6ZnVuY3Rpb24ga1QoKXt9LAp4STpmdW5jdGlvbiB4SShhKXt0aGlzLiR0aT1h
+fSwKQ3c6ZnVuY3Rpb24gQ3coYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCm0wOmZ1bmN0aW9uIG0wKCl7
+fSwKcEs6ZnVuY3Rpb24gcEsoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkppOmZ1bmN0aW9uIEppKCl7
+fSwKaGo6ZnVuY3Rpb24gaGooYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKVnA6ZnVu
+Y3Rpb24gVnAoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCk9SOmZ1bmN0aW9uIE9SKGEsYixjKXt0aGlz
+LmE9YQp0aGlzLmI9Ygp0aGlzLmM9Y30sCkVGOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYi5DKCJAPDA+
+IikuS3EoYykuQygiRm88MSwyPiIpLmIoSC5CNyhhLG5ldyBILk41KGIuQygiQDwwPiIpLktxKGMpLkMo
+Ik41PDEsMj4iKSkpKX0sCkZsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBILk41KGEuQygiQDwwPiIp
+LktxKGIpLkMoIk41PDEsMj4iKSl9LApMczpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuYjYoYS5DKCJi
+NjwwPiIpKX0sClQyOmZ1bmN0aW9uKCl7dmFyIHQ9T2JqZWN0LmNyZWF0ZShudWxsKQp0WyI8bm9uLWlk
+ZW50aWZpZXIta2V5PiJdPXQKZGVsZXRlIHRbIjxub24taWRlbnRpZmllci1rZXk+Il0KcmV0dXJuIHR9
+LApyajpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9bmV3IFAubG0oYSxiLGMuQygibG08MD4iKSkKdC5jPWEu
+ZQpyZXR1cm4gdH0sCkVQOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzCmlmKFAuaEIoYSkpe2lmKGI9PT0i
+KCImJmM9PT0iKSIpcmV0dXJuIiguLi4pIgpyZXR1cm4gYisiLi4uIitjfXQ9SC5WTShbXSx1LnMpCkMu
+Tm0uaSgkLnhnLGEpCnRyeXtQLlZyKGEsdCl9ZmluYWxseXtpZigwPj0kLnhnLmxlbmd0aClyZXR1cm4g
+SC5PSCgkLnhnLC0xKQokLnhnLnBvcCgpfXM9UC52ZyhiLHUuUi5iKHQpLCIsICIpK2MKcmV0dXJuIHMu
+Y2hhckNvZGVBdCgwKT09MD9zOnN9LApXRTpmdW5jdGlvbihhLGIsYyl7dmFyIHQscwppZihQLmhCKGEp
+KXJldHVybiBiKyIuLi4iK2MKdD1uZXcgUC5SbihiKQpDLk5tLmkoJC54ZyxhKQp0cnl7cz10CnMuYT1Q
+LnZnKHMuYSxhLCIsICIpfWZpbmFsbHl7aWYoMD49JC54Zy5sZW5ndGgpcmV0dXJuIEguT0goJC54Zywt
+MSkKJC54Zy5wb3AoKX10LmErPWMKcz10LmEKcmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9LApo
+QjpmdW5jdGlvbihhKXt2YXIgdCxzCmZvcih0PSQueGcubGVuZ3RoLHM9MDtzPHQ7KytzKWlmKGE9PT0k
+LnhnW3NdKXJldHVybiEwCnJldHVybiExfSwKVnI6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwLG8s
+bixtPWEuZ2t6KGEpLGw9MCxrPTAKd2hpbGUoITApe2lmKCEobDw4MHx8azwzKSlicmVhawppZighbS5G
+KCkpcmV0dXJuCnQ9SC5kKG0uZ2woKSkKQy5ObS5pKGIsdCkKbCs9dC5sZW5ndGgrMjsrK2t9aWYoIW0u
+RigpKXtpZihrPD01KXJldHVybgppZigwPj1iLmxlbmd0aClyZXR1cm4gSC5PSChiLC0xKQpzPWIucG9w
+KCkKaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKcj1iLnBvcCgpfWVsc2V7cT1tLmdsKCk7
+KytrCmlmKCFtLkYoKSl7aWYoazw9NCl7Qy5ObS5pKGIsSC5kKHEpKQpyZXR1cm59cz1ILmQocSkKaWYo
+MD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKcj1iLnBvcCgpCmwrPXMubGVuZ3RoKzJ9ZWxzZXtw
+PW0uZ2woKTsrK2sKZm9yKDttLkYoKTtxPXAscD1vKXtvPW0uZ2woKTsrK2sKaWYoaz4xMDApe3doaWxl
+KCEwKXtpZighKGw+NzUmJms+MykpYnJlYWsKaWYoMD49Yi5sZW5ndGgpcmV0dXJuIEguT0goYiwtMSkK
+bC09Yi5wb3AoKS5sZW5ndGgrMjstLWt9Qy5ObS5pKGIsIi4uLiIpCnJldHVybn19cj1ILmQocSkKcz1I
+LmQocCkKbCs9cy5sZW5ndGgrci5sZW5ndGgrNH19aWYoaz5iLmxlbmd0aCsyKXtsKz01Cm49Ii4uLiJ9
+ZWxzZSBuPW51bGwKd2hpbGUoITApe2lmKCEobD44MCYmYi5sZW5ndGg+MykpYnJlYWsKaWYoMD49Yi5s
+ZW5ndGgpcmV0dXJuIEguT0goYiwtMSkKbC09Yi5wb3AoKS5sZW5ndGgrMgppZihuPT1udWxsKXtsKz01
+Cm49Ii4uLiJ9fWlmKG4hPW51bGwpQy5ObS5pKGIsbikKQy5ObS5pKGIscikKQy5ObS5pKGIscyl9LAp0
+TTpmdW5jdGlvbihhLGIpe3ZhciB0LHMscj1QLkxzKGIpCmZvcih0PWEubGVuZ3RoLHM9MDtzPGEubGVu
+Z3RoO2EubGVuZ3RoPT09dHx8KDAsSC5saykoYSksKytzKXIuaSgwLGIuYihhW3NdKSkKcmV0dXJuIHJ9
+LApuTzpmdW5jdGlvbihhKXt2YXIgdCxzPXt9CmlmKFAuaEIoYSkpcmV0dXJuInsuLi59Igp0PW5ldyBQ
+LlJuKCIiKQp0cnl7Qy5ObS5pKCQueGcsYSkKdC5hKz0ieyIKcy5hPSEwCmEuSygwLG5ldyBQLnJhKHMs
+dCkpCnQuYSs9In0ifWZpbmFsbHl7aWYoMD49JC54Zy5sZW5ndGgpcmV0dXJuIEguT0goJC54ZywtMSkK
+JC54Zy5wb3AoKX1zPXQuYQpyZXR1cm4gcy5jaGFyQ29kZUF0KDApPT0wP3M6c30sCmI2OmZ1bmN0aW9u
+IGI2KGEpe3ZhciBfPXRoaXMKXy5hPTAKXy5mPV8uZT1fLmQ9Xy5jPV8uYj1udWxsCl8ucj0wCl8uJHRp
+PWF9LApibjpmdW5jdGlvbiBibihhKXt0aGlzLmE9YQp0aGlzLmM9dGhpcy5iPW51bGx9LApsbTpmdW5j
+dGlvbiBsbShhLGIsYyl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmQ9Xy5jPW51bGwKXy4kdGk9Y30s
+Cm1XOmZ1bmN0aW9uIG1XKCl7fSwKTFU6ZnVuY3Rpb24gTFUoKXt9LApsRDpmdW5jdGlvbiBsRCgpe30s
+CmlsOmZ1bmN0aW9uIGlsKCl7fSwKcmE6ZnVuY3Rpb24gcmEoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0s
+CllrOmZ1bmN0aW9uIFlrKCl7fSwKS1A6ZnVuY3Rpb24gS1AoKXt9LApQbjpmdW5jdGlvbiBQbigpe30s
+CkdqOmZ1bmN0aW9uIEdqKGEsYil7dGhpcy5hPWEKdGhpcy4kdGk9Yn0sCmxmOmZ1bmN0aW9uIGxmKCl7
+fSwKVmo6ZnVuY3Rpb24gVmooKXt9LApYdjpmdW5jdGlvbiBYdigpe30sCm5ZOmZ1bmN0aW9uIG5ZKCl7
+fSwKV1k6ZnVuY3Rpb24gV1koKXt9LApSVTpmdW5jdGlvbiBSVSgpe30sCkJTOmZ1bmN0aW9uKGEsYil7
+dmFyIHQscyxyLHEKaWYodHlwZW9mIGEhPSJzdHJpbmciKXRocm93IEguYihILnRMKGEpKQp0PW51bGwK
+dHJ5e3Q9SlNPTi5wYXJzZShhKX1jYXRjaChyKXtzPUguUnUocikKcT1QLnJyKFN0cmluZyhzKSxudWxs
+LG51bGwpCnRocm93IEguYihxKX1xPVAuUWUodCkKcmV0dXJuIHF9LApRZTpmdW5jdGlvbihhKXt2YXIg
+dAppZihhPT1udWxsKXJldHVybiBudWxsCmlmKHR5cGVvZiBhIT0ib2JqZWN0IilyZXR1cm4gYQppZihP
+YmplY3QuZ2V0UHJvdG90eXBlT2YoYSkhPT1BcnJheS5wcm90b3R5cGUpcmV0dXJuIG5ldyBQLnV3KGEs
+T2JqZWN0LmNyZWF0ZShudWxsKSkKZm9yKHQ9MDt0PGEubGVuZ3RoOysrdClhW3RdPVAuUWUoYVt0XSkK
+cmV0dXJuIGF9LApreTpmdW5jdGlvbihhLGIsYyxkKXtpZihiIGluc3RhbmNlb2YgVWludDhBcnJheSly
+ZXR1cm4gUC5SUCghMSxiLGMsZCkKcmV0dXJuIG51bGx9LApSUDpmdW5jdGlvbihhLGIsYyxkKXt2YXIg
+dCxzLHI9JC5yZigpCmlmKHI9PW51bGwpcmV0dXJuIG51bGwKdD0wPT09YwppZih0JiYhMClyZXR1cm4g
+UC5PUShyLGIpCnM9Yi5sZW5ndGgKZD1QLmpCKGMsZCxzKQppZih0JiZkPT09cylyZXR1cm4gUC5PUShy
+LGIpCnJldHVybiBQLk9RKHIsYi5zdWJhcnJheShjLGQpKX0sCk9ROmZ1bmN0aW9uKGEsYil7aWYoUC5C
+ZShiKSlyZXR1cm4gbnVsbApyZXR1cm4gUC5KaChhLGIpfSwKSmg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxz
+CnRyeXt0PWEuZGVjb2RlKGIpCnJldHVybiB0fWNhdGNoKHMpe0guUnUocyl9cmV0dXJuIG51bGx9LApC
+ZTpmdW5jdGlvbihhKXt2YXIgdCxzPWEubGVuZ3RoLTIKZm9yKHQ9MDt0PHM7Kyt0KWlmKGFbdF09PT0y
+MzcpaWYoKGFbdCsxXSYyMjQpPT09MTYwKXJldHVybiEwCnJldHVybiExfSwKV0k6ZnVuY3Rpb24oKXt2
+YXIgdCxzCnRyeXt0PW5ldyBUZXh0RGVjb2RlcigidXRmLTgiLHtmYXRhbDp0cnVlfSkKcmV0dXJuIHR9
+Y2F0Y2gocyl7SC5SdShzKX1yZXR1cm4gbnVsbH0sCmNQOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIK
+Zm9yKHQ9Si5VNihhKSxzPWI7czxjOysrcyl7cj10LnEoYSxzKQppZih0eXBlb2YgciE9PSJudW1iZXIi
+KXJldHVybiByLnpNKCkKaWYoKHImMTI3KSE9PXIpcmV0dXJuIHMtYn1yZXR1cm4gYy1ifSwKeE06ZnVu
+Y3Rpb24oYSxiLGMsZCxlLGYpe2lmKEMuam4uelkoZiw0KSE9PTApdGhyb3cgSC5iKFAucnIoIkludmFs
+aWQgYmFzZTY0IHBhZGRpbmcsIHBhZGRlZCBsZW5ndGggbXVzdCBiZSBtdWx0aXBsZSBvZiBmb3VyLCBp
+cyAiK2YsYSxjKSkKaWYoZCtlIT09Zil0aHJvdyBILmIoUC5ycigiSW52YWxpZCBiYXNlNjQgcGFkZGlu
+ZywgJz0nIG5vdCBhdCB0aGUgZW5kIixhLGIpKQppZihlPjIpdGhyb3cgSC5iKFAucnIoIkludmFsaWQg
+YmFzZTY0IHBhZGRpbmcsIG1vcmUgdGhhbiB0d28gJz0nIGNoYXJhY3RlcnMiLGEsYikpfSwKdXc6ZnVu
+Y3Rpb24gdXcoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Ygp0aGlzLmM9bnVsbH0sCmk4OmZ1bmN0aW9uIGk4
+KGEpe3RoaXMuYT1hfSwKQ1Y6ZnVuY3Rpb24gQ1YoKXt9LApVODpmdW5jdGlvbiBVOCgpe30sClVrOmZ1
+bmN0aW9uIFVrKCl7fSwKd0k6ZnVuY3Rpb24gd0koKXt9LApaaTpmdW5jdGlvbiBaaSgpe30sCmJ5OmZ1
+bmN0aW9uIGJ5KCl7fSwKTXg6ZnVuY3Rpb24gTXgoYSl7dGhpcy5hPWF9LAp1NTpmdW5jdGlvbiB1NSgp
+e30sCkUzOmZ1bmN0aW9uIEUzKCl7fSwKUnc6ZnVuY3Rpb24gUncoYSl7dGhpcy5iPTAKdGhpcy5jPWF9
+LApHWTpmdW5jdGlvbiBHWShhKXt0aGlzLmE9YX0sCmJ6OmZ1bmN0aW9uIGJ6KGEsYil7dmFyIF89dGhp
+cwpfLmE9YQpfLmI9YgpfLmM9ITAKXy5mPV8uZT1fLmQ9MH0sClFBOmZ1bmN0aW9uKGEsYixjKXt2YXIg
+dD1ILkhwKGEsYykKaWYodCE9bnVsbClyZXR1cm4gdAppZihiIT1udWxsKXJldHVybiBiLiQxKGEpCnRo
+cm93IEguYihQLnJyKGEsbnVsbCxudWxsKSl9LApGOmZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBI
+LlRwKXJldHVybiBhLncoMCkKcmV0dXJuIkluc3RhbmNlIG9mICciK0guZChILk0oYSkpKyInIn0sCk84
+OmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzPUouUWkoYSxjKQppZihhIT09MCYmITApZm9yKHQ9MDt0PHMu
+bGVuZ3RoOysrdClDLk5tLlkocyx0LGIpCnJldHVybiBzfSwKQ0g6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0
+LHM9SC5WTShbXSxjLkMoImpkPDA+IikpCmZvcih0PUouSVQoYSk7dC5GKCk7KUMuTm0uaShzLGMuYih0
+LmdsKCkpKQppZihiKXJldHVybiBzCnJldHVybiBjLkMoInpNPDA+IikuYihKLkVwKHMpKX0sCkFGOmZ1
+bmN0aW9uKGEsYil7cmV0dXJuIGIuQygiek08MD4iKS5iKEouekMoUC5DSChhLCExLGIpKSl9LApITTpm
+dW5jdGlvbihhLGIsYyl7dmFyIHQKaWYoQXJyYXkuaXNBcnJheShhKSl7dS50LmIoYSkKdD1hLmxlbmd0
+aApjPVAuakIoYixjLHQpCnJldHVybiBILmVUKGI+MHx8Yzx0P0MuTm0uRDYoYSxiLGMpOmEpfWlmKHUu
+Ym0uYyhhKSlyZXR1cm4gSC5mdyhhLGIsUC5qQihiLGMsYS5sZW5ndGgpKQpyZXR1cm4gUC5idyhhLGIs
+Yyl9LApPbzpmdW5jdGlvbihhKXtyZXR1cm4gSC5MdyhhKX0sCmJ3OmZ1bmN0aW9uKGEsYixjKXt2YXIg
+dCxzLHIscSxwPW51bGwKaWYoYjwwKXRocm93IEguYihQLlRFKGIsMCxKLkhtKGEpLHAscCkpCnQ9Yz09
+bnVsbAppZighdCYmYzxiKXRocm93IEguYihQLlRFKGMsYixKLkhtKGEpLHAscCkpCnM9Si5JVChhKQpm
+b3Iocj0wO3I8YjsrK3IpaWYoIXMuRigpKXRocm93IEguYihQLlRFKGIsMCxyLHAscCkpCnE9W10KaWYo
+dClmb3IoO3MuRigpOylxLnB1c2gocy5nbCgpKQplbHNlIGZvcihyPWI7cjxjOysrcil7aWYoIXMuRigp
+KXRocm93IEguYihQLlRFKGMsYixyLHAscCkpCnEucHVzaChzLmdsKCkpfXJldHVybiBILmVUKHEpfSwK
+bnU6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILlZSKGEsSC52NChhLCExLCEwLCExLCExLCExKSl9LAp2
+ZzpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9Si5JVChiKQppZighdC5GKCkpcmV0dXJuIGEKaWYoYy5sZW5n
+dGg9PT0wKXtkbyBhKz1ILmQodC5nbCgpKQp3aGlsZSh0LkYoKSl9ZWxzZXthKz1ILmQodC5nbCgpKQpm
+b3IoO3QuRigpOylhPWErYytILmQodC5nbCgpKX1yZXR1cm4gYX0sCmxyOmZ1bmN0aW9uKGEsYixjLGQp
+e3JldHVybiBuZXcgUC5tcChhLGIsYyxkKX0sCnVvOmZ1bmN0aW9uKCl7dmFyIHQ9SC5NMCgpCmlmKHQh
+PW51bGwpcmV0dXJuIFAuaEsodCkKdGhyb3cgSC5iKFAuTDQoIidVcmkuYmFzZScgaXMgbm90IHN1cHBv
+cnRlZCIpKX0sCmVQOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscixxLHAsbyxuPSIwMTIzNDU2Nzg5
+QUJDREVGIgppZihjPT09Qy54TSl7dD0kLno0KCkuYgppZih0eXBlb2YgYiE9InN0cmluZyIpSC52aChI
+LnRMKGIpKQp0PXQudGVzdChiKX1lbHNlIHQ9ITEKaWYodClyZXR1cm4gYgpILkxoKGMpLkMoIlVrLlMi
+KS5iKGIpCnM9Yy5nWkUoKS5XSihiKQpmb3IodD1zLmxlbmd0aCxyPTAscT0iIjtyPHQ7KytyKXtwPXNb
+cl0KaWYocDwxMjgpe289cD4+PjQKaWYobz49OClyZXR1cm4gSC5PSChhLG8pCm89KGFbb10mMTw8KHAm
+MTUpKSE9PTB9ZWxzZSBvPSExCmlmKG8pcSs9SC5MdyhwKQplbHNlIHE9ZCYmcD09PTMyP3ErIisiOnEr
+IiUiK25bcD4+PjQmMTVdK25bcCYxNV19cmV0dXJuIHEuY2hhckNvZGVBdCgwKT09MD9xOnF9LApHcTpm
+dW5jdGlvbihhKXt2YXIgdD1NYXRoLmFicyhhKSxzPWE8MD8iLSI6IiIKaWYodD49MTAwMClyZXR1cm4i
+IithCmlmKHQ+PTEwMClyZXR1cm4gcysiMCIrdAppZih0Pj0xMClyZXR1cm4gcysiMDAiK3QKcmV0dXJu
+IHMrIjAwMCIrdH0sClZ4OmZ1bmN0aW9uKGEpe2lmKGE+PTEwMClyZXR1cm4iIithCmlmKGE+PTEwKXJl
+dHVybiIwIithCnJldHVybiIwMCIrYX0sCmgwOmZ1bmN0aW9uKGEpe2lmKGE+PTEwKXJldHVybiIiK2EK
+cmV0dXJuIjAiK2F9LApwOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ibnVtYmVyInx8SC5sKGEpfHxu
+dWxsPT1hKXJldHVybiBKLmooYSkKaWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBKU09OLnN0cmlu
+Z2lmeShhKQpyZXR1cm4gUC5GKGEpfSwKaFY6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLkM2KGEpfSwK
+eFk6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLnUoITEsbnVsbCxudWxsLGEpfSwKTDM6ZnVuY3Rpb24o
+YSxiLGMpe3JldHVybiBuZXcgUC51KCEwLGEsYixjKX0sCkVlOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcg
+UC51KCExLG51bGwsYSwiTXVzdCBub3QgYmUgbnVsbCIpfSwKeDpmdW5jdGlvbihhLGIpe3JldHVybiBu
+ZXcgUC5iSihudWxsLG51bGwsITAsYSxiLCJWYWx1ZSBub3QgaW4gcmFuZ2UiKX0sClRFOmZ1bmN0aW9u
+KGEsYixjLGQsZSl7cmV0dXJuIG5ldyBQLmJKKGIsYywhMCxhLGQsIkludmFsaWQgdmFsdWUiKX0sCndB
+OmZ1bmN0aW9uKGEsYixjLGQpe2lmKGE8Ynx8YT5jKXRocm93IEguYihQLlRFKGEsYixjLGQsbnVsbCkp
+fSwKakI6ZnVuY3Rpb24oYSxiLGMpe2lmKDA+YXx8YT5jKXRocm93IEguYihQLlRFKGEsMCxjLCJzdGFy
+dCIsbnVsbCkpCmlmKGIhPW51bGwpe2lmKGE+Ynx8Yj5jKXRocm93IEguYihQLlRFKGIsYSxjLCJlbmQi
+LG51bGwpKQpyZXR1cm4gYn1yZXR1cm4gY30sCmsxOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGEhPT0i
+bnVtYmVyIilyZXR1cm4gYS5KKCkKaWYoYTwwKXRocm93IEguYihQLlRFKGEsMCxudWxsLGIsbnVsbCkp
+fSwKQ2Y6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgdD1ILlNjKGU9PW51bGw/Si5IbShiKTplKQpyZXR1
+cm4gbmV3IFAuZVkodCwhMCxhLGMsIkluZGV4IG91dCBvZiByYW5nZSIpfSwKTDQ6ZnVuY3Rpb24oYSl7
+cmV0dXJuIG5ldyBQLnViKGEpfSwKU1k6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLmRzKGEpfSwKUFY6
+ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLmxqKGEpfSwKYTQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQ
+LlVWKGEpfSwKcnI6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgUC5hRShhLGIsYyl9LApkSDpmdW5j
+dGlvbihhLGIsYyxkKXt2YXIgdCxzPUguVk0oW10sZC5DKCJqZDwwPiIpKQpDLk5tLnNBKHMsYSkKZm9y
+KHQ9MDt0PGE7Kyt0KUMuTm0uWShzLHQsYi4kMSh0KSkKcmV0dXJuIHN9LApoSzpmdW5jdGlvbihhKXt2
+YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZT1udWxsLGQ9YS5sZW5ndGgKaWYoZD49NSl7
+dD0oKEouUXooYSw0KV41OCkqM3xDLnhCLlcoYSwwKV4xMDB8Qy54Qi5XKGEsMSleOTd8Qy54Qi5XKGEs
+MileMTE2fEMueEIuVyhhLDMpXjk3KT4+PjAKaWYodD09PTApcmV0dXJuIFAuS0QoZDxkP0MueEIuTmoo
+YSwwLGQpOmEsNSxlKS5nbFIoKQplbHNlIGlmKHQ9PT0zMilyZXR1cm4gUC5LRChDLnhCLk5qKGEsNSxk
+KSwwLGUpLmdsUigpfXM9bmV3IEFycmF5KDgpCnMuZml4ZWQkbGVuZ3RoPUFycmF5CnI9SC5WTShzLHUu
+dCkKQy5ObS5ZKHIsMCwwKQpDLk5tLlkociwxLC0xKQpDLk5tLlkociwyLC0xKQpDLk5tLlkociw3LC0x
+KQpDLk5tLlkociwzLDApCkMuTm0uWShyLDQsMCkKQy5ObS5ZKHIsNSxkKQpDLk5tLlkociw2LGQpCmlm
+KFAuVUIoYSwwLGQsMCxyKT49MTQpQy5ObS5ZKHIsNyxkKQpxPXJbMV0KaWYodHlwZW9mIHEhPT0ibnVt
+YmVyIilyZXR1cm4gcS50QigpCmlmKHE+PTApaWYoUC5VQihhLDAscSwyMCxyKT09PTIwKXJbN109cQpz
+PXJbMl0KaWYodHlwZW9mIHMhPT0ibnVtYmVyIilyZXR1cm4gcy5oKCkKcD1zKzEKbz1yWzNdCm49cls0
+XQptPXJbNV0KbD1yWzZdCmlmKHR5cGVvZiBsIT09Im51bWJlciIpcmV0dXJuIGwuSigpCmlmKHR5cGVv
+ZiBtIT09Im51bWJlciIpcmV0dXJuIEgucFkobSkKaWYobDxtKW09bAppZih0eXBlb2YgbiE9PSJudW1i
+ZXIiKXJldHVybiBuLkooKQppZihuPHApbj1tCmVsc2UgaWYobjw9cSluPXErMQppZih0eXBlb2YgbyE9
+PSJudW1iZXIiKXJldHVybiBvLkooKQppZihvPHApbz1uCnM9cls3XQppZih0eXBlb2YgcyE9PSJudW1i
+ZXIiKXJldHVybiBzLkooKQprPXM8MAppZihrKWlmKHA+cSszKXtqPWUKaz0hMX1lbHNle3M9bz4wCmlm
+KHMmJm8rMT09PW4pe2o9ZQprPSExfWVsc2V7aWYoIShtPGQmJm09PT1uKzImJkoucTAoYSwiLi4iLG4p
+KSlpPW0+bisyJiZKLnEwKGEsIi8uLiIsbS0zKQplbHNlIGk9ITAKaWYoaSl7aj1lCms9ITF9ZWxzZXtp
+ZihxPT09NClpZihKLnEwKGEsImZpbGUiLDApKXtpZihwPD0wKXtpZighQy54Qi5RaShhLCIvIixuKSl7
+aD0iZmlsZTovLy8iCnQ9M31lbHNle2g9ImZpbGU6Ly8iCnQ9Mn1hPWgrQy54Qi5OaihhLG4sZCkKcS09
+MApzPXQtMAptKz1zCmwrPXMKZD1hLmxlbmd0aApwPTcKbz03Cm49N31lbHNlIGlmKG49PT1tKXtnPW0r
+MTsrK2wKYT1DLnhCLmk3KGEsbixtLCIvIik7KytkCm09Z31qPSJmaWxlIn1lbHNlIGlmKEMueEIuUWko
+YSwiaHR0cCIsMCkpe2lmKHMmJm8rMz09PW4mJkMueEIuUWkoYSwiODAiLG8rMSkpe2Y9bi0zCm0tPTMK
+bC09MwphPUMueEIuaTcoYSxvLG4sIiIpCmQtPTMKbj1mfWo9Imh0dHAifWVsc2Ugaj1lCmVsc2UgaWYo
+cT09PTUmJkoucTAoYSwiaHR0cHMiLDApKXtpZihzJiZvKzQ9PT1uJiZKLnEwKGEsIjQ0MyIsbysxKSl7
+Zj1uLTQKbS09NApsLT00CmE9Si55UShhLG8sbiwiIikKZC09MwpuPWZ9aj0iaHR0cHMifWVsc2Ugaj1l
+Cms9ITB9fX1lbHNlIGo9ZQppZihrKXtzPWEubGVuZ3RoCmlmKGQ8cyl7YT1KLmxkKGEsMCxkKQpxLT0w
+CnAtPTAKby09MApuLT0wCm0tPTAKbC09MH1yZXR1cm4gbmV3IFAuVWYoYSxxLHAsbyxuLG0sbCxqKX1y
+ZXR1cm4gUC5qdihhLDAsZCxxLHAsbyxuLG0sbCxqKX0sCk10OmZ1bmN0aW9uKGEpe0gueShhKQpyZXR1
+cm4gUC5rdShhLDAsYS5sZW5ndGgsQy54TSwhMSl9LApXWDpmdW5jdGlvbihhKXt2YXIgdD11Lk4KcmV0
+dXJuIEMuTm0uTjAoSC5WTShhLnNwbGl0KCImIiksdS5zKSxQLkZsKHQsdCksbmV3IFAubjEoQy54TSks
+dS5mKX0sCkhoOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxwLG8sbixtPW51bGwsbD0iSVB2NCBh
+ZGRyZXNzIHNob3VsZCBjb250YWluIGV4YWN0bHkgNCBwYXJ0cyIsaz0iZWFjaCBwYXJ0IG11c3QgYmUg
+aW4gdGhlIHJhbmdlIDAuLjI1NSIsaj1uZXcgUC5jUyhhKSxpPW5ldyBVaW50OEFycmF5KDQpCmZvcih0
+PWkubGVuZ3RoLHM9YixyPXMscT0wO3M8YzsrK3Mpe3A9Qy54Qi5tKGEscykKaWYocCE9PTQ2KXtpZigo
+cF40OCk+OSlqLiQyKCJpbnZhbGlkIGNoYXJhY3RlciIscyl9ZWxzZXtpZihxPT09MylqLiQyKGwscykK
+bz1QLlFBKEMueEIuTmooYSxyLHMpLG0sbSkKaWYodHlwZW9mIG8hPT0ibnVtYmVyIilyZXR1cm4gby5v
+cygpCmlmKG8+MjU1KWouJDIoayxyKQpuPXErMQppZihxPj10KXJldHVybiBILk9IKGkscSkKaVtxXT1v
+CnI9cysxCnE9bn19aWYocSE9PTMpai4kMihsLGMpCm89UC5RQShDLnhCLk5qKGEscixjKSxtLG0pCmlm
+KHR5cGVvZiBvIT09Im51bWJlciIpcmV0dXJuIG8ub3MoKQppZihvPjI1NSlqLiQyKGsscikKaWYocT49
+dClyZXR1cm4gSC5PSChpLHEpCmlbcV09bwpyZXR1cm4gaX0sCmVnOmZ1bmN0aW9uKGEsYixhMCl7dmFy
+IHQscyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZD1uZXcgUC5WQyhhKSxjPW5ldyBQLnRwKGQs
+YSkKaWYoYS5sZW5ndGg8MilkLiQxKCJhZGRyZXNzIGlzIHRvbyBzaG9ydCIpCnQ9SC5WTShbXSx1LnQp
+CmZvcihzPWIscj1zLHE9ITEscD0hMTtzPGEwOysrcyl7bz1DLnhCLm0oYSxzKQppZihvPT09NTgpe2lm
+KHM9PT1iKXsrK3MKaWYoQy54Qi5tKGEscykhPT01OClkLiQyKCJpbnZhbGlkIHN0YXJ0IGNvbG9uLiIs
+cykKcj1zfWlmKHM9PT1yKXtpZihxKWQuJDIoIm9ubHkgb25lIHdpbGRjYXJkIGA6OmAgaXMgYWxsb3dl
+ZCIscykKQy5ObS5pKHQsLTEpCnE9ITB9ZWxzZSBDLk5tLmkodCxjLiQyKHIscykpCnI9cysxfWVsc2Ug
+aWYobz09PTQ2KXA9ITB9aWYodC5sZW5ndGg9PT0wKWQuJDEoInRvbyBmZXcgcGFydHMiKQpuPXI9PT1h
+MAptPUMuTm0uZ3JaKHQpCmlmKG4mJm0hPT0tMSlkLiQyKCJleHBlY3RlZCBhIHBhcnQgYWZ0ZXIgbGFz
+dCBgOmAiLGEwKQppZighbilpZighcClDLk5tLmkodCxjLiQyKHIsYTApKQplbHNle2w9UC5IaChhLHIs
+YTApCkMuTm0uaSh0LChsWzBdPDw4fGxbMV0pPj4+MCkKQy5ObS5pKHQsKGxbMl08PDh8bFszXSk+Pj4w
+KX1pZihxKXtpZih0Lmxlbmd0aD43KWQuJDEoImFuIGFkZHJlc3Mgd2l0aCBhIHdpbGRjYXJkIG11c3Qg
+aGF2ZSBsZXNzIHRoYW4gNyBwYXJ0cyIpfWVsc2UgaWYodC5sZW5ndGghPT04KWQuJDEoImFuIGFkZHJl
+c3Mgd2l0aG91dCBhIHdpbGRjYXJkIG11c3QgY29udGFpbiBleGFjdGx5IDggcGFydHMiKQprPW5ldyBV
+aW50OEFycmF5KDE2KQpmb3IobT10Lmxlbmd0aCxqPWsubGVuZ3RoLGk9OS1tLHM9MCxoPTA7czxtOysr
+cyl7Zz10W3NdCmlmKGc9PT0tMSlmb3IoZj0wO2Y8aTsrK2Ype2lmKGg8MHx8aD49ailyZXR1cm4gSC5P
+SChrLGgpCmtbaF09MAplPWgrMQppZihlPj1qKXJldHVybiBILk9IKGssZSkKa1tlXT0wCmgrPTJ9ZWxz
+ZXtlPUMuam4ud0coZyw4KQppZihoPDB8fGg+PWopcmV0dXJuIEguT0goayxoKQprW2hdPWUKZT1oKzEK
+aWYoZT49ailyZXR1cm4gSC5PSChrLGUpCmtbZV09ZyYyNTUKaCs9Mn19cmV0dXJuIGt9LApqdjpmdW5j
+dGlvbihhLGIsYyxkLGUsZixnLGgsaSxqKXt2YXIgdCxzLHIscSxwLG8sbixtPW51bGwKaWYoaj09bnVs
+bClpZihkPmIpaj1QLlBpKGEsYixkKQplbHNle2lmKGQ9PT1iKVAuUjMoYSxiLCJJbnZhbGlkIGVtcHR5
+IHNjaGVtZSIpCmo9IiJ9aWYoZT5iKXt0PWQrMwpzPXQ8ZT9QLnpSKGEsdCxlLTEpOiIiCnI9UC5PZShh
+LGUsZiwhMSkKaWYodHlwZW9mIGYhPT0ibnVtYmVyIilyZXR1cm4gZi5oKCkKcT1mKzEKaWYodHlwZW9m
+IGchPT0ibnVtYmVyIilyZXR1cm4gSC5wWShnKQpwPXE8Zz9QLndCKFAuUUEoSi5sZChhLHEsZyksbmV3
+IFAuZTEoYSxmKSxtKSxqKTptfWVsc2V7cD1tCnI9cApzPSIifW89UC5rYShhLGcsaCxtLGosciE9bnVs
+bCkKaWYodHlwZW9mIGghPT0ibnVtYmVyIilyZXR1cm4gaC5KKCkKbj1oPGk/UC5sZShhLGgrMSxpLG0p
+Om0KcmV0dXJuIG5ldyBQLkRuKGoscyxyLHAsbyxuLGk8Yz9QLnRHKGEsaSsxLGMpOm0pfSwKd0s6ZnVu
+Y3Rpb24oYSl7aWYoYT09PSJodHRwIilyZXR1cm4gODAKaWYoYT09PSJodHRwcyIpcmV0dXJuIDQ0Mwpy
+ZXR1cm4gMH0sClIzOmZ1bmN0aW9uKGEsYixjKXt0aHJvdyBILmIoUC5ycihjLGEsYikpfSwKa0U6ZnVu
+Y3Rpb24oYSxiKXtDLk5tLksoYSxuZXcgUC5OWSghMSkpfSwKSE46ZnVuY3Rpb24oYSxiLGMpe3ZhciB0
+LHMscgpmb3IodD1ILnFDKGEsYyxudWxsLEgudDYoYSkuZCksdD1uZXcgSC5hNyh0LHQuZ0EodCksdC4k
+dGkuQygiYTc8YUwuRT4iKSk7dC5GKCk7KXtzPXQuZApyPVAubnUoJ1siKi86PD4/XFxcXHxdJykKcy50
+b1N0cmluZwppZihILm0yKHMsciwwKSl7dD1QLkw0KCJJbGxlZ2FsIGNoYXJhY3RlciBpbiBwYXRoOiAi
+K3MpCnRocm93IEguYih0KX19fSwKcmc6ZnVuY3Rpb24oYSxiKXt2YXIgdAppZighKDY1PD1hJiZhPD05
+MCkpdD05Nzw9YSYmYTw9MTIyCmVsc2UgdD0hMAppZih0KXJldHVybgp0PVAuTDQoIklsbGVnYWwgZHJp
+dmUgbGV0dGVyICIrUC5PbyhhKSkKdGhyb3cgSC5iKHQpfSwKd0I6ZnVuY3Rpb24oYSxiKXtpZihhIT1u
+dWxsJiZhPT09UC53SyhiKSlyZXR1cm4gbnVsbApyZXR1cm4gYX0sCk9lOmZ1bmN0aW9uKGEsYixjLGQp
+e3ZhciB0LHMscixxLHAsbwppZihhPT1udWxsKXJldHVybiBudWxsCmlmKGI9PT1jKXJldHVybiIiCmlm
+KEMueEIubShhLGIpPT09OTEpe2lmKHR5cGVvZiBjIT09Im51bWJlciIpcmV0dXJuIGMuSE4oKQp0PWMt
+MQppZihDLnhCLm0oYSx0KSE9PTkzKVAuUjMoYSxiLCJNaXNzaW5nIGVuZCBgXWAgdG8gbWF0Y2ggYFtg
+IGluIGhvc3QiKQpzPWIrMQpyPVAudG8oYSxzLHQpCmlmKHR5cGVvZiByIT09Im51bWJlciIpcmV0dXJu
+IHIuSigpCmlmKHI8dCl7cT1yKzEKcD1QLk9BKGEsQy54Qi5RaShhLCIyNSIscSk/ciszOnEsdCwiJTI1
+Iil9ZWxzZSBwPSIiClAuZWcoYSxzLHIpCnJldHVybiBDLnhCLk5qKGEsYixyKS50b0xvd2VyQ2FzZSgp
+K3ArIl0ifWlmKHR5cGVvZiBjIT09Im51bWJlciIpcmV0dXJuIEgucFkoYykKbz1iCmZvcig7bzxjOysr
+bylpZihDLnhCLm0oYSxvKT09PTU4KXtyPUMueEIuWFUoYSwiJSIsYikKaWYoIShyPj1iJiZyPGMpKXI9
+YwppZihyPGMpe3E9cisxCnA9UC5PQShhLEMueEIuUWkoYSwiMjUiLHEpP3IrMzpxLGMsIiUyNSIpfWVs
+c2UgcD0iIgpQLmVnKGEsYixyKQpyZXR1cm4iWyIrQy54Qi5OaihhLGIscikrcCsiXSJ9cmV0dXJuIFAu
+T0woYSxiLGMpfSwKdG86ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHM9Qy54Qi5YVShhLCIlIixiKQppZihz
+Pj1iKXtpZih0eXBlb2YgYyE9PSJudW1iZXIiKXJldHVybiBILnBZKGMpCnQ9czxjfWVsc2UgdD0hMQpy
+ZXR1cm4gdD9zOmN9LApPQTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsaz1k
+IT09IiI/bmV3IFAuUm4oZCk6bnVsbAppZih0eXBlb2YgYyE9PSJudW1iZXIiKXJldHVybiBILnBZKGMp
+CnQ9YgpzPXQKcj0hMApmb3IoO3Q8Yzspe3E9Qy54Qi5tKGEsdCkKaWYocT09PTM3KXtwPVAucnYoYSx0
+LCEwKQpvPXA9PW51bGwKaWYobyYmcil7dCs9Mwpjb250aW51ZX1pZihrPT1udWxsKWs9bmV3IFAuUm4o
+IiIpCm49ay5hKz1DLnhCLk5qKGEscyx0KQppZihvKXA9Qy54Qi5OaihhLHQsdCszKQplbHNlIGlmKHA9
+PT0iJSIpUC5SMyhhLHQsIlpvbmVJRCBzaG91bGQgbm90IGNvbnRhaW4gJSBhbnltb3JlIikKay5hPW4r
+cAp0Kz0zCnM9dApyPSEwfWVsc2V7aWYocTwxMjcpe289cT4+PjQKaWYobz49OClyZXR1cm4gSC5PSChD
+LkYzLG8pCm89KEMuRjNbb10mMTw8KHEmMTUpKSE9PTB9ZWxzZSBvPSExCmlmKG8pe2lmKHImJjY1PD1x
+JiY5MD49cSl7aWYoaz09bnVsbClrPW5ldyBQLlJuKCIiKQppZihzPHQpe2suYSs9Qy54Qi5OaihhLHMs
+dCkKcz10fXI9ITF9Kyt0fWVsc2V7aWYoKHEmNjQ1MTIpPT09NTUyOTYmJnQrMTxjKXttPUMueEIubShh
+LHQrMSkKaWYoKG0mNjQ1MTIpPT09NTYzMjApe3E9NjU1MzZ8KHEmMTAyMyk8PDEwfG0mMTAyMwpsPTJ9
+ZWxzZSBsPTF9ZWxzZSBsPTEKaWYoaz09bnVsbClrPW5ldyBQLlJuKCIiKQprLmErPUMueEIuTmooYSxz
+LHQpCmsuYSs9UC5ISChxKQp0Kz1sCnM9dH19fWlmKGs9PW51bGwpcmV0dXJuIEMueEIuTmooYSxiLGMp
+CmlmKHM8YylrLmErPUMueEIuTmooYSxzLGMpCm89ay5hCnJldHVybiBvLmNoYXJDb2RlQXQoMCk9PTA/
+bzpvfSwKT0w6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGoKaWYodHlwZW9m
+IGMhPT0ibnVtYmVyIilyZXR1cm4gSC5wWShjKQp0PWIKcz10CnI9bnVsbApxPSEwCmZvcig7dDxjOyl7
+cD1DLnhCLm0oYSx0KQppZihwPT09Mzcpe289UC5ydihhLHQsITApCm49bz09bnVsbAppZihuJiZxKXt0
+Kz0zCmNvbnRpbnVlfWlmKHI9PW51bGwpcj1uZXcgUC5SbigiIikKbT1DLnhCLk5qKGEscyx0KQpsPXIu
+YSs9IXE/bS50b0xvd2VyQ2FzZSgpOm0KaWYobil7bz1DLnhCLk5qKGEsdCx0KzMpCms9M31lbHNlIGlm
+KG89PT0iJSIpe289IiUyNSIKaz0xfWVsc2Ugaz0zCnIuYT1sK28KdCs9awpzPXQKcT0hMH1lbHNle2lm
+KHA8MTI3KXtuPXA+Pj40CmlmKG4+PTgpcmV0dXJuIEguT0goQy5lYSxuKQpuPShDLmVhW25dJjE8PChw
+JjE1KSkhPT0wfWVsc2Ugbj0hMQppZihuKXtpZihxJiY2NTw9cCYmOTA+PXApe2lmKHI9PW51bGwpcj1u
+ZXcgUC5SbigiIikKaWYoczx0KXtyLmErPUMueEIuTmooYSxzLHQpCnM9dH1xPSExfSsrdH1lbHNle2lm
+KHA8PTkzKXtuPXA+Pj40CmlmKG4+PTgpcmV0dXJuIEguT0goQy5hayxuKQpuPShDLmFrW25dJjE8PChw
+JjE1KSkhPT0wfWVsc2Ugbj0hMQppZihuKVAuUjMoYSx0LCJJbnZhbGlkIGNoYXJhY3RlciIpCmVsc2V7
+aWYoKHAmNjQ1MTIpPT09NTUyOTYmJnQrMTxjKXtqPUMueEIubShhLHQrMSkKaWYoKGomNjQ1MTIpPT09
+NTYzMjApe3A9NjU1MzZ8KHAmMTAyMyk8PDEwfGomMTAyMwprPTJ9ZWxzZSBrPTF9ZWxzZSBrPTEKaWYo
+cj09bnVsbClyPW5ldyBQLlJuKCIiKQptPUMueEIuTmooYSxzLHQpCnIuYSs9IXE/bS50b0xvd2VyQ2Fz
+ZSgpOm0Kci5hKz1QLkhIKHApCnQrPWsKcz10fX19fWlmKHI9PW51bGwpcmV0dXJuIEMueEIuTmooYSxi
+LGMpCmlmKHM8Yyl7bT1DLnhCLk5qKGEscyxjKQpyLmErPSFxP20udG9Mb3dlckNhc2UoKTptfW49ci5h
+CnJldHVybiBuLmNoYXJDb2RlQXQoMCk9PTA/bjpufSwKUGk6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMs
+cixxCmlmKGI9PT1jKXJldHVybiIiCmlmKCFQLkV0KEouclkoYSkuVyhhLGIpKSlQLlIzKGEsYiwiU2No
+ZW1lIG5vdCBzdGFydGluZyB3aXRoIGFscGhhYmV0aWMgY2hhcmFjdGVyIikKZm9yKHQ9YixzPSExO3Q8
+YzsrK3Qpe3I9Qy54Qi5XKGEsdCkKaWYocjwxMjgpe3E9cj4+PjQKaWYocT49OClyZXR1cm4gSC5PSChD
+Lm1LLHEpCnE9KEMubUtbcV0mMTw8KHImMTUpKSE9PTB9ZWxzZSBxPSExCmlmKCFxKVAuUjMoYSx0LCJJ
+bGxlZ2FsIHNjaGVtZSBjaGFyYWN0ZXIiKQppZig2NTw9ciYmcjw9OTApcz0hMH1hPUMueEIuTmooYSxi
+LGMpCnJldHVybiBQLllhKHM/YS50b0xvd2VyQ2FzZSgpOmEpfSwKWWE6ZnVuY3Rpb24oYSl7aWYoYT09
+PSJodHRwIilyZXR1cm4iaHR0cCIKaWYoYT09PSJmaWxlIilyZXR1cm4iZmlsZSIKaWYoYT09PSJodHRw
+cyIpcmV0dXJuImh0dHBzIgppZihhPT09InBhY2thZ2UiKXJldHVybiJwYWNrYWdlIgpyZXR1cm4gYX0s
+CnpSOmZ1bmN0aW9uKGEsYixjKXtpZihhPT1udWxsKXJldHVybiIiCnJldHVybiBQLnVPKGEsYixjLEMu
+dG8sITEpfSwKa2E6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciB0LHM9ZT09PSJmaWxlIixyPXN8fGYs
+cT1hPT1udWxsCmlmKHEmJiEwKXJldHVybiBzPyIvIjoiIgp0PSFxP1AudU8oYSxiLGMsQy5XZCwhMCk6
+Qy5qTi5FMihkLG5ldyBQLlJaKCksdS5OKS5IKDAsIi8iKQppZih0Lmxlbmd0aD09PTApe2lmKHMpcmV0
+dXJuIi8ifWVsc2UgaWYociYmIUMueEIubih0LCIvIikpdD0iLyIrdApyZXR1cm4gUC5Kcih0LGUsZil9
+LApKcjpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9Yi5sZW5ndGg9PT0wCmlmKHQmJiFjJiYhQy54Qi5uKGEs
+Ii8iKSlyZXR1cm4gUC53RihhLCF0fHxjKQpyZXR1cm4gUC54ZShhKX0sCmxlOmZ1bmN0aW9uKGEsYixj
+LGQpe3ZhciB0LHM9e30KaWYoYSE9bnVsbCl7aWYoZCE9bnVsbCl0aHJvdyBILmIoUC54WSgiQm90aCBx
+dWVyeSBhbmQgcXVlcnlQYXJhbWV0ZXJzIHNwZWNpZmllZCIpKQpyZXR1cm4gUC51TyhhLGIsYyxDLlZD
+LCEwKX1pZihkPT1udWxsKXJldHVybiBudWxsCnQ9bmV3IFAuUm4oIiIpCnMuYT0iIgpkLksoMCxuZXcg
+UC55NShuZXcgUC5NRShzLHQpKSkKcz10LmEKcmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9LAp0
+RzpmdW5jdGlvbihhLGIsYyl7aWYoYT09bnVsbClyZXR1cm4gbnVsbApyZXR1cm4gUC51TyhhLGIsYyxD
+LlZDLCEwKX0sCnJ2OmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxwLG89YisyCmlmKG8+PWEubGVu
+Z3RoKXJldHVybiIlIgp0PUMueEIubShhLGIrMSkKcz1DLnhCLm0oYSxvKQpyPUgub28odCkKcT1ILm9v
+KHMpCmlmKHI8MHx8cTwwKXJldHVybiIlIgpwPXIqMTYrcQppZihwPDEyNyl7bz1DLmpuLndHKHAsNCkK
+aWYobz49OClyZXR1cm4gSC5PSChDLkYzLG8pCm89KEMuRjNbb10mMTw8KHAmMTUpKSE9PTB9ZWxzZSBv
+PSExCmlmKG8pcmV0dXJuIEguTHcoYyYmNjU8PXAmJjkwPj1wPyhwfDMyKT4+PjA6cCkKaWYodD49OTd8
+fHM+PTk3KXJldHVybiBDLnhCLk5qKGEsYixiKzMpLnRvVXBwZXJDYXNlKCkKcmV0dXJuIG51bGx9LApI
+SDpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG8sbj0iMDEyMzQ1Njc4OUFCQ0RFRiIKaWYoYTwxMjgp
+e3Q9bmV3IEFycmF5KDMpCnQuZml4ZWQkbGVuZ3RoPUFycmF5CnM9SC5WTSh0LHUudCkKQy5ObS5ZKHMs
+MCwzNykKQy5ObS5ZKHMsMSxDLnhCLlcobixhPj4+NCkpCkMuTm0uWShzLDIsQy54Qi5XKG4sYSYxNSkp
+fWVsc2V7aWYoYT4yMDQ3KWlmKGE+NjU1MzUpe3I9MjQwCnE9NH1lbHNle3I9MjI0CnE9M31lbHNle3I9
+MTkyCnE9Mn10PW5ldyBBcnJheSgzKnEpCnQuZml4ZWQkbGVuZ3RoPUFycmF5CnM9SC5WTSh0LHUudCkK
+Zm9yKHA9MDstLXEscT49MDtyPTEyOCl7bz1DLmpuLmJmKGEsNipxKSY2M3xyCkMuTm0uWShzLHAsMzcp
+CkMuTm0uWShzLHArMSxDLnhCLlcobixvPj4+NCkpCkMuTm0uWShzLHArMixDLnhCLlcobixvJjE1KSkK
+cCs9M319cmV0dXJuIFAuSE0ocywwLG51bGwpfSwKdU86ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgdD1Q
+LlVsKGEsYixjLGQsZSkKcmV0dXJuIHQ9PW51bGw/Qy54Qi5OaihhLGIsYyk6dH0sClVsOmZ1bmN0aW9u
+KGEsYixjLGQsZSl7dmFyIHQscyxyLHEscCxvPW51bGwsbj0hZSxtPWIsbD1tLGs9bwp3aGlsZSghMCl7
+aWYodHlwZW9mIG0hPT0ibnVtYmVyIilyZXR1cm4gbS5KKCkKaWYodHlwZW9mIGMhPT0ibnVtYmVyIily
+ZXR1cm4gSC5wWShjKQppZighKG08YykpYnJlYWsKYyQwOnt0PUMueEIubShhLG0pCmlmKHQ8MTI3KXtz
+PXQ+Pj40CmlmKHM+PTgpcmV0dXJuIEguT0goZCxzKQpzPShkW3NdJjE8PCh0JjE1KSkhPT0wfWVsc2Ug
+cz0hMQppZihzKSsrbQplbHNle2lmKHQ9PT0zNyl7cj1QLnJ2KGEsbSwhMSkKaWYocj09bnVsbCl7bSs9
+MwpicmVhayBjJDB9aWYoIiUiPT09cil7cj0iJTI1IgpxPTF9ZWxzZSBxPTN9ZWxzZXtpZihuKWlmKHQ8
+PTkzKXtzPXQ+Pj40CmlmKHM+PTgpcmV0dXJuIEguT0goQy5hayxzKQpzPShDLmFrW3NdJjE8PCh0JjE1
+KSkhPT0wfWVsc2Ugcz0hMQplbHNlIHM9ITEKaWYocyl7UC5SMyhhLG0sIkludmFsaWQgY2hhcmFjdGVy
+IikKcT1vCnI9cX1lbHNle2lmKCh0JjY0NTEyKT09PTU1Mjk2KXtzPW0rMQppZihzPGMpe3A9Qy54Qi5t
+KGEscykKaWYoKHAmNjQ1MTIpPT09NTYzMjApe3Q9NjU1MzZ8KHQmMTAyMyk8PDEwfHAmMTAyMwpxPTJ9
+ZWxzZSBxPTF9ZWxzZSBxPTF9ZWxzZSBxPTEKcj1QLkhIKHQpfX1pZihrPT1udWxsKWs9bmV3IFAuUm4o
+IiIpCmsuYSs9Qy54Qi5OaihhLGwsbSkKay5hKz1ILmQocikKaWYodHlwZW9mIHEhPT0ibnVtYmVyIily
+ZXR1cm4gSC5wWShxKQptKz1xCmw9bX19fWlmKGs9PW51bGwpcmV0dXJuIG8KaWYodHlwZW9mIGwhPT0i
+bnVtYmVyIilyZXR1cm4gbC5KKCkKaWYobDxjKWsuYSs9Qy54Qi5OaihhLGwsYykKbj1rLmEKcmV0dXJu
+IG4uY2hhckNvZGVBdCgwKT09MD9uOm59LAp5QjpmdW5jdGlvbihhKXtpZihDLnhCLm4oYSwiLiIpKXJl
+dHVybiEwCnJldHVybiBDLnhCLk9ZKGEsIi8uIikhPT0tMX0sCnhlOmZ1bmN0aW9uKGEpe3ZhciB0LHMs
+cixxLHAsbyxuCmlmKCFQLnlCKGEpKXJldHVybiBhCnQ9SC5WTShbXSx1LnMpCmZvcihzPWEuc3BsaXQo
+Ii8iKSxyPXMubGVuZ3RoLHE9ITEscD0wO3A8cjsrK3Ape289c1twXQppZihKLlJNKG8sIi4uIikpe249
+dC5sZW5ndGgKaWYobiE9PTApe2lmKDA+PW4pcmV0dXJuIEguT0godCwtMSkKdC5wb3AoKQppZih0Lmxl
+bmd0aD09PTApQy5ObS5pKHQsIiIpfXE9ITB9ZWxzZSBpZigiLiI9PT1vKXE9ITAKZWxzZXtDLk5tLmko
+dCxvKQpxPSExfX1pZihxKUMuTm0uaSh0LCIiKQpyZXR1cm4gQy5ObS5IKHQsIi8iKX0sCndGOmZ1bmN0
+aW9uKGEsYil7dmFyIHQscyxyLHEscCxvCmlmKCFQLnlCKGEpKXJldHVybiFiP1AuQzEoYSk6YQp0PUgu
+Vk0oW10sdS5zKQpmb3Iocz1hLnNwbGl0KCIvIikscj1zLmxlbmd0aCxxPSExLHA9MDtwPHI7KytwKXtv
+PXNbcF0KaWYoIi4uIj09PW8paWYodC5sZW5ndGghPT0wJiZDLk5tLmdyWih0KSE9PSIuLiIpe2lmKDA+
+PXQubGVuZ3RoKXJldHVybiBILk9IKHQsLTEpCnQucG9wKCkKcT0hMH1lbHNle0MuTm0uaSh0LCIuLiIp
+CnE9ITF9ZWxzZSBpZigiLiI9PT1vKXE9ITAKZWxzZXtDLk5tLmkodCxvKQpxPSExfX1zPXQubGVuZ3Ro
+CmlmKHMhPT0wKWlmKHM9PT0xKXtpZigwPj1zKXJldHVybiBILk9IKHQsMCkKcz10WzBdLmxlbmd0aD09
+PTB9ZWxzZSBzPSExCmVsc2Ugcz0hMAppZihzKXJldHVybiIuLyIKaWYocXx8Qy5ObS5ncloodCk9PT0i
+Li4iKUMuTm0uaSh0LCIiKQppZighYil7aWYoMD49dC5sZW5ndGgpcmV0dXJuIEguT0godCwwKQpDLk5t
+LlkodCwwLFAuQzEodFswXSkpfXJldHVybiBDLk5tLkgodCwiLyIpfSwKQzE6ZnVuY3Rpb24oYSl7dmFy
+IHQscyxyLHE9YS5sZW5ndGgKaWYocT49MiYmUC5FdChKLlF6KGEsMCkpKWZvcih0PTE7dDxxOysrdCl7
+cz1DLnhCLlcoYSx0KQppZihzPT09NTgpcmV0dXJuIEMueEIuTmooYSwwLHQpKyIlM0EiK0MueEIuRyhh
+LHQrMSkKaWYoczw9MTI3KXtyPXM+Pj40CmlmKHI+PTgpcmV0dXJuIEguT0goQy5tSyxyKQpyPShDLm1L
+W3JdJjE8PChzJjE1KSk9PT0wfWVsc2Ugcj0hMAppZihyKWJyZWFrfXJldHVybiBhfSwKbW46ZnVuY3Rp
+b24oYSl7dmFyIHQscyxyLHE9YS5nRmooKSxwPXEubGVuZ3RoCmlmKHA+MCYmSi5IbShxWzBdKT09PTIm
+JkouYTYocVswXSwxKT09PTU4KXtpZigwPj1wKXJldHVybiBILk9IKHEsMCkKUC5yZyhKLmE2KHFbMF0s
+MCksITEpClAuSE4ocSwhMSwxKQp0PSEwfWVsc2V7UC5ITihxLCExLDApCnQ9ITF9cz1hLmd0VCgpJiYh
+dD8iXFwiOiIiCmlmKGEuZ2NqKCkpe3I9YS5nSmYoYSkKaWYoci5sZW5ndGghPT0wKXM9cysiXFwiK3Ir
+IlxcIn1zPVAudmcocyxxLCJcXCIpCnA9dCYmcD09PTE/cysiXFwiOnMKcmV0dXJuIHAuY2hhckNvZGVB
+dCgwKT09MD9wOnB9LApJaDpmdW5jdGlvbihhLGIpe3ZhciB0LHMscgpmb3IodD0wLHM9MDtzPDI7Kytz
+KXtyPUMueEIuVyhhLGIrcykKaWYoNDg8PXImJnI8PTU3KXQ9dCoxNityLTQ4CmVsc2V7cnw9MzIKaWYo
+OTc8PXImJnI8PTEwMil0PXQqMTYrci04NwplbHNlIHRocm93IEguYihQLnhZKCJJbnZhbGlkIFVSTCBl
+bmNvZGluZyIpKX19cmV0dXJuIHR9LAprdTpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciB0LHMscixxLHA9
+Si5yWShhKSxvPWIKd2hpbGUoITApe2lmKCEobzxjKSl7dD0hMApicmVha31zPXAuVyhhLG8pCmlmKHM8
+PTEyNylpZihzIT09Mzcpcj1lJiZzPT09NDMKZWxzZSByPSEwCmVsc2Ugcj0hMAppZihyKXt0PSExCmJy
+ZWFrfSsrb31pZih0KXtpZihDLnhNIT09ZClyPSExCmVsc2Ugcj0hMAppZihyKXJldHVybiBwLk5qKGEs
+YixjKQplbHNlIHE9bmV3IEgucWoocC5OaihhLGIsYykpfWVsc2V7cT1ILlZNKFtdLHUudCkKZm9yKG89
+YjtvPGM7KytvKXtzPXAuVyhhLG8pCmlmKHM+MTI3KXRocm93IEguYihQLnhZKCJJbGxlZ2FsIHBlcmNl
+bnQgZW5jb2RpbmcgaW4gVVJJIikpCmlmKHM9PT0zNyl7aWYobyszPmEubGVuZ3RoKXRocm93IEguYihQ
+LnhZKCJUcnVuY2F0ZWQgVVJJIikpCkMuTm0uaShxLFAuSWgoYSxvKzEpKQpvKz0yfWVsc2UgaWYoZSYm
+cz09PTQzKUMuTm0uaShxLDMyKQplbHNlIEMuTm0uaShxLHMpfX11LkwuYihxKQpyZXR1cm4gbmV3IFAu
+R1koITEpLldKKHEpfSwKRXQ6ZnVuY3Rpb24oYSl7dmFyIHQ9YXwzMgpyZXR1cm4gOTc8PXQmJnQ8PTEy
+Mn0sCktEOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxwLG8sbixtLGw9IkludmFsaWQgTUlNRSB0
+eXBlIixrPUguVk0oW2ItMV0sdS50KQpmb3IodD1hLmxlbmd0aCxzPWIscj0tMSxxPW51bGw7czx0Oysr
+cyl7cT1DLnhCLlcoYSxzKQppZihxPT09NDR8fHE9PT01OSlicmVhawppZihxPT09NDcpe2lmKHI8MCl7
+cj1zCmNvbnRpbnVlfXRocm93IEguYihQLnJyKGwsYSxzKSl9fWlmKHI8MCYmcz5iKXRocm93IEguYihQ
+LnJyKGwsYSxzKSkKZm9yKDtxIT09NDQ7KXtDLk5tLmkoayxzKTsrK3MKZm9yKHA9LTE7czx0Oysrcyl7
+cT1DLnhCLlcoYSxzKQppZihxPT09NjEpe2lmKHA8MClwPXN9ZWxzZSBpZihxPT09NTl8fHE9PT00NCli
+cmVha31pZihwPj0wKUMuTm0uaShrLHApCmVsc2V7bz1DLk5tLmdyWihrKQppZihxIT09NDR8fHMhPT1v
+Kzd8fCFDLnhCLlFpKGEsImJhc2U2NCIsbysxKSl0aHJvdyBILmIoUC5ycigiRXhwZWN0aW5nICc9JyIs
+YSxzKSkKYnJlYWt9fUMuTm0uaShrLHMpCm49cysxCmlmKChrLmxlbmd0aCYxKT09PTEpYT1DLmg5Lnly
+KGEsbix0KQplbHNle209UC5VbChhLG4sdCxDLlZDLCEwKQppZihtIT1udWxsKWE9Qy54Qi5pNyhhLG4s
+dCxtKX1yZXR1cm4gbmV3IFAuUEUoYSxrLGMpfSwKdXg6ZnVuY3Rpb24oKXt2YXIgdD0iMDEyMzQ1Njc4
+OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXotLl9+ISQm
+JygpKissOz0iLHM9Ii4iLHI9IjoiLHE9Ii8iLHA9Ij8iLG89IiMiLG49dS5nYyxtPVAuZEgoMjIsbmV3
+IFAucTMoKSwhMCxuKSxsPW5ldyBQLnlJKG0pLGs9bmV3IFAuYzYoKSxqPW5ldyBQLnFkKCksaT1uLmIo
+bC4kMigwLDIyNSkpCmsuJDMoaSx0LDEpCmsuJDMoaSxzLDE0KQprLiQzKGksciwzNCkKay4kMyhpLHEs
+MykKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5iKGwuJDIoMTQsMjI1KSkKay4kMyhpLHQs
+MSkKay4kMyhpLHMsMTUpCmsuJDMoaSxyLDM0KQprLiQzKGkscSwyMzQpCmsuJDMoaSxwLDE3MikKay4k
+MyhpLG8sMjA1KQppPW4uYihsLiQyKDE1LDIyNSkpCmsuJDMoaSx0LDEpCmsuJDMoaSwiJSIsMjI1KQpr
+LiQzKGksciwzNCkKay4kMyhpLHEsOSkKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5iKGwu
+JDIoMSwyMjUpKQprLiQzKGksdCwxKQprLiQzKGksciwzNCkKay4kMyhpLHEsMTApCmsuJDMoaSxwLDE3
+MikKay4kMyhpLG8sMjA1KQppPW4uYihsLiQyKDIsMjM1KSkKay4kMyhpLHQsMTM5KQprLiQzKGkscSwx
+MzEpCmsuJDMoaSxzLDE0NikKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5iKGwuJDIoMywy
+MzUpKQprLiQzKGksdCwxMSkKay4kMyhpLHEsNjgpCmsuJDMoaSxzLDE4KQprLiQzKGkscCwxNzIpCmsu
+JDMoaSxvLDIwNSkKaT1uLmIobC4kMig0LDIyOSkpCmsuJDMoaSx0LDUpCmouJDMoaSwiQVoiLDIyOSkK
+ay4kMyhpLHIsMTAyKQprLiQzKGksIkAiLDY4KQprLiQzKGksIlsiLDIzMikKay4kMyhpLHEsMTM4KQpr
+LiQzKGkscCwxNzIpCmsuJDMoaSxvLDIwNSkKaT1uLmIobC4kMig1LDIyOSkpCmsuJDMoaSx0LDUpCmou
+JDMoaSwiQVoiLDIyOSkKay4kMyhpLHIsMTAyKQprLiQzKGksIkAiLDY4KQprLiQzKGkscSwxMzgpCmsu
+JDMoaSxwLDE3MikKay4kMyhpLG8sMjA1KQppPW4uYihsLiQyKDYsMjMxKSkKai4kMyhpLCIxOSIsNykK
+ay4kMyhpLCJAIiw2OCkKay4kMyhpLHEsMTM4KQprLiQzKGkscCwxNzIpCmsuJDMoaSxvLDIwNSkKaT1u
+LmIobC4kMig3LDIzMSkpCmouJDMoaSwiMDkiLDcpCmsuJDMoaSwiQCIsNjgpCmsuJDMoaSxxLDEzOCkK
+ay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmsuJDMobi5iKGwuJDIoOCw4KSksIl0iLDUpCmk9bi5i
+KGwuJDIoOSwyMzUpKQprLiQzKGksdCwxMSkKay4kMyhpLHMsMTYpCmsuJDMoaSxxLDIzNCkKay4kMyhp
+LHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5iKGwuJDIoMTYsMjM1KSkKay4kMyhpLHQsMTEpCmsuJDMo
+aSxzLDE3KQprLiQzKGkscSwyMzQpCmsuJDMoaSxwLDE3MikKay4kMyhpLG8sMjA1KQppPW4uYihsLiQy
+KDE3LDIzNSkpCmsuJDMoaSx0LDExKQprLiQzKGkscSw5KQprLiQzKGkscCwxNzIpCmsuJDMoaSxvLDIw
+NSkKaT1uLmIobC4kMigxMCwyMzUpKQprLiQzKGksdCwxMSkKay4kMyhpLHMsMTgpCmsuJDMoaSxxLDIz
+NCkKay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5iKGwuJDIoMTgsMjM1KSkKay4kMyhpLHQs
+MTEpCmsuJDMoaSxzLDE5KQprLiQzKGkscSwyMzQpCmsuJDMoaSxwLDE3MikKay4kMyhpLG8sMjA1KQpp
+PW4uYihsLiQyKDE5LDIzNSkpCmsuJDMoaSx0LDExKQprLiQzKGkscSwyMzQpCmsuJDMoaSxwLDE3MikK
+ay4kMyhpLG8sMjA1KQppPW4uYihsLiQyKDExLDIzNSkpCmsuJDMoaSx0LDExKQprLiQzKGkscSwxMCkK
+ay4kMyhpLHAsMTcyKQprLiQzKGksbywyMDUpCmk9bi5iKGwuJDIoMTIsMjM2KSkKay4kMyhpLHQsMTIp
+CmsuJDMoaSxwLDEyKQprLiQzKGksbywyMDUpCmk9bi5iKGwuJDIoMTMsMjM3KSkKay4kMyhpLHQsMTMp
+CmsuJDMoaSxwLDEzKQpqLiQzKG4uYihsLiQyKDIwLDI0NSkpLCJheiIsMjEpCmw9bi5iKGwuJDIoMjEs
+MjQ1KSkKai4kMyhsLCJheiIsMjEpCmouJDMobCwiMDkiLDIxKQprLiQzKGwsIistLiIsMjEpCnJldHVy
+biBtfSwKVUI6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgdCxzLHIscSxwLG89JC52WigpCmZvcih0PUou
+clkoYSkscz1iO3M8YzsrK3Mpe2lmKGQ8MHx8ZD49by5sZW5ndGgpcmV0dXJuIEguT0gobyxkKQpyPW9b
+ZF0KcT10LlcoYSxzKV45NgppZihxPjk1KXE9MzEKaWYocT49ci5sZW5ndGgpcmV0dXJuIEguT0gocixx
+KQpwPXJbcV0KZD1wJjMxCkMuTm0uWShlLHA+Pj41LHMpfXJldHVybiBkfSwKV0Y6ZnVuY3Rpb24gV0Yo
+YSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCmEyOmZ1bmN0aW9uIGEyKCl7fSwKaVA6ZnVuY3Rpb24gaVAo
+YSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkNQOmZ1bmN0aW9uIENQKCl7fSwKWFM6ZnVuY3Rpb24gWFMo
+KXt9LApDNjpmdW5jdGlvbiBDNihhKXt0aGlzLmE9YX0sCm46ZnVuY3Rpb24gbigpe30sCnU6ZnVuY3Rp
+b24gdShhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kfSwKYko6ZnVuY3Rp
+b24gYkooYSxiLGMsZCxlLGYpe3ZhciBfPXRoaXMKXy5lPWEKXy5mPWIKXy5hPWMKXy5iPWQKXy5jPWUK
+Xy5kPWZ9LAplWTpmdW5jdGlvbiBlWShhLGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5mPWEKXy5hPWIKXy5i
+PWMKXy5jPWQKXy5kPWV9LAptcDpmdW5jdGlvbiBtcChhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8u
+Yj1iCl8uYz1jCl8uZD1kfSwKdWI6ZnVuY3Rpb24gdWIoYSl7dGhpcy5hPWF9LApkczpmdW5jdGlvbiBk
+cyhhKXt0aGlzLmE9YX0sCmxqOmZ1bmN0aW9uIGxqKGEpe3RoaXMuYT1hfSwKVVY6ZnVuY3Rpb24gVVYo
+YSl7dGhpcy5hPWF9LAprNTpmdW5jdGlvbiBrNSgpe30sCktZOmZ1bmN0aW9uIEtZKCl7fSwKYzpmdW5j
+dGlvbiBjKGEpe3RoaXMuYT1hfSwKQ0Q6ZnVuY3Rpb24gQ0QoYSl7dGhpcy5hPWF9LAphRTpmdW5jdGlv
+biBhRShhLGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LApFSDpmdW5jdGlvbiBFSCgpe30s
+CktOOmZ1bmN0aW9uIEtOKCl7fSwKY1g6ZnVuY3Rpb24gY1goKXt9LApBbjpmdW5jdGlvbiBBbigpe30s
+CnpNOmZ1bmN0aW9uIHpNKCl7fSwKWjA6ZnVuY3Rpb24gWjAoKXt9LApjODpmdW5jdGlvbiBjOCgpe30s
+CkZLOmZ1bmN0aW9uIEZLKCl7fSwKazpmdW5jdGlvbiBrKCl7fSwKT2Q6ZnVuY3Rpb24gT2QoKXt9LApp
+YjpmdW5jdGlvbiBpYigpe30sCnh1OmZ1bmN0aW9uIHh1KCl7fSwKR3o6ZnVuY3Rpb24gR3ooKXt9LApx
+VTpmdW5jdGlvbiBxVSgpe30sClJuOmZ1bmN0aW9uIFJuKGEpe3RoaXMuYT1hfSwKR0Q6ZnVuY3Rpb24g
+R0QoKXt9LApuMTpmdW5jdGlvbiBuMShhKXt0aGlzLmE9YX0sCmNTOmZ1bmN0aW9uIGNTKGEpe3RoaXMu
+YT1hfSwKVkM6ZnVuY3Rpb24gVkMoYSl7dGhpcy5hPWF9LAp0cDpmdW5jdGlvbiB0cChhLGIpe3RoaXMu
+YT1hCnRoaXMuYj1ifSwKRG46ZnVuY3Rpb24gRG4oYSxiLGMsZCxlLGYsZyl7dmFyIF89dGhpcwpfLmE9
+YQpfLmI9YgpfLmM9YwpfLmQ9ZApfLmU9ZQpfLmY9ZgpfLnI9ZwpfLlE9Xy56PV8ueT1fLng9bnVsbH0s
+CmUxOmZ1bmN0aW9uIGUxKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApOWTpmdW5jdGlvbiBOWShhKXt0
+aGlzLmE9YX0sClJaOmZ1bmN0aW9uIFJaKCl7fSwKTUU6ZnVuY3Rpb24gTUUoYSxiKXt0aGlzLmE9YQp0
+aGlzLmI9Yn0sCnk1OmZ1bmN0aW9uIHk1KGEpe3RoaXMuYT1hfSwKUEU6ZnVuY3Rpb24gUEUoYSxiLGMp
+e3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKcTM6ZnVuY3Rpb24gcTMoKXt9LAp5STpmdW5jdGlv
+biB5SShhKXt0aGlzLmE9YX0sCmM2OmZ1bmN0aW9uIGM2KCl7fSwKcWQ6ZnVuY3Rpb24gcWQoKXt9LApV
+ZjpmdW5jdGlvbiBVZihhLGIsYyxkLGUsZixnLGgpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMK
+Xy5kPWQKXy5lPWUKXy5mPWYKXy5yPWcKXy54PWgKXy55PW51bGx9LApxZTpmdW5jdGlvbiBxZShhLGIs
+YyxkLGUsZixnKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mCl8u
+cj1nCl8uUT1fLno9Xy55PV8ueD1udWxsfSwKaUo6ZnVuY3Rpb24gaUooKXt9LApsUjpmdW5jdGlvbiBs
+UihhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKamc6ZnVuY3Rpb24gamcoYSxiKXt0aGlzLmE9YQp0aGlz
+LmI9Yn0sCkJmOmZ1bmN0aW9uIEJmKGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApBczpmdW5jdGlvbiBB
+cygpe30sCkdFOmZ1bmN0aW9uIEdFKGEpe3RoaXMuYT1hfSwKTjc6ZnVuY3Rpb24gTjcoYSxiKXt0aGlz
+LmE9YQp0aGlzLmI9Yn0sCnVROmZ1bmN0aW9uIHVRKCl7fSwKaEY6ZnVuY3Rpb24gaEYoKXt9LApSNDpm
+dW5jdGlvbihhLGIsYyxkKXt2YXIgdCxzLHIKSC54ZChiKQp1LmouYihkKQppZihILm9UKGIpKXt0PVtj
+XQpDLk5tLkZWKHQsZCkKZD10fXM9dS56CnI9UC5DSChKLk0xKGQsUC53MCgpLHMpLCEwLHMpCnUuWi5i
+KGEpCnJldHVybiBQLndZKEguRWsoYSxyLG51bGwpKX0sCkRtOmZ1bmN0aW9uKGEsYixjKXt2YXIgdAp0
+cnl7aWYoT2JqZWN0LmlzRXh0ZW5zaWJsZShhKSYmIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVy
+dHkuY2FsbChhLGIpKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLHt2YWx1ZTpjfSkKcmV0dXJuITB9
+fWNhdGNoKHQpe0guUnUodCl9cmV0dXJuITF9LApPbTpmdW5jdGlvbihhLGIpe2lmKE9iamVjdC5wcm90
+b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGIpKXJldHVybiBhW2JdCnJldHVybiBudWxsfSwKd1k6
+ZnVuY3Rpb24oYSl7aWYoYT09bnVsbHx8dHlwZW9mIGE9PSJzdHJpbmcifHx0eXBlb2YgYT09Im51bWJl
+ciJ8fEgubChhKSlyZXR1cm4gYQppZihhIGluc3RhbmNlb2YgUC5FNClyZXR1cm4gYS5hCmlmKEguUjko
+YSkpcmV0dXJuIGEKaWYodS53LmMoYSkpcmV0dXJuIGEKaWYoYSBpbnN0YW5jZW9mIFAuaVApcmV0dXJu
+IEgubzIoYSkKaWYodS5aLmMoYSkpcmV0dXJuIFAuaEUoYSwiJGRhcnRfanNGdW5jdGlvbiIsbmV3IFAu
+UEMoKSkKcmV0dXJuIFAuaEUoYSwiXyRkYXJ0X2pzT2JqZWN0IixuZXcgUC5ZbSgkLmtJKCkpKX0sCmhF
+OmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1QLk9tKGEsYikKaWYodD09bnVsbCl7dD1jLiQxKGEpClAuRG0o
+YSxiLHQpfXJldHVybiB0fSwKTDc6ZnVuY3Rpb24oYSl7dmFyIHQscwppZihhPT1udWxsfHx0eXBlb2Yg
+YT09InN0cmluZyJ8fHR5cGVvZiBhPT0ibnVtYmVyInx8dHlwZW9mIGE9PSJib29sZWFuIilyZXR1cm4g
+YQplbHNlIGlmKGEgaW5zdGFuY2VvZiBPYmplY3QmJkguUjkoYSkpcmV0dXJuIGEKZWxzZSBpZihhIGlu
+c3RhbmNlb2YgT2JqZWN0JiZ1LncuYyhhKSlyZXR1cm4gYQplbHNlIGlmKGEgaW5zdGFuY2VvZiBEYXRl
+KXt0PUguU2MoYS5nZXRUaW1lKCkpCmlmKE1hdGguYWJzKHQpPD04NjRlMTMpcz0hMQplbHNlIHM9ITAK
+aWYocylILnZoKFAueFkoIkRhdGVUaW1lIGlzIG91dHNpZGUgdmFsaWQgcmFuZ2U6ICIrdCkpCnJldHVy
+biBuZXcgUC5pUCh0LCExKX1lbHNlIGlmKGEuY29uc3RydWN0b3I9PT0kLmtJKCkpcmV0dXJuIGEubwpl
+bHNlIHJldHVybiBQLk5EKGEpfSwKTkQ6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJmdW5jdGlvbiIp
+cmV0dXJuIFAuaVEoYSwkLncoKSxuZXcgUC5OeigpKQppZihhIGluc3RhbmNlb2YgQXJyYXkpcmV0dXJu
+IFAuaVEoYSwkLlI4KCksbmV3IFAubnAoKSkKcmV0dXJuIFAuaVEoYSwkLlI4KCksbmV3IFAuVXQoKSl9
+LAppUTpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9UC5PbShhLGIpCmlmKHQ9PW51bGx8fCEoYSBpbnN0YW5j
+ZW9mIE9iamVjdCkpe3Q9Yy4kMShhKQpQLkRtKGEsYix0KX1yZXR1cm4gdH0sClBDOmZ1bmN0aW9uIFBD
+KCl7fSwKWW06ZnVuY3Rpb24gWW0oYSl7dGhpcy5hPWF9LApOejpmdW5jdGlvbiBOeigpe30sCm5wOmZ1
+bmN0aW9uIG5wKCl7fSwKVXQ6ZnVuY3Rpb24gVXQoKXt9LApFNDpmdW5jdGlvbiBFNChhKXt0aGlzLmE9
+YX0sCnI3OmZ1bmN0aW9uIHI3KGEpe3RoaXMuYT1hfSwKVHo6ZnVuY3Rpb24gVHooYSxiKXt0aGlzLmE9
+YQp0aGlzLiR0aT1ifSwKY286ZnVuY3Rpb24gY28oKXt9LApuZDpmdW5jdGlvbiBuZCgpe30sCktlOmZ1
+bmN0aW9uIEtlKGEpe3RoaXMuYT1hfSwKZDU6ZnVuY3Rpb24gZDUoKXt9LApuNjpmdW5jdGlvbiBuNigp
+e319LFc9ewpacjpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudH0sClU5OmZ1bmN0aW9uKGEsYixjKXt2
+YXIgdD1kb2N1bWVudC5ib2R5LHM9KHQmJkMuUlkpLnI2KHQsYSxiLGMpCnMudG9TdHJpbmcKdD11LmFj
+CnQ9bmV3IEguVTUobmV3IFcuZTcocyksdC5DKCJhMihsRC5FKSIpLmIobmV3IFcuQ3YoKSksdC5DKCJV
+NTxsRC5FPiIpKQpyZXR1cm4gdS5oLmIodC5ncjgodCkpfSwKclM6ZnVuY3Rpb24oYSl7dmFyIHQscyxy
+PSJlbGVtZW50IHRhZyB1bmF2YWlsYWJsZSIKdHJ5e3Q9Si5SRShhKQppZih0eXBlb2YgdC5nbnMoYSk9
+PSJzdHJpbmciKXI9dC5nbnMoYSl9Y2F0Y2gocyl7SC5SdShzKX1yZXR1cm4gcn0sCnFEOmZ1bmN0aW9u
+KGEsYixjKXt2YXIgdCxzLHIscT1uZXcgUC52cygkLlgzLHUuYW8pLHA9bmV3IFAuWmYocSx1LmJqKSxv
+PW5ldyBYTUxIdHRwUmVxdWVzdCgpCkMuRHQuZW8obyxiPT1udWxsPyJHRVQiOmIsYSwhMCkKYy5LKDAs
+bmV3IFcuYlUobykpCnQ9dS5hbgpzPXQuYihuZXcgVy5oSChvLHApKQp1Lk0uYihudWxsKQpyPXUucApX
+LkpFKG8sImxvYWQiLHMsITEscikKVy5KRShvLCJlcnJvciIsdC5iKHAuZ1lKKCkpLCExLHIpCm8uc2Vu
+ZCgpCnJldHVybiBxfSwKQzA6ZnVuY3Rpb24oYSxiKXthPTUzNjg3MDkxMSZhK2IKYT01MzY4NzA5MTEm
+YSsoKDUyNDI4NyZhKTw8MTApCnJldHVybiBhXmE+Pj42fSwKckU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFy
+IHQ9Vy5DMChXLkMwKFcuQzAoVy5DMCgwLGEpLGIpLGMpLGQpLHM9NTM2ODcwOTExJnQrKCg2NzEwODg2
+MyZ0KTw8MykKc149cz4+PjExCnJldHVybiA1MzY4NzA5MTEmcysoKDE2MzgzJnMpPDwxNSl9LApUTjpm
+dW5jdGlvbihhLGIpe3ZhciB0LHMscj1hLmNsYXNzTGlzdApmb3IodD1iLmxlbmd0aCxzPTA7czxiLmxl
+bmd0aDtiLmxlbmd0aD09PXR8fCgwLEgubGspKGIpLCsrcylyLmFkZChiW3NdKX0sCkpFOmZ1bmN0aW9u
+KGEsYixjLGQsZSl7dmFyIHQ9Vy5hRihuZXcgVy52TihjKSx1LkIpCmlmKHQhPW51bGwmJiEwKUouZFoo
+YSxiLHQsITEpCnJldHVybiBuZXcgVy54QyhhLGIsdCwhMSxlLkMoInhDPDA+IikpfSwKVHc6ZnVuY3Rp
+b24oYSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpLHM9bmV3IFcubWsodCx3aW5kb3cu
+bG9jYXRpb24pCnM9bmV3IFcuSlEocykKcy5DWShhKQpyZXR1cm4gc30sCnlXOmZ1bmN0aW9uKGEsYixj
+LGQpe3UuaC5iKGEpCkgueShiKQpILnkoYykKdS5PLmIoZCkKcmV0dXJuITB9LApRVzpmdW5jdGlvbihh
+LGIsYyxkKXt2YXIgdCxzLHIKdS5oLmIoYSkKSC55KGIpCkgueShjKQp0PXUuTy5iKGQpLmEKcz10LmEK
+cy5ocmVmPWMKcj1zLmhvc3RuYW1lCnQ9dC5iCmlmKCEocj09dC5ob3N0bmFtZSYmcy5wb3J0PT10LnBv
+cnQmJnMucHJvdG9jb2w9PXQucHJvdG9jb2wpKWlmKHI9PT0iIilpZihzLnBvcnQ9PT0iIil7dD1zLnBy
+b3RvY29sCnQ9dD09PSI6Inx8dD09PSIifWVsc2UgdD0hMQplbHNlIHQ9ITEKZWxzZSB0PSEwCnJldHVy
+biB0fSwKQmw6ZnVuY3Rpb24oKXt2YXIgdD11Lk4scz1QLnRNKEMuUXgsdCkscj11LmRHLmIobmV3IFcu
+SUEoKSkscT1ILlZNKFsiVEVNUExBVEUiXSx1LnMpCnQ9bmV3IFcuY3QocyxQLkxzKHQpLFAuTHModCks
+UC5Mcyh0KSxudWxsKQp0LkNZKG51bGwsbmV3IEguQTgoQy5ReCxyLHUuZHYpLHEsbnVsbCkKcmV0dXJu
+IHR9LAp1VjpmdW5jdGlvbihhKXtpZihhPT1udWxsKXJldHVybiBudWxsCnJldHVybiBXLlAxKGEpfSwK
+cWM6ZnVuY3Rpb24oYSl7dmFyIHQKaWYoYT09bnVsbClyZXR1cm4gbnVsbAppZigicG9zdE1lc3NhZ2Ui
+IGluIGEpe3Q9Vy5QMShhKQpyZXR1cm4gdH1lbHNlIHJldHVybiB1LmFTLmIoYSl9LApQMTpmdW5jdGlv
+bihhKXtpZihhPT09d2luZG93KXJldHVybiB1LmNpLmIoYSkKZWxzZSByZXR1cm4gbmV3IFcuZFcoYSl9
+LAp6WDpmdW5jdGlvbihhKXtpZihhPT09d2luZG93LmxvY2F0aW9uKXJldHVybiBhCmVsc2UgcmV0dXJu
+IG5ldyBXLkZiKCl9LAphRjpmdW5jdGlvbihhLGIpe3ZhciB0PSQuWDMKaWYodD09PUMuTlUpcmV0dXJu
+IGEKcmV0dXJuIHQuUHkoYSxiKX0sCnFFOmZ1bmN0aW9uIHFFKCl7fSwKR2g6ZnVuY3Rpb24gR2goKXt9
+LApmWTpmdW5jdGlvbiBmWSgpe30sCm5COmZ1bmN0aW9uIG5CKCl7fSwKQXo6ZnVuY3Rpb24gQXooKXt9
+LApRUDpmdW5jdGlvbiBRUCgpe30sCm54OmZ1bmN0aW9uIG54KCl7fSwKb0o6ZnVuY3Rpb24gb0ooKXt9
+LAppZDpmdW5jdGlvbiBpZCgpe30sClFGOmZ1bmN0aW9uIFFGKCl7fSwKTmg6ZnVuY3Rpb24gTmgoKXt9
+LApJQjpmdW5jdGlvbiBJQigpe30sCm43OmZ1bmN0aW9uIG43KCl7fSwKd3o6ZnVuY3Rpb24gd3ooYSxi
+KXt0aGlzLmE9YQp0aGlzLiR0aT1ifSwKY3Y6ZnVuY3Rpb24gY3YoKXt9LApDdjpmdW5jdGlvbiBDdigp
+e30sCmVhOmZ1bmN0aW9uIGVhKCl7fSwKRDA6ZnVuY3Rpb24gRDAoKXt9LApUNTpmdW5jdGlvbiBUNSgp
+e30sCmg0OmZ1bmN0aW9uIGg0KCl7fSwKYnI6ZnVuY3Rpb24gYnIoKXt9LApWYjpmdW5jdGlvbiBWYigp
+e30sCk83OmZ1bmN0aW9uIE83KCl7fSwKYlU6ZnVuY3Rpb24gYlUoYSl7dGhpcy5hPWF9LApoSDpmdW5j
+dGlvbiBoSChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKd2E6ZnVuY3Rpb24gd2EoKXt9LApTZzpmdW5j
+dGlvbiBTZygpe30sCnU4OmZ1bmN0aW9uIHU4KCl7fSwKQWo6ZnVuY3Rpb24gQWooKXt9LAplNzpmdW5j
+dGlvbiBlNyhhKXt0aGlzLmE9YX0sCnVIOmZ1bmN0aW9uIHVIKCl7fSwKQkg6ZnVuY3Rpb24gQkgoKXt9
+LApTTjpmdW5jdGlvbiBTTigpe30sCmV3OmZ1bmN0aW9uIGV3KCl7fSwKbHA6ZnVuY3Rpb24gbHAoKXt9
+LApUYjpmdW5jdGlvbiBUYigpe30sCkl2OmZ1bmN0aW9uIEl2KCl7fSwKQlQ6ZnVuY3Rpb24gQlQoKXt9
+LAp5WTpmdW5jdGlvbiB5WSgpe30sCnc2OmZ1bmN0aW9uIHc2KCl7fSwKSzU6ZnVuY3Rpb24gSzUoKXt9
+LApDbTpmdW5jdGlvbiBDbSgpe30sCkNROmZ1bmN0aW9uIENRKCl7fSwKdzQ6ZnVuY3Rpb24gdzQoKXt9
+LApyaDpmdW5jdGlvbiByaCgpe30sCmNmOmZ1bmN0aW9uIGNmKCl7fSwKaTc6ZnVuY3Rpb24gaTcoYSl7
+dGhpcy5hPWF9LApTeTpmdW5jdGlvbiBTeShhKXt0aGlzLmE9YX0sCktTOmZ1bmN0aW9uIEtTKGEsYil7
+dGhpcy5hPWEKdGhpcy5iPWJ9LApBMzpmdW5jdGlvbiBBMyhhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwK
+STQ6ZnVuY3Rpb24gSTQoYSl7dGhpcy5hPWF9LApGazpmdW5jdGlvbiBGayhhLGIpe3RoaXMuYT1hCnRo
+aXMuJHRpPWJ9LApSTzpmdW5jdGlvbiBSTyhhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1iCl8u
+Yz1jCl8uJHRpPWR9LApDcTpmdW5jdGlvbiBDcShhLGIsYyxkKXt2YXIgXz10aGlzCl8uYT1hCl8uYj1i
+Cl8uYz1jCl8uJHRpPWR9LAp4QzpmdW5jdGlvbiB4QyhhLGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5iPWEK
+Xy5jPWIKXy5kPWMKXy5lPWQKXy4kdGk9ZX0sCnZOOmZ1bmN0aW9uIHZOKGEpe3RoaXMuYT1hfSwKSlE6
+ZnVuY3Rpb24gSlEoYSl7dGhpcy5hPWF9LApHbTpmdW5jdGlvbiBHbSgpe30sCnZEOmZ1bmN0aW9uIHZE
+KGEpe3RoaXMuYT1hfSwKVXY6ZnVuY3Rpb24gVXYoYSl7dGhpcy5hPWF9LApFZzpmdW5jdGlvbiBFZyhh
+LGIsYyl7dGhpcy5hPWEKdGhpcy5iPWIKdGhpcy5jPWN9LAptNjpmdW5jdGlvbiBtNigpe30sCkVvOmZ1
+bmN0aW9uIEVvKCl7fSwKV2s6ZnVuY3Rpb24gV2soKXt9LApjdDpmdW5jdGlvbiBjdChhLGIsYyxkLGUp
+e3ZhciBfPXRoaXMKXy5lPWEKXy5hPWIKXy5iPWMKXy5jPWQKXy5kPWV9LApJQTpmdW5jdGlvbiBJQSgp
+e30sCk93OmZ1bmN0aW9uIE93KCl7fSwKVzk6ZnVuY3Rpb24gVzkoYSxiLGMpe3ZhciBfPXRoaXMKXy5h
+PWEKXy5iPWIKXy5jPS0xCl8uZD1udWxsCl8uJHRpPWN9LApkVzpmdW5jdGlvbiBkVyhhKXt0aGlzLmE9
+YX0sCkZiOmZ1bmN0aW9uIEZiKCl7fSwKa0Y6ZnVuY3Rpb24ga0YoKXt9LAptazpmdW5jdGlvbiBtayhh
+LGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKS286ZnVuY3Rpb24gS28oYSl7dGhpcy5hPWF9LApmbTpmdW5j
+dGlvbiBmbShhKXt0aGlzLmE9YX0sCkxlOmZ1bmN0aW9uIExlKCl7fSwKSzc6ZnVuY3Rpb24gSzcoKXt9
+LApyQjpmdW5jdGlvbiByQigpe30sClhXOmZ1bmN0aW9uIFhXKCl7fSwKb2E6ZnVuY3Rpb24gb2EoKXt9
+fSxVPXsKeXU6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG49SC5WTShbXSx1LmJQKQpmb3IodD1K
+LlU2KGEpLHM9Si5JVCh1LlIuYih0LnEoYSwiZGV0YWlscyIpKSk7cy5GKCk7KXtyPXMuZ2woKQpxPUou
+VTYocikKcD1ILnkocS5xKHIsImRlc2NyaXB0aW9uIikpCnE9cS5xKHIsImxpbmsiKQppZihxPT1udWxs
+KXE9bnVsbAplbHNle289Si5VNihxKQpxPW5ldyBVLk1sKEgueShvLnEocSwiaHJlZiIpKSxILlNjKG8u
+cShxLCJsaW5lIikpLEgueShvLnEocSwicGF0aCIpKSl9Qy5ObS5pKG4sbmV3IFUudUYocCxxKSl9cmV0
+dXJuIG5ldyBVLmQyKG4sVS5qZih0LnEoYSwiZWRpdHMiKSksSC55KHQucShhLCJleHBsYW5hdGlvbiIp
+KSxILlNjKHQucShhLCJsaW5lIikpLEgueSh0LnEoYSwicGF0aCIpKSxVLk5kKHQucShhLCJ0cmFjZXMi
+KSkpfSwKamY6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEKaWYoYT09bnVsbCl0PW51bGwKZWxzZXt0PUgu
+Vk0oW10sdS5mQSkKZm9yKHM9Si5JVCh1LlIuYihhKSk7cy5GKCk7KXtyPXMuZ2woKQpxPUouVTYocikK
+Qy5ObS5pKHQsbmV3IFUuU2UoSC55KHEucShyLCJkZXNjcmlwdGlvbiIpKSxILnkocS5xKHIsImhyZWYi
+KSkpKX19cmV0dXJuIHR9LApOZDpmdW5jdGlvbihhKXt2YXIgdCxzCmlmKGE9PW51bGwpdD1udWxsCmVs
+c2V7dD1ILlZNKFtdLHUuaGgpCmZvcihzPUouSVQodS5SLmIoYSkpO3MuRigpOylDLk5tLmkodCxVLk5m
+KHMuZ2woKSkpfXJldHVybiB0fSwKTmY6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvPSJkZXNjcmlw
+dGlvbiIsbj1KLlU2KGEpLG09SC55KG4ucShhLG8pKSxsPUguVk0oW10sdS5hSikKZm9yKG49Si5JVCh1
+LlIuYihuLnEoYSwiZW50cmllcyIpKSk7bi5GKCk7KXt0PW4uZ2woKQpzPUouVTYodCkKcj1ILnkocy5x
+KHQsbykpCnE9SC55KHMucSh0LCJmdW5jdGlvbiIpKQpzPXMucSh0LCJsaW5rIikKaWYocz09bnVsbClz
+PW51bGwKZWxzZXtwPUouVTYocykKcz1uZXcgVS5NbChILnkocC5xKHMsImhyZWYiKSksSC5TYyhwLnEo
+cywibGluZSIpKSxILnkocC5xKHMsInBhdGgiKSkpfUMuTm0uaShsLG5ldyBVLndiKHIscSxzKSl9cmV0
+dXJuIG5ldyBVLnlEKG0sbCl9LApkMjpmdW5jdGlvbiBkMihhLGIsYyxkLGUsZil7dmFyIF89dGhpcwpf
+LmE9YQpfLmI9YgpfLmM9YwpfLmQ9ZApfLmU9ZQpfLmY9Zn0sClNlOmZ1bmN0aW9uIFNlKGEsYil7dGhp
+cy5hPWEKdGhpcy5iPWJ9LAp1RjpmdW5jdGlvbiB1RihhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKTWw6
+ZnVuY3Rpb24gTWwoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKeUQ6ZnVuY3Rpb24g
+eUQoYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCndiOmZ1bmN0aW9uIHdiKGEsYixjKXt0aGlzLmE9YQp0
+aGlzLmI9Ygp0aGlzLmM9Y319LEI9ewpZZjpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT1ILnkoYS5xKDAs
+InJlZ2lvbnMiKSkscD1ILnkoYS5xKDAsIm5hdmlnYXRpb25Db250ZW50IikpLG89SC55KGEucSgwLCJz
+b3VyY2VDb2RlIikpLG49SC5WTShbXSx1LnUpCmZvcih0PUouSVQodS5SLmIoYS5xKDAsImVkaXRzIikp
+KTt0LkYoKTspe3M9dC5nbCgpCnI9Si5VNihzKQpDLk5tLmkobixuZXcgQi5qOChILlNjKHIucShzLCJs
+aW5lIikpLEgueShyLnEocywiZXhwbGFuYXRpb24iKSksSC5TYyhyLnEocywib2Zmc2V0IikpKSl9cmV0
+dXJuIG5ldyBCLnFwKHEscCxvLG4pfSwKajg6ZnVuY3Rpb24gajgoYSxiLGMpe3RoaXMuYT1hCnRoaXMu
+Yj1iCnRoaXMuYz1jfSwKcXA6ZnVuY3Rpb24gcXAoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9
+YgpfLmM9YwpfLmQ9ZH0sCkx1OmZ1bmN0aW9uIEx1KCl7fSwKT1M6ZnVuY3Rpb24oYSl7dmFyIHQKaWYo
+IShhPj02NSYmYTw9OTApKXQ9YT49OTcmJmE8PTEyMgplbHNlIHQ9ITAKcmV0dXJuIHR9LApZdTpmdW5j
+dGlvbihhLGIpe3ZhciB0PWEubGVuZ3RoLHM9YisyCmlmKHQ8cylyZXR1cm4hMQppZighQi5PUyhDLnhC
+Lm0oYSxiKSkpcmV0dXJuITEKaWYoQy54Qi5tKGEsYisxKSE9PTU4KXJldHVybiExCmlmKHQ9PT1zKXJl
+dHVybiEwCnJldHVybiBDLnhCLm0oYSxzKT09PTQ3fX0sVD17R1Y6ZnVuY3Rpb24gR1YoKXt9fSxMPXsK
+SXE6ZnVuY3Rpb24oKXtDLkJaLkIoZG9jdW1lbnQsIkRPTUNvbnRlbnRMb2FkZWQiLG5ldyBMLmUoKSkK
+Qy5vbC5CKHdpbmRvdywicG9wc3RhdGUiLG5ldyBMLkwoKSl9LAprejpmdW5jdGlvbihhKXt2YXIgdCxz
+PXUuaC5hKGEucGFyZW50Tm9kZSkucXVlcnlTZWxlY3RvcigiOnNjb3BlID4gdWwiKSxyPXMuc3R5bGUs
+cT0iIitDLkNELnpRKHMub2Zmc2V0SGVpZ2h0KSoyKyJweCIKci5tYXhIZWlnaHQ9cQpyPUoucUYoYSkK
+cT1yLiR0aQp0PXEuQygifigxKSIpLmIobmV3IEwuV3gocyxhKSkKdS5NLmIobnVsbCkKVy5KRShyLmEs
+ci5iLHQsITEscS5kKX0sCnlYOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvPSJxdWVyeVNlbGVj
+dG9yQWxsIixuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYSksbT11LmgKbi50b1N0cmluZwpILkRoKG0s
+bSwiVCIsbykKdD11LlMKcz1uZXcgVy53eihuLnF1ZXJ5U2VsZWN0b3JBbGwoIi5uYXYtbGluayIpLHQp
+CnMuSyhzLG5ldyBMLkFPKGIpKQpILkRoKG0sbSwiVCIsbykKcj1uZXcgVy53eihuLnF1ZXJ5U2VsZWN0
+b3JBbGwoIi5yZWdpb24iKSx0KQppZihyLmdBKHIpIT09MCl7cT1uLnF1ZXJ5U2VsZWN0b3IoInRhYmxl
+W2RhdGEtcGF0aF0iKQpxLnRvU3RyaW5nCnIuSyhyLG5ldyBMLkhvKHEuZ2V0QXR0cmlidXRlKCJkYXRh
+LSIrbmV3IFcuU3kobmV3IFcuaTcocSkpLk8oInBhdGgiKSkpKX1ILkRoKG0sbSwiVCIsbykKcD1uZXcg
+Vy53eihuLnF1ZXJ5U2VsZWN0b3JBbGwoIi5wb3N0LWxpbmsiKSx0KQpwLksocCxuZXcgTC5JQygpKX0s
+CnR5OmZ1bmN0aW9uKGEpe3ZhciB0PXUuTgpyZXR1cm4gVy5xRChhLCJQT1NUIixQLkVGKFsiQ29udGVu
+dC1UeXBlIiwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD1VVEYtOCJdLHQsdCkpLlc3KG5ldyBMLkwx
+KCksdS5yKX0sCmFLOmZ1bmN0aW9uKGEpe3ZhciB0PVAuaEsoYSkuZ2hZKCkucSgwLCJsaW5lIikKcmV0
+dXJuIHQ9PW51bGw/bnVsbDpILkhwKHQsbnVsbCl9LApHNjpmdW5jdGlvbihhKXt2YXIgdD1QLmhLKGEp
+LmdoWSgpLnEoMCwib2Zmc2V0IikKcmV0dXJuIHQ9PW51bGw/bnVsbDpILkhwKHQsbnVsbCl9LAp0Mjpm
+dW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHEscCxvPXt9LG49by5hPXUuaC5iKFcucWMoYS5jdXJyZW50
+VGFyZ2V0KSkuZ2V0QXR0cmlidXRlKCJocmVmIikKaWYoSi56bChuLCI/Iikpe3Q9Qy54Qi5OaihuLDAs
+Qy54Qi5PWShuLCI/IikpCm8uYT10CnM9dH1lbHNlIHM9bgppZihjIT1udWxsKXtyPSQublUoKQpzPW8u
+YT1yLm81KEQubnIoci50TShjKSxzKSl9cT1MLkc2KG4pCnA9TC5hSyhuKQppZihxIT1udWxsKUwuYWYo
+cyxxLHAsYixuZXcgTC5uVChvLHEscCkpCmVsc2UgTC5hZihzLG51bGwsbnVsbCxiLG5ldyBMLkJaKG8p
+KQphLnByZXZlbnREZWZhdWx0KCl9LAp1bTpmdW5jdGlvbihhKXtyZXR1cm4gTC5RUyh1LlYuYihhKSl9
+LApRUzpmdW5jdGlvbihhKXt2YXIgdD0wLHM9UC5GWCh1LnopLHI9MSxxLHA9W10sbyxuLG0sbCxrLGoK
+dmFyICRhc3luYyR1bT1QLmx6KGZ1bmN0aW9uKGIsYyl7aWYoYj09PTEpe3E9Ywp0PXJ9d2hpbGUodHJ1
+ZSlzd2l0Y2godCl7Y2FzZSAwOms9dS5oLmEoVy5xYyhhLmN1cnJlbnRUYXJnZXQpKS5nZXRBdHRyaWJ1
+dGUoImhyZWYiKQphLnByZXZlbnREZWZhdWx0KCkKbT1kb2N1bWVudAptLmJvZHkuY2xhc3NMaXN0LmFk
+ZCgicmVydW5uaW5nIikKcj0zCnQ9NgpyZXR1cm4gUC5qUShMLnR5KGspLCRhc3luYyR1bSkKY2FzZSA2
+OnUuRi5hKEouR3IoVy51VihtLmRlZmF1bHRWaWV3KSkpLnJlbG9hZCgpCnAucHVzaCg1KQp0PTQKYnJl
+YWsKY2FzZSAzOnI9MgpqPXEKbz1ILlJ1KGopCm49SC50cyhqKQpMLnFKKCJoYW5kbGVQb3N0TGlua0Ns
+aWNrOiAiK0guZChvKSxuKQp3aW5kb3cuYWxlcnQoIkNvdWxkIG5vdCBsb2FkICIrSC5kKGspKyIgKCIr
+SC5kKG8pKyIpLiIpCnAucHVzaCg1KQp0PTQKYnJlYWsKY2FzZSAyOnA9WzFdCmNhc2UgNDpyPTEKbS5i
+b2R5LmNsYXNzTGlzdC5yZW1vdmUoInJlcnVubmluZyIpCnQ9cC5wb3AoKQpicmVhawpjYXNlIDU6cmV0
+dXJuIFAueUMobnVsbCxzKQpjYXNlIDE6cmV0dXJuIFAuZjMocSxzKX19KQpyZXR1cm4gUC5ESSgkYXN5
+bmMkdW0scyl9LAp2VTpmdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LHM9dS5oCkguRGgocyxzLCJUIiwi
+cXVlcnlTZWxlY3RvckFsbCIpCnQ9bmV3IFcud3oodC5xdWVyeVNlbGVjdG9yQWxsKCIuY29kZSIpLHUu
+UykKdC5LKHQsbmV3IEwuR0goKSl9LApoWDpmdW5jdGlvbihhLGIpe3ZhciB0PXUuTgpXLnFEKEguZChh
+KSsiP3JlZ2lvbj1yZWdpb24mb2Zmc2V0PSIrSC5kKGIpLG51bGwsUC5FRihbIkNvbnRlbnQtVHlwZSIs
+ImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLTgiXSx0LHQpKS5XNyhuZXcgTC5EVCgpLHUuUCku
+T0EobmV3IEwuZUgoYSkpfSwKRzc6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgdCxzCmlmKCFKLnJZKGEp
+LlRjKGEsIi5kYXJ0Iikpe0wuQkUoYSxuZXcgQi5xcCgiIiwiIiwiIixDLnhEKSxkKQpMLkJYKGEsbnVs
+bCkKaWYoZSE9bnVsbCllLiQwKCkKcmV0dXJufXQ9Qy54Qi50ZyhhLCI/Iik/YSsiJmlubGluZT10cnVl
+IjphKyI/aW5saW5lPXRydWUiCnM9dS5OClcucUQodCxudWxsLFAuRUYoWyJDb250ZW50LVR5cGUiLCJh
+cHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PVVURi04Il0scyxzKSkuVzcobmV3IEwuekQoYSxkLGIsYyxl
+KSx1LlApLk9BKG5ldyBMLk9FKGEpKX0sCkdlOmZ1bmN0aW9uKCl7dmFyIHQ9Ii9fcHJldmlldy9uYXZp
+Z2F0aW9uVHJlZS5qc29uIixzPXUuTgpXLnFEKHQsbnVsbCxQLkVGKFsiQ29udGVudC1UeXBlIiwiYXBw
+bGljYXRpb24vanNvbjsgY2hhcnNldD1VVEYtOCJdLHMscykpLlc3KG5ldyBMLlRXKCksdS5QKS5PQShu
+ZXcgTC54cih0KSl9LApxSjpmdW5jdGlvbihhLGIpe3ZhciB0CndpbmRvdwppZih0eXBlb2YgY29uc29s
+ZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUuZXJyb3IoYSkKd2luZG93CnQ9SC5kKGIpCmlmKHR5
+cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS5lcnJvcih0KX0sCnFPOmZ1bmN0
+aW9uKGEpe3ZhciB0PWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscz1DLkNELnpRKCQuZmkoKS5vZmZz
+ZXRIZWlnaHQpLHI9d2luZG93LmlubmVySGVpZ2h0LHE9Qy5DRC56USgkLkRXKCkub2Zmc2V0SGVpZ2h0
+KQppZih0eXBlb2YgciE9PSJudW1iZXIiKXJldHVybiByLkhOKCkKaWYodC5ib3R0b20+ci0ocSsxNCkp
+Si5kaChhKQplbHNlIGlmKHQudG9wPHMrMTQpSi5kaChhKX0sCmZHOmZ1bmN0aW9uKGEsYil7dmFyIHQs
+cyxyCmlmKGEhPW51bGwpe3Q9ZG9jdW1lbnQKcz10LmdldEVsZW1lbnRCeUlkKCJvIitILmQoYSkpCnI9
+dC5xdWVyeVNlbGVjdG9yKCIubGluZS0iK0guZChiKSkKaWYocyE9bnVsbCl7TC5xTyhzKQpKLmRSKHMp
+LmkoMCwidGFyZ2V0Iil9ZWxzZSBpZihyIT1udWxsKUwucU8oci5wYXJlbnRFbGVtZW50KQppZihyIT1u
+dWxsKUouZFIodS5oLmEoci5wYXJlbnROb2RlKSkuaSgwLCJoaWdobGlnaHQiKX1lbHNlIEwucU8oJC5E
+OSgpKX0sCmFmOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQscyxyPUwuRzYod2luZG93LmxvY2F0aW9u
+LmhyZWYpLHE9TC5hSyh3aW5kb3cubG9jYXRpb24uaHJlZikKaWYociE9bnVsbCl7dD1kb2N1bWVudC5n
+ZXRFbGVtZW50QnlJZCgibyIrSC5kKHIpKQppZih0IT1udWxsKUouZFIodCkuUigwLCJ0YXJnZXQiKX1p
+ZihxIT1udWxsKXtzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5saW5lLSIrSC5kKHEpKQppZihzIT1u
+dWxsKUouZFIocy5wYXJlbnRFbGVtZW50KS5SKDAsImhpZ2hsaWdodCIpfWlmKGE9PXdpbmRvdy5sb2Nh
+dGlvbi5wYXRobmFtZSl7TC5mRyhiLGMpCmUuJDAoKX1lbHNlIEwuRzcoYSxiLGMsZCxlKX0sCkx4OmZ1
+bmN0aW9uKGEsYil7dmFyIHQKaWYoYT09PTEpdD1iCmVsc2UgdD1iKyJzIgpyZXR1cm4gdH0sClQxOmZ1
+bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbyxuLG09JC5oTCgpCkoubDUobSwiIikKaWYoYT09bnVsbCl7
+dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIikKdC50ZXh0Q29udGVudD0iU2VlIGRldGFpbHMgYWJv
+dXQgYSBwcm9wb3NlZCBlZGl0LiIKQy5MdC5zRCh0LEguVk0oWyJwbGFjZWhvbGRlciJdLHUucykpCm0u
+YXBwZW5kQ2hpbGQodCkKcmV0dXJufXM9YS5lCnQ9JC5uVSgpCnI9dC50TShzKQpxPWEuYwpwPWRvY3Vt
+ZW50Cm89dC5IUChzLEouVDAocC5xdWVyeVNlbGVjdG9yKCIucm9vdCIpLnRleHRDb250ZW50KSkKbj1h
+LmQKdD1wLmNyZWF0ZUVsZW1lbnQoInAiKQp1LmguYihtLmFwcGVuZENoaWxkKHQpKS5hcHBlbmRDaGls
+ZChwLmNyZWF0ZVRleHROb2RlKEguZChxKSsiIGF0ICIrSC5kKG8pKyI6IitILmQobikrIi4iKSkKTC5D
+QyhhLG0scikKTC5GeihhLG0pCkwuTkcoYSxtLHIpfSwKTEg6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMs
+cixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlLGQ9JC5tUSgpCkoubDUoZCwiIikKdD1kb2N1bWVudApz
+PXQuY3JlYXRlRWxlbWVudCgicCIpCnI9dS5oCnE9ci5iKGQuYXBwZW5kQ2hpbGQocykpCnA9Yi5sZW5n
+dGgKaWYocD09PTApcS5hcHBlbmRDaGlsZCh0LmNyZWF0ZVRleHROb2RlKCJObyBwcm9wb3NlZCBlZGl0
+cyIpKQplbHNlIHEuYXBwZW5kQ2hpbGQodC5jcmVhdGVUZXh0Tm9kZSgiIitwKyIgcHJvcG9zZWQgIitM
+Lkx4KHAsImVkaXQiKSsiOiIpKQpzPXQuY3JlYXRlRWxlbWVudCgidWwiKQpvPXIuYihkLmFwcGVuZENo
+aWxkKHMpKQpmb3IoZD1iLmxlbmd0aCxzPXUuaSxuPXUuUSxtPW4uQygifigxKSIpLGw9dS5NLG49bi5k
+LGs9MDtrPGIubGVuZ3RoO2IubGVuZ3RoPT09ZHx8KDAsSC5saykoYiksKytrKXtqPWJba10KaT10LmNy
+ZWF0ZUVsZW1lbnQoImxpIikKaD1yLmIoby5hcHBlbmRDaGlsZChpKSkKSi5kUihoKS5pKDAsImVkaXQi
+KQppPXQuY3JlYXRlRWxlbWVudCgiYSIpCmc9cy5iKGguYXBwZW5kQ2hpbGQoaSkpCmcuY2xhc3NMaXN0
+LmFkZCgiZWRpdC1saW5rIikKZj1qLmMKaT1ILmQoZikKZy5zZXRBdHRyaWJ1dGUoImRhdGEtIituZXcg
+Vy5TeShuZXcgVy5pNyhnKSkuTygib2Zmc2V0IiksaSkKZT1qLmEKaT1ILmQoZSkKZy5zZXRBdHRyaWJ1
+dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyhnKSkuTygibGluZSIpLGkpCmcuYXBwZW5kQ2hpbGQo
+dC5jcmVhdGVUZXh0Tm9kZSgibGluZSAiK0guZChlKSkpCmk9bS5iKG5ldyBMLkVFKGYsZSxhKSkKbC5i
+KG51bGwpClcuSkUoZywiY2xpY2siLGksITEsbikKaC5hcHBlbmRDaGlsZCh0LmNyZWF0ZVRleHROb2Rl
+KCI6ICIrSC5kKGouYikpKX1pZihjKUwuVDEobnVsbCl9LApGcjpmdW5jdGlvbihhLGIsYyl7dmFyIHQs
+cyxyLHE9d2luZG93LmxvY2F0aW9uLHA9UC5oSygocSYmQy5FeCkuZ0RyKHEpK0guZChhKSkKcT11LnoK
+dD1QLkZsKHUuTixxKQppZihiIT1udWxsKXQuWSgwLCJvZmZzZXQiLEguZChiKSkKaWYoYyE9bnVsbCl0
+LlkoMCwibGluZSIsSC5kKGMpKQpwPXAubm0oMCx0LmE9PT0wP251bGw6dCkKcz13aW5kb3cuaGlzdG9y
+eQpyPXAudygwKQpzLnRvU3RyaW5nCnMucHVzaFN0YXRlKG5ldyBQLkJmKFtdLFtdKS5QdihQLkZsKHEs
+cSkpLCIiLHIpfSwKRW46ZnVuY3Rpb24oYSl7dmFyIHQ9Si5iYihkb2N1bWVudC5xdWVyeVNlbGVjdG9y
+KCIucm9vdCIpLnRleHRDb250ZW50LCIvIikKaWYoQy54Qi5uKGEsdCkpcmV0dXJuIEMueEIuRyhhLHQu
+bGVuZ3RoKQplbHNlIHJldHVybiBhfSwKQlg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHI9e30Kci5hPWEK
+YT1MLkVuKGEpCnIuYT1hCiQuRDkoKS50ZXh0Q29udGVudD1hCnQ9ZG9jdW1lbnQKcz11LmgKSC5EaChz
+LHMsIlQiLCJxdWVyeVNlbGVjdG9yQWxsIikKdD1uZXcgVy53eih0LnF1ZXJ5U2VsZWN0b3JBbGwoIi5u
+YXYtcGFuZWwgLm5hdi1saW5rIiksdS5TKQp0LksodCxuZXcgTC5WUyhyKSl9LApCRTpmdW5jdGlvbihh
+LGIsYyl7dmFyIHQ9Ii5yZWdpb25zIixzPWRvY3VtZW50LHI9cy5xdWVyeVNlbGVjdG9yKHQpLHE9cy5x
+dWVyeVNlbGVjdG9yKCIuY29kZSIpCkoudEgocixiLmEsJC5LRygpKQpKLnRIKHEsYi5iLCQuS0coKSkK
+TC5MSChhLGIuZCxjKQpMLnZVKCkKTC55WCgiLmNvZGUiLCEwKQpMLnlYKHQsITApfSwKdFg6ZnVuY3Rp
+b24oYSxiKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGk9ZG9jdW1lbnQsaD1pLmNyZWF0ZUVsZW1l
+bnQoInVsIiksZz11LmgsZj1nLmIoYS5hcHBlbmRDaGlsZChoKSkKZm9yKGg9Yi5sZW5ndGgsdD11Lk0s
+cz0wO3M8Yi5sZW5ndGg7Yi5sZW5ndGg9PT1ofHwoMCxILmxrKShiKSwrK3Mpe3I9YltzXQpxPWkuY3Jl
+YXRlRWxlbWVudCgibGkiKQpwPWcuYihmLmFwcGVuZENoaWxkKHEpKQpxPUouUkUocCkKaWYoci5hPT09
+Qy5ZMil7cS5nRChwKS5pKDAsImRpciIpCnE9aS5jcmVhdGVFbGVtZW50KCJzcGFuIikKbz1nLmIocC5h
+cHBlbmRDaGlsZChxKSkKcT1KLlJFKG8pCnEuZ0QobykuaSgwLCJhcnJvdyIpCnEuc2hmKG8sIiYjeDI1
+QkM7IikKcT1pLmNyZWF0ZUVsZW1lbnQoInNwYW4iKQpKLmw1KGcuYihwLmFwcGVuZENoaWxkKHEpKSwi
+JiN4MUY0QzE7IikKcC5hcHBlbmRDaGlsZChpLmNyZWF0ZVRleHROb2RlKHIuYikpCkwudFgocCxyLmMp
+Ckwua3oobyl9ZWxzZXtxLnNoZihwLCImI3gxRjRDNDsiKQpxPWkuY3JlYXRlRWxlbWVudCgiYSIpCm49
+Zy5iKHAuYXBwZW5kQ2hpbGQocSkpCnE9Si5SRShuKQpxLmdEKG4pLmkoMCwibmF2LWxpbmsiKQpuLnNl
+dEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KG4pKS5PKCJuYW1lIiksci5kKQpuLnNl
+dEF0dHJpYnV0ZSgiaHJlZiIsci5lKQpuLmFwcGVuZENoaWxkKGkuY3JlYXRlVGV4dE5vZGUoci5iKSkK
+cT1xLmdWbChuKQptPXEuJHRpCmw9bS5DKCJ+KDEpIikuYihuZXcgTC5URCgpKQp0LmIobnVsbCkKVy5K
+RShxLmEscS5iLGwsITEsbS5kKQprPXIuZgppZih0eXBlb2YgayE9PSJudW1iZXIiKXJldHVybiBrLm9z
+KCkKaWYoaz4wKXtxPWkuY3JlYXRlRWxlbWVudCgic3BhbiIpCmo9Zy5iKHAuYXBwZW5kQ2hpbGQocSkp
+CkouZFIoaikuaSgwLCJlZGl0LWNvdW50IikKcT0iIitrKyIgIgppZihrPT09MSltPSJlZGl0IgplbHNl
+IG09ImVkaXRzIgpqLnNldEF0dHJpYnV0ZSgidGl0bGUiLHErbSkKai5hcHBlbmRDaGlsZChpLmNyZWF0
+ZVRleHROb2RlKEMuam4udyhrKSkpfX19fSwKYzQ6ZnVuY3Rpb24oYSxiKXt2YXIgdD1kb2N1bWVudCxz
+PXQuY3JlYXRlRWxlbWVudCgiYSIpCnUuaS5iKHMpCnMuYXBwZW5kQ2hpbGQodC5jcmVhdGVUZXh0Tm9k
+ZShILmQoYS5jKSsiOiIrSC5kKGEuYikpKQp0PUQubnIoYixhLmEpCnMuc2V0QXR0cmlidXRlKCJocmVm
+IiwkLm5VKCkubzUodCkpCnMuY2xhc3NMaXN0LmFkZCgibmF2LWxpbmsiKQpyZXR1cm4gc30sCkZ6OmZ1
+bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvLG4sbSxsLGssaixpPWEuYgppZihpIT1udWxsKWZvcih0
+PWkubGVuZ3RoLHM9dS5oLHI9dS5zLHE9dS5YLHA9MDtwPGkubGVuZ3RoO2kubGVuZ3RoPT09dHx8KDAs
+SC5saykoaSksKytwKXtvPWlbcF0Kbj1kb2N1bWVudAptPW4uY3JlYXRlRWxlbWVudCgicCIpCmw9cy5i
+KGIuYXBwZW5kQ2hpbGQobSkpCm09bi5jcmVhdGVFbGVtZW50KCJhIikKaz1zLmIobC5hcHBlbmRDaGls
+ZChtKSkKay5hcHBlbmRDaGlsZChuLmNyZWF0ZVRleHROb2RlKG8uYSkpCmsuc2V0QXR0cmlidXRlKCJo
+cmVmIixvLmIpCm49cS5iKEguVk0oWyJwb3N0LWxpbmsiLCJiZWZvcmUtYXBwbHkiXSxyKSkKaj1KLmRS
+KGspCmouVjEoMCkKai5GVigwLG4pfX0sCk5HOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxwLG8s
+bixtLGw9YS5hCmlmKGwubGVuZ3RoIT09MCl7dD1kb2N1bWVudApzPXQuY3JlYXRlRWxlbWVudCgicCIp
+CnMudGV4dENvbnRlbnQ9IkVkaXQgcmF0aW9uYWxlIChleHBlcmltZW50YWwpOiIKYi5hcHBlbmRDaGls
+ZChzKQpzPXQuY3JlYXRlRWxlbWVudCgidWwiKQpyPXUuaC5iKGIuYXBwZW5kQ2hpbGQocykpCmZvcihz
+PWwubGVuZ3RoLHE9MDtxPGwubGVuZ3RoO2wubGVuZ3RoPT09c3x8KDAsSC5saykobCksKytxKXtwPWxb
+cV0Kbz10LmNyZWF0ZUVsZW1lbnQoImxpIikKbj1yLmFwcGVuZENoaWxkKG8pCm4uYXBwZW5kQ2hpbGQo
+dC5jcmVhdGVUZXh0Tm9kZShwLmEpKQptPXAuYgppZihtIT1udWxsKXtuLmFwcGVuZENoaWxkKHQuY3Jl
+YXRlVGV4dE5vZGUoIiAoIikpCm4uYXBwZW5kQ2hpbGQoTC5jNChtLGMpKQpuLmFwcGVuZENoaWxkKHQu
+Y3JlYXRlVGV4dE5vZGUoIikiKSl9fX19LApDQzpmdW5jdGlvbihhLGIsYTApe3ZhciB0LHMscixxLHAs
+byxuLG0sbCxrLGosaSxoLGcsZixlLGQsYwpmb3IodD1hLmYscz10Lmxlbmd0aCxyPXUucyxxPXUuWCxw
+PTA7cDx0Lmxlbmd0aDt0Lmxlbmd0aD09PXN8fCgwLEgubGspKHQpLCsrcCl7bz10W3BdCm49ZG9jdW1l
+bnQKbT1uLmNyZWF0ZUVsZW1lbnQoInAiKQpsPXEuYihILlZNKFsidHJhY2UiXSxyKSkKaz1KLmRSKG0p
+CmsuVjEoMCkKay5GVigwLGwpCmo9Yi5hcHBlbmRDaGlsZChtKQptPW4uY3JlYXRlRWxlbWVudCgic3Bh
+biIpCmw9cS5iKEguVk0oWyJ0eXBlLWRlc2NyaXB0aW9uIl0scikpCms9Si5kUihtKQprLlYxKDApCmsu
+RlYoMCxsKQptLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUoby5hKSkKai5hcHBlbmRDaGlsZCht
+KQpqLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUoIjoiKSkKbT1uLmNyZWF0ZUVsZW1lbnQoInVs
+IikKbD1xLmIoSC5WTShbInRyYWNlIl0scikpCms9Si5kUihtKQprLlYxKDApCmsuRlYoMCxsKQppPWou
+YXBwZW5kQ2hpbGQobSkKZm9yKG09by5iLGw9bS5sZW5ndGgsaD0wO2g8bS5sZW5ndGg7bS5sZW5ndGg9
+PT1sfHwoMCxILmxrKShtKSwrK2gpe2c9bVtoXQpmPW4uY3JlYXRlRWxlbWVudCgibGkiKQpKLmw1KGYs
+IiYjeDI3NEY7ICIpCmU9aS5hcHBlbmRDaGlsZChmKQpmPW4uY3JlYXRlRWxlbWVudCgic3BhbiIpCmQ9
+cS5iKEguVk0oWyJmdW5jdGlvbiJdLHIpKQprPUouZFIoZikKay5WMSgwKQprLkZWKDAsZCkKZD1nLmIK
+aWYoZD09bnVsbClkPSJ1bmtub3duIgpmLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUoZCkpCmUu
+YXBwZW5kQ2hpbGQoZikKYz1nLmMKaWYoYyE9bnVsbCl7ZS5hcHBlbmRDaGlsZChuLmNyZWF0ZVRleHRO
+b2RlKCIgKCIpKQplLmFwcGVuZENoaWxkKEwuYzQoYyxhMCkpCmUuYXBwZW5kQ2hpbGQobi5jcmVhdGVU
+ZXh0Tm9kZSgiKSIpKX1lLmFwcGVuZENoaWxkKG4uY3JlYXRlVGV4dE5vZGUoIjogIikpCmUuYXBwZW5k
+Q2hpbGQobi5jcmVhdGVUZXh0Tm9kZShnLmEpKX19fSwKZTpmdW5jdGlvbiBlKCl7fSwKVlc6ZnVuY3Rp
+b24gVlcoYSxiLGMpe3RoaXMuYT1hCnRoaXMuYj1iCnRoaXMuYz1jfSwKb1o6ZnVuY3Rpb24gb1ooKXt9
+LApqcjpmdW5jdGlvbiBqcigpe30sCnFsOmZ1bmN0aW9uIHFsKCl7fSwKTDpmdW5jdGlvbiBMKCl7fSwK
+V3g6ZnVuY3Rpb24gV3goYSxiKXt0aGlzLmE9YQp0aGlzLmI9Yn0sCkFPOmZ1bmN0aW9uIEFPKGEpe3Ro
+aXMuYT1hfSwKZE46ZnVuY3Rpb24gZE4oYSl7dGhpcy5hPWF9LApIbzpmdW5jdGlvbiBIbyhhKXt0aGlz
+LmE9YX0sCnh6OmZ1bmN0aW9uIHh6KGEsYil7dGhpcy5hPWEKdGhpcy5iPWJ9LApJQzpmdW5jdGlvbiBJ
+Qygpe30sCkwxOmZ1bmN0aW9uIEwxKCl7fSwKblQ6ZnVuY3Rpb24gblQoYSxiLGMpe3RoaXMuYT1hCnRo
+aXMuYj1iCnRoaXMuYz1jfSwKQlo6ZnVuY3Rpb24gQlooYSl7dGhpcy5hPWF9LApHSDpmdW5jdGlvbiBH
+SCgpe30sCkRUOmZ1bmN0aW9uIERUKCl7fSwKZUg6ZnVuY3Rpb24gZUgoYSl7dGhpcy5hPWF9LAp6RDpm
+dW5jdGlvbiB6RChhLGIsYyxkLGUpe3ZhciBfPXRoaXMKXy5hPWEKXy5iPWIKXy5jPWMKXy5kPWQKXy5l
+PWV9LApPRTpmdW5jdGlvbiBPRShhKXt0aGlzLmE9YX0sClRXOmZ1bmN0aW9uIFRXKCl7fSwKeHI6ZnVu
+Y3Rpb24geHIoYSl7dGhpcy5hPWF9LApFRTpmdW5jdGlvbiBFRShhLGIsYyl7dGhpcy5hPWEKdGhpcy5i
+PWIKdGhpcy5jPWN9LApRTDpmdW5jdGlvbiBRTChhLGIpe3RoaXMuYT1hCnRoaXMuYj1ifSwKVlM6ZnVu
+Y3Rpb24gVlMoYSl7dGhpcy5hPWF9LApURDpmdW5jdGlvbiBURCgpe30sClhBOmZ1bmN0aW9uIFhBKCl7
+fSwKbUs6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG49SC5WTShbXSx1LmZoKQpmb3IodD1KLklU
+KHUuUi5iKGEpKTt0LkYoKTspe3M9dC5nbCgpCnI9Si5VNihzKQpxPUwucDIoSC55KHIucShzLCJ0eXBl
+IikpKQpwPUgueShyLnEocywibmFtZSIpKQpvPXIucShzLCJzdWJ0cmVlIikKbz1vPT1udWxsP251bGw6
+TC5tSyhvKQpDLk5tLmkobixuZXcgTC5aWihxLHAsbyxILnkoci5xKHMsInBhdGgiKSksSC55KHIucShz
+LCJocmVmIikpLEguU2Moci5xKHMsImVkaXRDb3VudCIpKSkpfXJldHVybiBufSwKcDI6ZnVuY3Rpb24o
+YSl7c3dpdGNoKGEpe2Nhc2UiZGlyZWN0b3J5IjpyZXR1cm4gQy5ZMgpjYXNlImZpbGUiOnJldHVybiBD
+LnJmCmRlZmF1bHQ6dGhyb3cgSC5iKFAuUFYoIlVucmVjb2duaXplZCBuYXZpZ2F0aW9uIHRyZWUgbm9k
+ZSB0eXBlOiAiK0guZChhKSkpfX0sClpaOmZ1bmN0aW9uIFpaKGEsYixjLGQsZSxmKXt2YXIgXz10aGlz
+Cl8uYT1hCl8uYj1iCl8uYz1jCl8uZD1kCl8uZT1lCl8uZj1mfSwKeTg6ZnVuY3Rpb24geTgoYSl7dGhp
+cy5iPWF9LApJVjpmdW5jdGlvbiBJVihhLGIsYyxkKXt2YXIgXz10aGlzCl8uZD1hCl8uZT1iCl8uZj1j
+Cl8ucj1kfX0sTT17CllGOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvLG4KZm9yKHQ9Yi5sZW5n
+dGgscz0xO3M8dDsrK3Mpe2lmKGJbc109PW51bGx8fGJbcy0xXSE9bnVsbCljb250aW51ZQpmb3IoO3Q+
+PTE7dD1yKXtyPXQtMQppZihiW3JdIT1udWxsKWJyZWFrfXE9bmV3IFAuUm4oIiIpCnA9YSsiKCIKcS5h
+PXAKbz1ILnFDKGIsMCx0LEgudDYoYikuZCkKbj1vLiR0aQpuPXArbmV3IEguQTgobyxuLkMoInFVKGFM
+LkUpIikuYihuZXcgTS5ObygpKSxuLkMoIkE4PGFMLkUscVU+IikpLkgoMCwiLCAiKQpxLmE9bgpxLmE9
+bisoIik6IHBhcnQgIisocy0xKSsiIHdhcyBudWxsLCBidXQgcGFydCAiK3MrIiB3YXMgbm90LiIpCnRo
+cm93IEguYihQLnhZKHEudygwKSkpfX0sCmxJOmZ1bmN0aW9uIGxJKGEpe3RoaXMuYT1hfSwKTWk6ZnVu
+Y3Rpb24gTWkoKXt9LApxNzpmdW5jdGlvbiBxNygpe30sCk5vOmZ1bmN0aW9uIE5vKCl7fX0sWD17CkNM
+OmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvPWIueFooYSkKYi5oSyhhKQppZihvIT1udWxsKWE9
+Si5LVihhLG8ubGVuZ3RoKQp0PXUucwpzPUguVk0oW10sdCkKcj1ILlZNKFtdLHQpCnQ9YS5sZW5ndGgK
+aWYodCE9PTAmJmIucjQoQy54Qi5XKGEsMCkpKXtpZigwPj10KXJldHVybiBILk9IKGEsMCkKQy5ObS5p
+KHIsYVswXSkKcT0xfWVsc2V7Qy5ObS5pKHIsIiIpCnE9MH1mb3IocD1xO3A8dDsrK3ApaWYoYi5yNChD
+LnhCLlcoYSxwKSkpe0MuTm0uaShzLEMueEIuTmooYSxxLHApKQpDLk5tLmkocixhW3BdKQpxPXArMX1p
+ZihxPHQpe0MuTm0uaShzLEMueEIuRyhhLHEpKQpDLk5tLmkociwiIil9cmV0dXJuIG5ldyBYLldEKGIs
+byxzLHIpfSwKV0Q6ZnVuY3Rpb24gV0QoYSxiLGMsZCl7dmFyIF89dGhpcwpfLmE9YQpfLmI9YgpfLmQ9
+YwpfLmU9ZH0sCnFSOmZ1bmN0aW9uIHFSKGEpe3RoaXMuYT1hfSwKSlQ6ZnVuY3Rpb24oYSl7cmV0dXJu
+IG5ldyBYLmR2KGEpfSwKZHY6ZnVuY3Rpb24gZHYoYSl7dGhpcy5hPWF9fSxPPXsKUmg6ZnVuY3Rpb24o
+KXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGk9bnVsbAppZihQLnVvKCkuZ0ZpKCkhPT0iZmlsZSIp
+cmV0dXJuICQuRWIoKQp0PVAudW8oKQppZighQy54Qi5UYyh0LmdJaSh0KSwiLyIpKXJldHVybiAkLkVi
+KCkKcz1QLlBpKGksMCwwKQpyPVAuelIoaSwwLDApCnE9UC5PZShpLDAsMCwhMSkKcD1QLmxlKGksMCww
+LGkpCm89UC50RyhpLDAsMCkKbj1QLndCKGkscykKbT1zPT09ImZpbGUiCmlmKHE9PW51bGwpdD1yLmxl
+bmd0aCE9PTB8fG4hPW51bGx8fG0KZWxzZSB0PSExCmlmKHQpcT0iIgp0PXE9PW51bGwKbD0hdAprPVAu
+a2EoImEvYiIsMCwzLGkscyxsKQpqPXMubGVuZ3RoPT09MAppZihqJiZ0JiYhQy54Qi5uKGssIi8iKSlr
+PVAud0Yoaywhanx8bCkKZWxzZSBrPVAueGUoaykKaWYobmV3IFAuRG4ocyxyLHQmJkMueEIubihrLCIv
+LyIpPyIiOnEsbixrLHAsbykudDQoKT09PSJhXFxiIilyZXR1cm4gJC5LaygpCnJldHVybiAkLmJEKCl9
+LAp6TDpmdW5jdGlvbiB6TCgpe319LEU9e09GOmZ1bmN0aW9uIE9GKGEsYixjKXt0aGlzLmQ9YQp0aGlz
+LmU9Ygp0aGlzLmY9Y319LEY9e3J1OmZ1bmN0aW9uIHJ1KGEsYixjLGQpe3ZhciBfPXRoaXMKXy5kPWEK
+Xy5lPWIKXy5mPWMKXy5yPWR9fSxEPXsKUlg6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9UC51bygpCmlmKEou
+Uk0ociwkLkk2KSlyZXR1cm4gJC5GZgokLkk2PXIKaWYoJC5IaygpPT0kLkViKCkpcmV0dXJuICQuRmY9
+ci5aSSgiLiIpLncoMCkKZWxzZXt0PXIudDQoKQpzPXQubGVuZ3RoLTEKcmV0dXJuICQuRmY9cz09PTA/
+dDpDLnhCLk5qKHQsMCxzKX19LApucjpmdW5jdGlvbihhLGIpe3ZhciB0PW51bGwKcmV0dXJuICQublUo
+KS5xNygwLGEsYix0LHQsdCx0LHQsdCl9fQp2YXIgdz1bQyxILEosUCxXLFUsQixULEwsTSxYLE8sRSxG
+LERdCmh1bmtIZWxwZXJzLnNldEZ1bmN0aW9uTmFtZXNJZk5lY2Vzc2FyeSh3KQp2YXIgJD17fQpILmVv
+LnByb3RvdHlwZT17fQpKLnZCLnByb3RvdHlwZT17CkROOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PT1i
+fSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBILmVRKGEpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4iSW5z
+dGFuY2Ugb2YgJyIrSC5kKEguTShhKSkrIicifSwKZTc6ZnVuY3Rpb24oYSxiKXt1Lm8uYihiKQp0aHJv
+dyBILmIoUC5scihhLGIuZ1dhKCksYi5nbmQoKSxiLmdWbSgpKSl9fQpKLnlFLnByb3RvdHlwZT17Cnc6
+ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKX0sCmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gYT81MTkw
+MTg6MjE4MTU5fSwKJGlhMjoxfQpKLllFLnByb3RvdHlwZT17CkROOmZ1bmN0aW9uKGEsYil7cmV0dXJu
+IG51bGw9PWJ9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiJudWxsIn0sCmdpTzpmdW5jdGlvbihhKXtyZXR1
+cm4gMH0sCmU3OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuU2ooYSx1Lm8uYihiKSl9LAokaWM4OjF9
+CkouTUYucHJvdG90eXBlPXsKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiAwfSwKdzpmdW5jdGlvbihhKXty
+ZXR1cm4gU3RyaW5nKGEpfSwKJGl2bToxfQpKLmlDLnByb3RvdHlwZT17fQpKLmtkLnByb3RvdHlwZT17
+fQpKLmM1LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHQ9YVskLncoKV0KaWYodD09bnVsbCly
+ZXR1cm4gdGhpcy50KGEpCnJldHVybiJKYXZhU2NyaXB0IGZ1bmN0aW9uIGZvciAiK0guZChKLmoodCkp
+fSwKJFM6ZnVuY3Rpb24oKXtyZXR1cm57ZnVuYzoxLG9wdDpbLCwsLCwsLCwsLCwsLCwsLF19fSwKJGlF
+SDoxfQpKLmpkLnByb3RvdHlwZT17Cmk6ZnVuY3Rpb24oYSxiKXtILnQ2KGEpLmQuYihiKQppZighIWEu
+Zml4ZWQkbGVuZ3RoKUgudmgoUC5MNCgiYWRkIikpCmEucHVzaChiKX0sClc0OmZ1bmN0aW9uKGEsYil7
+dmFyIHQKaWYoISFhLmZpeGVkJGxlbmd0aClILnZoKFAuTDQoInJlbW92ZUF0IikpCnQ9YS5sZW5ndGgK
+aWYoYj49dCl0aHJvdyBILmIoUC54KGIsbnVsbCkpCnJldHVybiBhLnNwbGljZShiLDEpWzBdfSwKVUc6
+ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscgpILnQ2KGEpLkMoImNYPDE+IikuYihjKQppZighIWEuZml4
+ZWQkbGVuZ3RoKUgudmgoUC5MNCgiaW5zZXJ0QWxsIikpCnQ9YS5sZW5ndGgKUC53QShiLDAsdCwiaW5k
+ZXgiKQpzPWMubGVuZ3RoCnRoaXMuc0EoYSx0K3MpCnI9YitzCnRoaXMuWVcoYSxyLGEubGVuZ3RoLGEs
+YikKdGhpcy52ZyhhLGIscixjKX0sCm12OmZ1bmN0aW9uKGEpe2lmKCEhYS5maXhlZCRsZW5ndGgpSC52
+aChQLkw0KCJyZW1vdmVMYXN0IikpCmlmKGEubGVuZ3RoPT09MCl0aHJvdyBILmIoSC5IWShhLC0xKSkK
+cmV0dXJuIGEucG9wKCl9LApGVjpmdW5jdGlvbihhLGIpe3ZhciB0CkgudDYoYSkuQygiY1g8MT4iKS5i
+KGIpCmlmKCEhYS5maXhlZCRsZW5ndGgpSC52aChQLkw0KCJhZGRBbGwiKSkKZm9yKHQ9Si5JVChiKTt0
+LkYoKTspYS5wdXNoKHQuZ2woKSl9LApLOmZ1bmN0aW9uKGEsYil7dmFyIHQscwpILnQ2KGEpLkMoIn4o
+MSkiKS5iKGIpCnQ9YS5sZW5ndGgKZm9yKHM9MDtzPHQ7KytzKXtiLiQxKGFbc10pCmlmKGEubGVuZ3Ro
+IT09dCl0aHJvdyBILmIoUC5hNChhKSl9fSwKRTI6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PUgudDYoYSkK
+cmV0dXJuIG5ldyBILkE4KGEsdC5LcShjKS5DKCIxKDIpIikuYihiKSx0LkMoIkA8MT4iKS5LcShjKS5D
+KCJBODwxLDI+IikpfSwKSDpmdW5jdGlvbihhLGIpe3ZhciB0LHM9bmV3IEFycmF5KGEubGVuZ3RoKQpz
+LmZpeGVkJGxlbmd0aD1BcnJheQpmb3IodD0wO3Q8YS5sZW5ndGg7Kyt0KXRoaXMuWShzLHQsSC5kKGFb
+dF0pKQpyZXR1cm4gcy5qb2luKGIpfSwKTjA6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscyxyCmQuYihi
+KQpILnQ2KGEpLktxKGQpLkMoIjEoMSwyKSIpLmIoYykKdD1hLmxlbmd0aApmb3Iocz1iLHI9MDtyPHQ7
+KytyKXtzPWMuJDIocyxhW3JdKQppZihhLmxlbmd0aCE9PXQpdGhyb3cgSC5iKFAuYTQoYSkpfXJldHVy
+biBzfSwKRTpmdW5jdGlvbihhLGIpe2lmKGI8MHx8Yj49YS5sZW5ndGgpcmV0dXJuIEguT0goYSxiKQpy
+ZXR1cm4gYVtiXX0sCkQ2OmZ1bmN0aW9uKGEsYixjKXtpZihiPDB8fGI+YS5sZW5ndGgpdGhyb3cgSC5i
+KFAuVEUoYiwwLGEubGVuZ3RoLCJzdGFydCIsbnVsbCkpCmlmKGM8Ynx8Yz5hLmxlbmd0aCl0aHJvdyBI
+LmIoUC5URShjLGIsYS5sZW5ndGgsImVuZCIsbnVsbCkpCmlmKGI9PT1jKXJldHVybiBILlZNKFtdLEgu
+dDYoYSkpCnJldHVybiBILlZNKGEuc2xpY2UoYixjKSxILnQ2KGEpKX0sCmdyWjpmdW5jdGlvbihhKXt2
+YXIgdD1hLmxlbmd0aAppZih0PjApcmV0dXJuIGFbdC0xXQp0aHJvdyBILmIoSC5XcCgpKX0sCllXOmZ1
+bmN0aW9uKGEsYixjLGQsZSl7dmFyIHQscyxyPUgudDYoYSkKci5DKCJjWDwxPiIpLmIoZCkKaWYoISFh
+LmltbXV0YWJsZSRsaXN0KUgudmgoUC5MNCgic2V0UmFuZ2UiKSkKUC5qQihiLGMsYS5sZW5ndGgpCnQ9
+Yy1iCmlmKHQ9PT0wKXJldHVybgpQLmsxKGUsInNraXBDb3VudCIpCnIuQygiek08MT4iKS5iKGQpCnI9
+Si5VNihkKQppZihlK3Q+ci5nQShkKSl0aHJvdyBILmIoSC5hcigpKQppZihlPGIpZm9yKHM9dC0xO3M+
+PTA7LS1zKWFbYitzXT1yLnEoZCxlK3MpCmVsc2UgZm9yKHM9MDtzPHQ7KytzKWFbYitzXT1yLnEoZCxl
+K3MpfSwKdmc6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuWVcoYSxiLGMsZCwwKX0sClZyOmZ1
+bmN0aW9uKGEsYil7dmFyIHQscwpILnQ2KGEpLkMoImEyKDEpIikuYihiKQp0PWEubGVuZ3RoCmZvcihz
+PTA7czx0Oysrcyl7aWYoSC5vVChiLiQxKGFbc10pKSlyZXR1cm4hMAppZihhLmxlbmd0aCE9PXQpdGhy
+b3cgSC5iKFAuYTQoYSkpfXJldHVybiExfSwKdGc6ZnVuY3Rpb24oYSxiKXt2YXIgdApmb3IodD0wO3Q8
+YS5sZW5ndGg7Kyt0KWlmKEouUk0oYVt0XSxiKSlyZXR1cm4hMApyZXR1cm4hMX0sCnc6ZnVuY3Rpb24o
+YSl7cmV0dXJuIFAuV0UoYSwiWyIsIl0iKX0sCmdrejpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEoubTEo
+YSxhLmxlbmd0aCxILnQ2KGEpLkMoIm0xPDE+IikpfSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBILmVR
+KGEpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKc0E6ZnVuY3Rpb24oYSxiKXtpZigh
+IWEuZml4ZWQkbGVuZ3RoKUgudmgoUC5MNCgic2V0IGxlbmd0aCIpKQppZihiPDApdGhyb3cgSC5iKFAu
+VEUoYiwwLG51bGwsIm5ld0xlbmd0aCIsbnVsbCkpCmEubGVuZ3RoPWJ9LApxOmZ1bmN0aW9uKGEsYil7
+SC5TYyhiKQppZihiPj1hLmxlbmd0aHx8YjwwKXRocm93IEguYihILkhZKGEsYikpCnJldHVybiBhW2Jd
+fSwKWTpmdW5jdGlvbihhLGIsYyl7SC50NihhKS5kLmIoYykKaWYoISFhLmltbXV0YWJsZSRsaXN0KUgu
+dmgoUC5MNCgiaW5kZXhlZCBzZXQiKSkKaWYoYj49YS5sZW5ndGh8fGI8MCl0aHJvdyBILmIoSC5IWShh
+LGIpKQphW2JdPWN9LAokaWNYOjEsCiRpek06MX0KSi5Qby5wcm90b3R5cGU9e30KSi5tMS5wcm90b3R5
+cGU9ewpnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR9LApGOmZ1bmN0aW9uKCl7dmFyIHQscz10aGlz
+LHI9cy5hLHE9ci5sZW5ndGgKaWYocy5iIT09cSl0aHJvdyBILmIoSC5sayhyKSkKdD1zLmMKaWYodD49
+cSl7cy5zTShudWxsKQpyZXR1cm4hMX1zLnNNKHJbdF0pOysrcy5jCnJldHVybiEwfSwKc006ZnVuY3Rp
+b24oYSl7dGhpcy5kPXRoaXMuJHRpLmQuYihhKX0sCiRpQW46MX0KSi5xSS5wcm90b3R5cGU9ewp5dTpm
+dW5jdGlvbihhKXt2YXIgdAppZihhPj0tMjE0NzQ4MzY0OCYmYTw9MjE0NzQ4MzY0NylyZXR1cm4gYXww
+CmlmKGlzRmluaXRlKGEpKXt0PWE8MD9NYXRoLmNlaWwoYSk6TWF0aC5mbG9vcihhKQpyZXR1cm4gdCsw
+fXRocm93IEguYihQLkw0KCIiK2ErIi50b0ludCgpIikpfSwKelE6ZnVuY3Rpb24oYSl7aWYoYT4wKXtp
+ZihhIT09MS8wKXJldHVybiBNYXRoLnJvdW5kKGEpfWVsc2UgaWYoYT4tMS8wKXJldHVybiAwLU1hdGgu
+cm91bmQoMC1hKQp0aHJvdyBILmIoUC5MNCgiIithKyIucm91bmQoKSIpKX0sCldaOmZ1bmN0aW9uKGEs
+Yil7dmFyIHQscyxyLHEKaWYoYjwyfHxiPjM2KXRocm93IEguYihQLlRFKGIsMiwzNiwicmFkaXgiLG51
+bGwpKQp0PWEudG9TdHJpbmcoYikKaWYoQy54Qi5tKHQsdC5sZW5ndGgtMSkhPT00MSlyZXR1cm4gdApz
+PS9eKFtcZGEtel0rKSg/OlwuKFtcZGEtel0rKSk/XChlXCsoXGQrKVwpJC8uZXhlYyh0KQppZihzPT1u
+dWxsKUgudmgoUC5MNCgiVW5leHBlY3RlZCB0b1N0cmluZyByZXN1bHQ6ICIrdCkpCnI9cy5sZW5ndGgK
+aWYoMT49cilyZXR1cm4gSC5PSChzLDEpCnQ9c1sxXQppZigzPj1yKXJldHVybiBILk9IKHMsMykKcT0r
+c1szXQpyPXNbMl0KaWYociE9bnVsbCl7dCs9cgpxLT1yLmxlbmd0aH1yZXR1cm4gdCtDLnhCLkl4KCIw
+IixxKX0sCnc6ZnVuY3Rpb24oYSl7aWYoYT09PTAmJjEvYTwwKXJldHVybiItMC4wIgplbHNlIHJldHVy
+biIiK2F9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscD1hfDAKaWYoYT09PXApcmV0dXJuIDUz
+Njg3MDkxMSZwCnQ9TWF0aC5hYnMoYSkKcz1NYXRoLmxvZyh0KS8wLjY5MzE0NzE4MDU1OTk0NTN8MApy
+PU1hdGgucG93KDIscykKcT10PDE/dC9yOnIvdApyZXR1cm4gNTM2ODcwOTExJigocSo5MDA3MTk5MjU0
+NzQwOTkyfDApKyhxKjM1NDIyNDMxODExNzY1MjF8MCkpKjU5OTE5NytzKjEyNTl9LAp6WTpmdW5jdGlv
+bihhLGIpe3ZhciB0PWElYgppZih0PT09MClyZXR1cm4gMAppZih0PjApcmV0dXJuIHQKaWYoYjwwKXJl
+dHVybiB0LWIKZWxzZSByZXR1cm4gdCtifSwKd0c6ZnVuY3Rpb24oYSxiKXt2YXIgdAppZihhPjApdD10
+aGlzLnAzKGEsYikKZWxzZXt0PWI+MzE/MzE6Ygp0PWE+PnQ+Pj4wfXJldHVybiB0fSwKYmY6ZnVuY3Rp
+b24oYSxiKXtpZihiPDApdGhyb3cgSC5iKEgudEwoYikpCnJldHVybiB0aGlzLnAzKGEsYil9LApwMzpm
+dW5jdGlvbihhLGIpe3JldHVybiBiPjMxPzA6YT4+PmJ9LAokaUNQOjEsCiRpRks6MX0KSi51ci5wcm90
+b3R5cGU9eyRpS046MX0KSi5WQS5wcm90b3R5cGU9e30KSi5Eci5wcm90b3R5cGU9ewptOmZ1bmN0aW9u
+KGEsYil7aWYoYjwwKXRocm93IEguYihILkhZKGEsYikpCmlmKGI+PWEubGVuZ3RoKUgudmgoSC5IWShh
+LGIpKQpyZXR1cm4gYS5jaGFyQ29kZUF0KGIpfSwKVzpmdW5jdGlvbihhLGIpe2lmKGI+PWEubGVuZ3Ro
+KXRocm93IEguYihILkhZKGEsYikpCnJldHVybiBhLmNoYXJDb2RlQXQoYil9LApkZDpmdW5jdGlvbihh
+LGIpe3JldHVybiBuZXcgSC51bihiLGEsMCl9LApoOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGIhPSJz
+dHJpbmciKXRocm93IEguYihQLkwzKGIsbnVsbCxudWxsKSkKcmV0dXJuIGErYn0sClRjOmZ1bmN0aW9u
+KGEsYil7dmFyIHQ9Yi5sZW5ndGgscz1hLmxlbmd0aAppZih0PnMpcmV0dXJuITEKcmV0dXJuIGI9PT10
+aGlzLkcoYSxzLXQpfSwKaTc6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscwpjPVAuakIoYixjLGEubGVu
+Z3RoKQp0PWEuc3Vic3RyaW5nKDAsYikKcz1hLnN1YnN0cmluZyhjKQpyZXR1cm4gdCtkK3N9LApRaTpm
+dW5jdGlvbihhLGIsYyl7dmFyIHQKaWYoIUgub2soYykpSC52aChILnRMKGMpKQppZih0eXBlb2YgYyE9
+PSJudW1iZXIiKXJldHVybiBjLkooKQppZihjPDB8fGM+YS5sZW5ndGgpdGhyb3cgSC5iKFAuVEUoYyww
+LGEubGVuZ3RoLG51bGwsbnVsbCkpCnQ9YytiLmxlbmd0aAppZih0PmEubGVuZ3RoKXJldHVybiExCnJl
+dHVybiBiPT09YS5zdWJzdHJpbmcoYyx0KX0sCm46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5RaShh
+LGIsMCl9LApOajpmdW5jdGlvbihhLGIsYyl7aWYoIUgub2soYikpSC52aChILnRMKGIpKQppZihjPT1u
+dWxsKWM9YS5sZW5ndGgKaWYodHlwZW9mIGIhPT0ibnVtYmVyIilyZXR1cm4gYi5KKCkKaWYoYjwwKXRo
+cm93IEguYihQLngoYixudWxsKSkKaWYoYj5jKXRocm93IEguYihQLngoYixudWxsKSkKaWYoYz5hLmxl
+bmd0aCl0aHJvdyBILmIoUC54KGMsbnVsbCkpCnJldHVybiBhLnN1YnN0cmluZyhiLGMpfSwKRzpmdW5j
+dGlvbihhLGIpe3JldHVybiB0aGlzLk5qKGEsYixudWxsKX0sCmhjOmZ1bmN0aW9uKGEpe3JldHVybiBh
+LnRvTG93ZXJDYXNlKCl9LApiUzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT1hLnRyaW0oKSxwPXEubGVu
+Z3RoCmlmKHA9PT0wKXJldHVybiBxCmlmKHRoaXMuVyhxLDApPT09MTMzKXt0PUoubW0ocSwxKQppZih0
+PT09cClyZXR1cm4iIn1lbHNlIHQ9MApzPXAtMQpyPXRoaXMubShxLHMpPT09MTMzP0ouYzEocSxzKTpw
+CmlmKHQ9PT0wJiZyPT09cClyZXR1cm4gcQpyZXR1cm4gcS5zdWJzdHJpbmcodCxyKX0sCkl4OmZ1bmN0
+aW9uKGEsYil7dmFyIHQscwppZigwPj1iKXJldHVybiIiCmlmKGI9PT0xfHxhLmxlbmd0aD09PTApcmV0
+dXJuIGEKaWYoYiE9PWI+Pj4wKXRocm93IEguYihDLkVxKQpmb3IodD1hLHM9IiI7ITA7KXtpZigoYiYx
+KT09PTEpcz10K3MKYj1iPj4+MQppZihiPT09MClicmVhawp0Kz10fXJldHVybiBzfSwKWFU6ZnVuY3Rp
+b24oYSxiLGMpe3ZhciB0CmlmKGM8MHx8Yz5hLmxlbmd0aCl0aHJvdyBILmIoUC5URShjLDAsYS5sZW5n
+dGgsbnVsbCxudWxsKSkKdD1hLmluZGV4T2YoYixjKQpyZXR1cm4gdH0sCk9ZOmZ1bmN0aW9uKGEsYil7
+cmV0dXJuIHRoaXMuWFUoYSxiLDApfSwKUGs6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMKaWYoYz09bnVs
+bCljPWEubGVuZ3RoCmVsc2UgaWYoYzwwfHxjPmEubGVuZ3RoKXRocm93IEguYihQLlRFKGMsMCxhLmxl
+bmd0aCxudWxsLG51bGwpKQp0PWIubGVuZ3RoCnM9YS5sZW5ndGgKaWYoYyt0PnMpYz1zLXQKcmV0dXJu
+IGEubGFzdEluZGV4T2YoYixjKX0sCmNuOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuUGsoYSxiLG51
+bGwpfSwKSXM6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PWEubGVuZ3RoCmlmKGM+dCl0aHJvdyBILmIoUC5U
+RShjLDAsdCxudWxsLG51bGwpKQpyZXR1cm4gSC5tMihhLGIsYyl9LAp0ZzpmdW5jdGlvbihhLGIpe3Jl
+dHVybiB0aGlzLklzKGEsYiwwKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LApnaU86ZnVuY3Rpb24o
+YSl7dmFyIHQscyxyCmZvcih0PWEubGVuZ3RoLHM9MCxyPTA7cjx0Oysrcil7cz01MzY4NzA5MTEmcyth
+LmNoYXJDb2RlQXQocikKcz01MzY4NzA5MTEmcysoKDUyNDI4NyZzKTw8MTApCnNePXM+PjZ9cz01MzY4
+NzA5MTEmcysoKDY3MTA4ODYzJnMpPDwzKQpzXj1zPj4xMQpyZXR1cm4gNTM2ODcwOTExJnMrKCgxNjM4
+MyZzKTw8MTUpfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIp
+e0guU2MoYikKaWYoYj49YS5sZW5ndGh8fCExKXRocm93IEguYihILkhZKGEsYikpCnJldHVybiBhW2Jd
+fSwKJGl2WDoxLAokaXFVOjF9CkgucWoucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRo
+aXMuYS5sZW5ndGh9LApxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEMueEIubSh0aGlzLmEsSC5TYyhiKSl9
+fQpILmJRLnByb3RvdHlwZT17fQpILmFMLnByb3RvdHlwZT17CmdrejpmdW5jdGlvbihhKXt2YXIgdD10
+aGlzCnJldHVybiBuZXcgSC5hNyh0LHQuZ0EodCksSC5MaCh0KS5DKCJhNzxhTC5FPiIpKX0sCkg6ZnVu
+Y3Rpb24oYSxiKXt2YXIgdCxzLHIscT10aGlzLHA9cS5nQShxKQppZihiLmxlbmd0aCE9PTApe2lmKHA9
+PT0wKXJldHVybiIiCnQ9SC5kKHEuRSgwLDApKQppZihwIT09cS5nQShxKSl0aHJvdyBILmIoUC5hNChx
+KSkKZm9yKHM9dCxyPTE7cjxwOysrcil7cz1zK2IrSC5kKHEuRSgwLHIpKQppZihwIT09cS5nQShxKSl0
+aHJvdyBILmIoUC5hNChxKSl9cmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9ZWxzZXtmb3Iocj0w
+LHM9IiI7cjxwOysrcil7cys9SC5kKHEuRSgwLHIpKQppZihwIT09cS5nQShxKSl0aHJvdyBILmIoUC5h
+NChxKSl9cmV0dXJuIHMuY2hhckNvZGVBdCgwKT09MD9zOnN9fSwKZXY6ZnVuY3Rpb24oYSxiKXtyZXR1
+cm4gdGhpcy5HRygwLEguTGgodGhpcykuQygiYTIoYUwuRSkiKS5iKGIpKX19CkgubkgucHJvdG90eXBl
+PXsKZ1VEOmZ1bmN0aW9uKCl7dmFyIHQ9Si5IbSh0aGlzLmEpLHM9dGhpcy5jCmlmKHM9PW51bGx8fHM+
+dClyZXR1cm4gdApyZXR1cm4gc30sCmdBczpmdW5jdGlvbigpe3ZhciB0PUouSG0odGhpcy5hKSxzPXRo
+aXMuYgppZihzPnQpcmV0dXJuIHQKcmV0dXJuIHN9LApnQTpmdW5jdGlvbihhKXt2YXIgdCxzPUouSG0o
+dGhpcy5hKSxyPXRoaXMuYgppZihyPj1zKXJldHVybiAwCnQ9dGhpcy5jCmlmKHQ9PW51bGx8fHQ+PXMp
+cmV0dXJuIHMtcgppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiB0LkhOKCkKcmV0dXJuIHQtcn0s
+CkU6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPXRoaXMscj1zLmdBcygpK2IKaWYoYj49MCl7dD1zLmdVRCgp
+CmlmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJuIEgucFkodCkKdD1yPj10fWVsc2UgdD0hMAppZih0
+KXRocm93IEguYihQLkNmKGIscywiaW5kZXgiLG51bGwsbnVsbCkpCnJldHVybiBKLkdBKHMuYSxyKX19
+CkguYTcucHJvdG90eXBlPXsKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwKRjpmdW5jdGlvbigp
+e3ZhciB0LHM9dGhpcyxyPXMuYSxxPUouVTYocikscD1xLmdBKHIpCmlmKHMuYiE9PXApdGhyb3cgSC5i
+KFAuYTQocikpCnQ9cy5jCmlmKHQ+PXApe3Muc0kobnVsbCkKcmV0dXJuITF9cy5zSShxLkUocix0KSk7
+KytzLmMKcmV0dXJuITB9LApzSTpmdW5jdGlvbihhKXt0aGlzLmQ9dGhpcy4kdGkuZC5iKGEpfSwKJGlB
+bjoxfQpILkE4LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBKLkhtKHRoaXMuYSl9LApF
+OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYi4kMShKLkdBKHRoaXMuYSxiKSl9fQpILlU1LnByb3Rv
+dHlwZT17CmdrejpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguU08oSi5JVCh0aGlzLmEpLHRoaXMuYix0
+aGlzLiR0aS5DKCJTTzwxPiIpKX19CkguU08ucHJvdG90eXBlPXsKRjpmdW5jdGlvbigpe3ZhciB0LHMK
+Zm9yKHQ9dGhpcy5hLHM9dGhpcy5iO3QuRigpOylpZihILm9UKHMuJDEodC5nbCgpKSkpcmV0dXJuITAK
+cmV0dXJuITF9LApnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuZ2woKX19CkguU1UucHJvdG90eXBl
+PXt9CkguUmUucHJvdG90eXBlPXsKWTpmdW5jdGlvbihhLGIsYyl7SC5MaCh0aGlzKS5DKCJSZS5FIiku
+YihjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IG1vZGlmeSBhbiB1bm1vZGlmaWFibGUgbGlzdCIpKX19
+CkguWEMucHJvdG90eXBlPXt9Ckgud3YucHJvdG90eXBlPXsKZ2lPOmZ1bmN0aW9uKGEpe3ZhciB0PXRo
+aXMuX2hhc2hDb2RlCmlmKHQhPW51bGwpcmV0dXJuIHQKdD01MzY4NzA5MTEmNjY0NTk3KkouaGYodGhp
+cy5hKQp0aGlzLl9oYXNoQ29kZT10CnJldHVybiB0fSwKdzpmdW5jdGlvbihhKXtyZXR1cm4nU3ltYm9s
+KCInK0guZCh0aGlzLmEpKyciKSd9LApETjpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEK
+cmV0dXJuIGIgaW5zdGFuY2VvZiBILnd2JiZ0aGlzLmE9PWIuYX0sCiRpR0Q6MX0KSC5QRC5wcm90b3R5
+cGU9e30KSC5XVS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLm5PKHRoaXMpfSwKWTpm
+dW5jdGlvbihhLGIsYyl7dmFyIHQ9SC5MaCh0aGlzKQp0LmQuYihiKQp0LmNoWzFdLmIoYykKcmV0dXJu
+IEguZGMoKX0sCiRpWjA6MX0KSC5MUC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhp
+cy5hfSwKeDQ6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPSJzdHJpbmciKXJldHVybiExCmlmKCJfX3By
+b3RvX18iPT09YSlyZXR1cm4hMQpyZXR1cm4gdGhpcy5iLmhhc093blByb3BlcnR5KGEpfSwKcTpmdW5j
+dGlvbihhLGIpe2lmKCF0aGlzLng0KGIpKXJldHVybiBudWxsCnJldHVybiB0aGlzLnFQKGIpfSwKcVA6
+ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYltILnkoYSldfSwKSzpmdW5jdGlvbihhLGIpe3ZhciB0LHMs
+cixxLHA9SC5MaCh0aGlzKQpwLkMoIn4oMSwyKSIpLmIoYikKdD10aGlzLmMKZm9yKHM9dC5sZW5ndGgs
+cD1wLmNoWzFdLHI9MDtyPHM7KytyKXtxPXRbcl0KYi4kMihxLHAuYih0aGlzLnFQKHEpKSl9fX0KSC5M
+SS5wcm90b3R5cGU9ewpnV2E6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmEKcmV0dXJuIHR9LApnbmQ6ZnVu
+Y3Rpb24oKXt2YXIgdCxzLHIscSxwPXRoaXMKaWYocC5jPT09MSlyZXR1cm4gQy5oVQp0PXAuZApzPXQu
+bGVuZ3RoLXAuZS5sZW5ndGgtcC5mCmlmKHM9PT0wKXJldHVybiBDLmhVCnI9W10KZm9yKHE9MDtxPHM7
+KytxKXtpZihxPj10Lmxlbmd0aClyZXR1cm4gSC5PSCh0LHEpCnIucHVzaCh0W3FdKX1yZXR1cm4gSi56
+QyhyKX0sCmdWbTpmdW5jdGlvbigpe3ZhciB0LHMscixxLHAsbyxuLG0sbD10aGlzCmlmKGwuYyE9PTAp
+cmV0dXJuIEMuQ00KdD1sLmUKcz10Lmxlbmd0aApyPWwuZApxPXIubGVuZ3RoLXMtbC5mCmlmKHM9PT0w
+KXJldHVybiBDLkNNCnA9bmV3IEguTjUodS5lbykKZm9yKG89MDtvPHM7KytvKXtpZihvPj10Lmxlbmd0
+aClyZXR1cm4gSC5PSCh0LG8pCm49dFtvXQptPXErbwppZihtPDB8fG0+PXIubGVuZ3RoKXJldHVybiBI
+Lk9IKHIsbSkKcC5ZKDAsbmV3IEgud3YobiksclttXSl9cmV0dXJuIG5ldyBILlBEKHAsdS5nRil9LAok
+aXZROjF9CkguQ2oucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgdApILnkoYSkKdD10aGlz
+LmEKdC5iPXQuYisiJCIrSC5kKGEpCkMuTm0uaSh0aGlzLmIsYSkKQy5ObS5pKHRoaXMuYyxiKTsrK3Qu
+YX0sCiRTOjEyfQpILmY5LnByb3RvdHlwZT17CnFTOmZ1bmN0aW9uKGEpe3ZhciB0LHMscj10aGlzLHE9
+bmV3IFJlZ0V4cChyLmEpLmV4ZWMoYSkKaWYocT09bnVsbClyZXR1cm4gbnVsbAp0PU9iamVjdC5jcmVh
+dGUobnVsbCkKcz1yLmIKaWYocyE9PS0xKXQuYXJndW1lbnRzPXFbcysxXQpzPXIuYwppZihzIT09LTEp
+dC5hcmd1bWVudHNFeHByPXFbcysxXQpzPXIuZAppZihzIT09LTEpdC5leHByPXFbcysxXQpzPXIuZQpp
+ZihzIT09LTEpdC5tZXRob2Q9cVtzKzFdCnM9ci5mCmlmKHMhPT0tMSl0LnJlY2VpdmVyPXFbcysxXQpy
+ZXR1cm4gdH19CkguVzAucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmIKaWYodD09
+bnVsbClyZXR1cm4iTm9TdWNoTWV0aG9kRXJyb3I6ICIrSC5kKHRoaXMuYSkKcmV0dXJuIk5vU3VjaE1l
+dGhvZEVycm9yOiBtZXRob2Qgbm90IGZvdW5kOiAnIit0KyInIG9uIG51bGwifX0KSC5hei5wcm90b3R5
+cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcyxyPSJOb1N1Y2hNZXRob2RFcnJvcjogbWV0aG9k
+IG5vdCBmb3VuZDogJyIscT1zLmIKaWYocT09bnVsbClyZXR1cm4iTm9TdWNoTWV0aG9kRXJyb3I6ICIr
+SC5kKHMuYSkKdD1zLmMKaWYodD09bnVsbClyZXR1cm4gcitxKyInICgiK0guZChzLmEpKyIpIgpyZXR1
+cm4gcitxKyInIG9uICciK3QrIicgKCIrSC5kKHMuYSkrIikifX0KSC52Vi5wcm90b3R5cGU9ewp3OmZ1
+bmN0aW9uKGEpe3ZhciB0PXRoaXMuYQpyZXR1cm4gdC5sZW5ndGg9PT0wPyJFcnJvciI6IkVycm9yOiAi
+K3R9fQpILmJxLnByb3RvdHlwZT17fQpILkFtLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe2lmKHUu
+YlUuYyhhKSlpZihhLiR0aHJvd25Kc0Vycm9yPT1udWxsKWEuJHRocm93bkpzRXJyb3I9dGhpcy5hCnJl
+dHVybiBhfSwKJFM6NH0KSC5YTy5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcy5i
+CmlmKHMhPW51bGwpcmV0dXJuIHMKcz10aGlzLmEKdD1zIT09bnVsbCYmdHlwZW9mIHM9PT0ib2JqZWN0
+Ij9zLnN0YWNrOm51bGwKcmV0dXJuIHRoaXMuYj10PT1udWxsPyIiOnR9LAokaUd6OjF9CkguVHAucHJv
+dG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmNvbnN0cnVjdG9yLHM9dD09bnVsbD9udWxs
+OnQubmFtZQpyZXR1cm4iQ2xvc3VyZSAnIitILk5RKHM9PW51bGw/InVua25vd24iOnMpKyInIn0sCiRp
+RUg6MSwKZ1FsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LAokQzoiJDEiLAokUjoxLAokRDpudWxsfQpI
+LmxjLnByb3RvdHlwZT17fQpILnp4LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy4k
+c3RhdGljX25hbWUKaWYodD09bnVsbClyZXR1cm4iQ2xvc3VyZSBvZiB1bmtub3duIHN0YXRpYyBtZXRo
+b2QiCnJldHVybiJDbG9zdXJlICciK0guTlEodCkrIicifX0KSC5yVC5wcm90b3R5cGU9ewpETjpmdW5j
+dGlvbihhLGIpe3ZhciB0PXRoaXMKaWYoYj09bnVsbClyZXR1cm4hMQppZih0PT09YilyZXR1cm4hMApp
+ZighKGIgaW5zdGFuY2VvZiBILnJUKSlyZXR1cm4hMQpyZXR1cm4gdC5hPT09Yi5hJiZ0LmI9PT1iLmIm
+JnQuYz09PWIuY30sCmdpTzpmdW5jdGlvbihhKXt2YXIgdCxzPXRoaXMuYwppZihzPT1udWxsKXQ9SC5l
+USh0aGlzLmEpCmVsc2UgdD10eXBlb2YgcyE9PSJvYmplY3QiP0ouaGYocyk6SC5lUShzKQpyZXR1cm4o
+dF5ILmVRKHRoaXMuYikpPj4+MH0sCnc6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5jCmlmKHQ9PW51bGwp
+dD10aGlzLmEKcmV0dXJuIkNsb3N1cmUgJyIrSC5kKHRoaXMuZCkrIicgb2YgIisoIkluc3RhbmNlIG9m
+ICciK0guZChILk0odCkpKyInIil9fQpILkVxLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJu
+IlJ1bnRpbWVFcnJvcjogIitILmQodGhpcy5hKX19Ckgua1kucHJvdG90eXBlPXsKdzpmdW5jdGlvbihh
+KXtyZXR1cm4iQXNzZXJ0aW9uIGZhaWxlZDogIitQLnAodGhpcy5hKX19CkguTjUucHJvdG90eXBlPXsK
+Z0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYX0sCmdWOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBILmk1
+KHRoaXMsSC5MaCh0aGlzKS5DKCJpNTwxPiIpKX0sCng0OmZ1bmN0aW9uKGEpe3ZhciB0LHMKaWYodHlw
+ZW9mIGE9PSJzdHJpbmciKXt0PXRoaXMuYgppZih0PT1udWxsKXJldHVybiExCnJldHVybiB0aGlzLlh1
+KHQsYSl9ZWxzZXtzPXRoaXMuQ1goYSkKcmV0dXJuIHN9fSwKQ1g6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhp
+cy5kCmlmKHQ9PW51bGwpcmV0dXJuITEKcmV0dXJuIHRoaXMuRmgodGhpcy5CdCh0LEouaGYoYSkmMHgz
+ZmZmZmZmKSxhKT49MH0sCnE6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwPXRoaXMsbz1udWxsCmlm
+KHR5cGVvZiBiPT0ic3RyaW5nIil7dD1wLmIKaWYodD09bnVsbClyZXR1cm4gbwpzPXAuajIodCxiKQpy
+PXM9PW51bGw/bzpzLmIKcmV0dXJuIHJ9ZWxzZSBpZih0eXBlb2YgYj09Im51bWJlciImJihiJjB4M2Zm
+ZmZmZik9PT1iKXtxPXAuYwppZihxPT1udWxsKXJldHVybiBvCnM9cC5qMihxLGIpCnI9cz09bnVsbD9v
+OnMuYgpyZXR1cm4gcn1lbHNlIHJldHVybiBwLmFhKGIpfSwKYWE6ZnVuY3Rpb24oYSl7dmFyIHQscyxy
+PXRoaXMuZAppZihyPT1udWxsKXJldHVybiBudWxsCnQ9dGhpcy5CdChyLEouaGYoYSkmMHgzZmZmZmZm
+KQpzPXRoaXMuRmgodCxhKQppZihzPDApcmV0dXJuIG51bGwKcmV0dXJuIHRbc10uYn0sClk6ZnVuY3Rp
+b24oYSxiLGMpe3ZhciB0LHMscixxLHAsbyxuPXRoaXMsbT1ILkxoKG4pCm0uZC5iKGIpCm0uY2hbMV0u
+YihjKQppZih0eXBlb2YgYj09InN0cmluZyIpe3Q9bi5iCm4uRUgodD09bnVsbD9uLmI9bi56SygpOnQs
+YixjKX1lbHNlIGlmKHR5cGVvZiBiPT0ibnVtYmVyIiYmKGImMHgzZmZmZmZmKT09PWIpe3M9bi5jCm4u
+RUgocz09bnVsbD9uLmM9bi56SygpOnMsYixjKX1lbHNle3I9bi5kCmlmKHI9PW51bGwpcj1uLmQ9bi56
+SygpCnE9Si5oZihiKSYweDNmZmZmZmYKcD1uLkJ0KHIscSkKaWYocD09bnVsbCluLkVJKHIscSxbbi5I
+bihiLGMpXSkKZWxzZXtvPW4uRmgocCxiKQppZihvPj0wKXBbb10uYj1jCmVsc2UgcC5wdXNoKG4uSG4o
+YixjKSl9fX0sCks6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHI9dGhpcwpILkxoKHIpLkMoIn4oMSwyKSIp
+LmIoYikKdD1yLmUKcz1yLnIKZm9yKDt0IT1udWxsOyl7Yi4kMih0LmEsdC5iKQppZihzIT09ci5yKXRo
+cm93IEguYihQLmE0KHIpKQp0PXQuY319LApFSDpmdW5jdGlvbihhLGIsYyl7dmFyIHQscz10aGlzLHI9
+SC5MaChzKQpyLmQuYihiKQpyLmNoWzFdLmIoYykKdD1zLmoyKGEsYikKaWYodD09bnVsbClzLkVJKGEs
+YixzLkhuKGIsYykpCmVsc2UgdC5iPWN9LAprczpmdW5jdGlvbigpe3RoaXMucj10aGlzLnIrMSY2NzEw
+ODg2M30sCkhuOmZ1bmN0aW9uKGEsYil7dmFyIHQscz10aGlzLHI9SC5MaChzKSxxPW5ldyBILmRiKHIu
+ZC5iKGEpLHIuY2hbMV0uYihiKSkKaWYocy5lPT1udWxsKXMuZT1zLmY9cQplbHNle3Q9cy5mCnEuZD10
+CnMuZj10LmM9cX0rK3MuYQpzLmtzKCkKcmV0dXJuIHF9LApGaDpmdW5jdGlvbihhLGIpe3ZhciB0LHMK
+aWYoYT09bnVsbClyZXR1cm4tMQp0PWEubGVuZ3RoCmZvcihzPTA7czx0OysrcylpZihKLlJNKGFbc10u
+YSxiKSlyZXR1cm4gcwpyZXR1cm4tMX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFAubk8odGhpcyl9LApq
+MjpmdW5jdGlvbihhLGIpe3JldHVybiBhW2JdfSwKQnQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYVtiXX0s
+CkVJOmZ1bmN0aW9uKGEsYixjKXthW2JdPWN9LApybjpmdW5jdGlvbihhLGIpe2RlbGV0ZSBhW2JdfSwK
+WHU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5qMihhLGIpIT1udWxsfSwKeks6ZnVuY3Rpb24oKXt2
+YXIgdD0iPG5vbi1pZGVudGlmaWVyLWtleT4iLHM9T2JqZWN0LmNyZWF0ZShudWxsKQp0aGlzLkVJKHMs
+dCxzKQp0aGlzLnJuKHMsdCkKcmV0dXJuIHN9LAokaUZvOjF9CkguZGIucHJvdG90eXBlPXt9CkguaTUu
+cHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5hfSwKZ2t6OmZ1bmN0aW9uKGEp
+e3ZhciB0PXRoaXMuYSxzPW5ldyBILk42KHQsdC5yLHRoaXMuJHRpLkMoIk42PDE+IikpCnMuYz10LmUK
+cmV0dXJuIHN9fQpILk42LnByb3RvdHlwZT17CmdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZH0sCkY6
+ZnVuY3Rpb24oKXt2YXIgdD10aGlzLHM9dC5hCmlmKHQuYiE9PXMucil0aHJvdyBILmIoUC5hNChzKSkK
+ZWxzZXtzPXQuYwppZihzPT1udWxsKXt0LnNxWShudWxsKQpyZXR1cm4hMX1lbHNle3Quc3FZKHMuYSkK
+dC5jPXQuYy5jCnJldHVybiEwfX19LApzcVk6ZnVuY3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLmQuYihh
+KX0sCiRpQW46MX0KSC5kQy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hKGEp
+fSwKJFM6NH0KSC53Ti5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEoYSxi
+KX0sCiRTOjM4fQpILlZYLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEoSC55
+KGEpKX0sCiRTOjQwfQpILlZSLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIlJlZ0V4cC8i
+K3RoaXMuYSsiLyIrdGhpcy5iLmZsYWdzfSwKZ0hjOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxzPXQuYwpp
+ZihzIT1udWxsKXJldHVybiBzCnM9dC5iCnJldHVybiB0LmM9SC52NCh0LmEscy5tdWx0aWxpbmUsIXMu
+aWdub3JlQ2FzZSxzLnVuaWNvZGUscy5kb3RBbGwsITApfSwKZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
+bmV3IEguS1codGhpcyxiLDApfSwKVVo6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPXRoaXMuZ0hjKCkKcy5s
+YXN0SW5kZXg9Ygp0PXMuZXhlYyhhKQppZih0PT1udWxsKXJldHVybiBudWxsCnJldHVybiBuZXcgSC5F
+Syh0KX0sCiRpdlg6MSwKJGl3TDoxfQpILkVLLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXt2YXIg
+dApILlNjKGIpCnQ9dGhpcy5iCmlmKGI+PXQubGVuZ3RoKXJldHVybiBILk9IKHQsYikKcmV0dXJuIHRb
+Yl19LAokaU9kOjEsCiRpaWI6MX0KSC5LVy5wcm90b3R5cGU9ewpna3o6ZnVuY3Rpb24oYSl7cmV0dXJu
+IG5ldyBILlBiKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX19CkguUGIucHJvdG90eXBlPXsKZ2w6ZnVuY3Rp
+b24oKXtyZXR1cm4gdGhpcy5kfSwKRjpmdW5jdGlvbigpe3ZhciB0LHMscixxLHA9dGhpcyxvPXAuYgpp
+ZihvPT1udWxsKXJldHVybiExCnQ9cC5jCmlmKHQ8PW8ubGVuZ3RoKXtzPXAuYQpyPXMuVVoobyx0KQpp
+ZihyIT1udWxsKXtwLmQ9cgpvPXIuYgp0PW8uaW5kZXgKcT10K29bMF0ubGVuZ3RoCmlmKHQ9PT1xKXtp
+ZihzLmIudW5pY29kZSl7bz1wLmMKdD1vKzEKcz1wLmIKaWYodDxzLmxlbmd0aCl7bz1KLnJZKHMpLm0o
+cyxvKQppZihvPj01NTI5NiYmbzw9NTYzMTkpe289Qy54Qi5tKHMsdCkKbz1vPj01NjMyMCYmbzw9NTcz
+NDN9ZWxzZSBvPSExfWVsc2Ugbz0hMX1lbHNlIG89ITEKcT0obz9xKzE6cSkrMX1wLmM9cQpyZXR1cm4h
+MH19cC5iPXAuZD1udWxsCnJldHVybiExfSwKJGlBbjoxfQpILnRRLnByb3RvdHlwZT17CnE6ZnVuY3Rp
+b24oYSxiKXtILlNjKGIpCmlmKGIhPT0wKUgudmgoUC54KGIsbnVsbCkpCnJldHVybiB0aGlzLmN9LAok
+aU9kOjF9CkgudW4ucHJvdG90eXBlPXsKZ2t6OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5TZCh0aGlz
+LmEsdGhpcy5iLHRoaXMuYyl9fQpILlNkLnByb3RvdHlwZT17CkY6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9
+dGhpcyxxPXIuYyxwPXIuYixvPXAubGVuZ3RoLG49ci5hLG09bi5sZW5ndGgKaWYocStvPm0pe3IuZD1u
+dWxsCnJldHVybiExfXQ9bi5pbmRleE9mKHAscSkKaWYodDwwKXtyLmM9bSsxCnIuZD1udWxsCnJldHVy
+biExfXM9dCtvCnIuZD1uZXcgSC50USh0LHApCnIuYz1zPT09ci5jP3MrMTpzCnJldHVybiEwfSwKZ2w6
+ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwKJGlBbjoxfQpILkVULnByb3RvdHlwZT17JGlFVDoxLCRp
+QVM6MX0KSC5iMC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LAokaVhq
+OjF9CkguRGcucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe0guU2MoYikKSC5vZChiLGEsYS5sZW5n
+dGgpCnJldHVybiBhW2JdfSwKWTpmdW5jdGlvbihhLGIsYyl7SC5JZyhjKQpILm9kKGIsYSxhLmxlbmd0
+aCkKYVtiXT1jfSwKJGljWDoxLAokaXpNOjF9CkguUGcucHJvdG90eXBlPXsKWTpmdW5jdGlvbihhLGIs
+Yyl7SC5TYyhjKQpILm9kKGIsYSxhLmxlbmd0aCkKYVtiXT1jfSwKJGljWDoxLAokaXpNOjF9CkgueGou
+cHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe0guU2MoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVy
+biBhW2JdfX0KSC5kRS5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7SC5TYyhiKQpILm9kKGIsYSxh
+Lmxlbmd0aCkKcmV0dXJuIGFbYl19fQpILlpBLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtILlNj
+KGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19Ckgud2YucHJvdG90eXBlPXsKcTpmdW5j
+dGlvbihhLGIpe0guU2MoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC5QcS5wcm90
 b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7SC5TYyhiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFb
-Yl19fQpILlpBLnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtILlNjKGIpCkgub2QoYixhLGEubGVu
-Z3RoKQpyZXR1cm4gYVtiXX19Ckgud2YucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe0guU2MoYikK
-SC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfX0KSC5QcS5wcm90b3R5cGU9ewpxOmZ1bmN0aW9u
-KGEsYil7SC5TYyhiKQpILm9kKGIsYSxhLmxlbmd0aCkKcmV0dXJuIGFbYl19fQpILmVFLnByb3RvdHlw
-ZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtILlNjKGIp
-Ckgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguVjYucHJvdG90eXBlPXsKZ0E6ZnVuY3Rp
-b24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe0guU2MoYikKSC5vZChiLGEsYS5s
-ZW5ndGgpCnJldHVybiBhW2JdfSwKJGlWNjoxLAokaW42OjF9CkguUkcucHJvdG90eXBlPXt9CkguVlAu
-cHJvdG90eXBlPXt9CkguV0IucHJvdG90eXBlPXt9CkguWkcucHJvdG90eXBlPXt9CkguSmMucHJvdG90
-eXBlPXsKQzpmdW5jdGlvbihhKXtyZXR1cm4gSC5jRSh2LnR5cGVVbml2ZXJzZSx0aGlzLGEpfSwKS3E6
-ZnVuY3Rpb24oYSl7cmV0dXJuIEgudjUodi50eXBlVW5pdmVyc2UsdGhpcyxhKX19CkguRy5wcm90b3R5
-cGU9e30KSC51OS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF9fQpILmh6LnBy
-b3RvdHlwZT17fQpILmlNLnByb3RvdHlwZT17fQpQLnRoLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEp
-e3ZhciB0PXRoaXMuYSxzPXQuYQp0LmE9bnVsbApzLiQwKCl9LAokUzoxMn0KUC5oYS5wcm90b3R5cGU9
-ewokMTpmdW5jdGlvbihhKXt2YXIgdCxzCnRoaXMuYS5hPXUuTS5iKGEpCnQ9dGhpcy5iCnM9dGhpcy5j
-CnQuZmlyc3RDaGlsZD90LnJlbW92ZUNoaWxkKHMpOnQuYXBwZW5kQ2hpbGQocyl9LAokUzoyMH0KUC5W
-cy5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYS4kMCgpfSwKJEM6IiQwIiwKJFI6MCwKJFM6
-MH0KUC5GdC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYS4kMCgpfSwKJEM6IiQwIiwKJFI6
-MCwKJFM6MH0KUC5XMy5wcm90b3R5cGU9ewpDWTpmdW5jdGlvbihhLGIpe2lmKHNlbGYuc2V0VGltZW91
-dCE9bnVsbClzZWxmLnNldFRpbWVvdXQoSC50UihuZXcgUC55SCh0aGlzLGIpLDApLGEpCmVsc2UgdGhy
-b3cgSC5iKFAuTDQoImBzZXRUaW1lb3V0KClgIG5vdCBmb3VuZC4iKSl9fQpQLnlILnByb3RvdHlwZT17
-CiQwOmZ1bmN0aW9uKCl7dGhpcy5iLiQwKCl9LAokQzoiJDAiLAokUjowLAokUzoyfQpQLmloLnByb3Rv
-dHlwZT17CmFNOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyPXRoaXMuJHRpCnIuQygiMS8iKS5iKGIpCnQ9
-IXRoaXMuYnx8ci5DKCJiODwxPiIpLmMoYikKcz10aGlzLmEKaWYodClzLlhmKGIpCmVsc2Ugcy5YMihy
-LmQuYihiKSl9LAp3MDpmdW5jdGlvbihhLGIpe3ZhciB0PXRoaXMuYQppZih0aGlzLmIpdC5aTChhLGIp
-CmVsc2UgdC5OayhhLGIpfX0KUC5XTS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhp
-cy5hLiQyKDAsYSl9LAokUzo0N30KUC5TWC5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3RoaXMu
-YS4kMigxLG5ldyBILmJxKGEsdS5sLmIoYikpKX0sCiRDOiIkMiIsCiRSOjIsCiRTOjIxfQpQLkdzLnBy
-b3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hKEguU2MoYSksYil9LAokUzoyNn0KUC5QZi5w
-cm90b3R5cGU9ewp3MDpmdW5jdGlvbihhLGIpe3ZhciB0CmlmKGE9PW51bGwpYT1uZXcgUC5uKCkKdD10
-aGlzLmEKaWYodC5hIT09MCl0aHJvdyBILmIoUC5QVigiRnV0dXJlIGFscmVhZHkgY29tcGxldGVkIikp
-CnQuTmsoYSxiKX0sCnBtOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLncwKGEsbnVsbCl9fQpQLlpmLnBy
-b3RvdHlwZT17CmFNOmZ1bmN0aW9uKGEsYil7dmFyIHQKdGhpcy4kdGkuQygiMS8iKS5iKGIpCnQ9dGhp
-cy5hCmlmKHQuYSE9PTApdGhyb3cgSC5iKFAuUFYoIkZ1dHVyZSBhbHJlYWR5IGNvbXBsZXRlZCIpKQp0
-LlhmKGIpfX0KUC5GZS5wcm90b3R5cGU9ewpIUjpmdW5jdGlvbihhKXtpZigodGhpcy5jJjE1KSE9PTYp
-cmV0dXJuITAKcmV0dXJuIHRoaXMuYi5iLmJ2KHUuYWwuYih0aGlzLmQpLGEuYSx1LmNKLHUuSyl9LApL
-dzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmUscz11Lnoscj11LksscT10aGlzLiR0aS5DKCIyLyIpLHA9
-dGhpcy5iLmIKaWYodS5XLmModCkpcmV0dXJuIHEuYihwLnJwKHQsYS5hLGEuYixzLHIsdS5sKSkKZWxz
-ZSByZXR1cm4gcS5iKHAuYnYodS55LmIodCksYS5hLHMscikpfX0KUC52cy5wcm90b3R5cGU9ewpTcTpm
-dW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHE9dGhpcy4kdGkKcS5LcShjKS5DKCIxLygyKSIpLmIoYSkK
-dD0kLlgzCmlmKHQhPT1DLk5VKXtjLkMoIkA8MC8+IikuS3EocS5kKS5DKCIxKDIpIikuYihhKQppZihi
-IT1udWxsKWI9UC5WSChiLHQpfXM9bmV3IFAudnMoJC5YMyxjLkMoInZzPDA+IikpCnI9Yj09bnVsbD8x
-OjMKdGhpcy54ZihuZXcgUC5GZShzLHIsYSxiLHEuQygiQDwxPiIpLktxKGMpLkMoIkZlPDEsMj4iKSkp
-CnJldHVybiBzfSwKVzc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5TcShhLG51bGwsYil9LApRZDpm
-dW5jdGlvbihhLGIsYyl7dmFyIHQscz10aGlzLiR0aQpzLktxKGMpLkMoIjEvKDIpIikuYihhKQp0PW5l
-dyBQLnZzKCQuWDMsYy5DKCJ2czwwPiIpKQp0aGlzLnhmKG5ldyBQLkZlKHQsKGI9PW51bGw/MTozKXwx
-NixhLGIscy5DKCJAPDE+IikuS3EoYykuQygiRmU8MSwyPiIpKSkKcmV0dXJuIHR9LApPQTpmdW5jdGlv
-bihhKXt2YXIgdCxzLHIKdS5iZi5iKG51bGwpCnQ9dGhpcy4kdGkKcz0kLlgzCnI9bmV3IFAudnMocyx0
-KQppZihzIT09Qy5OVSlhPVAuVkgoYSxzKQp0aGlzLnhmKG5ldyBQLkZlKHIsMixudWxsLGEsdC5DKCJA
-PDE+IikuS3EodC5kKS5DKCJGZTwxLDI+IikpKQpyZXR1cm4gcn0sCnhmOmZ1bmN0aW9uKGEpe3ZhciB0
-LHM9dGhpcyxyPXMuYQppZihyPD0xKXthLmE9dS54LmIocy5jKQpzLmM9YX1lbHNle2lmKHI9PT0yKXt0
-PXUuXy5iKHMuYykKcj10LmEKaWYocjw0KXt0LnhmKGEpCnJldHVybn1zLmE9cgpzLmM9dC5jfVAuVGso
-bnVsbCxudWxsLHMuYix1Lk0uYihuZXcgUC5kYShzLGEpKSl9fSwKalE6ZnVuY3Rpb24oYSl7dmFyIHQs
-cyxyLHEscCxvPXRoaXMsbj17fQpuLmE9YQppZihhPT1udWxsKXJldHVybgp0PW8uYQppZih0PD0xKXtz
-PXUueC5iKG8uYykKcj1vLmM9YQppZihzIT1udWxsKXtmb3IoO3E9ci5hLHEhPW51bGw7cj1xKTtyLmE9
-c319ZWxzZXtpZih0PT09Mil7cD11Ll8uYihvLmMpCnQ9cC5hCmlmKHQ8NCl7cC5qUShhKQpyZXR1cm59
-by5hPXQKby5jPXAuY31uLmE9by5OOChhKQpQLlRrKG51bGwsbnVsbCxvLmIsdS5NLmIobmV3IFAub1Eo
-bixvKSkpfX0sCmFoOmZ1bmN0aW9uKCl7dmFyIHQ9dS54LmIodGhpcy5jKQp0aGlzLmM9bnVsbApyZXR1
-cm4gdGhpcy5OOCh0KX0sCk44OmZ1bmN0aW9uKGEpe3ZhciB0LHMscgpmb3IodD1hLHM9bnVsbDt0IT1u
-dWxsO3M9dCx0PXIpe3I9dC5hCnQuYT1zfXJldHVybiBzfSwKSEg6ZnVuY3Rpb24oYSl7dmFyIHQscz10
-aGlzLHI9cy4kdGkKci5DKCIxLyIpLmIoYSkKaWYoci5DKCJiODwxPiIpLmMoYSkpaWYoci5jKGEpKVAu
-QTkoYSxzKQplbHNlIFAuazMoYSxzKQplbHNle3Q9cy5haCgpCnIuZC5iKGEpCnMuYT00CnMuYz1hClAu
-SFoocyx0KX19LApYMjpmdW5jdGlvbihhKXt2YXIgdCxzPXRoaXMKcy4kdGkuZC5iKGEpCnQ9cy5haCgp
-CnMuYT00CnMuYz1hClAuSFoocyx0KX0sClpMOmZ1bmN0aW9uKGEsYil7dmFyIHQscz10aGlzCnUubC5i
-KGIpCnQ9cy5haCgpCnMuYT04CnMuYz1uZXcgUC5DdyhhLGIpClAuSFoocyx0KX0sClhmOmZ1bmN0aW9u
-KGEpe3ZhciB0PXRoaXMscz10LiR0aQpzLkMoIjEvIikuYihhKQppZihzLkMoImI4PDE+IikuYyhhKSl7
-dC5jVShhKQpyZXR1cm59dC5hPTEKUC5UayhudWxsLG51bGwsdC5iLHUuTS5iKG5ldyBQLnJIKHQsYSkp
-KX0sCmNVOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMscz10LiR0aQpzLkMoImI4PDE+IikuYihhKQppZihz
-LmMoYSkpe2lmKGEuYT09PTgpe3QuYT0xClAuVGsobnVsbCxudWxsLHQuYix1Lk0uYihuZXcgUC5LRih0
-LGEpKSl9ZWxzZSBQLkE5KGEsdCkKcmV0dXJufVAuazMoYSx0KX0sCk5rOmZ1bmN0aW9uKGEsYil7dGhp
-cy5hPTEKUC5UayhudWxsLG51bGwsdGhpcy5iLHUuTS5iKG5ldyBQLlpMKHRoaXMsYSxiKSkpfSwKJGli
-ODoxfQpQLmRhLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7UC5IWih0aGlzLmEsdGhpcy5iKX0sCiRT
-OjB9ClAub1EucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtQLkhaKHRoaXMuYix0aGlzLmEuYSl9LAok
-UzowfQpQLnBWLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYQp0LmE9MAp0LkhI
-KGEpfSwKJFM6MTJ9ClAuVTcucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt1LmwuYihiKQp0aGlz
-LmEuWkwoYSxiKX0sCiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLiQyKGEsbnVsbCl9LAokQzoiJDIi
-LAokRDpmdW5jdGlvbigpe3JldHVybltudWxsXX0sCiRTOjMwfQpQLnZyLnByb3RvdHlwZT17CiQwOmZ1
-bmN0aW9uKCl7dGhpcy5hLlpMKHRoaXMuYix0aGlzLmMpfSwKJFM6MH0KUC5ySC5wcm90b3R5cGU9ewok
-MDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYQp0LlgyKHQuJHRpLmQuYih0aGlzLmIpKX0sCiRTOjB9ClAu
-S0YucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtQLkE5KHRoaXMuYix0aGlzLmEpfSwKJFM6MH0KUC5a
-TC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYS5aTCh0aGlzLmIsdGhpcy5jKX0sCiRTOjB9
-ClAuUlQucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwLG8sbj10aGlzLG09bnVs
-bAp0cnl7cj1uLmMKbT1yLmIuYi56eih1LmZPLmIoci5kKSx1LnopfWNhdGNoKHEpe3Q9SC5SdShxKQpz
-PUgudHMocSkKaWYobi5kKXtyPXUubi5iKG4uYS5hLmMpLmEKcD10CnA9cj09bnVsbD9wPT1udWxsOnI9
-PT1wCnI9cH1lbHNlIHI9ITEKcD1uLmIKaWYocilwLmI9dS5uLmIobi5hLmEuYykKZWxzZSBwLmI9bmV3
-IFAuQ3codCxzKQpwLmE9ITAKcmV0dXJufWlmKHUuYy5jKG0pKXtpZihtIGluc3RhbmNlb2YgUC52cyYm
-bS5hPj00KXtpZihtLmE9PT04KXtyPW4uYgpyLmI9dS5uLmIobS5jKQpyLmE9ITB9cmV0dXJufW89bi5h
-LmEKcj1uLmIKci5iPW0uVzcobmV3IFAualoobyksdS56KQpyLmE9ITF9fSwKJFM6Mn0KUC5qWi5wcm90
-b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfSwKJFM6MzN9ClAucnEucHJvdG90eXBl
-PXsKJDA6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwLG8sbixtPXRoaXMKdHJ5e3I9bS5iCnE9ci4kdGkK
-cD1xLmQKbz1wLmIobS5jKQptLmEuYj1yLmIuYi5idihxLkMoIjIvKDEpIikuYihyLmQpLG8scS5DKCIy
-LyIpLHApfWNhdGNoKG4pe3Q9SC5SdShuKQpzPUgudHMobikKcj1tLmEKci5iPW5ldyBQLkN3KHQscykK
-ci5hPSEwfX0sCiRTOjJ9ClAuUlcucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxw
-LG8sbixtLGw9dGhpcwp0cnl7dD11Lm4uYihsLmEuYS5jKQpxPWwuYwppZihILm9UKHEuSFIodCkpJiZx
-LmUhPW51bGwpe3A9bC5iCnAuYj1xLkt3KHQpCnAuYT0hMX19Y2F0Y2gobyl7cz1ILlJ1KG8pCnI9SC50
-cyhvKQpxPXUubi5iKGwuYS5hLmMpCnA9cS5hCm49cwptPWwuYgppZihwPT1udWxsP249PW51bGw6cD09
-PW4pbS5iPXEKZWxzZSBtLmI9bmV3IFAuQ3cocyxyKQptLmE9ITB9fSwKJFM6Mn0KUC5PTS5wcm90b3R5
-cGU9e30KUC5xaC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXt2YXIgdCxzLHI9dGhpcyxxPXt9LHA9
-bmV3IFAudnMoJC5YMyx1LmZKKQpxLmE9MAp0PUguTGgocikKcz10LkMoIn4oMSkiKS5iKG5ldyBQLkI1
-KHEscikpCnUuTS5iKG5ldyBQLlBJKHEscCkpClcuSkUoci5hLHIuYixzLCExLHQuZCkKcmV0dXJuIHB9
-fQpQLkI1LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe0guTGgodGhpcy5iKS5kLmIoYSk7Kyt0aGlz
-LmEuYX0sCiRTOmZ1bmN0aW9uKCl7cmV0dXJuIEguTGgodGhpcy5iKS5DKCJjOCgxKSIpfX0KUC5QSS5w
-cm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYi5ISCh0aGlzLmEuYSl9LAokUzowfQpQLk1PLnBy
-b3RvdHlwZT17fQpQLmtULnByb3RvdHlwZT17fQpQLnhJLnByb3RvdHlwZT17fQpQLkN3LnByb3RvdHlw
-ZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIEguZCh0aGlzLmEpfSwKJGlYUzoxfQpQLm0wLnByb3RvdHlw
-ZT17JGlKQjoxfQpQLnBLLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dmFyIHQscz10aGlzLmEscj1z
-LmEKcz1yPT1udWxsP3MuYT1uZXcgUC5uKCk6cgpyPXRoaXMuYgppZihyPT1udWxsKXRocm93IEguYihz
-KQp0PUguYihzKQp0LnN0YWNrPXIudygwKQp0aHJvdyB0fSwKJFM6MH0KUC5KaS5wcm90b3R5cGU9ewpi
-SDpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT1udWxsCnUuTS5iKGEpCnRyeXtpZihDLk5VPT09JC5YMyl7
-YS4kMCgpCnJldHVybn1QLlQ4KHEscSx0aGlzLGEsdS5IKX1jYXRjaChyKXt0PUguUnUocikKcz1ILnRz
-KHIpClAuTDIocSxxLHRoaXMsdCx1LmwuYihzKSl9fSwKRGw6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMs
-cixxPW51bGwKYy5DKCJ+KDApIikuYihhKQpjLmIoYikKdHJ5e2lmKEMuTlU9PT0kLlgzKXthLiQxKGIp
-CnJldHVybn1QLnl2KHEscSx0aGlzLGEsYix1LkgsYyl9Y2F0Y2gocil7dD1ILlJ1KHIpCnM9SC50cyhy
-KQpQLkwyKHEscSx0aGlzLHQsdS5sLmIocykpfX0sClJUOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBQ
-LmhqKHRoaXMsYi5DKCIwKCkiKS5iKGEpLGIpfSwKR1k6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLlZw
-KHRoaXMsdS5NLmIoYSkpfSwKUHk6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IFAuT1IodGhpcyxiLkMo
-In4oMCkiKS5iKGEpLGIpfSwKcTpmdW5jdGlvbihhLGIpe3JldHVybn0sCnp6OmZ1bmN0aW9uKGEsYil7
-Yi5DKCIwKCkiKS5iKGEpCmlmKCQuWDM9PT1DLk5VKXJldHVybiBhLiQwKCkKcmV0dXJuIFAuVDgobnVs
-bCxudWxsLHRoaXMsYSxiKX0sCmJ2OmZ1bmN0aW9uKGEsYixjLGQpe2MuQygiQDwwPiIpLktxKGQpLkMo
-IjEoMikiKS5iKGEpCmQuYihiKQppZigkLlgzPT09Qy5OVSlyZXR1cm4gYS4kMShiKQpyZXR1cm4gUC55
-dihudWxsLG51bGwsdGhpcyxhLGIsYyxkKX0sCnJwOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXtkLkMoIkA8
-MD4iKS5LcShlKS5LcShmKS5DKCIxKDIsMykiKS5iKGEpCmUuYihiKQpmLmIoYykKaWYoJC5YMz09PUMu
-TlUpcmV0dXJuIGEuJDIoYixjKQpyZXR1cm4gUC5ReChudWxsLG51bGwsdGhpcyxhLGIsYyxkLGUsZil9
-LApMajpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYi5DKCJAPDA+IikuS3EoYykuS3EoZCkuQygiMSgy
-LDMpIikuYihhKX19ClAuaGoucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLnp6
-KHRoaXMuYix0aGlzLmMpfSwKJFM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jLkMoIjAoKSIpfX0KUC5W
-cC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuYkgodGhpcy5iKX0sCiRTOjJ9
-ClAuT1IucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5jCnJldHVybiB0aGlzLmEu
-RGwodGhpcy5iLHQuYihhKSx0KX0sCiRTOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYy5DKCJ+KDApIil9
-fQpQLmI2LnByb3RvdHlwZT17CmdrejpmdW5jdGlvbihhKXt2YXIgdD10aGlzLHM9bmV3IFAubG0odCx0
-LnIsSC5MaCh0KS5DKCJsbTwxPiIpKQpzLmM9dC5lCnJldHVybiBzfSwKZ0E6ZnVuY3Rpb24oYSl7cmV0
-dXJuIHRoaXMuYX0sCnRnOmZ1bmN0aW9uKGEsYil7dmFyIHQscwppZih0eXBlb2YgYj09InN0cmluZyIm
-JmIhPT0iX19wcm90b19fIil7dD10aGlzLmIKaWYodD09bnVsbClyZXR1cm4hMQpyZXR1cm4gdS5KLmIo
-dFtiXSkhPW51bGx9ZWxzZXtzPXRoaXMuUFIoYikKcmV0dXJuIHN9fSwKUFI6ZnVuY3Rpb24oYSl7dmFy
-IHQ9dGhpcy5kCmlmKHQ9PW51bGwpcmV0dXJuITEKcmV0dXJuIHRoaXMuREYodFt0aGlzLk4oYSldLGEp
-Pj0wfSwKaTpmdW5jdGlvbihhLGIpe3ZhciB0LHMscj10aGlzCkguTGgocikuZC5iKGIpCmlmKHR5cGVv
-ZiBiPT0ic3RyaW5nIiYmYiE9PSJfX3Byb3RvX18iKXt0PXIuYgpyZXR1cm4gci5iUSh0PT1udWxsP3Iu
-Yj1QLlQyKCk6dCxiKX1lbHNlIGlmKHR5cGVvZiBiPT0ibnVtYmVyIiYmKGImMTA3Mzc0MTgyMyk9PT1i
-KXtzPXIuYwpyZXR1cm4gci5iUShzPT1udWxsP3IuYz1QLlQyKCk6cyxiKX1lbHNlIHJldHVybiByLkI3
-KGIpfSwKQjc6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHE9dGhpcwpILkxoKHEpLmQuYihhKQp0PXEuZApp
-Zih0PT1udWxsKXQ9cS5kPVAuVDIoKQpzPXEuTihhKQpyPXRbc10KaWYocj09bnVsbCl0W3NdPVtxLnlv
-KGEpXQplbHNle2lmKHEuREYocixhKT49MClyZXR1cm4hMQpyLnB1c2gocS55byhhKSl9cmV0dXJuITB9
-LApSOmZ1bmN0aW9uKGEsYil7dmFyIHQ9dGhpcwppZih0eXBlb2YgYj09InN0cmluZyImJmIhPT0iX19w
-cm90b19fIilyZXR1cm4gdC5MKHQuYixiKQplbHNlIGlmKHR5cGVvZiBiPT0ibnVtYmVyIiYmKGImMTA3
-Mzc0MTgyMyk9PT1iKXJldHVybiB0LkwodC5jLGIpCmVsc2UgcmV0dXJuIHQucWcoYil9LApxZzpmdW5j
-dGlvbihhKXt2YXIgdCxzLHIscSxwPXRoaXMsbz1wLmQKaWYobz09bnVsbClyZXR1cm4hMQp0PXAuTihh
-KQpzPW9bdF0Kcj1wLkRGKHMsYSkKaWYocjwwKXJldHVybiExCnE9cy5zcGxpY2UociwxKVswXQppZigw
-PT09cy5sZW5ndGgpZGVsZXRlIG9bdF0KcC5HUyhxKQpyZXR1cm4hMH0sCmJROmZ1bmN0aW9uKGEsYil7
-SC5MaCh0aGlzKS5kLmIoYikKaWYodS5KLmIoYVtiXSkhPW51bGwpcmV0dXJuITEKYVtiXT10aGlzLnlv
-KGIpCnJldHVybiEwfSwKTDpmdW5jdGlvbihhLGIpe3ZhciB0CmlmKGE9PW51bGwpcmV0dXJuITEKdD11
-LkouYihhW2JdKQppZih0PT1udWxsKXJldHVybiExCnRoaXMuR1ModCkKZGVsZXRlIGFbYl0KcmV0dXJu
-ITB9LApTOmZ1bmN0aW9uKCl7dGhpcy5yPTEwNzM3NDE4MjMmdGhpcy5yKzF9LAp5bzpmdW5jdGlvbihh
-KXt2YXIgdCxzPXRoaXMscj1uZXcgUC5ibihILkxoKHMpLmQuYihhKSkKaWYocy5lPT1udWxsKXMuZT1z
-LmY9cgplbHNle3Q9cy5mCnIuYz10CnMuZj10LmI9cn0rK3MuYQpzLlMoKQpyZXR1cm4gcn0sCkdTOmZ1
-bmN0aW9uKGEpe3ZhciB0PXRoaXMscz1hLmMscj1hLmIKaWYocz09bnVsbCl0LmU9cgplbHNlIHMuYj1y
-CmlmKHI9PW51bGwpdC5mPXMKZWxzZSByLmM9czstLXQuYQp0LlMoKX0sCk46ZnVuY3Rpb24oYSl7cmV0
-dXJuIEouaGYoYSkmMTA3Mzc0MTgyM30sCkRGOmZ1bmN0aW9uKGEsYil7dmFyIHQscwppZihhPT1udWxs
-KXJldHVybi0xCnQ9YS5sZW5ndGgKZm9yKHM9MDtzPHQ7KytzKWlmKEouUk0oYVtzXS5hLGIpKXJldHVy
-biBzCnJldHVybi0xfX0KUC5ibi5wcm90b3R5cGU9e30KUC5sbS5wcm90b3R5cGU9ewpnbDpmdW5jdGlv
-bigpe3JldHVybiB0aGlzLmR9LApGOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxzPXQuYQppZih0LmIhPT1z
-LnIpdGhyb3cgSC5iKFAuYTQocykpCmVsc2V7cz10LmMKaWYocz09bnVsbCl7dC5zaihudWxsKQpyZXR1
-cm4hMX1lbHNle3Quc2oodC4kdGkuZC5iKHMuYSkpCnQuYz10LmMuYgpyZXR1cm4hMH19fSwKc2o6ZnVu
-Y3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLmQuYihhKX0sCiRpQW46MX0KUC5tVy5wcm90b3R5cGU9e30K
-UC5MVS5wcm90b3R5cGU9eyRpY1g6MSwkaXpNOjF9ClAubEQucHJvdG90eXBlPXsKZ2t6OmZ1bmN0aW9u
-KGEpe3JldHVybiBuZXcgSC5hNyhhLHRoaXMuZ0EoYSksSC56SyhhKS5DKCJhNzxsRC5FPiIpKX0sCkU6
-ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5xKGEsYil9LApLOmZ1bmN0aW9uKGEsYil7dmFyIHQscwpI
-LnpLKGEpLkMoIn4obEQuRSkiKS5iKGIpCnQ9dGhpcy5nQShhKQpmb3Iocz0wO3M8dDsrK3Mpe2IuJDEo
-dGhpcy5xKGEscykpCmlmKHQhPT10aGlzLmdBKGEpKXRocm93IEguYihQLmE0KGEpKX19LApFMjpmdW5j
-dGlvbihhLGIsYyl7dmFyIHQ9SC56SyhhKQpyZXR1cm4gbmV3IEguQTgoYSx0LktxKGMpLkMoIjEobEQu
-RSkiKS5iKGIpLHQuQygiQDxsRC5FPiIpLktxKGMpLkMoIkE4PDEsMj4iKSl9LApkdTpmdW5jdGlvbihh
-LGIsYyxkKXt2YXIgdApILnpLKGEpLkMoImxELkUiKS5iKGQpClAuakIoYixjLHRoaXMuZ0EoYSkpCmZv
-cih0PWI7dDxjOysrdCl0aGlzLlkoYSx0LGQpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gUC5XRShhLCJb
-IiwiXSIpfX0KUC5pbC5wcm90b3R5cGU9e30KUC5HQS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIp
-e3ZhciB0LHM9dGhpcy5hCmlmKCFzLmEpdGhpcy5iLmErPSIsICIKcy5hPSExCnM9dGhpcy5iCnQ9cy5h
-Kz1ILmQoYSkKcy5hPXQrIjogIgpzLmErPUguZChiKX0sCiRTOjF9ClAuWWsucHJvdG90eXBlPXsKSzpm
-dW5jdGlvbihhLGIpe3ZhciB0LHMKSC5MaCh0aGlzKS5DKCJ+KFlrLkssWWsuVikiKS5iKGIpCmZvcih0
-PUouSVQodGhpcy5nVigpKTt0LkYoKTspe3M9dC5nbCgpCmIuJDIocyx0aGlzLnEoMCxzKSl9fSwKZ0E6
-ZnVuY3Rpb24oYSl7cmV0dXJuIEouSG0odGhpcy5nVigpKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFAu
-bk8odGhpcyl9LAokaVowOjF9ClAuS1AucHJvdG90eXBlPXsKWTpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9
-SC5MaCh0aGlzKQp0LmQuYihiKQp0LmNoWzFdLmIoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBtb2Rp
-ZnkgdW5tb2RpZmlhYmxlIG1hcCIpKX19ClAuUG4ucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe3Jl
-dHVybiB0aGlzLmEucSgwLGIpfSwKWTpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9SC5MaCh0aGlzKQp0aGlz
-LmEuWSgwLHQuZC5iKGIpLHQuY2hbMV0uYihjKSl9LApLOmZ1bmN0aW9uKGEsYil7dGhpcy5hLksoMCxI
-LkxoKHRoaXMpLkMoIn4oMSwyKSIpLmIoYikpfSwKZ0E6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hCnJl
-dHVybiB0LmdBKHQpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4gSi5qKHRoaXMuYSl9LAokaVowOjF9ClAu
-R2oucHJvdG90eXBlPXt9ClAubGYucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4gUC5XRSh0
-aGlzLCJ7IiwifSIpfX0KUC5Wai5wcm90b3R5cGU9eyRpY1g6MSwkaXh1OjF9ClAuWHYucHJvdG90eXBl
-PXsKRlY6ZnVuY3Rpb24oYSxiKXt2YXIgdApmb3IodD1KLklUKEguTGgodGhpcykuQygiY1g8MT4iKS5i
-KGIpKTt0LkYoKTspdGhpcy5pKDAsdC5nbCgpKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuV0UodGhp
-cywieyIsIn0iKX0sCkg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPVAucmoodGhpcyx0aGlzLnIsSC5MaCh0
-aGlzKS5kKQppZighcy5GKCkpcmV0dXJuIiIKaWYoYj09PSIiKXt0PSIiCmRvIHQrPUguZChzLmQpCndo
-aWxlKHMuRigpKX1lbHNle3Q9SC5kKHMuZCkKZm9yKDtzLkYoKTspdD10K2IrSC5kKHMuZCl9cmV0dXJu
-IHQuY2hhckNvZGVBdCgwKT09MD90OnR9LAokaWNYOjEsCiRpeHU6MX0KUC5uWS5wcm90b3R5cGU9e30K
-UC5XWS5wcm90b3R5cGU9e30KUC5SVS5wcm90b3R5cGU9e30KUC51dy5wcm90b3R5cGU9ewpxOmZ1bmN0
-aW9uKGEsYil7dmFyIHQscz10aGlzLmIKaWYocz09bnVsbClyZXR1cm4gdGhpcy5jLnEoMCxiKQplbHNl
-IGlmKHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4KZWxzZXt0PXNbYl0KcmV0dXJuIHR5cGVvZiB0PT0i
-dW5kZWZpbmVkIj90aGlzLmZiKGIpOnR9fSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYj09bnVs
-bD90aGlzLmMuYTp0aGlzLkNmKCkubGVuZ3RofSwKZ1Y6ZnVuY3Rpb24oKXtpZih0aGlzLmI9PW51bGwp
-e3ZhciB0PXRoaXMuYwpyZXR1cm4gbmV3IEguaTUodCxILkxoKHQpLkMoImk1PDE+IikpfXJldHVybiBu
-ZXcgUC5pOCh0aGlzKX0sClk6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscj10aGlzCmlmKHIuYj09bnVs
-bClyLmMuWSgwLGIsYykKZWxzZSBpZihyLng0KGIpKXt0PXIuYgp0W2JdPWMKcz1yLmEKaWYocz09bnVs
-bD90IT1udWxsOnMhPT10KXNbYl09bnVsbH1lbHNlIHIuWEsoKS5ZKDAsYixjKX0sCng0OmZ1bmN0aW9u
-KGEpe2lmKHRoaXMuYj09bnVsbClyZXR1cm4gdGhpcy5jLng0KGEpCnJldHVybiBPYmplY3QucHJvdG90
-eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5hLGEpfSwKSzpmdW5jdGlvbihhLGIpe3ZhciB0LHMs
-cixxLHA9dGhpcwp1LmNBLmIoYikKaWYocC5iPT1udWxsKXJldHVybiBwLmMuSygwLGIpCnQ9cC5DZigp
-CmZvcihzPTA7czx0Lmxlbmd0aDsrK3Mpe3I9dFtzXQpxPXAuYltyXQppZih0eXBlb2YgcT09InVuZGVm
-aW5lZCIpe3E9UC5RZShwLmFbcl0pCnAuYltyXT1xfWIuJDIocixxKQppZih0IT09cC5jKXRocm93IEgu
-YihQLmE0KHApKX19LApDZjpmdW5jdGlvbigpe3ZhciB0PXUuai5iKHRoaXMuYykKaWYodD09bnVsbCl0
-PXRoaXMuYz1ILlZNKE9iamVjdC5rZXlzKHRoaXMuYSksdS5zKQpyZXR1cm4gdH0sClhLOmZ1bmN0aW9u
-KCl7dmFyIHQscyxyLHEscCxvPXRoaXMKaWYoby5iPT1udWxsKXJldHVybiBvLmMKdD1QLkZsKHUuTix1
-LnopCnM9by5DZigpCmZvcihyPTA7cT1zLmxlbmd0aCxyPHE7KytyKXtwPXNbcl0KdC5ZKDAscCxvLnEo
-MCxwKSl9aWYocT09PTApQy5ObS5pKHMsbnVsbCkKZWxzZSBDLk5tLnNBKHMsMCkKby5hPW8uYj1udWxs
-CnJldHVybiBvLmM9dH0sCmZiOmZ1bmN0aW9uKGEpe3ZhciB0CmlmKCFPYmplY3QucHJvdG90eXBlLmhh
-c093blByb3BlcnR5LmNhbGwodGhpcy5hLGEpKXJldHVybgp0PVAuUWUodGhpcy5hW2FdKQpyZXR1cm4g
-dGhpcy5iW2FdPXR9fQpQLmk4LnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYQpy
-ZXR1cm4gdC5nQSh0KX0sCkU6ZnVuY3Rpb24oYSxiKXt2YXIgdD10aGlzLmEKaWYodC5iPT1udWxsKXQ9
-dC5nVigpLkUoMCxiKQplbHNle3Q9dC5DZigpCmlmKGI8MHx8Yj49dC5sZW5ndGgpcmV0dXJuIEguT0go
-dCxiKQp0PXRbYl19cmV0dXJuIHR9LApna3o6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hCmlmKHQuYj09
-bnVsbCl7dD10LmdWKCkKdD10Lmdreih0KX1lbHNle3Q9dC5DZigpCnQ9bmV3IEoubTEodCx0Lmxlbmd0
-aCxILnQ2KHQpLkMoIm0xPDE+IikpfXJldHVybiB0fX0KUC5DVi5wcm90b3R5cGU9ewp5cjpmdW5jdGlv
-bihhLGEwLGExKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGMsYj0iSW52YWxp
-ZCBiYXNlNjQgZW5jb2RpbmcgbGVuZ3RoICIKYTE9UC5qQihhMCxhMSxhLmxlbmd0aCkKdD0kLlY3KCkK
-Zm9yKHM9YTAscj1zLHE9bnVsbCxwPS0xLG89LTEsbj0wO3M8YTE7cz1tKXttPXMrMQpsPUMueEIuVyhh
-LHMpCmlmKGw9PT0zNyl7az1tKzIKaWYoazw9YTEpe2o9SC5vbyhDLnhCLlcoYSxtKSkKaT1ILm9vKEMu
-eEIuVyhhLG0rMSkpCmg9aioxNitpLShpJjI1NikKaWYoaD09PTM3KWg9LTEKbT1rfWVsc2UgaD0tMX1l
-bHNlIGg9bAppZigwPD1oJiZoPD0xMjcpe2lmKGg8MHx8aD49dC5sZW5ndGgpcmV0dXJuIEguT0godCxo
-KQpnPXRbaF0KaWYoZz49MCl7aD1DLnhCLm0oIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVm
-Z2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGcpCmlmKGg9PT1sKWNvbnRpbnVlCmw9aH1l
-bHNle2lmKGc9PT0tMSl7aWYocDwwKXtmPXE9PW51bGw/bnVsbDpxLmEubGVuZ3RoCmlmKGY9PW51bGwp
-Zj0wCnA9Zisocy1yKQpvPXN9KytuCmlmKGw9PT02MSljb250aW51ZX1sPWh9aWYoZyE9PS0yKXtpZihx
-PT1udWxsKXE9bmV3IFAuUm4oIiIpCnEuYSs9Qy54Qi5OaihhLHIscykKcS5hKz1ILkx3KGwpCnI9bQpj
-b250aW51ZX19dGhyb3cgSC5iKFAucnIoIkludmFsaWQgYmFzZTY0IGRhdGEiLGEscykpfWlmKHEhPW51
-bGwpe2Y9cS5hKz1DLnhCLk5qKGEscixhMSkKZT1mLmxlbmd0aAppZihwPj0wKVAueE0oYSxvLGExLHAs
-bixlKQplbHNle2Q9Qy5qbi56WShlLTEsNCkrMQppZihkPT09MSl0aHJvdyBILmIoUC5ycihiLGEsYTEp
-KQpmb3IoO2Q8NDspe2YrPSI9IgpxLmE9ZjsrK2R9fWY9cS5hCnJldHVybiBDLnhCLmk3KGEsYTAsYTEs
-Zi5jaGFyQ29kZUF0KDApPT0wP2Y6Zil9Yz1hMS1hMAppZihwPj0wKVAueE0oYSxvLGExLHAsbixjKQpl
-bHNle2Q9Qy5qbi56WShjLDQpCmlmKGQ9PT0xKXRocm93IEguYihQLnJyKGIsYSxhMSkpCmlmKGQ+MSlh
-PUMueEIuaTcoYSxhMSxhMSxkPT09Mj8iPT0iOiI9Iil9cmV0dXJuIGF9fQpQLlU4LnByb3RvdHlwZT17
-fQpQLlVrLnByb3RvdHlwZT17fQpQLndJLnByb3RvdHlwZT17fQpQLlppLnByb3RvdHlwZT17fQpQLmJ5
-LnByb3RvdHlwZT17CnBXOmZ1bmN0aW9uKGEsYixjKXt2YXIgdAp1LmVwLmIoYykKdD1QLkJTKGIsdGhp
-cy5nSGUoKS5hKQpyZXR1cm4gdH0sCmdIZTpmdW5jdGlvbigpe3JldHVybiBDLkEzfX0KUC5NeC5wcm90
-b3R5cGU9e30KUC51NS5wcm90b3R5cGU9ewpnWkU6ZnVuY3Rpb24oKXtyZXR1cm4gQy5Ra319ClAuRTMu
-cHJvdG90eXBlPXsKV0o6ZnVuY3Rpb24oYSl7dmFyIHQscyxyPVAuakIoMCxudWxsLGEubGVuZ3RoKSxx
-PXItMAppZihxPT09MClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCkKdD1uZXcgVWludDhBcnJheShxKjMp
-CnM9bmV3IFAuUncodCkKaWYocy5HeChhLDAscikhPT1yKXMuTzYoSi5hNihhLHItMSksMCkKcmV0dXJu
-IG5ldyBVaW50OEFycmF5KHQuc3ViYXJyYXkoMCxILnJNKDAscy5iLHQubGVuZ3RoKSkpfX0KUC5Sdy5w
-cm90b3R5cGU9ewpPNjpmdW5jdGlvbihhLGIpe3ZhciB0LHM9dGhpcyxyPXMuYyxxPXMuYixwPXErMSxv
-PXIubGVuZ3RoCmlmKChiJjY0NTEyKT09PTU2MzIwKXt0PTY1NTM2KygoYSYxMDIzKTw8MTApfGImMTAy
-MwpzLmI9cAppZihxPj1vKXJldHVybiBILk9IKHIscSkKcltxXT0yNDB8dD4+PjE4CnE9cy5iPXArMQpp
-ZihwPj1vKXJldHVybiBILk9IKHIscCkKcltwXT0xMjh8dD4+PjEyJjYzCnA9cy5iPXErMQppZihxPj1v
-KXJldHVybiBILk9IKHIscSkKcltxXT0xMjh8dD4+PjYmNjMKcy5iPXArMQppZihwPj1vKXJldHVybiBI
-Lk9IKHIscCkKcltwXT0xMjh8dCY2MwpyZXR1cm4hMH1lbHNle3MuYj1wCmlmKHE+PW8pcmV0dXJuIEgu
-T0gocixxKQpyW3FdPTIyNHxhPj4+MTIKcT1zLmI9cCsxCmlmKHA+PW8pcmV0dXJuIEguT0gocixwKQpy
-W3BdPTEyOHxhPj4+NiY2MwpzLmI9cSsxCmlmKHE+PW8pcmV0dXJuIEguT0gocixxKQpyW3FdPTEyOHxh
-JjYzCnJldHVybiExfX0sCkd4OmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscSxwLG8sbixtPXRoaXMK
-aWYoYiE9PWMmJihDLnhCLm0oYSxjLTEpJjY0NTEyKT09PTU1Mjk2KS0tYwpmb3IodD1tLmMscz10Lmxl
-bmd0aCxyPWI7cjxjOysrcil7cT1DLnhCLlcoYSxyKQppZihxPD0xMjcpe3A9bS5iCmlmKHA+PXMpYnJl
-YWsKbS5iPXArMQp0W3BdPXF9ZWxzZSBpZigocSY2NDUxMik9PT01NTI5Nil7aWYobS5iKzM+PXMpYnJl
-YWsKbz1yKzEKaWYobS5PNihxLEMueEIuVyhhLG8pKSlyPW99ZWxzZSBpZihxPD0yMDQ3KXtwPW0uYgpu
-PXArMQppZihuPj1zKWJyZWFrCm0uYj1uCmlmKHA+PXMpcmV0dXJuIEguT0godCxwKQp0W3BdPTE5Mnxx
-Pj4+NgptLmI9bisxCnRbbl09MTI4fHEmNjN9ZWxzZXtwPW0uYgppZihwKzI+PXMpYnJlYWsKbj1tLmI9
-cCsxCmlmKHA+PXMpcmV0dXJuIEguT0godCxwKQp0W3BdPTIyNHxxPj4+MTIKcD1tLmI9bisxCmlmKG4+
-PXMpcmV0dXJuIEguT0godCxuKQp0W25dPTEyOHxxPj4+NiY2MwptLmI9cCsxCmlmKHA+PXMpcmV0dXJu
-IEguT0godCxwKQp0W3BdPTEyOHxxJjYzfX1yZXR1cm4gcn19ClAuR1kucHJvdG90eXBlPXsKV0o6ZnVu
-Y3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG4sbSxsCnUuTC5iKGEpCnQ9UC5reSghMSxhLDAsbnVsbCkK
-aWYodCE9bnVsbClyZXR1cm4gdApzPVAuakIoMCxudWxsLEouSG0oYSkpCnI9UC53RyhhLDAscykKaWYo
-cj4wKXtxPVAuSE0oYSwwLHIpCmlmKHI9PT1zKXJldHVybiBxCnA9bmV3IFAuUm4ocSkKbz1yCm49ITF9
-ZWxzZXtvPTAKcD1udWxsCm49ITB9aWYocD09bnVsbClwPW5ldyBQLlJuKCIiKQptPW5ldyBQLmJ6KCEx
-LHApCm0uYz1uCm0uTUUoYSxvLHMpCmlmKG0uZT4wKXtILnZoKFAucnIoIlVuZmluaXNoZWQgVVRGLTgg
-b2N0ZXQgc2VxdWVuY2UiLGEscykpCnAuYSs9SC5Mdyg2NTUzMykKbS5mPW0uZT1tLmQ9MH1sPXAuYQpy
-ZXR1cm4gbC5jaGFyQ29kZUF0KDApPT0wP2w6bH19ClAuYnoucHJvdG90eXBlPXsKTUU6ZnVuY3Rpb24o
-YSxiLGMpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGosaSxoPXRoaXMsZz0iQmFkIFVURi04IGVuY29k
-aW5nIDB4Igp1LkwuYihhKQp0PWguZApzPWguZQpyPWguZgpoLmY9aC5lPWguZD0wCiRsYWJlbDAkMDpm
-b3IocT1KLlU2KGEpLHA9aC5iLG89YjshMDtvPWopeyRsYWJlbDEkMTppZihzPjApe2Rve2lmKG89PT1j
-KWJyZWFrICRsYWJlbDAkMApuPXEucShhLG8pCmlmKHR5cGVvZiBuIT09Im51bWJlciIpcmV0dXJuIG4u
-ek0oKQppZigobiYxOTIpIT09MTI4KXttPVAucnIoZytDLmpuLldaKG4sMTYpLGEsbykKdGhyb3cgSC5i
-KG0pfWVsc2V7dD0odDw8NnxuJjYzKT4+PjA7LS1zOysrb319d2hpbGUocz4wKQptPXItMQppZihtPDB8
-fG0+PTQpcmV0dXJuIEguT0goQy5HYixtKQppZih0PD1DLkdiW21dKXttPVAucnIoIk92ZXJsb25nIGVu
-Y29kaW5nIG9mIDB4IitDLmpuLldaKHQsMTYpLGEsby1yLTEpCnRocm93IEguYihtKX1pZih0PjExMTQx
-MTEpe209UC5ycigiQ2hhcmFjdGVyIG91dHNpZGUgdmFsaWQgVW5pY29kZSByYW5nZTogMHgiK0Muam4u
-V1oodCwxNiksYSxvLXItMSkKdGhyb3cgSC5iKG0pfWlmKCFoLmN8fHQhPT02NTI3OSlwLmErPUguTHco
-dCkKaC5jPSExfWZvcihtPW88YzttOyl7bD1QLndHKGEsbyxjKQppZihsPjApe2guYz0hMQprPW8rbApw
-LmErPVAuSE0oYSxvLGspCmlmKGs9PT1jKWJyZWFrfWVsc2Ugaz1vCmo9aysxCm49cS5xKGEsaykKaWYo
-dHlwZW9mIG4hPT0ibnVtYmVyIilyZXR1cm4gbi5KKCkKaWYobjwwKXtpPVAucnIoIk5lZ2F0aXZlIFVU
-Ri04IGNvZGUgdW5pdDogLTB4IitDLmpuLldaKC1uLDE2KSxhLGotMSkKdGhyb3cgSC5iKGkpfWVsc2V7
-aWYoKG4mMjI0KT09PTE5Mil7dD1uJjMxCnM9MQpyPTEKY29udGludWUgJGxhYmVsMCQwfWlmKChuJjI0
-MCk9PT0yMjQpe3Q9biYxNQpzPTIKcj0yCmNvbnRpbnVlICRsYWJlbDAkMH1pZigobiYyNDgpPT09MjQw
-JiZuPDI0NSl7dD1uJjcKcz0zCnI9Mwpjb250aW51ZSAkbGFiZWwwJDB9aT1QLnJyKGcrQy5qbi5XWihu
-LDE2KSxhLGotMSkKdGhyb3cgSC5iKGkpfX1icmVhayAkbGFiZWwwJDB9aWYocz4wKXtoLmQ9dApoLmU9
-cwpoLmY9cn19fQpQLldGLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyCnUuZm8u
-YihhKQp0PXRoaXMuYgpzPXRoaXMuYQp0LmErPXMuYQpyPXQuYSs9SC5kKGEuYSkKdC5hPXIrIjogIgp0
-LmErPVAucChiKQpzLmE9IiwgIn0sCiRTOjE4fQpQLmEyLnByb3RvdHlwZT17fQpQLmlQLnByb3RvdHlw
-ZT17CkROOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQpyZXR1cm4gYiBpbnN0YW5jZW9m
-IFAuaVAmJnRoaXMuYT09PWIuYSYmITB9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hCnJldHVy
-bih0XkMuam4ud0codCwzMCkpJjEwNzM3NDE4MjN9LAp3OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMscz1Q
-LkdxKEgudEoodCkpLHI9UC5oMChILk5TKHQpKSxxPVAuaDAoSC5qQSh0KSkscD1QLmgwKEguS0wodCkp
-LG89UC5oMChILmNoKHQpKSxuPVAuaDAoSC5KZCh0KSksbT1QLlZ4KEgubzEodCkpLGw9cysiLSIrcisi
-LSIrcSsiICIrcCsiOiIrbysiOiIrbisiLiIrbQpyZXR1cm4gbH19ClAuQ1AucHJvdG90eXBlPXt9ClAu
-WFMucHJvdG90eXBlPXt9ClAuQzYucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEK
-aWYodCE9bnVsbClyZXR1cm4iQXNzZXJ0aW9uIGZhaWxlZDogIitQLnAodCkKcmV0dXJuIkFzc2VydGlv
-biBmYWlsZWQifX0KUC5uLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIlRocm93IG9mIG51
-bGwuIn19ClAudS5wcm90b3R5cGU9ewpnWjpmdW5jdGlvbigpe3JldHVybiJJbnZhbGlkIGFyZ3VtZW50
-IisoIXRoaXMuYT8iKHMpIjoiIil9LApndTpmdW5jdGlvbigpe3JldHVybiIifSwKdzpmdW5jdGlvbihh
-KXt2YXIgdCxzLHIscSxwPXRoaXMsbz1wLmMsbj1vIT1udWxsPyIgKCIrbysiKSI6IiIKbz1wLmQKdD1v
-PT1udWxsPyIiOiI6ICIrSC5kKG8pCnM9cC5nWigpK24rdAppZighcC5hKXJldHVybiBzCnI9cC5ndSgp
-CnE9UC5wKHAuYikKcmV0dXJuIHMrcisiOiAiK3F9fQpQLmJKLnByb3RvdHlwZT17CmdaOmZ1bmN0aW9u
-KCl7cmV0dXJuIlJhbmdlRXJyb3IifSwKZ3U6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9dGhpcy5lCmlmKHI9
-PW51bGwpe3I9dGhpcy5mCnQ9ciE9bnVsbD8iOiBOb3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICIrSC5k
-KHIpOiIifWVsc2V7cz10aGlzLmYKaWYocz09bnVsbCl0PSI6IE5vdCBncmVhdGVyIHRoYW4gb3IgZXF1
-YWwgdG8gIitILmQocikKZWxzZSBpZihzPnIpdD0iOiBOb3QgaW4gcmFuZ2UgIitILmQocikrIi4uIitI
-LmQocykrIiwgaW5jbHVzaXZlIgplbHNlIHQ9czxyPyI6IFZhbGlkIHZhbHVlIHJhbmdlIGlzIGVtcHR5
-IjoiOiBPbmx5IHZhbGlkIHZhbHVlIGlzICIrSC5kKHIpfXJldHVybiB0fX0KUC5lWS5wcm90b3R5cGU9
-ewpnWjpmdW5jdGlvbigpe3JldHVybiJSYW5nZUVycm9yIn0sCmd1OmZ1bmN0aW9uKCl7dmFyIHQscz1I
-LlNjKHRoaXMuYikKaWYodHlwZW9mIHMhPT0ibnVtYmVyIilyZXR1cm4gcy5KKCkKaWYoczwwKXJldHVy
-biI6IGluZGV4IG11c3Qgbm90IGJlIG5lZ2F0aXZlIgp0PXRoaXMuZgppZih0PT09MClyZXR1cm4iOiBu
-byBpbmRpY2VzIGFyZSB2YWxpZCIKcmV0dXJuIjogaW5kZXggc2hvdWxkIGJlIGxlc3MgdGhhbiAiK0gu
-ZCh0KX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmZ9fQpQLm1wLnByb3RvdHlwZT17Cnc6ZnVu
-Y3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG4sbSxsPXRoaXMsaz17fSxqPW5ldyBQLlJuKCIiKQprLmE9
-IiIKZm9yKHQ9bC5jLHM9dC5sZW5ndGgscj0wLHE9IiIscD0iIjtyPHM7KytyLHA9IiwgIil7bz10W3Jd
-CmouYT1xK3AKcT1qLmErPVAucChvKQprLmE9IiwgIn1sLmQuSygwLG5ldyBQLldGKGssaikpCm49UC5w
-KGwuYSkKbT1qLncoMCkKdD0iTm9TdWNoTWV0aG9kRXJyb3I6IG1ldGhvZCBub3QgZm91bmQ6ICciK0gu
-ZChsLmIuYSkrIidcblJlY2VpdmVyOiAiK24rIlxuQXJndW1lbnRzOiBbIittKyJdIgpyZXR1cm4gdH19
-ClAudWIucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iVW5zdXBwb3J0ZWQgb3BlcmF0aW9u
-OiAiK3RoaXMuYX19ClAuZHMucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEKcmV0
-dXJuIHQhPW51bGw/IlVuaW1wbGVtZW50ZWRFcnJvcjogIit0OiJVbmltcGxlbWVudGVkRXJyb3IifX0K
-UC5sai5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJCYWQgc3RhdGU6ICIrdGhpcy5hfX0K
-UC5VVi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYQppZih0PT1udWxsKXJldHVy
-biJDb25jdXJyZW50IG1vZGlmaWNhdGlvbiBkdXJpbmcgaXRlcmF0aW9uLiIKcmV0dXJuIkNvbmN1cnJl
-bnQgbW9kaWZpY2F0aW9uIGR1cmluZyBpdGVyYXRpb246ICIrUC5wKHQpKyIuIn19ClAuazUucHJvdG90
-eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iT3V0IG9mIE1lbW9yeSJ9LAokaVhTOjF9ClAuS1kucHJv
-dG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iU3RhY2sgT3ZlcmZsb3cifSwKJGlYUzoxfQpQLmMu
-cHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEKcmV0dXJuIHQ9PW51bGw/IlJlYWRp
-bmcgc3RhdGljIHZhcmlhYmxlIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24iOiJSZWFkaW5nIHN0YXRp
-YyB2YXJpYWJsZSAnIit0KyInIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24ifX0KUC5DRC5wcm90b3R5
-cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJFeGNlcHRpb246ICIrdGhpcy5hfX0KUC5hRS5wcm90b3R5
-cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbyxuLG0sbCxrLGosaSxoPXRoaXMuYSxnPWgh
-PW51bGwmJiIiIT09aD8iRm9ybWF0RXhjZXB0aW9uOiAiK0guZChoKToiRm9ybWF0RXhjZXB0aW9uIixm
-PXRoaXMuYyxlPXRoaXMuYgppZih0eXBlb2YgZT09InN0cmluZyIpe2lmKGYhPW51bGwpaD1mPDB8fGY+
-ZS5sZW5ndGgKZWxzZSBoPSExCmlmKGgpZj1udWxsCmlmKGY9PW51bGwpe3Q9ZS5sZW5ndGg+Nzg/Qy54
-Qi5OaihlLDAsNzUpKyIuLi4iOmUKcmV0dXJuIGcrIlxuIit0fWZvcihzPTEscj0wLHE9ITEscD0wO3A8
-ZjsrK3Ape289Qy54Qi5XKGUscCkKaWYobz09PTEwKXtpZihyIT09cHx8IXEpKytzCnI9cCsxCnE9ITF9
-ZWxzZSBpZihvPT09MTMpeysrcwpyPXArMQpxPSEwfX1nPXM+MT9nKygiIChhdCBsaW5lICIrcysiLCBj
-aGFyYWN0ZXIgIisoZi1yKzEpKyIpXG4iKTpnKygiIChhdCBjaGFyYWN0ZXIgIisoZisxKSsiKVxuIikK
-bj1lLmxlbmd0aApmb3IocD1mO3A8bjsrK3Ape289Qy54Qi5tKGUscCkKaWYobz09PTEwfHxvPT09MTMp
-e249cApicmVha319aWYobi1yPjc4KWlmKGYtcjw3NSl7bT1yKzc1Cmw9cgprPSIiCmo9Ii4uLiJ9ZWxz
-ZXtpZihuLWY8NzUpe2w9bi03NQptPW4Kaj0iIn1lbHNle2w9Zi0zNgptPWYrMzYKaj0iLi4uIn1rPSIu
-Li4ifWVsc2V7bT1uCmw9cgprPSIiCmo9IiJ9aT1DLnhCLk5qKGUsbCxtKQpyZXR1cm4gZytrK2kraisi
-XG4iK0MueEIuSXgoIiAiLGYtbCtrLmxlbmd0aCkrIl5cbiJ9ZWxzZSByZXR1cm4gZiE9bnVsbD9nKygi
-IChhdCBvZmZzZXQgIitILmQoZikrIikiKTpnfX0KUC5FSC5wcm90b3R5cGU9e30KUC5LTi5wcm90b3R5
-cGU9e30KUC5jWC5wcm90b3R5cGU9ewpldjpmdW5jdGlvbihhLGIpe3ZhciB0PUguTGgodGhpcykKcmV0
-dXJuIG5ldyBILlU1KHRoaXMsdC5DKCJhMihjWC5FKSIpLmIoYiksdC5DKCJVNTxjWC5FPiIpKX0sCmdB
-OmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcy5na3oodGhpcykKZm9yKHQ9MDtzLkYoKTspKyt0CnJldHVy
-biB0fSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiF0aGlzLmdreih0aGlzKS5GKCl9LApncjg6ZnVuY3Rp
-b24oYSl7dmFyIHQscz10aGlzLmdreih0aGlzKQppZighcy5GKCkpdGhyb3cgSC5iKEguV3AoKSkKdD1z
-LmdsKCkKaWYocy5GKCkpdGhyb3cgSC5iKEguZFUoKSkKcmV0dXJuIHR9LApFOmZ1bmN0aW9uKGEsYil7
-dmFyIHQscyxyClAuazEoYiwiaW5kZXgiKQpmb3IodD10aGlzLmdreih0aGlzKSxzPTA7dC5GKCk7KXty
-PXQuZ2woKQppZihiPT09cylyZXR1cm4gcjsrK3N9dGhyb3cgSC5iKFAuQ2YoYix0aGlzLCJpbmRleCIs
-bnVsbCxzKSl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBQLkVQKHRoaXMsIigiLCIpIil9fQpQLkFuLnBy
-b3RvdHlwZT17fQpQLnpNLnByb3RvdHlwZT17JGljWDoxfQpQLlowLnByb3RvdHlwZT17fQpQLmM4LnBy
-b3RvdHlwZT17CmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gUC5rLnByb3RvdHlwZS5naU8uY2FsbCh0aGlz
-LHRoaXMpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4ibnVsbCJ9fQpQLkZLLnByb3RvdHlwZT17fQpQLmsu
-cHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpQLmssJGlrOjEsCkROOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRo
-aXM9PT1ifSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBILmVRKHRoaXMpfSwKdzpmdW5jdGlvbihhKXty
-ZXR1cm4iSW5zdGFuY2Ugb2YgJyIrSC5kKEguTSh0aGlzKSkrIicifSwKZTc6ZnVuY3Rpb24oYSxiKXt1
-Lm8uYihiKQp0aHJvdyBILmIoUC5scih0aGlzLGIuZ1dhKCksYi5nbmQoKSxiLmdWbSgpKSl9LAp0b1N0
-cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLncodGhpcyl9fQpQLk9kLnByb3RvdHlwZT17fQpQLmli
-LnByb3RvdHlwZT17JGlPZDoxfQpQLnh1LnByb3RvdHlwZT17fQpQLkd6LnByb3RvdHlwZT17fQpQLnFV
-LnByb3RvdHlwZT17JGl2WDoxfQpQLlJuLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0
-aGlzLmEubGVuZ3RofSwKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEKcmV0dXJuIHQuY2hhckNvZGVB
-dCgwKT09MD90OnR9LAokaUJMOjF9ClAuR0QucHJvdG90eXBlPXt9ClAubjEucHJvdG90eXBlPXsKJDI6
-ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscQp1LmYuYihhKQpILnkoYikKdD1KLnJZKGIpLk9ZKGIsIj0i
-KQppZih0PT09LTEpe2lmKGIhPT0iIilhLlkoMCxQLmt1KGIsMCxiLmxlbmd0aCx0aGlzLmEsITApLCIi
-KX1lbHNlIGlmKHQhPT0wKXtzPUMueEIuTmooYiwwLHQpCnI9Qy54Qi5HKGIsdCsxKQpxPXRoaXMuYQph
-LlkoMCxQLmt1KHMsMCxzLmxlbmd0aCxxLCEwKSxQLmt1KHIsMCxyLmxlbmd0aCxxLCEwKSl9cmV0dXJu
-IGF9LAokUzo0MH0KUC5jUy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3Rocm93IEguYihQLnJy
-KCJJbGxlZ2FsIElQdjQgYWRkcmVzcywgIithLHRoaXMuYSxiKSl9LAokUzo0M30KUC5WQy5wcm90b3R5
-cGU9ewokMjpmdW5jdGlvbihhLGIpe3Rocm93IEguYihQLnJyKCJJbGxlZ2FsIElQdjYgYWRkcmVzcywg
-IithLHRoaXMuYSxiKSl9LAokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy4kMihhLG51bGwpfSwKJFM6
-NDR9ClAudHAucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgdAppZihiLWE+NCl0aGlzLmEu
-JDIoImFuIElQdjYgcGFydCBjYW4gb25seSBjb250YWluIGEgbWF4aW11bSBvZiA0IGhleCBkaWdpdHMi
-LGEpCnQ9UC5RQShDLnhCLk5qKHRoaXMuYixhLGIpLG51bGwsMTYpCmlmKHR5cGVvZiB0IT09Im51bWJl
-ciIpcmV0dXJuIHQuSigpCmlmKHQ8MHx8dD42NTUzNSl0aGlzLmEuJDIoImVhY2ggcGFydCBtdXN0IGJl
-IGluIHRoZSByYW5nZSBvZiBgMHgwLi4weEZGRkZgIixhKQpyZXR1cm4gdH0sCiRTOjE5fQpQLkRuLnBy
-b3RvdHlwZT17CmdrdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ9LApnSmY6ZnVuY3Rpb24oYSl7dmFy
-IHQ9dGhpcy5jCmlmKHQ9PW51bGwpcmV0dXJuIiIKaWYoQy54Qi5uKHQsIlsiKSlyZXR1cm4gQy54Qi5O
-aih0LDEsdC5sZW5ndGgtMSkKcmV0dXJuIHR9LApndHA6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5kCmlm
-KHQ9PW51bGwpcmV0dXJuIFAud0sodGhpcy5hKQpyZXR1cm4gdH0sCmd0UDpmdW5jdGlvbigpe3ZhciB0
-PXRoaXMuZgpyZXR1cm4gdD09bnVsbD8iIjp0fSwKZ0thOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yCnJl
-dHVybiB0PT1udWxsPyIiOnR9LApubTpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAsbyxuLG0sbD10
-aGlzCnUuWC5iKG51bGwpCnUuYi5iKGIpCnQ9bC5hCnM9dD09PSJmaWxlIgpyPWwuYgpxPWwuZApwPWwu
-YwppZighKHAhPW51bGwpKXA9ci5sZW5ndGghPT0wfHxxIT1udWxsfHxzPyIiOm51bGwKbz1sLmUKaWYo
-IXMpbj1wIT1udWxsJiZvLmxlbmd0aCE9PTAKZWxzZSBuPSEwCmlmKG4mJiFDLnhCLm4obywiLyIpKW89
-Ii8iK28KaWYoYiE9bnVsbCltPVAubGUobnVsbCwwLDAsYikKZWxzZSBtPWwuZgpyZXR1cm4gbmV3IFAu
-RG4odCxyLHAscSxvLG0sbC5yKX0sCmdGajpmdW5jdGlvbigpe3ZhciB0LHM9dGhpcy54CmlmKHMhPW51
-bGwpcmV0dXJuIHMKdD10aGlzLmUKaWYodC5sZW5ndGghPT0wJiZDLnhCLlcodCwwKT09PTQ3KXQ9Qy54
-Qi5HKHQsMSkKcz10PT09IiI/Qy5kbjpQLkFGKG5ldyBILkE4KEguVk0odC5zcGxpdCgiLyIpLHUucyks
-dS5kTy5iKFAuUEgoKSksdS5kbyksdS5OKQp0aGlzLnNvNihzKQpyZXR1cm4gc30sCmdoWTpmdW5jdGlv
-bigpe3ZhciB0LHM9dGhpcwppZihzLlE9PW51bGwpe3Q9cy5mCnMuc1JIKG5ldyBQLkdqKFAuV1godD09
-bnVsbD8iIjp0KSx1LlQpKX1yZXR1cm4gcy5RfSwKSmg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxw
-LG8KZm9yKHQ9MCxzPTA7Qy54Qi5RaShiLCIuLi8iLHMpOyl7cys9MzsrK3R9cj1DLnhCLmNuKGEsIi8i
-KQp3aGlsZSghMCl7aWYoIShyPjAmJnQ+MCkpYnJlYWsKcT1DLnhCLlBrKGEsIi8iLHItMSkKaWYocTww
-KWJyZWFrCnA9ci1xCm89cCE9PTIKaWYoIW98fHA9PT0zKWlmKEMueEIubShhLHErMSk9PT00NilvPSFv
-fHxDLnhCLm0oYSxxKzIpPT09NDYKZWxzZSBvPSExCmVsc2Ugbz0hMQppZihvKWJyZWFrOy0tdApyPXF9
-cmV0dXJuIEMueEIuaTcoYSxyKzEsbnVsbCxDLnhCLkcoYixzLTMqdCkpfSwKWkk6ZnVuY3Rpb24oYSl7
-cmV0dXJuIHRoaXMubVMoUC5oSyhhKSl9LAptUzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG8sbixt
-LGwsaz10aGlzLGo9bnVsbAppZihhLmdGaSgpLmxlbmd0aCE9PTApe3Q9YS5nRmkoKQppZihhLmdjaigp
-KXtzPWEuZ2t1KCkKcj1hLmdKZihhKQpxPWEuZ3hBKCk/YS5ndHAoYSk6an1lbHNle3E9agpyPXEKcz0i
-In1wPVAueGUoYS5nSWkoYSkpCm89YS5nUUQoKT9hLmd0UCgpOmp9ZWxzZXt0PWsuYQppZihhLmdjaigp
-KXtzPWEuZ2t1KCkKcj1hLmdKZihhKQpxPVAud0IoYS5neEEoKT9hLmd0cChhKTpqLHQpCnA9UC54ZShh
-LmdJaShhKSkKbz1hLmdRRCgpP2EuZ3RQKCk6an1lbHNle3M9ay5iCnI9ay5jCnE9ay5kCmlmKGEuZ0lp
-KGEpPT09IiIpe3A9ay5lCm89YS5nUUQoKT9hLmd0UCgpOmsuZn1lbHNle2lmKGEuZ3RUKCkpcD1QLnhl
-KGEuZ0lpKGEpKQplbHNle249ay5lCmlmKG4ubGVuZ3RoPT09MClpZihyPT1udWxsKXA9dC5sZW5ndGg9
-PT0wP2EuZ0lpKGEpOlAueGUoYS5nSWkoYSkpCmVsc2UgcD1QLnhlKCIvIithLmdJaShhKSkKZWxzZXtt
-PWsuSmgobixhLmdJaShhKSkKbD10Lmxlbmd0aD09PTAKaWYoIWx8fHIhPW51bGx8fEMueEIubihuLCIv
-IikpcD1QLnhlKG0pCmVsc2UgcD1QLndGKG0sIWx8fHIhPW51bGwpfX1vPWEuZ1FEKCk/YS5ndFAoKTpq
-fX19cmV0dXJuIG5ldyBQLkRuKHQscyxyLHEscCxvLGEuZ1o4KCk/YS5nS2EoKTpqKX0sCmdjajpmdW5j
-dGlvbigpe3JldHVybiB0aGlzLmMhPW51bGx9LApneEE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kIT1u
-dWxsfSwKZ1FEOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZiE9bnVsbH0sCmdaODpmdW5jdGlvbigpe3Jl
-dHVybiB0aGlzLnIhPW51bGx9LApndFQ6ZnVuY3Rpb24oKXtyZXR1cm4gQy54Qi5uKHRoaXMuZSwiLyIp
-fSwKdDQ6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9dGhpcyxxPXIuYQppZihxIT09IiImJnEhPT0iZmlsZSIp
-dGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSAiK0guZChxKSsi
-IFVSSSIpKQpxPXIuZgppZigocT09bnVsbD8iIjpxKSE9PSIiKXRocm93IEguYihQLkw0KCJDYW5ub3Qg
-ZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgVVJJIHdpdGggYSBxdWVyeSBjb21wb25lbnQiKSkKcT1y
-LnIKaWYoKHE9PW51bGw/IiI6cSkhPT0iIil0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBm
-aWxlIHBhdGggZnJvbSBhIFVSSSB3aXRoIGEgZnJhZ21lbnQgY29tcG9uZW50IikpCnQ9JC53USgpCmlm
-KEgub1QodCkpcT1QLm1uKHIpCmVsc2V7aWYoci5jIT1udWxsJiZyLmdKZihyKSE9PSIiKUgudmgoUC5M
-NCgiQ2Fubm90IGV4dHJhY3QgYSBub24tV2luZG93cyBmaWxlIHBhdGggZnJvbSBhIGZpbGUgVVJJIHdp
-dGggYW4gYXV0aG9yaXR5IikpCnM9ci5nRmooKQpQLmtFKHMsITEpCnE9UC52ZyhDLnhCLm4oci5lLCIv
-Iik/Ii8iOiIiLHMsIi8iKQpxPXEuY2hhckNvZGVBdCgwKT09MD9xOnF9cmV0dXJuIHF9LAp3OmZ1bmN0
-aW9uKGEpe3ZhciB0LHMscixxPXRoaXMscD1xLnkKaWYocD09bnVsbCl7cD1xLmEKdD1wLmxlbmd0aCE9
-PTA/cCsiOiI6IiIKcz1xLmMKcj1zPT1udWxsCmlmKCFyfHxwPT09ImZpbGUiKXtwPXQrIi8vIgp0PXEu
-YgppZih0Lmxlbmd0aCE9PTApcD1wK3QrIkAiCmlmKCFyKXArPXMKdD1xLmQKaWYodCE9bnVsbClwPXAr
-IjoiK0guZCh0KX1lbHNlIHA9dApwKz1xLmUKdD1xLmYKaWYodCE9bnVsbClwPXArIj8iK3QKdD1xLnIK
-aWYodCE9bnVsbClwPXArIiMiK3QKcD1xLnk9cC5jaGFyQ29kZUF0KDApPT0wP3A6cH1yZXR1cm4gcH0s
-CkROOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyPXRoaXMKaWYoYj09bnVsbClyZXR1cm4hMQppZihyPT09
-YilyZXR1cm4hMAppZih1LkQuYyhiKSlpZihyLmE9PWIuZ0ZpKCkpaWYoci5jIT1udWxsPT09Yi5nY2oo
-KSlpZihyLmI9PWIuZ2t1KCkpaWYoci5nSmYocik9PWIuZ0pmKGIpKWlmKHIuZ3RwKHIpPT1iLmd0cChi
-KSlpZihyLmU9PT1iLmdJaShiKSl7dD1yLmYKcz10PT1udWxsCmlmKCFzPT09Yi5nUUQoKSl7aWYocyl0
-PSIiCmlmKHQ9PT1iLmd0UCgpKXt0PXIucgpzPXQ9PW51bGwKaWYoIXM9PT1iLmdaOCgpKXtpZihzKXQ9
-IiIKdD10PT09Yi5nS2EoKX1lbHNlIHQ9ITF9ZWxzZSB0PSExfWVsc2UgdD0hMX1lbHNlIHQ9ITEKZWxz
-ZSB0PSExCmVsc2UgdD0hMQplbHNlIHQ9ITEKZWxzZSB0PSExCmVsc2UgdD0hMQplbHNlIHQ9ITEKcmV0
-dXJuIHR9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy56CnJldHVybiB0PT1udWxsP3RoaXMuej1D
-LnhCLmdpTyh0aGlzLncoMCkpOnR9LApzbzY6ZnVuY3Rpb24oYSl7dGhpcy54PXUuYS5iKGEpfSwKc1JI
-OmZ1bmN0aW9uKGEpe3RoaXMuUT11LmYuYihhKX0sCiRpaUQ6MSwKZ0ZpOmZ1bmN0aW9uKCl7cmV0dXJu
-IHRoaXMuYX0sCmdJaTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lfX0KUC5lMS5wcm90b3R5cGU9ewok
-MTpmdW5jdGlvbihhKXt0aHJvdyBILmIoUC5ycigiSW52YWxpZCBwb3J0Iix0aGlzLmEsdGhpcy5iKzEp
-KX0sCiRTOjE0fQpQLk5ZLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0PSJJbGxlZ2FsIHBh
-dGggY2hhcmFjdGVyICIKSC55KGEpCmlmKEouemwoYSwiLyIpKWlmKHRoaXMuYSl0aHJvdyBILmIoUC54
-WSh0K2EpKQplbHNlIHRocm93IEguYihQLkw0KHQrYSkpfSwKJFM6MTR9ClAuUloucHJvdG90eXBlPXsK
-JDE6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuZVAoQy5aSixhLEMueE0sITEpfSwKJFM6NH0KUC5NRS5wcm90
-b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciB0PXRoaXMuYixzPXRoaXMuYQp0LmErPXMuYQpzLmE9
-IiYiCnM9dC5hKz1ILmQoUC5lUChDLkYzLGEsQy54TSwhMCkpCmlmKGIhPW51bGwmJmIubGVuZ3RoIT09
-MCl7dC5hPXMrIj0iCnQuYSs9SC5kKFAuZVAoQy5GMyxiLEMueE0sITApKX19LAokUzoyMn0KUC55NS5w
-cm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciB0LHMKSC55KGEpCmlmKGI9PW51bGx8fHR5cGVv
-ZiBiPT0ic3RyaW5nIil0aGlzLmEuJDIoYSxILnkoYikpCmVsc2UgZm9yKHQ9Si5JVCh1LlIuYihiKSks
-cz10aGlzLmE7dC5GKCk7KXMuJDIoYSxILnkodC5nbCgpKSl9LAokUzoxM30KUC5QRS5wcm90b3R5cGU9
-ewpnbFI6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwPXRoaXMsbz1udWxsLG49cC5jCmlmKG4hPW51bGwp
-cmV0dXJuIG4Kbj1wLmIKaWYoMD49bi5sZW5ndGgpcmV0dXJuIEguT0gobiwwKQp0PXAuYQpuPW5bMF0r
-MQpzPUMueEIuWFUodCwiPyIsbikKcj10Lmxlbmd0aAppZihzPj0wKXtxPVAudU8odCxzKzEscixDLlZD
-LCExKQpyPXN9ZWxzZSBxPW8KcmV0dXJuIHAuYz1uZXcgUC5xZSgiZGF0YSIsbyxvLG8sUC51Tyh0LG4s
-cixDLldkLCExKSxxLG8pfSwKdzpmdW5jdGlvbihhKXt2YXIgdCxzPXRoaXMuYgppZigwPj1zLmxlbmd0
-aClyZXR1cm4gSC5PSChzLDApCnQ9dGhpcy5hCnJldHVybiBzWzBdPT09LTE/ImRhdGE6Iit0OnR9fQpQ
-LnEzLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgVWludDhBcnJheSg5Nil9LAok
-UzoyM30KUC55SS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciB0PXRoaXMuYQppZihhPj10
-Lmxlbmd0aClyZXR1cm4gSC5PSCh0LGEpCnQ9dFthXQpKLkNNKHQsMCw5NixiKQpyZXR1cm4gdH0sCiRT
-OjI0fQpQLmM2LnByb3RvdHlwZT17CiQzOmZ1bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscQpmb3IodD1i
-Lmxlbmd0aCxzPWEubGVuZ3RoLHI9MDtyPHQ7KytyKXtxPUMueEIuVyhiLHIpXjk2CmlmKHE+PXMpcmV0
-dXJuIEguT0goYSxxKQphW3FdPWN9fX0KUC5xZC5wcm90b3R5cGU9ewokMzpmdW5jdGlvbihhLGIsYyl7
-dmFyIHQscyxyLHEKZm9yKHQ9Qy54Qi5XKGIsMCkscz1DLnhCLlcoYiwxKSxyPWEubGVuZ3RoO3Q8PXM7
-Kyt0KXtxPSh0Xjk2KT4+PjAKaWYocT49cilyZXR1cm4gSC5PSChhLHEpCmFbcV09Y319fQpQLlVmLnBy
-b3RvdHlwZT17CmdjajpmdW5jdGlvbigpe3JldHVybiB0aGlzLmM+MH0sCmd4QTpmdW5jdGlvbigpe3Zh
-ciB0LHMKaWYodGhpcy5jPjApe3Q9dGhpcy5kCmlmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJuIHQu
-aCgpCnM9dGhpcy5lCmlmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIEgucFkocykKcz10KzE8cwp0
-PXN9ZWxzZSB0PSExCnJldHVybiB0fSwKZ1FEOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5mCmlmKHR5cGVv
-ZiB0IT09Im51bWJlciIpcmV0dXJuIHQuSigpCnJldHVybiB0PHRoaXMucn0sCmdaODpmdW5jdGlvbigp
-e3JldHVybiB0aGlzLnI8dGhpcy5hLmxlbmd0aH0sCmdOdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmI9
-PT00JiZDLnhCLm4odGhpcy5hLCJmaWxlIil9LApndmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iPT09
-NCYmQy54Qi5uKHRoaXMuYSwiaHR0cCIpfSwKZ3FCOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYj09PTUm
-JkMueEIubih0aGlzLmEsImh0dHBzIil9LApndFQ6ZnVuY3Rpb24oKXtyZXR1cm4gQy54Qi5RaSh0aGlz
-LmEsIi8iLHRoaXMuZSl9LApnRmk6ZnVuY3Rpb24oKXt2YXIgdCxzPXRoaXMscj0icGFja2FnZSIscT1z
-LmIKaWYocTw9MClyZXR1cm4iIgp0PXMueAppZih0IT1udWxsKXJldHVybiB0CmlmKHMuZ3ZoKCkpcT1z
-Lng9Imh0dHAiCmVsc2UgaWYocy5ncUIoKSl7cy54PSJodHRwcyIKcT0iaHR0cHMifWVsc2UgaWYocy5n
-TncoKSl7cy54PSJmaWxlIgpxPSJmaWxlIn1lbHNlIGlmKHE9PT03JiZDLnhCLm4ocy5hLHIpKXtzLng9
-cgpxPXJ9ZWxzZXtxPUMueEIuTmoocy5hLDAscSkKcy54PXF9cmV0dXJuIHF9LApna3U6ZnVuY3Rpb24o
-KXt2YXIgdD10aGlzLmMscz10aGlzLmIrMwpyZXR1cm4gdD5zP0MueEIuTmoodGhpcy5hLHMsdC0xKToi
-In0sCmdKZjpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmMKcmV0dXJuIHQ+MD9DLnhCLk5qKHRoaXMuYSx0
-LHRoaXMuZCk6IiJ9LApndHA6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlzCmlmKHMuZ3hBKCkpe3Q9cy5k
-CmlmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJuIHQuaCgpCnJldHVybiBQLlFBKEMueEIuTmoocy5h
-LHQrMSxzLmUpLG51bGwsbnVsbCl9aWYocy5ndmgoKSlyZXR1cm4gODAKaWYocy5ncUIoKSlyZXR1cm4g
-NDQzCnJldHVybiAwfSwKZ0lpOmZ1bmN0aW9uKGEpe3JldHVybiBDLnhCLk5qKHRoaXMuYSx0aGlzLmUs
-dGhpcy5mKX0sCmd0UDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZixzPXRoaXMucgppZih0eXBlb2YgdCE9
-PSJudW1iZXIiKXJldHVybiB0LkooKQpyZXR1cm4gdDxzP0MueEIuTmoodGhpcy5hLHQrMSxzKToiIn0s
-CmdLYTpmdW5jdGlvbigpe3ZhciB0PXRoaXMucixzPXRoaXMuYQpyZXR1cm4gdDxzLmxlbmd0aD9DLnhC
-Lkcocyx0KzEpOiIifSwKZ0ZqOmZ1bmN0aW9uKCl7dmFyIHQscyxyPXRoaXMuZSxxPXRoaXMuZixwPXRo
-aXMuYQppZihDLnhCLlFpKHAsIi8iLHIpKXtpZih0eXBlb2YgciE9PSJudW1iZXIiKXJldHVybiByLmgo
-KTsrK3J9aWYocj09cSlyZXR1cm4gQy5kbgp0PUguVk0oW10sdS5zKQpzPXIKd2hpbGUoITApe2lmKHR5
-cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIHMuSigpCmlmKHR5cGVvZiBxIT09Im51bWJlciIpcmV0dXJu
-IEgucFkocSkKaWYoIShzPHEpKWJyZWFrCmlmKEMueEIubShwLHMpPT09NDcpe0MuTm0uaSh0LEMueEIu
-TmoocCxyLHMpKQpyPXMrMX0rK3N9Qy5ObS5pKHQsQy54Qi5OaihwLHIscSkpCnJldHVybiBQLkFGKHQs
-dS5OKX0sCmdoWTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZgppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJl
-dHVybiB0LkooKQppZih0Pj10aGlzLnIpcmV0dXJuIEMuV08KcmV0dXJuIG5ldyBQLkdqKFAuV1godGhp
-cy5ndFAoKSksdS5UKX0sCmtYOmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcy5kCmlmKHR5cGVvZiBzIT09
-Im51bWJlciIpcmV0dXJuIHMuaCgpCnQ9cysxCnJldHVybiB0K2EubGVuZ3RoPT09dGhpcy5lJiZDLnhC
-LlFpKHRoaXMuYSxhLHQpfSwKTjk6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLHM9dC5yLHI9dC5hCmlmKHM+
-PXIubGVuZ3RoKXJldHVybiB0CnJldHVybiBuZXcgUC5VZihDLnhCLk5qKHIsMCxzKSx0LmIsdC5jLHQu
-ZCx0LmUsdC5mLHMsdC54KX0sCm5tOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvLG4sbSxsLGss
-aixpPXRoaXMsaD1udWxsCnUuWC5iKG51bGwpCnUuYi5iKGIpCnQ9aS5nRmkoKQpzPXQ9PT0iZmlsZSIK
-cj1pLmMKcT1yPjA/Qy54Qi5OaihpLmEsaS5iKzMscik6IiIKcD1pLmd4QSgpP2kuZ3RwKGkpOmgKcj1p
-LmMKaWYocj4wKW89Qy54Qi5OaihpLmEscixpLmQpCmVsc2Ugbz1xLmxlbmd0aCE9PTB8fHAhPW51bGx8
-fHM/IiI6aApyPWkuYQpuPWkuZgptPUMueEIuTmoocixpLmUsbikKaWYoIXMpbD1vIT1udWxsJiZtLmxl
-bmd0aCE9PTAKZWxzZSBsPSEwCmlmKGwmJiFDLnhCLm4obSwiLyIpKW09Ii8iK20KaWYoYiE9bnVsbClr
-PVAubGUoaCwwLDAsYikKZWxzZXtsPWkucgppZih0eXBlb2YgbiE9PSJudW1iZXIiKXJldHVybiBuLkoo
-KQprPW48bD9DLnhCLk5qKHIsbisxLGwpOmh9bj1pLnIKaj1uPHIubGVuZ3RoP0MueEIuRyhyLG4rMSk6
-aApyZXR1cm4gbmV3IFAuRG4odCxxLG8scCxtLGssail9LApaSTpmdW5jdGlvbihhKXtyZXR1cm4gdGhp
-cy5tUyhQLmhLKGEpKX0sCm1TOmZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBQLlVmKXJldHVybiB0
-aGlzLnUxKHRoaXMsYSkKcmV0dXJuIHRoaXMuUmUoKS5tUyhhKX0sCnUxOmZ1bmN0aW9uKGEsYil7dmFy
-IHQscyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGU9Yi5iCmlmKGU+MClyZXR1cm4gYgp0PWIuYwpp
-Zih0PjApe3M9YS5iCmlmKHM8PTApcmV0dXJuIGIKaWYoYS5nTncoKSlyPWIuZSE9Yi5mCmVsc2UgaWYo
-YS5ndmgoKSlyPSFiLmtYKCI4MCIpCmVsc2Ugcj0hYS5ncUIoKXx8IWIua1goIjQ0MyIpCmlmKHIpe3E9
-cysxCnA9Qy54Qi5OaihhLmEsMCxxKStDLnhCLkcoYi5hLGUrMSkKZT1iLmQKaWYodHlwZW9mIGUhPT0i
-bnVtYmVyIilyZXR1cm4gZS5oKCkKbz1iLmUKaWYodHlwZW9mIG8hPT0ibnVtYmVyIilyZXR1cm4gby5o
-KCkKbj1iLmYKaWYodHlwZW9mIG4hPT0ibnVtYmVyIilyZXR1cm4gbi5oKCkKcmV0dXJuIG5ldyBQLlVm
-KHAscyx0K3EsZStxLG8rcSxuK3EsYi5yK3EsYS54KX1lbHNlIHJldHVybiB0aGlzLlJlKCkubVMoYil9
-bT1iLmUKZT1iLmYKaWYobT09ZSl7dD1iLnIKaWYodHlwZW9mIGUhPT0ibnVtYmVyIilyZXR1cm4gZS5K
-KCkKaWYoZTx0KXtzPWEuZgppZih0eXBlb2YgcyE9PSJudW1iZXIiKXJldHVybiBzLkhOKCkKcT1zLWUK
-cmV0dXJuIG5ldyBQLlVmKEMueEIuTmooYS5hLDAscykrQy54Qi5HKGIuYSxlKSxhLmIsYS5jLGEuZCxh
-LmUsZStxLHQrcSxhLngpfWU9Yi5hCmlmKHQ8ZS5sZW5ndGgpe3M9YS5yCnJldHVybiBuZXcgUC5VZihD
-LnhCLk5qKGEuYSwwLHMpK0MueEIuRyhlLHQpLGEuYixhLmMsYS5kLGEuZSxhLmYsdCsocy10KSxhLngp
-fXJldHVybiBhLk45KCl9dD1iLmEKaWYoQy54Qi5RaSh0LCIvIixtKSl7cz1hLmUKaWYodHlwZW9mIHMh
-PT0ibnVtYmVyIilyZXR1cm4gcy5ITigpCmlmKHR5cGVvZiBtIT09Im51bWJlciIpcmV0dXJuIEgucFko
-bSkKcT1zLW0KcD1DLnhCLk5qKGEuYSwwLHMpK0MueEIuRyh0LG0pCmlmKHR5cGVvZiBlIT09Im51bWJl
-ciIpcmV0dXJuIGUuaCgpCnJldHVybiBuZXcgUC5VZihwLGEuYixhLmMsYS5kLHMsZStxLGIucitxLGEu
-eCl9bD1hLmUKaz1hLmYKaWYobD09ayYmYS5jPjApe2Zvcig7Qy54Qi5RaSh0LCIuLi8iLG0pOyl7aWYo
-dHlwZW9mIG0hPT0ibnVtYmVyIilyZXR1cm4gbS5oKCkKbSs9M31pZih0eXBlb2YgbCE9PSJudW1iZXIi
-KXJldHVybiBsLkhOKCkKaWYodHlwZW9mIG0hPT0ibnVtYmVyIilyZXR1cm4gSC5wWShtKQpxPWwtbSsx
-CnA9Qy54Qi5OaihhLmEsMCxsKSsiLyIrQy54Qi5HKHQsbSkKaWYodHlwZW9mIGUhPT0ibnVtYmVyIily
-ZXR1cm4gZS5oKCkKcmV0dXJuIG5ldyBQLlVmKHAsYS5iLGEuYyxhLmQsbCxlK3EsYi5yK3EsYS54KX1q
-PWEuYQpmb3IoaT1sO0MueEIuUWkoaiwiLi4vIixpKTspe2lmKHR5cGVvZiBpIT09Im51bWJlciIpcmV0
-dXJuIGkuaCgpCmkrPTN9aD0wCndoaWxlKCEwKXtpZih0eXBlb2YgbSE9PSJudW1iZXIiKXJldHVybiBt
-LmgoKQpnPW0rMwppZih0eXBlb2YgZSE9PSJudW1iZXIiKXJldHVybiBILnBZKGUpCmlmKCEoZzw9ZSYm
-Qy54Qi5RaSh0LCIuLi8iLG0pKSlicmVhazsrK2gKbT1nfWY9IiIKd2hpbGUoITApe2lmKHR5cGVvZiBr
-IT09Im51bWJlciIpcmV0dXJuIGsub3MoKQppZih0eXBlb2YgaSE9PSJudW1iZXIiKXJldHVybiBILnBZ
-KGkpCmlmKCEoaz5pKSlicmVhazstLWsKaWYoQy54Qi5tKGosayk9PT00Nyl7aWYoaD09PTApe2Y9Ii8i
-CmJyZWFrfS0taApmPSIvIn19aWYoaz09PWkmJmEuYjw9MCYmIUMueEIuUWkoaiwiLyIsbCkpe20tPWgq
-MwpmPSIifXE9ay1tK2YubGVuZ3RoCnJldHVybiBuZXcgUC5VZihDLnhCLk5qKGosMCxrKStmK0MueEIu
-Ryh0LG0pLGEuYixhLmMsYS5kLGwsZStxLGIucitxLGEueCl9LAp0NDpmdW5jdGlvbigpe3ZhciB0LHMs
-cixxLHA9dGhpcwppZihwLmI+PTAmJiFwLmdOdygpKXRocm93IEguYihQLkw0KCJDYW5ub3QgZXh0cmFj
-dCBhIGZpbGUgcGF0aCBmcm9tIGEgIitILmQocC5nRmkoKSkrIiBVUkkiKSkKdD1wLmYKcz1wLmEKaWYo
-dHlwZW9mIHQhPT0ibnVtYmVyIilyZXR1cm4gdC5KKCkKaWYodDxzLmxlbmd0aCl7aWYodDxwLnIpdGhy
-b3cgSC5iKFAuTDQoIkNhbm5vdCBleHRyYWN0IGEgZmlsZSBwYXRoIGZyb20gYSBVUkkgd2l0aCBhIHF1
-ZXJ5IGNvbXBvbmVudCIpKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGgg
-ZnJvbSBhIFVSSSB3aXRoIGEgZnJhZ21lbnQgY29tcG9uZW50IikpfXI9JC53USgpCmlmKEgub1Qocikp
-dD1QLm1uKHApCmVsc2V7cT1wLmQKaWYodHlwZW9mIHEhPT0ibnVtYmVyIilyZXR1cm4gSC5wWShxKQpp
-ZihwLmM8cSlILnZoKFAuTDQoIkNhbm5vdCBleHRyYWN0IGEgbm9uLVdpbmRvd3MgZmlsZSBwYXRoIGZy
-b20gYSBmaWxlIFVSSSB3aXRoIGFuIGF1dGhvcml0eSIpKQp0PUMueEIuTmoocyxwLmUsdCl9cmV0dXJu
-IHR9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy55CnJldHVybiB0PT1udWxsP3RoaXMueT1DLnhC
-LmdpTyh0aGlzLmEpOnR9LApETjpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKaWYodGhp
-cz09PWIpcmV0dXJuITAKcmV0dXJuIHUuRC5jKGIpJiZ0aGlzLmE9PT1iLncoMCl9LApSZTpmdW5jdGlv
-bigpe3ZhciB0PXRoaXMscz1udWxsLHI9dC5nRmkoKSxxPXQuZ2t1KCkscD10LmM+MD90LmdKZih0KTpz
-LG89dC5neEEoKT90Lmd0cCh0KTpzLG49dC5hLG09dC5mLGw9Qy54Qi5OaihuLHQuZSxtKSxrPXQucgpp
-Zih0eXBlb2YgbSE9PSJudW1iZXIiKXJldHVybiBtLkooKQptPW08az90Lmd0UCgpOnMKcmV0dXJuIG5l
-dyBQLkRuKHIscSxwLG8sbCxtLGs8bi5sZW5ndGg/dC5nS2EoKTpzKX0sCnc6ZnVuY3Rpb24oYSl7cmV0
-dXJuIHRoaXMuYX0sCiRpaUQ6MX0KUC5xZS5wcm90b3R5cGU9e30KVy5xRS5wcm90b3R5cGU9e30KVy5H
-aC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiBTdHJpbmcoYSl9LAokaUdoOjF9ClcuZlku
-cHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEpfX0KVy5uQi5wcm90b3R5cGU9
-eyRpbkI6MX0KVy5Bei5wcm90b3R5cGU9eyRpQXo6MX0KVy5RUC5wcm90b3R5cGU9eyRpUVA6MX0KVy5u
-eC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9fQpXLm9KLnByb3RvdHlw
-ZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH19ClcuaWQucHJvdG90eXBlPXt9ClcuUUYu
-cHJvdG90eXBlPXt9ClcuTmgucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEp
-fX0KVy5JQi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJSZWN0YW5nbGUgKCIrSC5kKGEu
-bGVmdCkrIiwgIitILmQoYS50b3ApKyIpICIrSC5kKGEud2lkdGgpKyIgeCAiK0guZChhLmhlaWdodCl9
-LApETjpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKcmV0dXJuIHUucS5jKGIpJiZhLmxl
-ZnQ9PT1iLmxlZnQmJmEudG9wPT09Yi50b3AmJmEud2lkdGg9PT1iLndpZHRoJiZhLmhlaWdodD09PWIu
-aGVpZ2h0fSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBXLnJFKEMuQ0QuZ2lPKGEubGVmdCksQy5DRC5n
-aU8oYS50b3ApLEMuQ0QuZ2lPKGEud2lkdGgpLEMuQ0QuZ2lPKGEuaGVpZ2h0KSl9LAokaXRuOjF9Clcu
-bjcucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofX0KVy53ei5wcm90b3R5
-cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXt2
-YXIgdApILlNjKGIpCnQ9dGhpcy5hCmlmKGI8MHx8Yj49dC5sZW5ndGgpcmV0dXJuIEguT0godCxiKQpy
-ZXR1cm4gdGhpcy4kdGkuZC5iKHRbYl0pfSwKWTpmdW5jdGlvbihhLGIsYyl7dGhpcy4kdGkuZC5iKGMp
-CnRocm93IEguYihQLkw0KCJDYW5ub3QgbW9kaWZ5IGxpc3QiKSl9fQpXLmN2LnByb3RvdHlwZT17CmdR
-ZzpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcuaTcoYSl9LApnRDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3
-IFcuSTQoYSl9LApzRDpmdW5jdGlvbihhLGIpe3ZhciB0CnUuWC5iKGIpCnQ9dGhpcy5nRChhKQp0LlYx
-KDApCnQuRlYoMCxiKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubG9jYWxOYW1lfSwKdG46ZnVuY3Rp
-b24oYSl7dmFyIHQ9ISFhLnNjcm9sbEludG9WaWV3SWZOZWVkZWQKaWYodClhLnNjcm9sbEludG9WaWV3
-SWZOZWVkZWQoKQplbHNlIGEuc2Nyb2xsSW50b1ZpZXcoKX0sCnI2OmZ1bmN0aW9uKGEsYixjLGQpe3Zh
-ciB0LHMscixxCmlmKGM9PW51bGwpe2lmKGQ9PW51bGwpe3Q9JC5sdAppZih0PT1udWxsKXt0PUguVk0o
-W10sdS5rKQpzPW5ldyBXLnZEKHQpCkMuTm0uaSh0LFcuVHcobnVsbCkpCkMuTm0uaSh0LFcuQmwoKSkK
-JC5sdD1zCmQ9c31lbHNlIGQ9dH10PSQuRVUKaWYodD09bnVsbCl7dD1uZXcgVy5LbyhkKQokLkVVPXQK
-Yz10fWVsc2V7dC5hPWQKYz10fX1lbHNlIGlmKGQhPW51bGwpdGhyb3cgSC5iKFAueFkoInZhbGlkYXRv
-ciBjYW4gb25seSBiZSBwYXNzZWQgaWYgdHJlZVNhbml0aXplciBpcyBudWxsIikpCmlmKCQueG89PW51
-bGwpe3Q9ZG9jdW1lbnQKcz10LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikKJC54
-bz1zCiQuQk89cy5jcmVhdGVSYW5nZSgpCnM9JC54by5jcmVhdGVFbGVtZW50KCJiYXNlIikKdS5jUi5i
-KHMpCnMuaHJlZj10LmJhc2VVUkkKJC54by5oZWFkLmFwcGVuZENoaWxkKHMpfXQ9JC54bwppZih0LmJv
-ZHk9PW51bGwpe3M9dC5jcmVhdGVFbGVtZW50KCJib2R5IikKdC5ib2R5PXUuWS5iKHMpfXQ9JC54bwpp
-Zih1LlkuYyhhKSlyPXQuYm9keQplbHNle3I9dC5jcmVhdGVFbGVtZW50KGEudGFnTmFtZSkKJC54by5i
-b2R5LmFwcGVuZENoaWxkKHIpfWlmKCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5S
-YW5nZS5wcm90b3R5cGUmJiFDLk5tLnRnKEMuU3EsYS50YWdOYW1lKSl7JC5CTy5zZWxlY3ROb2RlQ29u
-dGVudHMocikKcT0kLkJPLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChiKX1lbHNle3IuaW5uZXJIVE1M
-PWIKcT0kLnhvLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpmb3IoO3Q9ci5maXJzdENoaWxkLHQhPW51
-bGw7KXEuYXBwZW5kQ2hpbGQodCl9dD0kLnhvLmJvZHkKaWYocj09bnVsbD90IT1udWxsOnIhPT10KUou
-THQocikKYy5QbihxKQpkb2N1bWVudC5hZG9wdE5vZGUocSkKcmV0dXJuIHF9LApBSDpmdW5jdGlvbihh
-LGIsYyl7cmV0dXJuIHRoaXMucjYoYSxiLGMsbnVsbCl9LApzaGY6ZnVuY3Rpb24oYSxiKXt0aGlzLllD
-KGEsYil9LApwazpmdW5jdGlvbihhLGIsYyl7YS50ZXh0Q29udGVudD1udWxsCmEuYXBwZW5kQ2hpbGQo
-dGhpcy5yNihhLGIsbnVsbCxjKSl9LApZQzpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnBrKGEsYixu
-dWxsKX0sCmdWbDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcuQ3EoYSwiY2xpY2siLCExLHUuUSl9LAok
-aWN2OjEsCmduczpmdW5jdGlvbihhKXtyZXR1cm4gYS50YWdOYW1lfX0KVy5Ddi5wcm90b3R5cGU9ewok
-MTpmdW5jdGlvbihhKXtyZXR1cm4gdS5oLmModS5BLmIoYSkpfSwKJFM6MjV9ClcuZWEucHJvdG90eXBl
-PXskaWVhOjF9ClcuRDAucHJvdG90eXBlPXsKT246ZnVuY3Rpb24oYSxiLGMsZCl7dS5VLmIoYykKaWYo
-YyE9bnVsbCl0aGlzLnYoYSxiLGMsZCl9LApCOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5Pbihh
-LGIsYyxudWxsKX0sCnY6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGEuYWRkRXZlbnRMaXN0ZW5lcihi
-LEgudFIodS5VLmIoYyksMSksZCl9LAokaUQwOjF9ClcuVDUucHJvdG90eXBlPXskaVQ1OjF9ClcuaDQu
-cHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofX0KVy5ici5wcm90b3R5cGU9
-ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9fQpXLlZiLnByb3RvdHlwZT17fQpXLk83LnBy
-b3RvdHlwZT17CmVvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLm9wZW4oYixjLCEwKX0sCiRpTzc6
-MX0KVy5iVS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3RoaXMuYS5zZXRSZXF1ZXN0SGVhZGVy
-KEgueShhKSxILnkoYikpfSwKJFM6OX0KVy5oSC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIg
-dCxzLHIscSxwCnUucC5iKGEpCnQ9dGhpcy5hCnM9dC5zdGF0dXMKaWYodHlwZW9mIHMhPT0ibnVtYmVy
-IilyZXR1cm4gcy50QigpCnI9cz49MjAwJiZzPDMwMApxPXM+MzA3JiZzPDQwMApzPXJ8fHM9PT0wfHxz
-PT09MzA0fHxxCnA9dGhpcy5iCmlmKHMpcC5hTSgwLHQpCmVsc2UgcC5wbShhKX0sCiRTOjI3fQpXLndh
-LnByb3RvdHlwZT17fQpXLlNnLnByb3RvdHlwZT17JGlTZzoxfQpXLnU4LnByb3RvdHlwZT17CmdEcjpm
-dW5jdGlvbihhKXtpZigib3JpZ2luIiBpbiBhKXJldHVybiBhLm9yaWdpbgpyZXR1cm4gSC5kKGEucHJv
-dG9jb2wpKyIvLyIrSC5kKGEuaG9zdCl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBTdHJpbmcoYSl9LAok
-aXU4OjF9ClcuQWoucHJvdG90eXBlPXskaUFqOjF9ClcuZTcucHJvdG90eXBlPXsKZ3I4OmZ1bmN0aW9u
-KGEpe3ZhciB0PXRoaXMuYSxzPXQuY2hpbGROb2Rlcy5sZW5ndGgKaWYocz09PTApdGhyb3cgSC5iKFAu
-UFYoIk5vIGVsZW1lbnRzIikpCmlmKHM+MSl0aHJvdyBILmIoUC5QVigiTW9yZSB0aGFuIG9uZSBlbGVt
-ZW50IikpCnJldHVybiB0LmZpcnN0Q2hpbGR9LApGVjpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxCnUu
-ZWguYihiKQp0PWIuYQpzPXRoaXMuYQppZih0IT09cylmb3Iocj10LmNoaWxkTm9kZXMubGVuZ3RoLHE9
-MDtxPHI7KytxKXMuYXBwZW5kQ2hpbGQodC5maXJzdENoaWxkKQpyZXR1cm59LApZOmZ1bmN0aW9uKGEs
-YixjKXt2YXIgdCxzCnUuQS5iKGMpCnQ9dGhpcy5hCnM9dC5jaGlsZE5vZGVzCmlmKGI8MHx8Yj49cy5s
-ZW5ndGgpcmV0dXJuIEguT0gocyxiKQp0LnJlcGxhY2VDaGlsZChjLHNbYl0pfSwKZ2t6OmZ1bmN0aW9u
-KGEpe3ZhciB0PXRoaXMuYS5jaGlsZE5vZGVzCnJldHVybiBuZXcgVy5XOSh0LHQubGVuZ3RoLEguekso
-dCkuQygiVzk8R20uRT4iKSl9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLmNoaWxkTm9kZXMu
-bGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe3ZhciB0CkguU2MoYikKdD10aGlzLmEuY2hpbGROb2Rlcwpp
-ZihiPDB8fGI+PXQubGVuZ3RoKXJldHVybiBILk9IKHQsYikKcmV0dXJuIHRbYl19fQpXLnVILnByb3Rv
-dHlwZT17CndnOmZ1bmN0aW9uKGEpe3ZhciB0PWEucGFyZW50Tm9kZQppZih0IT1udWxsKXQucmVtb3Zl
-Q2hpbGQoYSl9LApENDpmdW5jdGlvbihhKXt2YXIgdApmb3IoO3Q9YS5maXJzdENoaWxkLHQhPW51bGw7
-KWEucmVtb3ZlQ2hpbGQodCl9LAp3OmZ1bmN0aW9uKGEpe3ZhciB0PWEubm9kZVZhbHVlCnJldHVybiB0
-PT1udWxsP3RoaXMuVShhKTp0fSwKJGl1SDoxfQpXLkJILnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEp
-e3JldHVybiBhLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXtILlNjKGIpCmlmKGI+Pj4wIT09Ynx8Yj49
-YS5sZW5ndGgpdGhyb3cgSC5iKFAuQ2YoYixhLG51bGwsbnVsbCxudWxsKSkKcmV0dXJuIGFbYl19LApZ
-OmZ1bmN0aW9uKGEsYixjKXt1LkEuYihjKQp0aHJvdyBILmIoUC5MNCgiQ2Fubm90IGFzc2lnbiBlbGVt
-ZW50IG9mIGltbXV0YWJsZSBMaXN0LiIpKX0sCkU6ZnVuY3Rpb24oYSxiKXtpZihiPDB8fGI+PWEubGVu
-Z3RoKXJldHVybiBILk9IKGEsYikKcmV0dXJuIGFbYl19LAokaVhqOjEsCiRpY1g6MSwKJGl6TToxfQpX
-LlNOLnByb3RvdHlwZT17fQpXLmV3LnByb3RvdHlwZT17JGlldzoxfQpXLmxwLnByb3RvdHlwZT17CmdB
-OmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH19ClcuVGIucHJvdG90eXBlPXsKcjY6ZnVuY3Rpb24o
-YSxiLGMsZCl7dmFyIHQscwppZigiY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiBpbiB3aW5kb3cuUmFu
-Z2UucHJvdG90eXBlKXJldHVybiB0aGlzLkRXKGEsYixjLGQpCnQ9Vy5VOSgiPHRhYmxlPiIrSC5kKGIp
-KyI8L3RhYmxlPiIsYyxkKQpzPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpzLnRvU3Ry
-aW5nCnQudG9TdHJpbmcKbmV3IFcuZTcocykuRlYoMCxuZXcgVy5lNyh0KSkKcmV0dXJuIHN9fQpXLkl2
-LnByb3RvdHlwZT17CnI2OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscixxCmlmKCJjcmVhdGVDb250
-ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxi
-LGMsZCkKdD1kb2N1bWVudApzPXQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCnQ9Qy5JZS5yNih0LmNy
-ZWF0ZUVsZW1lbnQoInRhYmxlIiksYixjLGQpCnQudG9TdHJpbmcKdD1uZXcgVy5lNyh0KQpyPXQuZ3I4
-KHQpCnIudG9TdHJpbmcKdD1uZXcgVy5lNyhyKQpxPXQuZ3I4KHQpCnMudG9TdHJpbmcKcS50b1N0cmlu
-ZwpuZXcgVy5lNyhzKS5GVigwLG5ldyBXLmU3KHEpKQpyZXR1cm4gc319ClcuQlQucHJvdG90eXBlPXsK
-cjY6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscyxyCmlmKCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQi
-IGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUpcmV0dXJuIHRoaXMuRFcoYSxiLGMsZCkKdD1kb2N1bWVu
-dApzPXQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCnQ9Qy5JZS5yNih0LmNyZWF0ZUVsZW1lbnQoInRh
-YmxlIiksYixjLGQpCnQudG9TdHJpbmcKdD1uZXcgVy5lNyh0KQpyPXQuZ3I4KHQpCnMudG9TdHJpbmcK
-ci50b1N0cmluZwpuZXcgVy5lNyhzKS5GVigwLG5ldyBXLmU3KHIpKQpyZXR1cm4gc319ClcueVkucHJv
-dG90eXBlPXsKcGs6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMKYS50ZXh0Q29udGVudD1udWxsCnQ9YS5j
-b250ZW50CnQudG9TdHJpbmcKSi5iVCh0KQpzPXRoaXMucjYoYSxiLG51bGwsYykKYS5jb250ZW50LmFw
-cGVuZENoaWxkKHMpfSwKWUM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wayhhLGIsbnVsbCl9LAok
-aXlZOjF9ClcudzYucHJvdG90eXBlPXt9ClcuSzUucHJvdG90eXBlPXsKZ21XOmZ1bmN0aW9uKGEpe3Jl
-dHVybiBhLmxvY2F0aW9ufSwKJGlLNToxLAokaXY2OjF9ClcuQ20ucHJvdG90eXBlPXskaUNtOjF9Clcu
-Q1EucHJvdG90eXBlPXskaUNROjF9ClcudzQucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4i
-UmVjdGFuZ2xlICgiK0guZChhLmxlZnQpKyIsICIrSC5kKGEudG9wKSsiKSAiK0guZChhLndpZHRoKSsi
-IHggIitILmQoYS5oZWlnaHQpfSwKRE46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVybiExCnJl
-dHVybiB1LnEuYyhiKSYmYS5sZWZ0PT09Yi5sZWZ0JiZhLnRvcD09PWIudG9wJiZhLndpZHRoPT09Yi53
-aWR0aCYmYS5oZWlnaHQ9PT1iLmhlaWdodH0sCmdpTzpmdW5jdGlvbihhKXtyZXR1cm4gVy5yRShDLkNE
-LmdpTyhhLmxlZnQpLEMuQ0QuZ2lPKGEudG9wKSxDLkNELmdpTyhhLndpZHRoKSxDLkNELmdpTyhhLmhl
-aWdodCkpfX0KVy5yaC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LApx
-OmZ1bmN0aW9uKGEsYil7SC5TYyhiKQppZihiPj4+MCE9PWJ8fGI+PWEubGVuZ3RoKXRocm93IEguYihQ
-LkNmKGIsYSxudWxsLG51bGwsbnVsbCkpCnJldHVybiBhW2JdfSwKWTpmdW5jdGlvbihhLGIsYyl7dS5B
-LmIoYykKdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBhc3NpZ24gZWxlbWVudCBvZiBpbW11dGFibGUgTGlz
-dC4iKSl9LApFOmZ1bmN0aW9uKGEsYil7aWYoYjwwfHxiPj1hLmxlbmd0aClyZXR1cm4gSC5PSChhLGIp
-CnJldHVybiBhW2JdfSwKJGlYajoxLAokaWNYOjEsCiRpek06MX0KVy5EOS5wcm90b3R5cGU9ewpLOmZ1
-bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscAp1LkUuYihiKQpmb3IodD10aGlzLmdWKCkscz10Lmxlbmd0
-aCxyPXRoaXMuYSxxPTA7cTx0Lmxlbmd0aDt0Lmxlbmd0aD09PXN8fCgwLEgubGspKHQpLCsrcSl7cD10
-W3FdCmIuJDIocCxyLmdldEF0dHJpYnV0ZShwKSl9fSwKZ1Y6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxw
-PXRoaXMuYS5hdHRyaWJ1dGVzLG89SC5WTShbXSx1LnMpCmZvcih0PXAubGVuZ3RoLHM9dS5oOSxyPTA7
-cjx0Oysrcil7aWYocj49cC5sZW5ndGgpcmV0dXJuIEguT0gocCxyKQpxPXMuYihwW3JdKQppZihxLm5h
-bWVzcGFjZVVSST09bnVsbClDLk5tLmkobyxxLm5hbWUpfXJldHVybiBvfX0KVy5pNy5wcm90b3R5cGU9
-ewpxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYS5nZXRBdHRyaWJ1dGUoSC55KGIpKX0sClk6ZnVu
-Y3Rpb24oYSxiLGMpe3RoaXMuYS5zZXRBdHRyaWJ1dGUoYixjKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVy
-biB0aGlzLmdWKCkubGVuZ3RofX0KVy5TeS5wcm90b3R5cGU9ewpxOmZ1bmN0aW9uKGEsYil7cmV0dXJu
-IHRoaXMuYS5hLmdldEF0dHJpYnV0ZSgiZGF0YS0iK3RoaXMuTyhILnkoYikpKX0sClk6ZnVuY3Rpb24o
-YSxiLGMpe3RoaXMuYS5hLnNldEF0dHJpYnV0ZSgiZGF0YS0iK3RoaXMuTyhiKSxjKX0sCks6ZnVuY3Rp
-b24oYSxiKXt0aGlzLmEuSygwLG5ldyBXLktTKHRoaXMsdS5FLmIoYikpKX0sCmdWOmZ1bmN0aW9uKCl7
-dmFyIHQ9SC5WTShbXSx1LnMpCnRoaXMuYS5LKDAsbmV3IFcuQTModGhpcyx0KSkKcmV0dXJuIHR9LApn
-QTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nVigpLmxlbmd0aH0sCms6ZnVuY3Rpb24oYSl7dmFyIHQs
-cyxyPUguVk0oYS5zcGxpdCgiLSIpLHUucykKZm9yKHQ9MTt0PHIubGVuZ3RoOysrdCl7cz1yW3RdCmlm
-KHMubGVuZ3RoPjApQy5ObS5ZKHIsdCxzWzBdLnRvVXBwZXJDYXNlKCkrSi5LVihzLDEpKX1yZXR1cm4g
-Qy5ObS5IKHIsIiIpfSwKTzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwCmZvcih0PWEubGVuZ3RoLHM9
-MCxyPSIiO3M8dDsrK3Mpe3E9YVtzXQpwPXEudG9Mb3dlckNhc2UoKQpyPShxIT09cCYmcz4wP3IrIi0i
-OnIpK3B9cmV0dXJuIHIuY2hhckNvZGVBdCgwKT09MD9yOnJ9fQpXLktTLnByb3RvdHlwZT17CiQyOmZ1
-bmN0aW9uKGEsYil7aWYoSi5yWShhKS5uKGEsImRhdGEtIikpdGhpcy5iLiQyKHRoaXMuYS5rKEMueEIu
-RyhhLDUpKSxiKX0sCiRTOjl9ClcuQTMucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtpZihKLnJZ
-KGEpLm4oYSwiZGF0YS0iKSlDLk5tLmkodGhpcy5iLHRoaXMuYS5rKEMueEIuRyhhLDUpKSl9LAokUzo5
-fQpXLkk0LnByb3RvdHlwZT17ClA6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwPVAuTHModS5OKQpmb3Io
-dD10aGlzLmEuY2xhc3NOYW1lLnNwbGl0KCIgIikscz10Lmxlbmd0aCxyPTA7cjxzOysrcil7cT1KLlQw
-KHRbcl0pCmlmKHEubGVuZ3RoIT09MClwLmkoMCxxKX1yZXR1cm4gcH0sClg6ZnVuY3Rpb24oYSl7dGhp
-cy5hLmNsYXNzTmFtZT11LkMuYihhKS5IKDAsIiAiKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlz
-LmEuY2xhc3NMaXN0Lmxlbmd0aH0sClYxOmZ1bmN0aW9uKGEpe3RoaXMuYS5jbGFzc05hbWU9IiJ9LAp0
-ZzpmdW5jdGlvbihhLGIpe3ZhciB0PXRoaXMuYS5jbGFzc0xpc3QuY29udGFpbnMoYikKcmV0dXJuIHR9
-LAppOmZ1bmN0aW9uKGEsYil7dmFyIHQ9dGhpcy5hLmNsYXNzTGlzdCxzPXQuY29udGFpbnMoYikKdC5h
-ZGQoYikKcmV0dXJuIXN9LApSOmZ1bmN0aW9uKGEsYil7dmFyIHQ9dGhpcy5hLmNsYXNzTGlzdCxzPXQu
-Y29udGFpbnMoYikKdC5yZW1vdmUoYikKcmV0dXJuIHN9LApGVjpmdW5jdGlvbihhLGIpe1cuVE4odGhp
-cy5hLHUuWC5iKGIpKX19ClcuRmsucHJvdG90eXBlPXt9ClcuUk8ucHJvdG90eXBlPXt9ClcuQ3EucHJv
-dG90eXBlPXt9ClcueEMucHJvdG90eXBlPXt9Clcudk4ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7
-cmV0dXJuIHRoaXMuYS4kMSh1LkIuYihhKSl9LAokUzoyOH0KVy5KUS5wcm90b3R5cGU9ewpDWTpmdW5j
-dGlvbihhKXt2YXIgdAppZigkLm9yLmE9PT0wKXtmb3IodD0wO3Q8MjYyOysrdCkkLm9yLlkoMCxDLmNt
-W3RdLFcucFMoKSkKZm9yKHQ9MDt0PDEyOysrdCkkLm9yLlkoMCxDLkJJW3RdLFcuVjQoKSl9fSwKaTA6
-ZnVuY3Rpb24oYSl7cmV0dXJuICQuQU4oKS50ZygwLFcuclMoYSkpfSwKRWI6ZnVuY3Rpb24oYSxiLGMp
-e3ZhciB0PSQub3IucSgwLEguZChXLnJTKGEpKSsiOjoiK2IpCmlmKHQ9PW51bGwpdD0kLm9yLnEoMCwi
-Kjo6IitiKQppZih0PT1udWxsKXJldHVybiExCnJldHVybiBILnhkKHQuJDQoYSxiLGMsdGhpcykpfSwK
-JGlrRjoxfQpXLkdtLnByb3RvdHlwZT17CmdrejpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcuVzkoYSx0
-aGlzLmdBKGEpLEgueksoYSkuQygiVzk8R20uRT4iKSl9fQpXLnZELnByb3RvdHlwZT17CmkwOmZ1bmN0
-aW9uKGEpe3JldHVybiBDLk5tLlZyKHRoaXMuYSxuZXcgVy5VdihhKSl9LApFYjpmdW5jdGlvbihhLGIs
-Yyl7cmV0dXJuIEMuTm0uVnIodGhpcy5hLG5ldyBXLkVnKGEsYixjKSl9LAokaWtGOjF9ClcuVXYucHJv
-dG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHUuZS5iKGEpLmkwKHRoaXMuYSl9LAokUzoxNX0K
-Vy5FZy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdS5lLmIoYSkuRWIodGhpcy5hLHRo
-aXMuYix0aGlzLmMpfSwKJFM6MTV9ClcubTYucHJvdG90eXBlPXsKQ1k6ZnVuY3Rpb24oYSxiLGMsZCl7
-dmFyIHQscyxyCnRoaXMuYS5GVigwLGMpCnQ9Yi5ldigwLG5ldyBXLkVvKCkpCnM9Yi5ldigwLG5ldyBX
-LldrKCkpCnRoaXMuYi5GVigwLHQpCnI9dGhpcy5jCnIuRlYoMCxDLmRuKQpyLkZWKDAscyl9LAppMDpm
-dW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLnRnKDAsVy5yUyhhKSl9LApFYjpmdW5jdGlvbihhLGIsYyl7
-dmFyIHQ9dGhpcyxzPVcuclMoYSkscj10LmMKaWYoci50ZygwLEguZChzKSsiOjoiK2IpKXJldHVybiB0
-LmQuRHQoYykKZWxzZSBpZihyLnRnKDAsIio6OiIrYikpcmV0dXJuIHQuZC5EdChjKQplbHNle3I9dC5i
-CmlmKHIudGcoMCxILmQocykrIjo6IitiKSlyZXR1cm4hMAplbHNlIGlmKHIudGcoMCwiKjo6IitiKSly
-ZXR1cm4hMAplbHNlIGlmKHIudGcoMCxILmQocykrIjo6KiIpKXJldHVybiEwCmVsc2UgaWYoci50Zygw
-LCIqOjoqIikpcmV0dXJuITB9cmV0dXJuITF9LAokaWtGOjF9ClcuRW8ucHJvdG90eXBlPXsKJDE6ZnVu
-Y3Rpb24oYSl7cmV0dXJuIUMuTm0udGcoQy5CSSxILnkoYSkpfSwKJFM6OH0KVy5Xay5wcm90b3R5cGU9
-ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gQy5ObS50ZyhDLkJJLEgueShhKSl9LAokUzo4fQpXLmN0LnBy
-b3RvdHlwZT17CkViOmZ1bmN0aW9uKGEsYixjKXtpZih0aGlzLmpGKGEsYixjKSlyZXR1cm4hMAppZihi
-PT09InRlbXBsYXRlIiYmYz09PSIiKXJldHVybiEwCmlmKGEuZ2V0QXR0cmlidXRlKCJ0ZW1wbGF0ZSIp
-PT09IiIpcmV0dXJuIHRoaXMuZS50ZygwLGIpCnJldHVybiExfX0KVy5JQS5wcm90b3R5cGU9ewokMTpm
-dW5jdGlvbihhKXtyZXR1cm4iVEVNUExBVEU6OiIrSC5kKEgueShhKSl9LAokUzo0fQpXLk93LnByb3Rv
-dHlwZT17CmkwOmZ1bmN0aW9uKGEpe3ZhciB0CmlmKHUuZXcuYyhhKSlyZXR1cm4hMQp0PXUuZzcuYyhh
-KQppZih0JiZXLnJTKGEpPT09ImZvcmVpZ25PYmplY3QiKXJldHVybiExCmlmKHQpcmV0dXJuITAKcmV0
-dXJuITF9LApFYjpmdW5jdGlvbihhLGIsYyl7aWYoYj09PSJpcyJ8fEMueEIubihiLCJvbiIpKXJldHVy
-biExCnJldHVybiB0aGlzLmkwKGEpfSwKJGlrRjoxfQpXLlc5LnByb3RvdHlwZT17CkY6ZnVuY3Rpb24o
-KXt2YXIgdD10aGlzLHM9dC5jKzEscj10LmIKaWYoczxyKXt0LnNwKEoudzIodC5hLHMpKQp0LmM9cwpy
-ZXR1cm4hMH10LnNwKG51bGwpCnQuYz1yCnJldHVybiExfSwKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhp
-cy5kfSwKc3A6ZnVuY3Rpb24oYSl7dGhpcy5kPXRoaXMuJHRpLmQuYihhKX0sCiRpQW46MX0KVy5kVy5w
-cm90b3R5cGU9ewpnbVc6ZnVuY3Rpb24oYSl7cmV0dXJuIFcuelgodGhpcy5hLmxvY2F0aW9uKX0sCiRp
-RDA6MSwKJGl2NjoxfQpXLkZiLnByb3RvdHlwZT17fQpXLmtGLnByb3RvdHlwZT17fQpXLm1rLnByb3Rv
-dHlwZT17JGl5MDoxfQpXLktvLnByb3RvdHlwZT17ClBuOmZ1bmN0aW9uKGEpe25ldyBXLmZtKHRoaXMp
-LiQyKGEsbnVsbCl9LApFUDpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpSi5MdChhKQplbHNlIGIucmVt
-b3ZlQ2hpbGQoYSl9LApJNDpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAsbz0hMCxuPW51bGwsbT1u
-dWxsCnRyeXtuPUouaWcoYSkKbT1uLmEuZ2V0QXR0cmlidXRlKCJpcyIpCnUuaC5iKGEpCnQ9ZnVuY3Rp
-b24oYyl7aWYoIShjLmF0dHJpYnV0ZXMgaW5zdGFuY2VvZiBOYW1lZE5vZGVNYXApKXJldHVybiB0cnVl
-CnZhciBsPWMuY2hpbGROb2RlcwppZihjLmxhc3RDaGlsZCYmYy5sYXN0Q2hpbGQhPT1sW2wubGVuZ3Ro
-LTFdKXJldHVybiB0cnVlCmlmKGMuY2hpbGRyZW4paWYoIShjLmNoaWxkcmVuIGluc3RhbmNlb2YgSFRN
-TENvbGxlY3Rpb258fGMuY2hpbGRyZW4gaW5zdGFuY2VvZiBOb2RlTGlzdCkpcmV0dXJuIHRydWUKdmFy
-IGs9MAppZihjLmNoaWxkcmVuKWs9Yy5jaGlsZHJlbi5sZW5ndGgKZm9yKHZhciBqPTA7ajxrO2orKyl7
-dmFyIGk9Yy5jaGlsZHJlbltqXQppZihpLmlkPT0nYXR0cmlidXRlcyd8fGkubmFtZT09J2F0dHJpYnV0
-ZXMnfHxpLmlkPT0nbGFzdENoaWxkJ3x8aS5uYW1lPT0nbGFzdENoaWxkJ3x8aS5pZD09J2NoaWxkcmVu
-J3x8aS5uYW1lPT0nY2hpbGRyZW4nKXJldHVybiB0cnVlfXJldHVybiBmYWxzZX0oYSkKbz1ILm9UKHQp
-PyEwOiEoYS5hdHRyaWJ1dGVzIGluc3RhbmNlb2YgTmFtZWROb2RlTWFwKX1jYXRjaChxKXtILlJ1KHEp
-fXM9ImVsZW1lbnQgdW5wcmludGFibGUiCnRyeXtzPUouaihhKX1jYXRjaChxKXtILlJ1KHEpfXRyeXty
-PVcuclMoYSkKdGhpcy5rUih1LmguYihhKSxiLG8scyxyLHUuRy5iKG4pLEgueShtKSl9Y2F0Y2gocSl7
-aWYoSC5SdShxKSBpbnN0YW5jZW9mIFAudSl0aHJvdyBxCmVsc2V7dGhpcy5FUChhLGIpCndpbmRvdwpw
-PSJSZW1vdmluZyBjb3JydXB0ZWQgZWxlbWVudCAiK0guZChzKQppZih0eXBlb2YgY29uc29sZSE9InVu
-ZGVmaW5lZCIpd2luZG93LmNvbnNvbGUud2FybihwKX19fSwKa1I6ZnVuY3Rpb24oYSxiLGMsZCxlLGYs
-Zyl7dmFyIHQscyxyLHEscCxvLG49dGhpcwppZihjKXtuLkVQKGEsYikKd2luZG93CnQ9IlJlbW92aW5n
-IGVsZW1lbnQgZHVlIHRvIGNvcnJ1cHRlZCBhdHRyaWJ1dGVzIG9uIDwiK2QrIj4iCmlmKHR5cGVvZiBj
-b25zb2xlIT0idW5kZWZpbmVkIil3aW5kb3cuY29uc29sZS53YXJuKHQpCnJldHVybn1pZighbi5hLmkw
-KGEpKXtuLkVQKGEsYikKd2luZG93CnQ9IlJlbW92aW5nIGRpc2FsbG93ZWQgZWxlbWVudCA8IitILmQo
-ZSkrIj4gZnJvbSAiK0guZChiKQppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNv
-bnNvbGUud2Fybih0KQpyZXR1cm59aWYoZyE9bnVsbClpZighbi5hLkViKGEsImlzIixnKSl7bi5FUChh
-LGIpCndpbmRvdwp0PSJSZW1vdmluZyBkaXNhbGxvd2VkIHR5cGUgZXh0ZW5zaW9uIDwiK0guZChlKSsn
-IGlzPSInK2crJyI+JwppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUu
-d2Fybih0KQpyZXR1cm59dD1mLmdWKCkKcz1ILlZNKHQuc2xpY2UoMCksSC50Nih0KS5DKCJqZDwxPiIp
-KQpmb3Iocj1mLmdWKCkubGVuZ3RoLTEsdD1mLmE7cj49MDstLXIpe2lmKHI+PXMubGVuZ3RoKXJldHVy
-biBILk9IKHMscikKcT1zW3JdCnA9bi5hCm89Si5jSChxKQpILnkocSkKaWYoIXAuRWIoYSxvLHQuZ2V0
-QXR0cmlidXRlKHEpKSl7d2luZG93CnA9IlJlbW92aW5nIGRpc2FsbG93ZWQgYXR0cmlidXRlIDwiK0gu
-ZChlKSsiICIrcSsnPSInK0guZCh0LmdldEF0dHJpYnV0ZShxKSkrJyI+JwppZih0eXBlb2YgY29uc29s
-ZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUud2FybihwKQp0LnJlbW92ZUF0dHJpYnV0ZShxKX19
-aWYodS5hVy5jKGEpKW4uUG4oYS5jb250ZW50KX0sCiRpb246MX0KVy5mbS5wcm90b3R5cGU9ewokMjpm
-dW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHA9dGhpcy5hCnN3aXRjaChhLm5vZGVUeXBlKXtjYXNlIDE6
-cC5JNChhLGIpCmJyZWFrCmNhc2UgODpjYXNlIDExOmNhc2UgMzpjYXNlIDQ6YnJlYWsKZGVmYXVsdDpw
-LkVQKGEsYil9dD1hLmxhc3RDaGlsZApmb3IocD11LkE7bnVsbCE9dDspe3M9bnVsbAp0cnl7cz10LnBy
-ZXZpb3VzU2libGluZ31jYXRjaChyKXtILlJ1KHIpCnE9cC5iKHQpCmEucmVtb3ZlQ2hpbGQocSkKdD1u
-dWxsCnM9YS5sYXN0Q2hpbGR9aWYodCE9bnVsbCl0aGlzLiQyKHQsYSkKdD1wLmIocyl9fSwKJFM6Mzl9
-ClcuTGUucHJvdG90eXBlPXt9ClcuSzcucHJvdG90eXBlPXt9ClcuckIucHJvdG90eXBlPXt9ClcuWFcu
-cHJvdG90eXBlPXt9Clcub2EucHJvdG90eXBlPXt9ClAuaUoucHJvdG90eXBlPXsKVkg6ZnVuY3Rpb24o
-YSl7dmFyIHQscz10aGlzLmEscj1zLmxlbmd0aApmb3IodD0wO3Q8cjsrK3QpaWYoc1t0XT09PWEpcmV0
-dXJuIHQKQy5ObS5pKHMsYSkKQy5ObS5pKHRoaXMuYixudWxsKQpyZXR1cm4gcn0sClB2OmZ1bmN0aW9u
-KGEpe3ZhciB0LHMscixxPXRoaXMscD17fQppZihhPT1udWxsKXJldHVybiBhCmlmKEgubChhKSlyZXR1
-cm4gYQppZih0eXBlb2YgYT09Im51bWJlciIpcmV0dXJuIGEKaWYodHlwZW9mIGE9PSJzdHJpbmciKXJl
-dHVybiBhCmlmKGEgaW5zdGFuY2VvZiBQLmlQKXJldHVybiBuZXcgRGF0ZShhLmEpCmlmKHUuZnYuYyhh
-KSl0aHJvdyBILmIoUC5TWSgic3RydWN0dXJlZCBjbG9uZSBvZiBSZWdFeHAiKSkKaWYodS5jOC5jKGEp
-KXJldHVybiBhCmlmKHUuZC5jKGEpKXJldHVybiBhCmlmKHUuSS5jKGEpKXJldHVybiBhCnQ9dS5kRC5j
-KGEpfHwhMQppZih0KXJldHVybiBhCmlmKHUuRy5jKGEpKXtzPXEuVkgoYSkKdD1xLmIKaWYocz49dC5s
-ZW5ndGgpcmV0dXJuIEguT0godCxzKQpyPXAuYT10W3NdCmlmKHIhPW51bGwpcmV0dXJuIHIKcj17fQpw
-LmE9cgpDLk5tLlkodCxzLHIpCmEuSygwLG5ldyBQLmxSKHAscSkpCnJldHVybiBwLmF9aWYodS5qLmMo
-YSkpe3M9cS5WSChhKQpwPXEuYgppZihzPj1wLmxlbmd0aClyZXR1cm4gSC5PSChwLHMpCnI9cFtzXQpp
-ZihyIT1udWxsKXJldHVybiByCnJldHVybiBxLmVrKGEscyl9aWYodS5lSC5jKGEpKXtzPXEuVkgoYSkK
-dD1xLmIKaWYocz49dC5sZW5ndGgpcmV0dXJuIEguT0godCxzKQpyPXAuYj10W3NdCmlmKHIhPW51bGwp
-cmV0dXJuIHIKcj17fQpwLmI9cgpDLk5tLlkodCxzLHIpCnEuaW0oYSxuZXcgUC5qZyhwLHEpKQpyZXR1
-cm4gcC5ifXRocm93IEguYihQLlNZKCJzdHJ1Y3R1cmVkIGNsb25lIG9mIG90aGVyIHR5cGUiKSl9LApl
-azpmdW5jdGlvbihhLGIpe3ZhciB0LHM9Si5VNihhKSxyPXMuZ0EoYSkscT1uZXcgQXJyYXkocikKQy5O
-bS5ZKHRoaXMuYixiLHEpCmZvcih0PTA7dDxyOysrdClDLk5tLlkocSx0LHRoaXMuUHYocy5xKGEsdCkp
-KQpyZXR1cm4gcX19ClAubFIucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt0aGlzLmEuYVthXT10
-aGlzLmIuUHYoYil9LAokUzoxfQpQLmpnLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhpcy5h
-LmJbYV09dGhpcy5iLlB2KGIpfSwKJFM6MX0KUC5CZi5wcm90b3R5cGU9ewppbTpmdW5jdGlvbihhLGIp
-e3ZhciB0LHMscixxCnUuYjguYihiKQpmb3IodD1PYmplY3Qua2V5cyhhKSxzPXQubGVuZ3RoLHI9MDty
-PHM7KytyKXtxPXRbcl0KYi4kMihxLGFbcV0pfX19ClAuQXMucHJvdG90eXBlPXsKVDpmdW5jdGlvbihh
-KXt2YXIgdApILnkoYSkKdD0kLmhHKCkuYgppZih0eXBlb2YgYSE9InN0cmluZyIpSC52aChILnRMKGEp
-KQppZih0LnRlc3QoYSkpcmV0dXJuIGEKdGhyb3cgSC5iKFAuTDMoYSwidmFsdWUiLCJOb3QgYSB2YWxp
-ZCBjbGFzcyB0b2tlbiIpKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUCgpLkgoMCwiICIpfSwK
-Z2t6OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuUCgpCnJldHVybiBQLnJqKHQsdC5yLEguTGgodCkuZCl9
-LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QKCkuYX0sCnRnOmZ1bmN0aW9uKGEsYil7dGhpcy5U
-KGIpCnJldHVybiB0aGlzLlAoKS50ZygwLGIpfSwKaTpmdW5jdGlvbihhLGIpe3RoaXMuVChiKQpyZXR1
-cm4gSC54ZCh0aGlzLk9TKG5ldyBQLkdFKGIpKSl9LApSOmZ1bmN0aW9uKGEsYil7dmFyIHQscwp0aGlz
-LlQoYikKdD10aGlzLlAoKQpzPXQuUigwLGIpCnRoaXMuWCh0KQpyZXR1cm4gc30sCkZWOmZ1bmN0aW9u
-KGEsYil7dGhpcy5PUyhuZXcgUC5ONyh0aGlzLHUuWC5iKGIpKSl9LApWMTpmdW5jdGlvbihhKXt0aGlz
-Lk9TKG5ldyBQLnVRKCkpfSwKT1M6ZnVuY3Rpb24oYSl7dmFyIHQscwp1LmNoLmIoYSkKdD10aGlzLlAo
-KQpzPWEuJDEodCkKdGhpcy5YKHQpCnJldHVybiBzfX0KUC5HRS5wcm90b3R5cGU9ewokMTpmdW5jdGlv
-bihhKXtyZXR1cm4gdS5DLmIoYSkuaSgwLHRoaXMuYSl9LAokUzozMn0KUC5ONy5wcm90b3R5cGU9ewok
-MTpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmIscz1ILnQ2KHQpCnJldHVybiB1LkMuYihhKS5GVigwLG5l
-dyBILkE4KHQscy5DKCJxVSgxKSIpLmIodGhpcy5hLmd1TSgpKSxzLkMoIkE4PDEscVU+IikpKX0sCiRT
-OjE2fQpQLnVRLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3UuQy5iKGEpCmlmKGEuYT4wKXthLmI9
-YS5jPWEuZD1hLmU9YS5mPW51bGwKYS5hPTAKYS5TKCl9cmV0dXJufSwKJFM6MTZ9ClAuaEYucHJvdG90
-eXBlPXskaWhGOjF9ClAuUEMucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQKdS5aLmIoYSkK
-dD1mdW5jdGlvbihiLGMsZCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGIoYyxkLHRoaXMsQXJyYXku
-cHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cykpfX0oUC5SNCxhLCExKQpQLkRtKHQsJC53KCks
-YSkKcmV0dXJuIHR9LAokUzozfQpQLlltLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBu
-ZXcgdGhpcy5hKGEpfSwKJFM6M30KUC5Oei5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4g
-bmV3IFAucjcoYSl9LAokUzozNH0KUC5ucC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4g
-bmV3IFAuVHooYSx1LmFtKX0sCiRTOjM1fQpQLlV0LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3Jl
-dHVybiBuZXcgUC5FNChhKX0sCiRTOjM2fQpQLkU0LnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXtp
-Zih0eXBlb2YgYiE9InN0cmluZyImJnR5cGVvZiBiIT0ibnVtYmVyIil0aHJvdyBILmIoUC54WSgicHJv
-cGVydHkgaXMgbm90IGEgU3RyaW5nIG9yIG51bSIpKQpyZXR1cm4gUC5MNyh0aGlzLmFbYl0pfSwKWTpm
-dW5jdGlvbihhLGIsYyl7aWYodHlwZW9mIGIhPSJzdHJpbmciJiZ0eXBlb2YgYiE9Im51bWJlciIpdGhy
-b3cgSC5iKFAueFkoInByb3BlcnR5IGlzIG5vdCBhIFN0cmluZyBvciBudW0iKSkKdGhpcy5hW2JdPVAu
-d1koYyl9LApETjpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKcmV0dXJuIGIgaW5zdGFu
-Y2VvZiBQLkU0JiZ0aGlzLmE9PT1iLmF9LAp3OmZ1bmN0aW9uKGEpe3ZhciB0LHMKdHJ5e3Q9U3RyaW5n
-KHRoaXMuYSkKcmV0dXJuIHR9Y2F0Y2gocyl7SC5SdShzKQp0PXRoaXMueGIoMCkKcmV0dXJuIHR9fSwK
-Vjc6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPXRoaXMuYQppZihiPT1udWxsKXQ9bnVsbAplbHNle3Q9SC50
-NihiKQp0PVAuQ0gobmV3IEguQTgoYix0LkMoIkAoMSkiKS5iKFAuaUcoKSksdC5DKCJBODwxLEA+Iikp
-LCEwLHUueil9cmV0dXJuIFAuTDcoc1thXS5hcHBseShzLHQpKX0sCmdpTzpmdW5jdGlvbihhKXtyZXR1
-cm4gMH19ClAucjcucHJvdG90eXBlPXt9ClAuVHoucHJvdG90eXBlPXsKY1A6ZnVuY3Rpb24oYSl7dmFy
-IHQ9dGhpcyxzPWE8MHx8YT49dC5nQSh0KQppZihzKXRocm93IEguYihQLlRFKGEsMCx0LmdBKHQpLG51
-bGwsbnVsbCkpfSwKcTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiPT0ibnVtYmVyIiYmYj09PUMuam4u
-eXUoYikpdGhpcy5jUChILlNjKGIpKQpyZXR1cm4gdGhpcy4kdGkuZC5iKHRoaXMuVXIoMCxiKSl9LApZ
-OmZ1bmN0aW9uKGEsYixjKXt2YXIgdAp0aGlzLiR0aS5kLmIoYykKdD1DLmpuLnl1KGIpCmlmKGI9PT10
-KXRoaXMuY1AoYikKdGhpcy5lNCgwLGIsYyl9LApnQTpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEubGVu
-Z3RoCmlmKHR5cGVvZiB0PT09Im51bWJlciImJnQ+Pj4wPT09dClyZXR1cm4gdAp0aHJvdyBILmIoUC5Q
-VigiQmFkIEpzQXJyYXkgbGVuZ3RoIikpfSwKJGljWDoxLAokaXpNOjF9ClAuY28ucHJvdG90eXBlPXt9
-ClAubmQucHJvdG90eXBlPXskaW5kOjF9ClAuS2UucHJvdG90eXBlPXsKUDpmdW5jdGlvbigpe3ZhciB0
-LHMscixxLHA9dGhpcy5hLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSxvPVAuTHModS5OKQppZihwPT1udWxs
-KXJldHVybiBvCmZvcih0PXAuc3BsaXQoIiAiKSxzPXQubGVuZ3RoLHI9MDtyPHM7KytyKXtxPUouVDAo
-dFtyXSkKaWYocS5sZW5ndGghPT0wKW8uaSgwLHEpfXJldHVybiBvfSwKWDpmdW5jdGlvbihhKXt0aGlz
-LmEuc2V0QXR0cmlidXRlKCJjbGFzcyIsYS5IKDAsIiAiKSl9fQpQLmQ1LnByb3RvdHlwZT17CmdEOmZ1
-bmN0aW9uKGEpe3JldHVybiBuZXcgUC5LZShhKX0sCnNoZjpmdW5jdGlvbihhLGIpe3RoaXMuWUMoYSxi
-KX0sCnI2OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscixxLHAsbwppZihkPT1udWxsKXt0PUguVk0o
-W10sdS5rKQpkPW5ldyBXLnZEKHQpCkMuTm0uaSh0LFcuVHcobnVsbCkpCkMuTm0uaSh0LFcuQmwoKSkK
-Qy5ObS5pKHQsbmV3IFcuT3coKSl9Yz1uZXcgVy5LbyhkKQpzPSc8c3ZnIHZlcnNpb249IjEuMSI+JytI
-LmQoYikrIjwvc3ZnPiIKdD1kb2N1bWVudApyPXQuYm9keQpxPShyJiZDLlJZKS5BSChyLHMsYykKcD10
-LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQpxLnRvU3RyaW5nCnQ9bmV3IFcuZTcocSkKbz10LmdyOCh0
-KQpmb3IoO3Q9by5maXJzdENoaWxkLHQhPW51bGw7KXAuYXBwZW5kQ2hpbGQodCkKcmV0dXJuIHB9LApn
-Vmw6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBXLkNxKGEsImNsaWNrIiwhMSx1LlEpfSwKJGlkNToxfQpQ
-Lm42LnByb3RvdHlwZT17JGljWDoxLCRpek06MSwkaUFTOjF9ClUuZDIucHJvdG90eXBlPXt9ClUuU2Uu
-cHJvdG90eXBlPXt9ClUudUYucHJvdG90eXBlPXt9ClUuTWwucHJvdG90eXBlPXt9ClUueUQucHJvdG90
-eXBlPXt9ClUud2IucHJvdG90eXBlPXt9CkIuajgucHJvdG90eXBlPXt9CkIucXAucHJvdG90eXBlPXt9
-ClQuR1YucHJvdG90eXBlPXt9CkwuZS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdCxzLHIs
-cSxwLG8KdS5CLmIoYSkKdD13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUKcz1MLkc2KHdpbmRvdy5sb2Nh
-dGlvbi5ocmVmKQpyPUwuYUsod2luZG93LmxvY2F0aW9uLmhyZWYpCkwuR2UoKQppZih0IT09Ii8iJiZ0
-IT09Si5UMChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucm9vdCIpLnRleHRDb250ZW50KSlMLkc3KHQs
-cyxyLG5ldyBMLlZXKHQscyxyKSkKcT1KLnFGKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5hcHBseS1t
-aWdyYXRpb24iKSkKcD1xLiR0aQpvPXAuQygifigxKSIpLmIobmV3IEwub1ooKSkKdS5NLmIobnVsbCkK
-Vy5KRShxLmEscS5iLG8sITEscC5kKX0sCiRTOjE3fQpMLlZXLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9u
-KCl7TC5Gcih0aGlzLmEsdGhpcy5iLHRoaXMuYyl9LAokUzowfQpMLm9aLnByb3RvdHlwZT17CiQxOmZ1
-bmN0aW9uKGEpe3UuVi5iKGEpCkwudHkoIi9hcHBseS1taWdyYXRpb24iKS5XNyhuZXcgTC5qcigpLHUu
-UCkuT0EobmV3IEwucWwoKSl9LAokUzo1fQpMLmpyLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3Zh
-ciB0CnUuci5iKGEpCnQ9ZG9jdW1lbnQuYm9keQp0LmNsYXNzTGlzdC5yZW1vdmUoInByb3Bvc2VkIikK
-dC5jbGFzc0xpc3QuYWRkKCJhcHBsaWVkIil9LAokUzo3fQpMLnFsLnByb3RvdHlwZT17CiQyOmZ1bmN0
-aW9uKGEsYil7TC5xSigiYXBwbHkgbWlncmF0aW9uIGVycm9yOiAiK0guZChhKSxiKQp3aW5kb3cuYWxl
-cnQoIkNvdWxkIG5vdCBhcHBseSBtaWdyYXRpb24gKCIrSC5kKGEpKyIpLiIpfSwKJEM6IiQyIiwKJFI6
-MiwKJFM6MX0KTC5MLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0LHMscgp1LkIuYihhKQp0
-PXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZQpzPUwuRzYod2luZG93LmxvY2F0aW9uLmhyZWYpCnI9TC5h
-Syh3aW5kb3cubG9jYXRpb24uaHJlZikKaWYodC5sZW5ndGg+MSlMLkc3KHQscyxyLG51bGwpCmVsc2V7
-TC5CRSh0LG5ldyBCLnFwKCIiLCIiLCIiLEMueEQpKQpMLkJYKCImbmJzcDsiLG51bGwpfX0sCiRTOjE3
-fQpMLld4LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxPSJjb2xsYXBzZWQiCnUu
-Vi5iKGEpCnQ9dGhpcy5hCnM9Si5SRSh0KQpyPXRoaXMuYgppZighcy5nRCh0KS50ZygwLHEpKXtzLmdE
-KHQpLmkoMCxxKQpKLmRSKHIpLmkoMCxxKX1lbHNle3MuZ0QodCkuUigwLHEpCkouZFIocikuUigwLHEp
-fX0sCiRTOjV9CkwuQU8ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQ9Si5xRih1LmguYihh
-KSkscz10LiR0aSxyPXMuQygifigxKSIpLmIobmV3IEwuZE4oKSkKdS5NLmIobnVsbCkKVy5KRSh0LmEs
-dC5iLHIsITEscy5kKX0sCiRTOjZ9CkwuZE4ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQK
-dS5WLmIoYSkKdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJ0YWJsZVtkYXRhLXBhdGhdIikKdC50b1N0
-cmluZwpMLnQyKGEsdC5nZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyh0KSkuTygi
-cGF0aCIpKSl9LAokUzo1fQpMLkhvLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0LHMscgp1
-LmguYihhKQp0PUoucUYoYSkKcz10LiR0aQpyPXMuQygifigxKSIpLmIobmV3IEwueHooYSx0aGlzLmEp
-KQp1Lk0uYihudWxsKQpXLkpFKHQuYSx0LmIsciwhMSxzLmQpfSwKJFM6Nn0KTC54ei5wcm90b3R5cGU9
-ewokMTpmdW5jdGlvbihhKXt2YXIgdAp1LlYuYihhKQp0PXRoaXMuYQpMLmhYKHRoaXMuYixQLlFBKHQu
-Z2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTcodCkpLk8oIm9mZnNldCIpKSxudWxs
-LG51bGwpKX0sCiRTOjV9CkwuSUMucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQ9Si5xRih1
-LmguYihhKSkscz10LiR0aQpzLkMoIn4oMSkiKS5iKEwuSDAoKSkKdS5NLmIobnVsbCkKVy5KRSh0LmEs
-dC5iLEwuSDAoKSwhMSxzLmQpfSwKJFM6Nn0KTC5MMS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2
-YXIgdAp1LnIuYihhKQp0PWEuc3RhdHVzCmlmKHQ9PT0yMDApcmV0dXJuIGEKZWxzZSB0aHJvdyBILmIo
-IlJlcXVlc3QgZmFpbGVkOyBzdGF0dXMgb2YgIitILmQodCkpfSwKJFM6NDF9CkwublQucHJvdG90eXBl
-PXsKJDA6ZnVuY3Rpb24oKXtMLkZyKHRoaXMuYS5hLHRoaXMuYix0aGlzLmMpfSwKJFM6MH0KTC5CWi5w
-cm90b3R5cGU9ewokMDpmdW5jdGlvbigpe0wuRnIodGhpcy5hLmEsbnVsbCxudWxsKX0sCiRTOjB9Ckwu
-R0gucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dS5oLmIoYSkKJC56QigpLnRvU3RyaW5nCnUudi5i
-KCQub3coKS5xKDAsImhsanMiKSkuVjcoImhpZ2hsaWdodEJsb2NrIixbYV0pfSwKJFM6Nn0KTC5EVC5w
-cm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdAp1LnIuYihhKQp0PWEuc3RhdHVzCmlmKHQ9PT0y
-MDApe0wuVDEoVS55dShDLkN0LnBXKDAsYS5yZXNwb25zZVRleHQsbnVsbCkpKQpMLnlYKCIuZWRpdC1w
-YW5lbCAucGFuZWwtY29udGVudCIpfWVsc2Ugd2luZG93LmFsZXJ0KCJSZXF1ZXN0IGZhaWxlZDsgc3Rh
-dHVzIG9mICIrSC5kKHQpKX0sCiRTOjd9CkwuZUgucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtM
-LnFKKCJsb2FkUmVnaW9uRXhwbGFuYXRpb246ICIrSC5kKGEpLGIpCndpbmRvdy5hbGVydCgiQ291bGQg
-bm90IGxvYWQgIitILmQodGhpcy5hKSsiICgiK0guZChhKSsiKS4iKX0sCiRDOiIkMiIsCiRSOjIsCiRT
-OjF9CkwuekQucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQscyxyPXRoaXMKdS5yLmIoYSkK
-dD1hLnN0YXR1cwppZih0PT09MjAwKXtzPXIuYQpMLkJFKHMsQi5ZZih1LmIuYihDLkN0LnBXKDAsYS5y
-ZXNwb25zZVRleHQsbnVsbCkpKSkKdD1yLmIKTC5mRyh0LHIuYykKTC5CWChDLnhCLnRnKHMsIj8iKT9D
-LnhCLk5qKHMsMCxDLnhCLk9ZKHMsIj8iKSk6cyx0KQp0PXIuZAppZih0IT1udWxsKXQuJDAoKX1lbHNl
-IHdpbmRvdy5hbGVydCgiUmVxdWVzdCBmYWlsZWQ7IHN0YXR1cyBvZiAiK0guZCh0KSl9LAokUzo3fQpM
-Lk9FLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7TC5xSigibG9hZEZpbGU6ICIrSC5kKGEpLGIp
-CndpbmRvdy5hbGVydCgiQ291bGQgbm90IGxvYWQgIit0aGlzLmErIiAoIitILmQoYSkrIikuIil9LAok
-QzoiJDIiLAokUjoyLAokUzoxfQpMLlRXLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0LHMs
-cgp1LnIuYihhKQp0PWEuc3RhdHVzCmlmKHQ9PT0yMDApe3M9Qy5DdC5wVygwLGEucmVzcG9uc2VUZXh0
-LG51bGwpCnI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm5hdi10cmVlIikKSi5sNShyLCIiKQpMLnRY
-KHIsTC5tSyhzKSl9ZWxzZSB3aW5kb3cuYWxlcnQoIlJlcXVlc3QgZmFpbGVkOyBzdGF0dXMgb2YgIitI
-LmQodCkpfSwKJFM6N30KTC54ci5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe0wucUooImxvYWRO
-YXZpZ2F0aW9uVHJlZTogIitILmQoYSksYikKd2luZG93LmFsZXJ0KCJDb3VsZCBub3QgbG9hZCAiK3Ro
-aXMuYSsiICgiK0guZChhKSsiKS4iKX0sCiRDOiIkMiIsCiRSOjIsCiRTOjF9CkwuRUUucHJvdG90eXBl
-PXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQscwp1LlYuYihhKQp0PXRoaXMuYQpzPXRoaXMuYgpMLmFmKHdp
-bmRvdy5sb2NhdGlvbi5wYXRobmFtZSx0LHMsbmV3IEwuUUwodCxzKSkKTC5oWCh0aGlzLmMsdCl9LAok
-Uzo1fQpMLlFMLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7TC5Gcih3aW5kb3cubG9jYXRpb24ucGF0
-aG5hbWUsdGhpcy5hLHRoaXMuYil9LAokUzowfQpMLlZTLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEp
-e3ZhciB0LHM9InNlbGVjdGVkLWZpbGUiCnUuaC5iKGEpCmEudG9TdHJpbmcKdD1KLlJFKGEpCmlmKGEu
-Z2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTcoYSkpLk8oIm5hbWUiKSk9PT10aGlz
-LmEuYSl0LmdEKGEpLmkoMCxzKQplbHNlIHQuZ0QoYSkuUigwLHMpfSwKJFM6Nn0KTC5YQS5wcm90b3R5
-cGU9ewpFYjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuITB9LAppMDpmdW5jdGlvbihhKXtyZXR1cm4hMH0s
-CiRpa0Y6MX0KTC5aWi5wcm90b3R5cGU9e30KTC55OC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3Jl
-dHVybiB0aGlzLmJ9fQpNLmxJLnByb3RvdHlwZT17CldPOmZ1bmN0aW9uKGEsYil7dmFyIHQscz1udWxs
-Ck0uWUYoImFic29sdXRlIixILlZNKFtiLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsXSx1LnMp
-KQp0PXRoaXMuYQp0PXQuWXIoYik+MCYmIXQuaEsoYikKaWYodClyZXR1cm4gYgp0PUQuUlgoKQpyZXR1
-cm4gdGhpcy5xNygwLHQsYixzLHMscyxzLHMscyl9LAp0TTpmdW5jdGlvbihhKXt2YXIgdCxzLHI9WC5D
-TChhLHRoaXMuYSkKci5JVigpCnQ9ci5kCnM9dC5sZW5ndGgKaWYocz09PTApe3Q9ci5iCnJldHVybiB0
-PT1udWxsPyIuIjp0fWlmKHM9PT0xKXt0PXIuYgpyZXR1cm4gdD09bnVsbD8iLiI6dH1pZigwPj1zKXJl
-dHVybiBILk9IKHQsLTEpCnQucG9wKCkKQy5ObS5tdihyLmUpCnIuSVYoKQpyZXR1cm4gci53KDApfSwK
-cTc6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe3ZhciB0PUguVk0oW2IsYyxkLGUsZixnLGgsaV0s
-dS5zKQpNLllGKCJqb2luIix0KQpyZXR1cm4gdGhpcy5JUChuZXcgSC5VNSh0LHUuYkIuYihuZXcgTS5N
-aSgpKSx1LmNjKSl9LApJUDpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG8sbixtLGwKdS5YLmIoYSkK
-Zm9yKHQ9YS4kdGkscz10LkMoImEyKGNYLkUpIikuYihuZXcgTS5xNygpKSxyPWEuZ2t6KGEpLHQ9bmV3
-IEguU08ocixzLHQuQygiU088Y1guRT4iKSkscz10aGlzLmEscT0hMSxwPSExLG89IiI7dC5GKCk7KXtu
-PXIuZ2woKQppZihzLmhLKG4pJiZwKXttPVguQ0wobixzKQpsPW8uY2hhckNvZGVBdCgwKT09MD9vOm8K
-bz1DLnhCLk5qKGwsMCxzLlNwKGwsITApKQptLmI9bwppZihzLmRzKG8pKUMuTm0uWShtLmUsMCxzLmdt
-SSgpKQpvPW0udygwKX1lbHNlIGlmKHMuWXIobik+MCl7cD0hcy5oSyhuKQpvPUguZChuKX1lbHNle2lm
-KCEobi5sZW5ndGg+MCYmcy5VZChuWzBdKSkpaWYocSlvKz1zLmdtSSgpCm8rPUguZChuKX1xPXMuZHMo
-bil9cmV0dXJuIG8uY2hhckNvZGVBdCgwKT09MD9vOm99LApvNTpmdW5jdGlvbihhKXt2YXIgdAppZigh
-dGhpcy55MyhhKSlyZXR1cm4gYQp0PVguQ0woYSx0aGlzLmEpCnQuclIoKQpyZXR1cm4gdC53KDApfSwK
-eTM6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG4sbSxsLGsKYS50b1N0cmluZwp0PXRoaXMuYQpz
-PXQuWXIoYSkKaWYocyE9PTApe2lmKHQ9PT0kLktrKCkpZm9yKHI9MDtyPHM7KytyKWlmKEMueEIuVyhh
-LHIpPT09NDcpcmV0dXJuITAKcT1zCnA9NDd9ZWxzZXtxPTAKcD1udWxsfWZvcihvPW5ldyBILnFqKGEp
-LmEsbj1vLmxlbmd0aCxyPXEsbT1udWxsO3I8bjsrK3IsbT1wLHA9bCl7bD1DLnhCLm0obyxyKQppZih0
-LnI0KGwpKXtpZih0PT09JC5LaygpJiZsPT09NDcpcmV0dXJuITAKaWYocCE9bnVsbCYmdC5yNChwKSly
-ZXR1cm4hMAppZihwPT09NDYpaz1tPT1udWxsfHxtPT09NDZ8fHQucjQobSkKZWxzZSBrPSExCmlmKGsp
-cmV0dXJuITB9fWlmKHA9PW51bGwpcmV0dXJuITAKaWYodC5yNChwKSlyZXR1cm4hMAppZihwPT09NDYp
-dD1tPT1udWxsfHx0LnI0KG0pfHxtPT09NDYKZWxzZSB0PSExCmlmKHQpcmV0dXJuITAKcmV0dXJuITF9
-LApIUDpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAsbz10aGlzLG49J1VuYWJsZSB0byBmaW5kIGEg
-cGF0aCB0byAiJwpiPW8uV08oMCxiKQp0PW8uYQppZih0LllyKGIpPD0wJiZ0LllyKGEpPjApcmV0dXJu
-IG8ubzUoYSkKaWYodC5ZcihhKTw9MHx8dC5oSyhhKSlhPW8uV08oMCxhKQppZih0LllyKGEpPD0wJiZ0
-LllyKGIpPjApdGhyb3cgSC5iKFguSlQobitILmQoYSkrJyIgZnJvbSAiJytILmQoYikrJyIuJykpCnM9
-WC5DTChiLHQpCnMuclIoKQpyPVguQ0woYSx0KQpyLnJSKCkKcT1zLmQKaWYocS5sZW5ndGg+MCYmSi5S
-TShxWzBdLCIuIikpcmV0dXJuIHIudygwKQpxPXMuYgpwPXIuYgppZihxIT1wKXE9cT09bnVsbHx8cD09
-bnVsbHx8IXQuTmMocSxwKQplbHNlIHE9ITEKaWYocSlyZXR1cm4gci53KDApCndoaWxlKCEwKXtxPXMu
-ZAppZihxLmxlbmd0aD4wKXtwPXIuZApxPXAubGVuZ3RoPjAmJnQuTmMocVswXSxwWzBdKX1lbHNlIHE9
-ITEKaWYoIXEpYnJlYWsKQy5ObS5XNChzLmQsMCkKQy5ObS5XNChzLmUsMSkKQy5ObS5XNChyLmQsMCkK
-Qy5ObS5XNChyLmUsMSl9cT1zLmQKaWYocS5sZW5ndGg+MCYmSi5STShxWzBdLCIuLiIpKXRocm93IEgu
-YihYLkpUKG4rSC5kKGEpKyciIGZyb20gIicrSC5kKGIpKyciLicpKQpxPXUuTgpDLk5tLlVHKHIuZCww
-LFAuTzgocy5kLmxlbmd0aCwiLi4iLHEpKQpDLk5tLlkoci5lLDAsIiIpCkMuTm0uVUcoci5lLDEsUC5P
-OChzLmQubGVuZ3RoLHQuZ21JKCkscSkpCnQ9ci5kCnE9dC5sZW5ndGgKaWYocT09PTApcmV0dXJuIi4i
-CmlmKHE+MSYmSi5STShDLk5tLmdyWih0KSwiLiIpKXt0PXIuZAppZigwPj10Lmxlbmd0aClyZXR1cm4g
-SC5PSCh0LC0xKQp0LnBvcCgpCnQ9ci5lCkMuTm0ubXYodCkKQy5ObS5tdih0KQpDLk5tLmkodCwiIil9
-ci5iPSIiCnIuSVYoKQpyZXR1cm4gci53KDApfX0KTS5NaS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihh
-KXtyZXR1cm4gSC55KGEpIT1udWxsfSwKJFM6OH0KTS5xNy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihh
-KXtyZXR1cm4gSC55KGEpIT09IiJ9LAokUzo4fQpNLk5vLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEp
-e0gueShhKQpyZXR1cm4gYT09bnVsbD8ibnVsbCI6JyInK2ErJyInfSwKJFM6NH0KQi5MdS5wcm90b3R5
-cGU9ewp4WjpmdW5jdGlvbihhKXt2YXIgdCxzPXRoaXMuWXIoYSkKaWYocz4wKXJldHVybiBKLmxkKGEs
-MCxzKQppZih0aGlzLmhLKGEpKXtpZigwPj1hLmxlbmd0aClyZXR1cm4gSC5PSChhLDApCnQ9YVswXX1l
-bHNlIHQ9bnVsbApyZXR1cm4gdH0sCk5jOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PWJ9fQpYLldELnBy
-b3RvdHlwZT17CklWOmZ1bmN0aW9uKCl7dmFyIHQscyxyPXRoaXMKd2hpbGUoITApe3Q9ci5kCmlmKCEo
-dC5sZW5ndGghPT0wJiZKLlJNKEMuTm0uZ3JaKHQpLCIiKSkpYnJlYWsKdD1yLmQKaWYoMD49dC5sZW5n
-dGgpcmV0dXJuIEguT0godCwtMSkKdC5wb3AoKQpDLk5tLm12KHIuZSl9dD1yLmUKcz10Lmxlbmd0aApp
-ZihzPjApQy5ObS5ZKHQscy0xLCIiKX0sCnJSOmZ1bmN0aW9uKCl7dmFyIHQscyxyLHEscCxvLG4sbT10
-aGlzLGw9SC5WTShbXSx1LnMpCmZvcih0PW0uZCxzPXQubGVuZ3RoLHI9MCxxPTA7cTx0Lmxlbmd0aDt0
-Lmxlbmd0aD09PXN8fCgwLEgubGspKHQpLCsrcSl7cD10W3FdCm89Si5pYShwKQppZighKG8uRE4ocCwi
-LiIpfHxvLkROKHAsIiIpKSlpZihvLkROKHAsIi4uIikpaWYobC5sZW5ndGg+MClsLnBvcCgpCmVsc2Ug
-KytyCmVsc2UgQy5ObS5pKGwscCl9aWYobS5iPT1udWxsKUMuTm0uVUcobCwwLFAuTzgociwiLi4iLHUu
-TikpCmlmKGwubGVuZ3RoPT09MCYmbS5iPT1udWxsKUMuTm0uaShsLCIuIikKbj1QLmRIKGwubGVuZ3Ro
-LG5ldyBYLnFSKG0pLCEwLHUuTikKdD1tLmIKdD10IT1udWxsJiZsLmxlbmd0aD4wJiZtLmEuZHModCk/
-bS5hLmdtSSgpOiIiCkgudDYobikuZC5iKHQpCmlmKCEhbi5maXhlZCRsZW5ndGgpSC52aChQLkw0KCJp
-bnNlcnQiKSkKbi5zcGxpY2UoMCwwLHQpCm0uc25KKGwpCm0uc1BoKG4pCnQ9bS5iCmlmKHQhPW51bGwm
-Jm0uYT09PSQuS2soKSl7dC50b1N0cmluZwptLmI9SC55cyh0LCIvIiwiXFwiKX1tLklWKCl9LAp3OmZ1
-bmN0aW9uKGEpe3ZhciB0LHMscj10aGlzLHE9ci5iCnE9cSE9bnVsbD9xOiIiCmZvcih0PTA7dDxyLmQu
-bGVuZ3RoOysrdCl7cz1yLmUKaWYodD49cy5sZW5ndGgpcmV0dXJuIEguT0gocyx0KQpzPXErSC5kKHNb
-dF0pCnE9ci5kCmlmKHQ+PXEubGVuZ3RoKXJldHVybiBILk9IKHEsdCkKcT1zK0guZChxW3RdKX1xKz1I
-LmQoQy5ObS5nclooci5lKSkKcmV0dXJuIHEuY2hhckNvZGVBdCgwKT09MD9xOnF9LApzbko6ZnVuY3Rp
-b24oYSl7dGhpcy5kPXUuYS5iKGEpfSwKc1BoOmZ1bmN0aW9uKGEpe3RoaXMuZT11LmEuYihhKX19Clgu
-cVIucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5hLmdtSSgpfSwKJFM6NDJ9
-ClguZHYucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4iUGF0aEV4Y2VwdGlvbjogIit0aGlz
-LmF9fQpPLnpMLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ29jKHRoaXMpfX0K
-RS5PRi5wcm90b3R5cGU9ewpVZDpmdW5jdGlvbihhKXtyZXR1cm4gQy54Qi50ZyhhLCIvIil9LApyNDpm
-dW5jdGlvbihhKXtyZXR1cm4gYT09PTQ3fSwKZHM6ZnVuY3Rpb24oYSl7dmFyIHQ9YS5sZW5ndGgKcmV0
-dXJuIHQhPT0wJiZDLnhCLm0oYSx0LTEpIT09NDd9LApTcDpmdW5jdGlvbihhLGIpe2lmKGEubGVuZ3Ro
-IT09MCYmQy54Qi5XKGEsMCk9PT00NylyZXR1cm4gMQpyZXR1cm4gMH0sCllyOmZ1bmN0aW9uKGEpe3Jl
-dHVybiB0aGlzLlNwKGEsITEpfSwKaEs6ZnVuY3Rpb24oYSl7cmV0dXJuITF9LApnb2M6ZnVuY3Rpb24o
-KXtyZXR1cm4icG9zaXgifSwKZ21JOmZ1bmN0aW9uKCl7cmV0dXJuIi8ifX0KRi5ydS5wcm90b3R5cGU9
-ewpVZDpmdW5jdGlvbihhKXtyZXR1cm4gQy54Qi50ZyhhLCIvIil9LApyNDpmdW5jdGlvbihhKXtyZXR1
-cm4gYT09PTQ3fSwKZHM6ZnVuY3Rpb24oYSl7dmFyIHQ9YS5sZW5ndGgKaWYodD09PTApcmV0dXJuITEK
-aWYoQy54Qi5tKGEsdC0xKSE9PTQ3KXJldHVybiEwCnJldHVybiBDLnhCLlRjKGEsIjovLyIpJiZ0aGlz
-LllyKGEpPT09dH0sClNwOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscD1hLmxlbmd0aAppZihwPT09
-MClyZXR1cm4gMAppZihDLnhCLlcoYSwwKT09PTQ3KXJldHVybiAxCmZvcih0PTA7dDxwOysrdCl7cz1D
-LnhCLlcoYSx0KQppZihzPT09NDcpcmV0dXJuIDAKaWYocz09PTU4KXtpZih0PT09MClyZXR1cm4gMApy
-PUMueEIuWFUoYSwiLyIsQy54Qi5RaShhLCIvLyIsdCsxKT90KzM6dCkKaWYocjw9MClyZXR1cm4gcApp
-ZighYnx8cDxyKzMpcmV0dXJuIHIKaWYoIUMueEIubihhLCJmaWxlOi8vIikpcmV0dXJuIHIKaWYoIUIu
-WXUoYSxyKzEpKXJldHVybiByCnE9ciszCnJldHVybiBwPT09cT9xOnIrNH19cmV0dXJuIDB9LApZcjpm
-dW5jdGlvbihhKXtyZXR1cm4gdGhpcy5TcChhLCExKX0sCmhLOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxl
-bmd0aCE9PTAmJkMueEIuVyhhLDApPT09NDd9LApnb2M6ZnVuY3Rpb24oKXtyZXR1cm4idXJsIn0sCmdt
-STpmdW5jdGlvbigpe3JldHVybiIvIn19CkwuSVYucHJvdG90eXBlPXsKVWQ6ZnVuY3Rpb24oYSl7cmV0
-dXJuIEMueEIudGcoYSwiLyIpfSwKcjQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT00N3x8YT09PTkyfSwK
-ZHM6ZnVuY3Rpb24oYSl7dmFyIHQ9YS5sZW5ndGgKaWYodD09PTApcmV0dXJuITEKdD1DLnhCLm0oYSx0
-LTEpCnJldHVybiEodD09PTQ3fHx0PT09OTIpfSwKU3A6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHI9YS5s
-ZW5ndGgKaWYocj09PTApcmV0dXJuIDAKdD1DLnhCLlcoYSwwKQppZih0PT09NDcpcmV0dXJuIDEKaWYo
-dD09PTkyKXtpZihyPDJ8fEMueEIuVyhhLDEpIT09OTIpcmV0dXJuIDEKcz1DLnhCLlhVKGEsIlxcIiwy
-KQppZihzPjApe3M9Qy54Qi5YVShhLCJcXCIscysxKQppZihzPjApcmV0dXJuIHN9cmV0dXJuIHJ9aWYo
-cjwzKXJldHVybiAwCmlmKCFCLk9TKHQpKXJldHVybiAwCmlmKEMueEIuVyhhLDEpIT09NTgpcmV0dXJu
-IDAKcj1DLnhCLlcoYSwyKQppZighKHI9PT00N3x8cj09PTkyKSlyZXR1cm4gMApyZXR1cm4gM30sClly
-OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlNwKGEsITEpfSwKaEs6ZnVuY3Rpb24oYSl7cmV0dXJuIHRo
-aXMuWXIoYSk9PT0xfSwKT3Q6ZnVuY3Rpb24oYSxiKXt2YXIgdAppZihhPT09YilyZXR1cm4hMAppZihh
-PT09NDcpcmV0dXJuIGI9PT05MgppZihhPT09OTIpcmV0dXJuIGI9PT00NwppZigoYV5iKSE9PTMyKXJl
-dHVybiExCnQ9YXwzMgpyZXR1cm4gdD49OTcmJnQ8PTEyMn0sCk5jOmZ1bmN0aW9uKGEsYil7dmFyIHQs
-cyxyCmlmKGE9PWIpcmV0dXJuITAKdD1hLmxlbmd0aAppZih0IT09Yi5sZW5ndGgpcmV0dXJuITEKZm9y
-KHM9Si5yWShiKSxyPTA7cjx0OysrcilpZighdGhpcy5PdChDLnhCLlcoYSxyKSxzLlcoYixyKSkpcmV0
-dXJuITEKcmV0dXJuITB9LApnb2M6ZnVuY3Rpb24oKXtyZXR1cm4id2luZG93cyJ9LApnbUk6ZnVuY3Rp
-b24oKXtyZXR1cm4iXFwifX07KGZ1bmN0aW9uIGFsaWFzZXMoKXt2YXIgdD1KLnZCLnByb3RvdHlwZQp0
-LlU9dC53CnQuU2o9dC5lNwp0PUouTUYucHJvdG90eXBlCnQudD10LncKdD1QLmNYLnByb3RvdHlwZQp0
-LkdHPXQuZXYKdD1QLmsucHJvdG90eXBlCnQueGI9dC53CnQ9Vy5jdi5wcm90b3R5cGUKdC5EVz10LnI2
-CnQ9Vy5tNi5wcm90b3R5cGUKdC5qRj10LkViCnQ9UC5FNC5wcm90b3R5cGUKdC5Vcj10LnEKdC5lND10
-Lll9KSgpOyhmdW5jdGlvbiBpbnN0YWxsVGVhck9mZnMoKXt2YXIgdD1odW5rSGVscGVycy5fc3RhdGlj
-XzEscz1odW5rSGVscGVycy5fc3RhdGljXzAscj1odW5rSGVscGVycy5pbnN0YWxsSW5zdGFuY2VUZWFy
-T2ZmLHE9aHVua0hlbHBlcnMuaW5zdGFsbFN0YXRpY1RlYXJPZmYscD1odW5rSGVscGVycy5faW5zdGFu
-Y2VfMXUKdChQLCJFWCIsIlpWIiwxMCkKdChQLCJ5dCIsIm9BIiwxMCkKdChQLCJxVyIsIkJ6IiwxMCkK
-cyhQLCJVSSIsImVOIiwyKQpyKFAuUGYucHJvdG90eXBlLCJnWUoiLDAsMSxudWxsLFsiJDIiLCIkMSJd
-LFsidzAiLCJwbSJdLDI5LDApCnQoUCwiUEgiLCJNdCIsNCkKcShXLCJwUyIsNCxudWxsLFsiJDQiXSxb
-InlXIl0sMTEsMCkKcShXLCJWNCIsNCxudWxsLFsiJDQiXSxbIlFXIl0sMTEsMCkKcChQLkFzLnByb3Rv
-dHlwZSwiZ3VNIiwiVCIsNCkKdChQLCJpRyIsIndZIiwzKQp0KFAsIncwIiwiTDciLDQ1KQpxKEwsIlhO
-IiwxLG51bGwsWyIkMiRyZWxhdGl2ZVRvIiwiJDEiXSxbInQyIixmdW5jdGlvbihhKXtyZXR1cm4gTC50
-MihhLG51bGwpfV0sNDYsMCkKdChMLCJIMCIsInVtIiwzMSl9KSgpOyhmdW5jdGlvbiBpbmhlcml0YW5j
-ZSgpe3ZhciB0PWh1bmtIZWxwZXJzLm1peGluLHM9aHVua0hlbHBlcnMuaW5oZXJpdCxyPWh1bmtIZWxw
-ZXJzLmluaGVyaXRNYW55CnMoUC5rLG51bGwpCnIoUC5rLFtILmVvLEoudkIsSi5tMSxQLm5ZLFAuY1gs
-SC5hNyxQLkFuLEguU1UsSC5SZSxILnd2LFAuUG4sSC5XVSxILkxJLEguVHAsSC5acixQLlhTLEguYnEs
-SC5YTyxQLllrLEguZGIsSC5ONixILlZSLEguRUssSC5QYixILnRRLEguU2QsSC5KYyxILkcsUC5XMyxQ
-LmloLFAuUGYsUC5GZSxQLnZzLFAuT00sUC5xaCxQLk1PLFAua1QsUC54SSxQLkN3LFAubTAsUC5YdixQ
-LmJuLFAubG0sUC5sRCxQLktQLFAubGYsUC5XWSxQLlVrLFAuUncsUC5ieixQLmEyLFAuaVAsUC5GSyxQ
-Lms1LFAuS1ksUC5DRCxQLmFFLFAuRUgsUC56TSxQLlowLFAuYzgsUC5PZCxQLmliLFAuR3osUC5xVSxQ
-LlJuLFAuR0QsUC5EbixQLlBFLFAuVWYsVy5pZCxXLkZrLFcuSlEsVy5HbSxXLnZELFcubTYsVy5PdyxX
-Llc5LFcuZFcsVy5GYixXLmtGLFcubWssVy5LbyxQLmlKLFAuRTQsUC5uNixVLmQyLFUuU2UsVS51RixV
-Lk1sLFUueUQsVS53YixCLmo4LEIucXAsVC5HVixMLlhBLEwuWlosTC55OCxNLmxJLE8uekwsWC5XRCxY
-LmR2XSkKcihKLnZCLFtKLnlFLEouWUUsSi5NRixKLmpkLEoucUksSi5EcixILkVULFcuRDAsVy5BeixX
-LkxlLFcuTmgsVy5JQixXLm43LFcuZWEsVy5icixXLlNnLFcudTgsVy5LNyxXLlhXLFAuaEZdKQpyKEou
-TUYsW0ouaUMsSi5rZCxKLmM1XSkKcyhKLlBvLEouamQpCnIoSi5xSSxbSi51cixKLlZBXSkKcyhQLkxV
-LFAublkpCnIoUC5MVSxbSC5YQyxXLnd6LFcuZTddKQpzKEgucWosSC5YQykKcihQLmNYLFtILmJRLEgu
-VTUsUC5tVyxILnVuXSkKcihILmJRLFtILmFMLEguaTUsUC54dV0pCnIoSC5hTCxbSC5uSCxILkE4LFAu
-aThdKQpzKEguU08sUC5BbikKcyhQLlJVLFAuUG4pCnMoUC5HaixQLlJVKQpzKEguUEQsUC5HaikKcyhI
-LkxQLEguV1UpCnIoSC5UcCxbSC5DaixILkFtLEgubGMsSC5kQyxILndOLEguVlgsUC50aCxQLmhhLFAu
-VnMsUC5GdCxQLnlILFAuV00sUC5TWCxQLkdzLFAuZGEsUC5vUSxQLnBWLFAuVTcsUC52cixQLnJILFAu
-S0YsUC5aTCxQLlJULFAualosUC5ycSxQLlJXLFAuQjUsUC5QSSxQLnBLLFAuaGosUC5WcCxQLk9SLFAu
-R0EsUC5XRixQLm4xLFAuY1MsUC5WQyxQLnRwLFAuZTEsUC5OWSxQLlJaLFAuTUUsUC55NSxQLnEzLFAu
-eUksUC5jNixQLnFkLFcuQ3YsVy5iVSxXLmhILFcuS1MsVy5BMyxXLnZOLFcuVXYsVy5FZyxXLkVvLFcu
-V2ssVy5JQSxXLmZtLFAubFIsUC5qZyxQLkdFLFAuTjcsUC51USxQLlBDLFAuWW0sUC5OeixQLm5wLFAu
-VXQsTC5lLEwuVlcsTC5vWixMLmpyLEwucWwsTC5MLEwuV3gsTC5BTyxMLmROLEwuSG8sTC54eixMLklD
-LEwuTDEsTC5uVCxMLkJaLEwuR0gsTC5EVCxMLmVILEwuekQsTC5PRSxMLlRXLEwueHIsTC5FRSxMLlFM
-LEwuVlMsTS5NaSxNLnE3LE0uTm8sWC5xUl0pCnIoUC5YUyxbSC5XMCxILmF6LEgudlYsSC5FcSxQLkM2
-LEgudTksUC5uLFAudSxQLm1wLFAudWIsUC5kcyxQLmxqLFAuVVYsUC5jXSkKcihILmxjLFtILnp4LEgu
-clRdKQpzKEgua1ksUC5DNikKcyhQLmlsLFAuWWspCnIoUC5pbCxbSC5ONSxQLnV3LFcuRDksVy5TeV0p
-CnMoSC5LVyxQLm1XKQpzKEguYjAsSC5FVCkKcihILmIwLFtILlJHLEguV0JdKQpzKEguVlAsSC5SRykK
-cyhILkRnLEguVlApCnMoSC5aRyxILldCKQpzKEguUGcsSC5aRykKcihILlBnLFtILnhqLEguZEUsSC5a
-QSxILndmLEguUHEsSC5lRSxILlY2XSkKcihILnU5LFtILmh6LEguaU1dKQpzKFAuWmYsUC5QZikKcyhQ
-LkppLFAubTApCnMoUC5iNixQLlh2KQpzKFAuVmosUC5XWSkKcihQLlVrLFtQLkNWLFAuWmksUC5ieV0p
-CnMoUC53SSxQLmtUKQpyKFAud0ksW1AuVTgsUC5NeCxQLkUzLFAuR1ldKQpzKFAudTUsUC5aaSkKcihQ
-LkZLLFtQLkNQLFAuS05dKQpyKFAudSxbUC5iSixQLmVZXSkKcyhQLnFlLFAuRG4pCnIoVy5EMCxbVy51
-SCxXLndhLFcuSzUsVy5DbV0pCnIoVy51SCxbVy5jdixXLm54LFcuUUYsVy5DUV0pCnIoVy5jdixbVy5x
-RSxQLmQ1XSkKcihXLnFFLFtXLkdoLFcuZlksVy5uQixXLlFQLFcuaDQsVy5TTixXLmxwLFcuVGIsVy5J
-dixXLkJULFcueVldKQpzKFcub0osVy5MZSkKcyhXLlQ1LFcuQXopCnMoVy5WYixXLlFGKQpzKFcuTzcs
-Vy53YSkKcihXLmVhLFtXLnc2LFcuZXddKQpzKFcuQWosVy53NikKcyhXLnJCLFcuSzcpCnMoVy5CSCxX
-LnJCKQpzKFcudzQsVy5JQikKcyhXLm9hLFcuWFcpCnMoVy5yaCxXLm9hKQpzKFcuaTcsVy5EOSkKcyhQ
-LkFzLFAuVmopCnIoUC5BcyxbVy5JNCxQLktlXSkKcyhXLlJPLFAucWgpCnMoVy5DcSxXLlJPKQpzKFcu
-eEMsUC5NTykKcyhXLmN0LFcubTYpCnMoUC5CZixQLmlKKQpyKFAuRTQsW1AucjcsUC5jb10pCnMoUC5U
-eixQLmNvKQpzKFAubmQsUC5kNSkKcyhCLkx1LE8uekwpCnIoQi5MdSxbRS5PRixGLnJ1LEwuSVZdKQp0
-KEguWEMsSC5SZSkKdChILlJHLFAubEQpCnQoSC5WUCxILlNVKQp0KEguV0IsUC5sRCkKdChILlpHLEgu
-U1UpCnQoUC5uWSxQLmxEKQp0KFAuV1ksUC5sZikKdChQLlJVLFAuS1ApCnQoVy5MZSxXLmlkKQp0KFcu
-SzcsUC5sRCkKdChXLnJCLFcuR20pCnQoVy5YVyxQLmxEKQp0KFcub2EsVy5HbSkKdChQLmNvLFAubEQp
-fSkoKQp2YXIgdj17dHlwZVVuaXZlcnNlOntlQzpuZXcgTWFwKCksdFI6e30sZVQ6e30sdFBWOnt9LHNF
-QTpbXX0sbWFuZ2xlZEdsb2JhbE5hbWVzOntLTjoiaW50IixDUDoiZG91YmxlIixGSzoibnVtIixxVToi
-U3RyaW5nIixhMjoiYm9vbCIsYzg6Ik51bGwiLHpNOiJMaXN0In0sbWFuZ2xlZE5hbWVzOnt9LGdldFR5
-cGVGcm9tTmFtZTpnZXRHbG9iYWxGcm9tTmFtZSxtZXRhZGF0YTpbXSx0eXBlczpbImM4KCkiLCJjOChA
-LEApIiwifigpIiwiQChAKSIsInFVKHFVKSIsImM4KEFqKSIsImM4KGN2KSIsImM4KE83KSIsImEyKHFV
-KSIsImM4KHFVLHFVKSIsIn4ofigpKSIsImEyKGN2LHFVLHFVLEpRKSIsImM4KEApIiwiYzgocVUsQCki
-LCJjOChxVSkiLCJhMihrRikiLCJ+KHh1PHFVPikiLCJjOChlYSkiLCJjOChHRCxAKSIsIktOKEtOLEtO
-KSIsImM4KH4oKSkiLCJjOChALEd6KSIsIn4ocVUscVUpIiwibjYoS04pIiwibjYoQCxAKSIsImEyKHVI
-KSIsImM4KEtOLEApIiwiYzgoZXcpIiwiQChlYSkiLCJ+KGtbR3pdKSIsImM4KEBbR3pdKSIsIn4oQWop
-IiwiYTIoeHU8cVU+KSIsInZzPEA+KEApIiwicjcoQCkiLCJUejxAPihAKSIsIkU0KEApIiwiQChxVSki
-LCJAKEAscVUpIiwifih1SCx1SCkiLCJaMDxxVSxxVT4oWjA8cVUscVU+LHFVKSIsIk83KE83KSIsInFV
-KEtOKSIsIn4ocVUsS04pIiwifihxVVtAXSkiLCJrKEApIiwifihBantyZWxhdGl2ZVRvOnFVfSkiLCJ+
-KEApIl0saW50ZXJjZXB0b3JzQnlUYWc6bnVsbCxsZWFmVGFnczpudWxsfQpILnhiKHYudHlwZVVuaXZl
-cnNlLEpTT04ucGFyc2UoJ3sicngiOiJlYSIsImU1IjoiZWEiLCJZMCI6ImQ1IiwiV3QiOiJkNSIsInYw
-IjoiZXciLCJNciI6InFFIiwiZUwiOiJxRSIsIkkwIjoidUgiLCJocyI6InVIIiwiWGciOiJRRiIsInlj
-IjoiQWoiLCJ5NCI6Inc2IiwiYVAiOiJDbSIsInhjIjoibngiLCJrSiI6Im54IiwielUiOiJEZyIsImRm
-IjoiRVQiLCJ5RSI6eyJhMiI6W119LCJZRSI6eyJjOCI6W119LCJNRiI6eyJ2bSI6W119LCJpQyI6eyJ2
-bSI6W119LCJrZCI6eyJ2bSI6W119LCJjNSI6eyJFSCI6W10sInZtIjpbXX0sImpkIjp7InpNIjpbIjEi
-XSwiY1giOlsiMSJdfSwiUG8iOnsiamQiOlsiMSJdLCJ6TSI6WyIxIl0sImNYIjpbIjEiXX0sIm0xIjp7
-IkFuIjpbIjEiXX0sInFJIjp7IkNQIjpbXSwiRksiOltdfSwidXIiOnsiS04iOltdLCJDUCI6W10sIkZL
-IjpbXX0sIlZBIjp7IkNQIjpbXSwiRksiOltdfSwiRHIiOnsicVUiOltdLCJ2WCI6W119LCJxaiI6eyJS
-ZSI6WyJLTiJdLCJsRCI6WyJLTiJdLCJ6TSI6WyJLTiJdLCJjWCI6WyJLTiJdLCJsRC5FIjoiS04iLCJS
-ZS5FIjoiS04ifSwiYlEiOnsiY1giOlsiMSJdfSwiYUwiOnsiY1giOlsiMSJdfSwibkgiOnsiYUwiOlsi
-MSJdLCJjWCI6WyIxIl0sImFMLkUiOiIxIiwiY1guRSI6IjEifSwiYTciOnsiQW4iOlsiMSJdfSwiQTgi
-OnsiYUwiOlsiMiJdLCJjWCI6WyIyIl0sImFMLkUiOiIyIiwiY1guRSI6IjIifSwiVTUiOnsiY1giOlsi
-MSJdLCJjWC5FIjoiMSJ9LCJTTyI6eyJBbiI6WyIxIl19LCJYQyI6eyJSZSI6WyIxIl0sImxEIjpbIjEi
-XSwiek0iOlsiMSJdLCJjWCI6WyIxIl19LCJ3diI6eyJHRCI6W119LCJQRCI6eyJHaiI6WyIxIiwiMiJd
-LCJSVSI6WyIxIiwiMiJdLCJQbiI6WyIxIiwiMiJdLCJLUCI6WyIxIiwiMiJdLCJaMCI6WyIxIiwiMiJd
-fSwiV1UiOnsiWjAiOlsiMSIsIjIiXX0sIkxQIjp7IldVIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl19
-LCJMSSI6eyJ2USI6W119LCJXMCI6eyJYUyI6W119LCJheiI6eyJYUyI6W119LCJ2ViI6eyJYUyI6W119
-LCJYTyI6eyJHeiI6W119LCJUcCI6eyJFSCI6W119LCJsYyI6eyJFSCI6W119LCJ6eCI6eyJFSCI6W119
-LCJyVCI6eyJFSCI6W119LCJFcSI6eyJYUyI6W119LCJrWSI6eyJYUyI6W119LCJONSI6eyJGbyI6WyIx
-IiwiMiJdLCJZayI6WyIxIiwiMiJdLCJaMCI6WyIxIiwiMiJdLCJZay5LIjoiMSIsIllrLlYiOiIyIn0s
-Imk1Ijp7ImNYIjpbIjEiXSwiY1guRSI6IjEifSwiTjYiOnsiQW4iOlsiMSJdfSwiVlIiOnsid0wiOltd
-LCJ2WCI6W119LCJFSyI6eyJpYiI6W10sIk9kIjpbXX0sIktXIjp7ImNYIjpbImliIl0sImNYLkUiOiJp
-YiJ9LCJQYiI6eyJBbiI6WyJpYiJdfSwidFEiOnsiT2QiOltdfSwidW4iOnsiY1giOlsiT2QiXSwiY1gu
-RSI6Ik9kIn0sIlNkIjp7IkFuIjpbIk9kIl19LCJFVCI6eyJBUyI6W119LCJiMCI6eyJYaiI6WyJAIl0s
-IkVUIjpbXSwiQVMiOltdfSwiRGciOnsibEQiOlsiQ1AiXSwiWGoiOlsiQCJdLCJ6TSI6WyJDUCJdLCJF
-VCI6W10sIlNVIjpbIkNQIl0sIkFTIjpbXSwiY1giOlsiQ1AiXSwibEQuRSI6IkNQIn0sIlBnIjp7ImxE
-IjpbIktOIl0sInpNIjpbIktOIl0sIlhqIjpbIkAiXSwiRVQiOltdLCJTVSI6WyJLTiJdLCJBUyI6W10s
-ImNYIjpbIktOIl19LCJ4aiI6eyJsRCI6WyJLTiJdLCJ6TSI6WyJLTiJdLCJYaiI6WyJAIl0sIkVUIjpb
-XSwiU1UiOlsiS04iXSwiQVMiOltdLCJjWCI6WyJLTiJdLCJsRC5FIjoiS04ifSwiZEUiOnsibEQiOlsi
-S04iXSwiek0iOlsiS04iXSwiWGoiOlsiQCJdLCJFVCI6W10sIlNVIjpbIktOIl0sIkFTIjpbXSwiY1gi
-OlsiS04iXSwibEQuRSI6IktOIn0sIlpBIjp7ImxEIjpbIktOIl0sInpNIjpbIktOIl0sIlhqIjpbIkAi
-XSwiRVQiOltdLCJTVSI6WyJLTiJdLCJBUyI6W10sImNYIjpbIktOIl0sImxELkUiOiJLTiJ9LCJ3ZiI6
-eyJsRCI6WyJLTiJdLCJ6TSI6WyJLTiJdLCJYaiI6WyJAIl0sIkVUIjpbXSwiU1UiOlsiS04iXSwiQVMi
-OltdLCJjWCI6WyJLTiJdLCJsRC5FIjoiS04ifSwiUHEiOnsibEQiOlsiS04iXSwiek0iOlsiS04iXSwi
-WGoiOlsiQCJdLCJFVCI6W10sIlNVIjpbIktOIl0sIkFTIjpbXSwiY1giOlsiS04iXSwibEQuRSI6IktO
-In0sImVFIjp7ImxEIjpbIktOIl0sInpNIjpbIktOIl0sIlhqIjpbIkAiXSwiRVQiOltdLCJTVSI6WyJL
-TiJdLCJBUyI6W10sImNYIjpbIktOIl0sImxELkUiOiJLTiJ9LCJWNiI6eyJuNiI6W10sImxEIjpbIktO
-Il0sInpNIjpbIktOIl0sIlhqIjpbIkAiXSwiRVQiOltdLCJTVSI6WyJLTiJdLCJBUyI6W10sImNYIjpb
-IktOIl0sImxELkUiOiJLTiJ9LCJ1OSI6eyJYUyI6W119LCJoeiI6eyJYUyI6W119LCJpTSI6eyJYUyI6
-W119LCJaZiI6eyJQZiI6WyIxIl19LCJ2cyI6eyJiOCI6WyIxIl19LCJDdyI6eyJYUyI6W119LCJtMCI6
-eyJKQiI6W119LCJKaSI6eyJKQiI6W119LCJiNiI6eyJYdiI6WyIxIl0sInh1IjpbIjEiXSwiY1giOlsi
-MSJdfSwibG0iOnsiQW4iOlsiMSJdfSwibVciOnsiY1giOlsiMSJdfSwiTFUiOnsibEQiOlsiMSJdLCJ6
-TSI6WyIxIl0sImNYIjpbIjEiXX0sImlsIjp7IllrIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl19LCJZ
-ayI6eyJaMCI6WyIxIiwiMiJdfSwiUG4iOnsiWjAiOlsiMSIsIjIiXX0sIkdqIjp7IlJVIjpbIjEiLCIy
-Il0sIlBuIjpbIjEiLCIyIl0sIktQIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl19LCJWaiI6eyJsZiI6
-WyIxIl0sInh1IjpbIjEiXSwiY1giOlsiMSJdfSwiWHYiOnsieHUiOlsiMSJdLCJjWCI6WyIxIl19LCJ1
-dyI6eyJZayI6WyJxVSIsIkAiXSwiWjAiOlsicVUiLCJAIl0sIllrLksiOiJxVSIsIllrLlYiOiJAIn0s
-Imk4Ijp7ImFMIjpbInFVIl0sImNYIjpbInFVIl0sImFMLkUiOiJxVSIsImNYLkUiOiJxVSJ9LCJDViI6
-eyJVayI6WyJ6TTxLTj4iLCJxVSJdLCJVay5TIjoiek08S04+In0sIlU4Ijp7IndJIjpbInpNPEtOPiIs
-InFVIl19LCJaaSI6eyJVayI6WyJxVSIsInpNPEtOPiJdfSwiYnkiOnsiVWsiOlsiayIsInFVIl0sIlVr
-LlMiOiJrIn0sIk14Ijp7IndJIjpbInFVIiwiayJdfSwidTUiOnsiVWsiOlsicVUiLCJ6TTxLTj4iXSwi
-VWsuUyI6InFVIn0sIkUzIjp7IndJIjpbInFVIiwiek08S04+Il19LCJHWSI6eyJ3SSI6WyJ6TTxLTj4i
-LCJxVSJdfSwiQ1AiOnsiRksiOltdfSwiQzYiOnsiWFMiOltdfSwibiI6eyJYUyI6W119LCJ1Ijp7IlhT
-IjpbXX0sImJKIjp7IlhTIjpbXX0sImVZIjp7IlhTIjpbXX0sIm1wIjp7IlhTIjpbXX0sInViIjp7IlhT
-IjpbXX0sImRzIjp7IlhTIjpbXX0sImxqIjp7IlhTIjpbXX0sIlVWIjp7IlhTIjpbXX0sIms1Ijp7IlhT
-IjpbXX0sIktZIjp7IlhTIjpbXX0sImMiOnsiWFMiOltdfSwiS04iOnsiRksiOltdfSwiek0iOnsiY1gi
-OlsiMSJdfSwiaWIiOnsiT2QiOltdfSwieHUiOnsiY1giOlsiMSJdfSwicVUiOnsidlgiOltdfSwiUm4i
-OnsiQkwiOltdfSwiRG4iOnsiaUQiOltdfSwiVWYiOnsiaUQiOltdfSwicWUiOnsiaUQiOltdfSwicUUi
-OnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIkdoIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJm
-WSI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwibkIiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0s
-IlFQIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJueCI6eyJ1SCI6W10sIkQwIjpbXX0sIlFGIjp7
-InVIIjpbXSwiRDAiOltdfSwiSUIiOnsidG4iOlsiRksiXX0sInd6Ijp7ImxEIjpbIjEiXSwiek0iOlsi
-MSJdLCJjWCI6WyIxIl0sImxELkUiOiIxIn0sImN2Ijp7InVIIjpbXSwiRDAiOltdfSwiVDUiOnsiQXoi
-OltdfSwiaDQiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIlZiIjp7InVIIjpbXSwiRDAiOltdfSwi
-TzciOnsiRDAiOltdfSwid2EiOnsiRDAiOltdfSwiQWoiOnsiZWEiOltdfSwiZTciOnsibEQiOlsidUgi
-XSwiek0iOlsidUgiXSwiY1giOlsidUgiXSwibEQuRSI6InVIIn0sInVIIjp7IkQwIjpbXX0sIkJIIjp7
-IkdtIjpbInVIIl0sImxEIjpbInVIIl0sInpNIjpbInVIIl0sIlhqIjpbInVIIl0sImNYIjpbInVIIl0s
-ImxELkUiOiJ1SCIsIkdtLkUiOiJ1SCJ9LCJTTiI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiZXci
-OnsiZWEiOltdfSwibHAiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIlRiIjp7ImN2IjpbXSwidUgi
-OltdLCJEMCI6W119LCJJdiI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiQlQiOnsiY3YiOltdLCJ1
-SCI6W10sIkQwIjpbXX0sInlZIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJ3NiI6eyJlYSI6W119
-LCJLNSI6eyJ2NiI6W10sIkQwIjpbXX0sIkNtIjp7IkQwIjpbXX0sIkNRIjp7InVIIjpbXSwiRDAiOltd
-fSwidzQiOnsidG4iOlsiRksiXX0sInJoIjp7IkdtIjpbInVIIl0sImxEIjpbInVIIl0sInpNIjpbInVI
-Il0sIlhqIjpbInVIIl0sImNYIjpbInVIIl0sImxELkUiOiJ1SCIsIkdtLkUiOiJ1SCJ9LCJEOSI6eyJZ
-ayI6WyJxVSIsInFVIl0sIlowIjpbInFVIiwicVUiXX0sImk3Ijp7IllrIjpbInFVIiwicVUiXSwiWjAi
-OlsicVUiLCJxVSJdLCJZay5LIjoicVUiLCJZay5WIjoicVUifSwiU3kiOnsiWWsiOlsicVUiLCJxVSJd
-LCJaMCI6WyJxVSIsInFVIl0sIllrLksiOiJxVSIsIllrLlYiOiJxVSJ9LCJJNCI6eyJsZiI6WyJxVSJd
-LCJ4dSI6WyJxVSJdLCJjWCI6WyJxVSJdfSwiUk8iOnsicWgiOlsiMSJdfSwiQ3EiOnsiUk8iOlsiMSJd
-LCJxaCI6WyIxIl19LCJ4QyI6eyJNTyI6WyIxIl19LCJKUSI6eyJrRiI6W119LCJ2RCI6eyJrRiI6W119
-LCJtNiI6eyJrRiI6W119LCJjdCI6eyJrRiI6W119LCJPdyI6eyJrRiI6W119LCJXOSI6eyJBbiI6WyIx
-Il19LCJkVyI6eyJ2NiI6W10sIkQwIjpbXX0sIm1rIjp7InkwIjpbXX0sIktvIjp7Im9uIjpbXX0sIkFz
-Ijp7ImxmIjpbInFVIl0sInh1IjpbInFVIl0sImNYIjpbInFVIl19LCJyNyI6eyJFNCI6W119LCJUeiI6
-eyJsRCI6WyIxIl0sInpNIjpbIjEiXSwiRTQiOltdLCJjWCI6WyIxIl0sImxELkUiOiIxIn0sIm5kIjp7
-ImQ1IjpbXSwiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIktlIjp7ImxmIjpbInFVIl0sInh1IjpbInFV
-Il0sImNYIjpbInFVIl19LCJkNSI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwibjYiOnsiek0iOlsi
-S04iXSwiQVMiOltdLCJjWCI6WyJLTiJdfSwiWEEiOnsia0YiOltdfSwiT0YiOnsiTHUiOltdfSwicnUi
-OnsiTHUiOltdfSwiSVYiOnsiTHUiOltdfX0nKSkKSC5GRih2LnR5cGVVbml2ZXJzZSxKU09OLnBhcnNl
-KCd7ImJRIjoxLCJYQyI6MSwiTU8iOjEsImtUIjoyLCJtVyI6MSwiTFUiOjEsImlsIjoyLCJWaiI6MSwi
-blkiOjEsIldZIjoxLCJjbyI6MX0nKSkKdmFyIHU9KGZ1bmN0aW9uIHJ0aWkoKXt2YXIgdD1ILk4wCnJl
-dHVybntpOnQoIkdoIiksbjp0KCJDdyIpLGNSOnQoIm5CIiksZDp0KCJBeiIpLFk6dCgiUVAiKSxnRjp0
-KCJQRDxHRCxAPiIpLGg6dCgiY3YiKSxiVTp0KCJYUyIpLEI6dCgiZWEiKSxhUzp0KCJEMCIpLGM4OnQo
-IlQ1IiksWjp0KCJFSCIpLGM6dCgiYjg8QD4iKSxyOnQoIk83IiksSTp0KCJTZyIpLG86dCgidlEiKSxl
-aDp0KCJjWDx1SD4iKSxYOnQoImNYPHFVPiIpLFI6dCgiY1g8QD4iKSxmQTp0KCJqZDxTZT4iKSx1OnQo
-ImpkPGo4PiIpLGJQOnQoImpkPHVGPiIpLGZoOnQoImpkPFpaPiIpLGs6dCgiamQ8a0Y+Iiksczp0KCJq
-ZDxxVT4iKSxoaDp0KCJqZDx5RD4iKSxhSjp0KCJqZDx3Yj4iKSxtOnQoImpkPEA+IiksdDp0KCJqZDxL
-Tj4iKSxlSDp0KCJ2bSIpLGc6dCgiYzUiKSxhVTp0KCJYajxAPiIpLGFtOnQoIlR6PEA+IiksZW86dCgi
-TjU8R0QsQD4iKSx2OnQoIkU0IiksZHo6dCgiaEYiKSxhOnQoInpNPHFVPiIpLGo6dCgiek08QD4iKSxM
-OnQoInpNPEtOPiIpLEY6dCgidTgiKSxmOnQoIlowPHFVLHFVPiIpLGI6dCgiWjA8cVUsQD4iKSxHOnQo
-IlowPEAsQD4iKSxkdjp0KCJBODxxVSxxVT4iKSxkbzp0KCJBODxxVSxAPiIpLFY6dCgiQWoiKSxkRDp0
-KCJFVCIpLGJtOnQoIlY2IiksQTp0KCJ1SCIpLGU6dCgia0YiKSxQOnQoImM4IiksSzp0KCJrIikscDp0
-KCJldyIpLHE6dCgidG48Rks+IiksZnY6dCgid0wiKSxldzp0KCJuZCIpLEM6dCgieHU8cVU+IiksbDp0
-KCJHeiIpLE46dCgicVUiKSxkRzp0KCJxVShxVSkiKSxnNzp0KCJkNSIpLGZvOnQoIkdEIiksYVc6dCgi
-eVkiKSx3OnQoIkFTIiksZ2M6dCgibjYiKSxhazp0KCJrZCIpLFQ6dCgiR2o8cVUscVU+IiksRDp0KCJp
-RCIpLGNjOnQoIlU1PHFVPiIpLGc0OnQoIks1IiksY2k6dCgidjYiKSxnMjp0KCJDbSIpLGJqOnQoIlpm
-PE83PiIpLGg5OnQoIkNRIiksYWM6dCgiZTciKSxROnQoIkNxPEFqPiIpLFM6dCgid3o8Y3Y+IikseDp0
-KCJGZTxALEA+IiksYW86dCgidnM8Tzc+IiksXzp0KCJ2czxAPiIpLGZKOnQoInZzPEtOPiIpLE86dCgi
-SlEiKSxKOnQoImJuIiksY0o6dCgiYTIiKSxhbDp0KCJhMihrKSIpLGJCOnQoImEyKHFVKSIpLGJmOnQo
-ImEyKEApIiksejp0KCJAIiksZk86dCgiQCgpIiksVTp0KCJAKGVhKSIpLHk6dCgiQChrKSIpLGVwOnQo
-IkAoayxrKSIpLFc6dCgiQChrLEd6KSIpLGNoOnQoIkAoeHU8cVU+KSIpLGRPOnQoIkAocVUpIiksYjg6
-dCgiQChALEApIiksZWc6dCgiS04iKSxIOnQoIn4iKSxNOnQoIn4oKSIpLGFuOnQoIn4oZXcpIiksRTp0
-KCJ+KHFVLHFVKSIpLGNBOnQoIn4ocVUsQCkiKX19KSgpOyhmdW5jdGlvbiBjb25zdGFudHMoKXt2YXIg
-dD1odW5rSGVscGVycy5tYWtlQ29uc3RMaXN0CkMuUlk9Vy5RUC5wcm90b3R5cGUKQy5CWj1XLlZiLnBy
-b3RvdHlwZQpDLkR0PVcuTzcucHJvdG90eXBlCkMuT2s9Si52Qi5wcm90b3R5cGUKQy5ObT1KLmpkLnBy
-b3RvdHlwZQpDLmpuPUoudXIucHJvdG90eXBlCkMuak49Si5ZRS5wcm90b3R5cGUKQy5DRD1KLnFJLnBy
-b3RvdHlwZQpDLnhCPUouRHIucHJvdG90eXBlCkMuREc9Si5jNS5wcm90b3R5cGUKQy5FeD1XLnU4LnBy
-b3RvdHlwZQpDLkx0PVcuU04ucHJvdG90eXBlCkMuWlE9Si5pQy5wcm90b3R5cGUKQy5JZT1XLlRiLnBy
-b3RvdHlwZQpDLnZCPUoua2QucHJvdG90eXBlCkMub2w9Vy5LNS5wcm90b3R5cGUKQy55OD1uZXcgUC5V
-OCgpCkMuaDk9bmV3IFAuQ1YoKQpDLk80PWZ1bmN0aW9uIGdldFRhZ0ZhbGxiYWNrKG8pIHsKICB2YXIg
-cyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTsKICByZXR1cm4gcy5zdWJzdHJpbmco
-OCwgcy5sZW5ndGggLSAxKTsKfQpDLllxPWZ1bmN0aW9uKCkgewogIHZhciB0b1N0cmluZ0Z1bmN0aW9u
-ID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKICBmdW5jdGlvbiBnZXRUYWcobykgewogICAgdmFy
-IHMgPSB0b1N0cmluZ0Z1bmN0aW9uLmNhbGwobyk7CiAgICByZXR1cm4gcy5zdWJzdHJpbmcoOCwgcy5s
-ZW5ndGggLSAxKTsKICB9CiAgZnVuY3Rpb24gZ2V0VW5rbm93blRhZyhvYmplY3QsIHRhZykgewogICAg
-aWYgKC9eSFRNTFtBLVpdLipFbGVtZW50JC8udGVzdCh0YWcpKSB7CiAgICAgIHZhciBuYW1lID0gdG9T
-dHJpbmdGdW5jdGlvbi5jYWxsKG9iamVjdCk7CiAgICAgIGlmIChuYW1lID09ICJbb2JqZWN0IE9iamVj
-dF0iKSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuICJIVE1MRWxlbWVudCI7CiAgICB9CiAgfQogIGZ1
-bmN0aW9uIGdldFVua25vd25UYWdHZW5lcmljQnJvd3NlcihvYmplY3QsIHRhZykgewogICAgaWYgKHNl
-bGYuSFRNTEVsZW1lbnQgJiYgb2JqZWN0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHJldHVybiAiSFRN
-TEVsZW1lbnQiOwogICAgcmV0dXJuIGdldFVua25vd25UYWcob2JqZWN0LCB0YWcpOwogIH0KICBmdW5j
-dGlvbiBwcm90b3R5cGVGb3JUYWcodGFnKSB7CiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PSAidW5kZWZp
-bmVkIikgcmV0dXJuIG51bGw7CiAgICBpZiAodHlwZW9mIHdpbmRvd1t0YWddID09ICJ1bmRlZmluZWQi
-KSByZXR1cm4gbnVsbDsKICAgIHZhciBjb25zdHJ1Y3RvciA9IHdpbmRvd1t0YWddOwogICAgaWYgKHR5
-cGVvZiBjb25zdHJ1Y3RvciAhPSAiZnVuY3Rpb24iKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiBjb25z
-dHJ1Y3Rvci5wcm90b3R5cGU7CiAgfQogIGZ1bmN0aW9uIGRpc2NyaW1pbmF0b3IodGFnKSB7IHJldHVy
-biBudWxsOyB9CiAgdmFyIGlzQnJvd3NlciA9IHR5cGVvZiBuYXZpZ2F0b3IgPT0gIm9iamVjdCI7CiAg
-cmV0dXJuIHsKICAgIGdldFRhZzogZ2V0VGFnLAogICAgZ2V0VW5rbm93blRhZzogaXNCcm93c2VyID8g
-Z2V0VW5rbm93blRhZ0dlbmVyaWNCcm93c2VyIDogZ2V0VW5rbm93blRhZywKICAgIHByb3RvdHlwZUZv
-clRhZzogcHJvdG90eXBlRm9yVGFnLAogICAgZGlzY3JpbWluYXRvcjogZGlzY3JpbWluYXRvciB9Owp9
-CkMud2I9ZnVuY3Rpb24oZ2V0VGFnRmFsbGJhY2spIHsKICByZXR1cm4gZnVuY3Rpb24oaG9va3MpIHsK
-ICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9ICJvYmplY3QiKSByZXR1cm4gaG9va3M7CiAgICB2YXIg
-dWEgPSBuYXZpZ2F0b3IudXNlckFnZW50OwogICAgaWYgKHVhLmluZGV4T2YoIkR1bXBSZW5kZXJUcmVl
-IikgPj0gMCkgcmV0dXJuIGhvb2tzOwogICAgaWYgKHVhLmluZGV4T2YoIkNocm9tZSIpID49IDApIHsK
-ICAgICAgZnVuY3Rpb24gY29uZmlybShwKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgPT0g
-Im9iamVjdCIgJiYgd2luZG93W3BdICYmIHdpbmRvd1twXS5uYW1lID09IHA7CiAgICAgIH0KICAgICAg
-aWYgKGNvbmZpcm0oIldpbmRvdyIpICYmIGNvbmZpcm0oIkhUTUxFbGVtZW50IikpIHJldHVybiBob29r
-czsKICAgIH0KICAgIGhvb2tzLmdldFRhZyA9IGdldFRhZ0ZhbGxiYWNrOwogIH07Cn0KQy5LVT1mdW5j
-dGlvbihob29rcykgewogIGlmICh0eXBlb2YgZGFydEV4cGVyaW1lbnRhbEZpeHVwR2V0VGFnICE9ICJm
-dW5jdGlvbiIpIHJldHVybiBob29rczsKICBob29rcy5nZXRUYWcgPSBkYXJ0RXhwZXJpbWVudGFsRml4
-dXBHZXRUYWcoaG9va3MuZ2V0VGFnKTsKfQpDLmZRPWZ1bmN0aW9uKGhvb2tzKSB7CiAgdmFyIGdldFRh
-ZyA9IGhvb2tzLmdldFRhZzsKICB2YXIgcHJvdG90eXBlRm9yVGFnID0gaG9va3MucHJvdG90eXBlRm9y
-VGFnOwogIGZ1bmN0aW9uIGdldFRhZ0ZpeGVkKG8pIHsKICAgIHZhciB0YWcgPSBnZXRUYWcobyk7CiAg
-ICBpZiAodGFnID09ICJEb2N1bWVudCIpIHsKICAgICAgaWYgKCEhby54bWxWZXJzaW9uKSByZXR1cm4g
-IiFEb2N1bWVudCI7CiAgICAgIHJldHVybiAiIUhUTUxEb2N1bWVudCI7CiAgICB9CiAgICByZXR1cm4g
-dGFnOwogIH0KICBmdW5jdGlvbiBwcm90b3R5cGVGb3JUYWdGaXhlZCh0YWcpIHsKICAgIGlmICh0YWcg
-PT0gIkRvY3VtZW50IikgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gcHJvdG90eXBlRm9yVGFnKHRhZyk7
-CiAgfQogIGhvb2tzLmdldFRhZyA9IGdldFRhZ0ZpeGVkOwogIGhvb2tzLnByb3RvdHlwZUZvclRhZyA9
-IHByb3RvdHlwZUZvclRhZ0ZpeGVkOwp9CkMuZGs9ZnVuY3Rpb24oaG9va3MpIHsKICB2YXIgdXNlckFn
-ZW50ID0gdHlwZW9mIG5hdmlnYXRvciA9PSAib2JqZWN0IiA/IG5hdmlnYXRvci51c2VyQWdlbnQgOiAi
-IjsKICBpZiAodXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSA9PSAtMSkgcmV0dXJuIGhvb2tzOwog
-IHZhciBnZXRUYWcgPSBob29rcy5nZXRUYWc7CiAgdmFyIHF1aWNrTWFwID0gewogICAgIkJlZm9yZVVu
-bG9hZEV2ZW50IjogIkV2ZW50IiwKICAgICJEYXRhVHJhbnNmZXIiOiAiQ2xpcGJvYXJkIiwKICAgICJH
-ZW9HZW9sb2NhdGlvbiI6ICJHZW9sb2NhdGlvbiIsCiAgICAiTG9jYXRpb24iOiAiIUxvY2F0aW9uIiwK
-ICAgICJXb3JrZXJNZXNzYWdlRXZlbnQiOiAiTWVzc2FnZUV2ZW50IiwKICAgICJYTUxEb2N1bWVudCI6
-ICIhRG9jdW1lbnQifTsKICBmdW5jdGlvbiBnZXRUYWdGaXJlZm94KG8pIHsKICAgIHZhciB0YWcgPSBn
-ZXRUYWcobyk7CiAgICByZXR1cm4gcXVpY2tNYXBbdGFnXSB8fCB0YWc7CiAgfQogIGhvb2tzLmdldFRh
-ZyA9IGdldFRhZ0ZpcmVmb3g7Cn0KQy54aT1mdW5jdGlvbihob29rcykgewogIHZhciB1c2VyQWdlbnQg
-PSB0eXBlb2YgbmF2aWdhdG9yID09ICJvYmplY3QiID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6ICIiOwog
-IGlmICh1c2VyQWdlbnQuaW5kZXhPZigiVHJpZGVudC8iKSA9PSAtMSkgcmV0dXJuIGhvb2tzOwogIHZh
-ciBnZXRUYWcgPSBob29rcy5nZXRUYWc7CiAgdmFyIHF1aWNrTWFwID0gewogICAgIkJlZm9yZVVubG9h
-ZEV2ZW50IjogIkV2ZW50IiwKICAgICJEYXRhVHJhbnNmZXIiOiAiQ2xpcGJvYXJkIiwKICAgICJIVE1M
-RERFbGVtZW50IjogIkhUTUxFbGVtZW50IiwKICAgICJIVE1MRFRFbGVtZW50IjogIkhUTUxFbGVtZW50
-IiwKICAgICJIVE1MUGhyYXNlRWxlbWVudCI6ICJIVE1MRWxlbWVudCIsCiAgICAiUG9zaXRpb24iOiAi
-R2VvcG9zaXRpb24iCiAgfTsKICBmdW5jdGlvbiBnZXRUYWdJRShvKSB7CiAgICB2YXIgdGFnID0gZ2V0
-VGFnKG8pOwogICAgdmFyIG5ld1RhZyA9IHF1aWNrTWFwW3RhZ107CiAgICBpZiAobmV3VGFnKSByZXR1
-cm4gbmV3VGFnOwogICAgaWYgKHRhZyA9PSAiT2JqZWN0IikgewogICAgICBpZiAod2luZG93LkRhdGFW
-aWV3ICYmIChvIGluc3RhbmNlb2Ygd2luZG93LkRhdGFWaWV3KSkgcmV0dXJuICJEYXRhVmlldyI7CiAg
-ICB9CiAgICByZXR1cm4gdGFnOwogIH0KICBmdW5jdGlvbiBwcm90b3R5cGVGb3JUYWdJRSh0YWcpIHsK
-ICAgIHZhciBjb25zdHJ1Y3RvciA9IHdpbmRvd1t0YWddOwogICAgaWYgKGNvbnN0cnVjdG9yID09IG51
-bGwpIHJldHVybiBudWxsOwogICAgcmV0dXJuIGNvbnN0cnVjdG9yLnByb3RvdHlwZTsKICB9CiAgaG9v
-a3MuZ2V0VGFnID0gZ2V0VGFnSUU7CiAgaG9va3MucHJvdG90eXBlRm9yVGFnID0gcHJvdG90eXBlRm9y
-VGFnSUU7Cn0KQy5pNz1mdW5jdGlvbihob29rcykgeyByZXR1cm4gaG9va3M7IH0KCkMuQ3Q9bmV3IFAu
-YnkoKQpDLkVxPW5ldyBQLms1KCkKQy54TT1uZXcgUC51NSgpCkMuUWs9bmV3IFAuRTMoKQpDLk5VPW5l
-dyBQLkppKCkKQy5BMz1uZXcgUC5NeChudWxsKQpDLkdiPUguVk0odChbMTI3LDIwNDcsNjU1MzUsMTEx
-NDExMV0pLHUudCkKQy5haz1ILlZNKHQoWzAsMCwzMjc3NiwzMzc5MiwxLDEwMjQwLDAsMF0pLHUudCkK
-Qy5jbT1ILlZNKHQoWyIqOjpjbGFzcyIsIio6OmRpciIsIio6OmRyYWdnYWJsZSIsIio6OmhpZGRlbiIs
-Iio6OmlkIiwiKjo6aW5lcnQiLCIqOjppdGVtcHJvcCIsIio6Oml0ZW1yZWYiLCIqOjppdGVtc2NvcGUi
-LCIqOjpsYW5nIiwiKjo6c3BlbGxjaGVjayIsIio6OnRpdGxlIiwiKjo6dHJhbnNsYXRlIiwiQTo6YWNj
-ZXNza2V5IiwiQTo6Y29vcmRzIiwiQTo6aHJlZmxhbmciLCJBOjpuYW1lIiwiQTo6c2hhcGUiLCJBOjp0
-YWJpbmRleCIsIkE6OnRhcmdldCIsIkE6OnR5cGUiLCJBUkVBOjphY2Nlc3NrZXkiLCJBUkVBOjphbHQi
-LCJBUkVBOjpjb29yZHMiLCJBUkVBOjpub2hyZWYiLCJBUkVBOjpzaGFwZSIsIkFSRUE6OnRhYmluZGV4
-IiwiQVJFQTo6dGFyZ2V0IiwiQVVESU86OmNvbnRyb2xzIiwiQVVESU86Omxvb3AiLCJBVURJTzo6bWVk
-aWFncm91cCIsIkFVRElPOjptdXRlZCIsIkFVRElPOjpwcmVsb2FkIiwiQkRPOjpkaXIiLCJCT0RZOjph
-bGluayIsIkJPRFk6OmJnY29sb3IiLCJCT0RZOjpsaW5rIiwiQk9EWTo6dGV4dCIsIkJPRFk6OnZsaW5r
-IiwiQlI6OmNsZWFyIiwiQlVUVE9OOjphY2Nlc3NrZXkiLCJCVVRUT046OmRpc2FibGVkIiwiQlVUVE9O
-OjpuYW1lIiwiQlVUVE9OOjp0YWJpbmRleCIsIkJVVFRPTjo6dHlwZSIsIkJVVFRPTjo6dmFsdWUiLCJD
-QU5WQVM6OmhlaWdodCIsIkNBTlZBUzo6d2lkdGgiLCJDQVBUSU9OOjphbGlnbiIsIkNPTDo6YWxpZ24i
-LCJDT0w6OmNoYXIiLCJDT0w6OmNoYXJvZmYiLCJDT0w6OnNwYW4iLCJDT0w6OnZhbGlnbiIsIkNPTDo6
-d2lkdGgiLCJDT0xHUk9VUDo6YWxpZ24iLCJDT0xHUk9VUDo6Y2hhciIsIkNPTEdST1VQOjpjaGFyb2Zm
-IiwiQ09MR1JPVVA6OnNwYW4iLCJDT0xHUk9VUDo6dmFsaWduIiwiQ09MR1JPVVA6OndpZHRoIiwiQ09N
-TUFORDo6Y2hlY2tlZCIsIkNPTU1BTkQ6OmNvbW1hbmQiLCJDT01NQU5EOjpkaXNhYmxlZCIsIkNPTU1B
-TkQ6OmxhYmVsIiwiQ09NTUFORDo6cmFkaW9ncm91cCIsIkNPTU1BTkQ6OnR5cGUiLCJEQVRBOjp2YWx1
-ZSIsIkRFTDo6ZGF0ZXRpbWUiLCJERVRBSUxTOjpvcGVuIiwiRElSOjpjb21wYWN0IiwiRElWOjphbGln
-biIsIkRMOjpjb21wYWN0IiwiRklFTERTRVQ6OmRpc2FibGVkIiwiRk9OVDo6Y29sb3IiLCJGT05UOjpm
-YWNlIiwiRk9OVDo6c2l6ZSIsIkZPUk06OmFjY2VwdCIsIkZPUk06OmF1dG9jb21wbGV0ZSIsIkZPUk06
-OmVuY3R5cGUiLCJGT1JNOjptZXRob2QiLCJGT1JNOjpuYW1lIiwiRk9STTo6bm92YWxpZGF0ZSIsIkZP
-Uk06OnRhcmdldCIsIkZSQU1FOjpuYW1lIiwiSDE6OmFsaWduIiwiSDI6OmFsaWduIiwiSDM6OmFsaWdu
-IiwiSDQ6OmFsaWduIiwiSDU6OmFsaWduIiwiSDY6OmFsaWduIiwiSFI6OmFsaWduIiwiSFI6Om5vc2hh
-ZGUiLCJIUjo6c2l6ZSIsIkhSOjp3aWR0aCIsIkhUTUw6OnZlcnNpb24iLCJJRlJBTUU6OmFsaWduIiwi
-SUZSQU1FOjpmcmFtZWJvcmRlciIsIklGUkFNRTo6aGVpZ2h0IiwiSUZSQU1FOjptYXJnaW5oZWlnaHQi
-LCJJRlJBTUU6Om1hcmdpbndpZHRoIiwiSUZSQU1FOjp3aWR0aCIsIklNRzo6YWxpZ24iLCJJTUc6OmFs
-dCIsIklNRzo6Ym9yZGVyIiwiSU1HOjpoZWlnaHQiLCJJTUc6OmhzcGFjZSIsIklNRzo6aXNtYXAiLCJJ
-TUc6Om5hbWUiLCJJTUc6OnVzZW1hcCIsIklNRzo6dnNwYWNlIiwiSU1HOjp3aWR0aCIsIklOUFVUOjph
-Y2NlcHQiLCJJTlBVVDo6YWNjZXNza2V5IiwiSU5QVVQ6OmFsaWduIiwiSU5QVVQ6OmFsdCIsIklOUFVU
-OjphdXRvY29tcGxldGUiLCJJTlBVVDo6YXV0b2ZvY3VzIiwiSU5QVVQ6OmNoZWNrZWQiLCJJTlBVVDo6
-ZGlzYWJsZWQiLCJJTlBVVDo6aW5wdXRtb2RlIiwiSU5QVVQ6OmlzbWFwIiwiSU5QVVQ6Omxpc3QiLCJJ
-TlBVVDo6bWF4IiwiSU5QVVQ6Om1heGxlbmd0aCIsIklOUFVUOjptaW4iLCJJTlBVVDo6bXVsdGlwbGUi
-LCJJTlBVVDo6bmFtZSIsIklOUFVUOjpwbGFjZWhvbGRlciIsIklOUFVUOjpyZWFkb25seSIsIklOUFVU
-OjpyZXF1aXJlZCIsIklOUFVUOjpzaXplIiwiSU5QVVQ6OnN0ZXAiLCJJTlBVVDo6dGFiaW5kZXgiLCJJ
-TlBVVDo6dHlwZSIsIklOUFVUOjp1c2VtYXAiLCJJTlBVVDo6dmFsdWUiLCJJTlM6OmRhdGV0aW1lIiwi
-S0VZR0VOOjpkaXNhYmxlZCIsIktFWUdFTjo6a2V5dHlwZSIsIktFWUdFTjo6bmFtZSIsIkxBQkVMOjph
-Y2Nlc3NrZXkiLCJMQUJFTDo6Zm9yIiwiTEVHRU5EOjphY2Nlc3NrZXkiLCJMRUdFTkQ6OmFsaWduIiwi
-TEk6OnR5cGUiLCJMSTo6dmFsdWUiLCJMSU5LOjpzaXplcyIsIk1BUDo6bmFtZSIsIk1FTlU6OmNvbXBh
-Y3QiLCJNRU5VOjpsYWJlbCIsIk1FTlU6OnR5cGUiLCJNRVRFUjo6aGlnaCIsIk1FVEVSOjpsb3ciLCJN
-RVRFUjo6bWF4IiwiTUVURVI6Om1pbiIsIk1FVEVSOjp2YWx1ZSIsIk9CSkVDVDo6dHlwZW11c3RtYXRj
-aCIsIk9MOjpjb21wYWN0IiwiT0w6OnJldmVyc2VkIiwiT0w6OnN0YXJ0IiwiT0w6OnR5cGUiLCJPUFRH
-Uk9VUDo6ZGlzYWJsZWQiLCJPUFRHUk9VUDo6bGFiZWwiLCJPUFRJT046OmRpc2FibGVkIiwiT1BUSU9O
-OjpsYWJlbCIsIk9QVElPTjo6c2VsZWN0ZWQiLCJPUFRJT046OnZhbHVlIiwiT1VUUFVUOjpmb3IiLCJP
-VVRQVVQ6Om5hbWUiLCJQOjphbGlnbiIsIlBSRTo6d2lkdGgiLCJQUk9HUkVTUzo6bWF4IiwiUFJPR1JF
-U1M6Om1pbiIsIlBST0dSRVNTOjp2YWx1ZSIsIlNFTEVDVDo6YXV0b2NvbXBsZXRlIiwiU0VMRUNUOjpk
-aXNhYmxlZCIsIlNFTEVDVDo6bXVsdGlwbGUiLCJTRUxFQ1Q6Om5hbWUiLCJTRUxFQ1Q6OnJlcXVpcmVk
-IiwiU0VMRUNUOjpzaXplIiwiU0VMRUNUOjp0YWJpbmRleCIsIlNPVVJDRTo6dHlwZSIsIlRBQkxFOjph
-bGlnbiIsIlRBQkxFOjpiZ2NvbG9yIiwiVEFCTEU6OmJvcmRlciIsIlRBQkxFOjpjZWxscGFkZGluZyIs
-IlRBQkxFOjpjZWxsc3BhY2luZyIsIlRBQkxFOjpmcmFtZSIsIlRBQkxFOjpydWxlcyIsIlRBQkxFOjpz
-dW1tYXJ5IiwiVEFCTEU6OndpZHRoIiwiVEJPRFk6OmFsaWduIiwiVEJPRFk6OmNoYXIiLCJUQk9EWTo6
-Y2hhcm9mZiIsIlRCT0RZOjp2YWxpZ24iLCJURDo6YWJiciIsIlREOjphbGlnbiIsIlREOjpheGlzIiwi
-VEQ6OmJnY29sb3IiLCJURDo6Y2hhciIsIlREOjpjaGFyb2ZmIiwiVEQ6OmNvbHNwYW4iLCJURDo6aGVh
-ZGVycyIsIlREOjpoZWlnaHQiLCJURDo6bm93cmFwIiwiVEQ6OnJvd3NwYW4iLCJURDo6c2NvcGUiLCJU
-RDo6dmFsaWduIiwiVEQ6OndpZHRoIiwiVEVYVEFSRUE6OmFjY2Vzc2tleSIsIlRFWFRBUkVBOjphdXRv
-Y29tcGxldGUiLCJURVhUQVJFQTo6Y29scyIsIlRFWFRBUkVBOjpkaXNhYmxlZCIsIlRFWFRBUkVBOjpp
-bnB1dG1vZGUiLCJURVhUQVJFQTo6bmFtZSIsIlRFWFRBUkVBOjpwbGFjZWhvbGRlciIsIlRFWFRBUkVB
-OjpyZWFkb25seSIsIlRFWFRBUkVBOjpyZXF1aXJlZCIsIlRFWFRBUkVBOjpyb3dzIiwiVEVYVEFSRUE6
-OnRhYmluZGV4IiwiVEVYVEFSRUE6OndyYXAiLCJURk9PVDo6YWxpZ24iLCJURk9PVDo6Y2hhciIsIlRG
-T09UOjpjaGFyb2ZmIiwiVEZPT1Q6OnZhbGlnbiIsIlRIOjphYmJyIiwiVEg6OmFsaWduIiwiVEg6OmF4
-aXMiLCJUSDo6Ymdjb2xvciIsIlRIOjpjaGFyIiwiVEg6OmNoYXJvZmYiLCJUSDo6Y29sc3BhbiIsIlRI
-OjpoZWFkZXJzIiwiVEg6OmhlaWdodCIsIlRIOjpub3dyYXAiLCJUSDo6cm93c3BhbiIsIlRIOjpzY29w
-ZSIsIlRIOjp2YWxpZ24iLCJUSDo6d2lkdGgiLCJUSEVBRDo6YWxpZ24iLCJUSEVBRDo6Y2hhciIsIlRI
-RUFEOjpjaGFyb2ZmIiwiVEhFQUQ6OnZhbGlnbiIsIlRSOjphbGlnbiIsIlRSOjpiZ2NvbG9yIiwiVFI6
-OmNoYXIiLCJUUjo6Y2hhcm9mZiIsIlRSOjp2YWxpZ24iLCJUUkFDSzo6ZGVmYXVsdCIsIlRSQUNLOjpr
-aW5kIiwiVFJBQ0s6OmxhYmVsIiwiVFJBQ0s6OnNyY2xhbmciLCJVTDo6Y29tcGFjdCIsIlVMOjp0eXBl
-IiwiVklERU86OmNvbnRyb2xzIiwiVklERU86OmhlaWdodCIsIlZJREVPOjpsb29wIiwiVklERU86Om1l
-ZGlhZ3JvdXAiLCJWSURFTzo6bXV0ZWQiLCJWSURFTzo6cHJlbG9hZCIsIlZJREVPOjp3aWR0aCJdKSx1
-LnMpCkMuVkM9SC5WTSh0KFswLDAsNjU0OTAsNDUwNTUsNjU1MzUsMzQ4MTUsNjU1MzQsMTg0MzFdKSx1
-LnQpCkMubUs9SC5WTSh0KFswLDAsMjY2MjQsMTAyMyw2NTUzNCwyMDQ3LDY1NTM0LDIwNDddKSx1LnQp
-CkMuU3E9SC5WTSh0KFsiSEVBRCIsIkFSRUEiLCJCQVNFIiwiQkFTRUZPTlQiLCJCUiIsIkNPTCIsIkNP
-TEdST1VQIiwiRU1CRUQiLCJGUkFNRSIsIkZSQU1FU0VUIiwiSFIiLCJJTUFHRSIsIklNRyIsIklOUFVU
-IiwiSVNJTkRFWCIsIkxJTksiLCJNRVRBIiwiUEFSQU0iLCJTT1VSQ0UiLCJTVFlMRSIsIlRJVExFIiwi
-V0JSIl0pLHUucykKQy54RD1ILlZNKHQoW10pLHUudSkKQy5kbj1ILlZNKHQoW10pLHUucykKQy5oVT1I
-LlZNKHQoW10pLHUubSkKQy50bz1ILlZNKHQoWzAsMCwzMjcyMiwxMjI4Nyw2NTUzNCwzNDgxNSw2NTUz
-NCwxODQzMV0pLHUudCkKQy5GMz1ILlZNKHQoWzAsMCwyNDU3NiwxMDIzLDY1NTM0LDM0ODE1LDY1NTM0
-LDE4NDMxXSksdS50KQpDLmVhPUguVk0odChbMCwwLDMyNzU0LDExMjYzLDY1NTM0LDM0ODE1LDY1NTM0
-LDE4NDMxXSksdS50KQpDLlpKPUguVk0odChbMCwwLDMyNzIyLDEyMjg3LDY1NTM1LDM0ODE1LDY1NTM0
-LDE4NDMxXSksdS50KQpDLldkPUguVk0odChbMCwwLDY1NDkwLDEyMjg3LDY1NTM1LDM0ODE1LDY1NTM0
-LDE4NDMxXSksdS50KQpDLlF4PUguVk0odChbImJpbmQiLCJpZiIsInJlZiIsInJlcGVhdCIsInN5bnRh
-eCJdKSx1LnMpCkMuQkk9SC5WTSh0KFsiQTo6aHJlZiIsIkFSRUE6OmhyZWYiLCJCTE9DS1FVT1RFOjpj
-aXRlIiwiQk9EWTo6YmFja2dyb3VuZCIsIkNPTU1BTkQ6Omljb24iLCJERUw6OmNpdGUiLCJGT1JNOjph
-Y3Rpb24iLCJJTUc6OnNyYyIsIklOUFVUOjpzcmMiLCJJTlM6OmNpdGUiLCJROjpjaXRlIiwiVklERU86
-OnBvc3RlciJdKSx1LnMpCkMuV089bmV3IEguTFAoMCx7fSxDLmRuLEguTjAoIkxQPHFVLHFVPiIpKQpD
-LmlIPUguVk0odChbXSksSC5OMCgiamQ8R0Q+IikpCkMuQ009bmV3IEguTFAoMCx7fSxDLmlILEguTjAo
-IkxQPEdELEA+IikpCkMuWTI9bmV3IEwueTgoIk5hdmlnYXRpb25UcmVlTm9kZVR5cGUuZGlyZWN0b3J5
-IikKQy5yZj1uZXcgTC55OCgiTmF2aWdhdGlvblRyZWVOb2RlVHlwZS5maWxlIikKQy5UZT1uZXcgSC53
-digiY2FsbCIpfSkoKTsoZnVuY3Rpb24gc3RhdGljRmllbGRzKCl7JC55aj0wCiQubUo9bnVsbAokLlA0
-PW51bGwKJC5ORj1udWxsCiQuVFg9bnVsbAokLng3PW51bGwKJC5udz1udWxsCiQudnY9bnVsbAokLkJ2
-PW51bGwKJC5TNj1udWxsCiQuazg9bnVsbAokLm1nPW51bGwKJC5VRD0hMQokLlgzPUMuTlUKJC54Zz1b
-XQokLnhvPW51bGwKJC5CTz1udWxsCiQubHQ9bnVsbAokLkVVPW51bGwKJC5vcj1QLkZsKHUuTix1Llop
-CiQuSTY9bnVsbAokLkZmPW51bGx9KSgpOyhmdW5jdGlvbiBsYXp5SW5pdGlhbGl6ZXJzKCl7dmFyIHQ9
-aHVua0hlbHBlcnMubGF6eQp0KCQsImZhIiwidyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5ZZygiXyRkYXJ0
-X2RhcnRDbG9zdXJlIil9KQp0KCQsIlkyIiwiVU4iLGZ1bmN0aW9uKCl7cmV0dXJuIEguWWcoIl8kZGFy
-dF9qcyIpfSkKdCgkLCJVMiIsIlNuIixmdW5jdGlvbigpe3JldHVybiBILmNNKEguUzcoewp0b1N0cmlu
-ZzpmdW5jdGlvbigpe3JldHVybiIkcmVjZWl2ZXIkIn19KSl9KQp0KCQsInhxIiwibHEiLGZ1bmN0aW9u
-KCl7cmV0dXJuIEguY00oSC5TNyh7JG1ldGhvZCQ6bnVsbCwKdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1
-cm4iJHJlY2VpdmVyJCJ9fSkpfSkKdCgkLCJSMSIsIk45IixmdW5jdGlvbigpe3JldHVybiBILmNNKEgu
-UzcobnVsbCkpfSkKdCgkLCJmTiIsImlJIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7
-dmFyICRhcmd1bWVudHNFeHByJD0nJGFyZ3VtZW50cyQnCnRyeXtudWxsLiRtZXRob2QkKCRhcmd1bWVu
-dHNFeHByJCl9Y2F0Y2gocyl7cmV0dXJuIHMubWVzc2FnZX19KCkpfSkKdCgkLCJxaSIsIktmIixmdW5j
-dGlvbigpe3JldHVybiBILmNNKEguUzcodm9pZCAwKSl9KQp0KCQsInJaIiwiWmgiLGZ1bmN0aW9uKCl7
-cmV0dXJuIEguY00oZnVuY3Rpb24oKXt2YXIgJGFyZ3VtZW50c0V4cHIkPSckYXJndW1lbnRzJCcKdHJ5
-eyh2b2lkIDApLiRtZXRob2QkKCRhcmd1bWVudHNFeHByJCl9Y2F0Y2gocyl7cmV0dXJuIHMubWVzc2Fn
-ZX19KCkpfSkKdCgkLCJrcSIsImNQIixmdW5jdGlvbigpe3JldHVybiBILmNNKEguTWoobnVsbCkpfSkK
-dCgkLCJ0dCIsImMzIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dHJ5e251bGwuJG1l
-dGhvZCR9Y2F0Y2gocyl7cmV0dXJuIHMubWVzc2FnZX19KCkpfSkKdCgkLCJkdCIsIkhLIixmdW5jdGlv
-bigpe3JldHVybiBILmNNKEguTWoodm9pZCAwKSl9KQp0KCQsIkE3IiwicjEiLGZ1bmN0aW9uKCl7cmV0
-dXJuIEguY00oZnVuY3Rpb24oKXt0cnl7KHZvaWQgMCkuJG1ldGhvZCR9Y2F0Y2gocyl7cmV0dXJuIHMu
-bWVzc2FnZX19KCkpfSkKdCgkLCJXYyIsInV0IixmdW5jdGlvbigpe3JldHVybiBQLk9qKCl9KQp0KCQs
-ImtoIiwicmYiLGZ1bmN0aW9uKCl7cmV0dXJuIFAuV0koKX0pCnQoJCwiYnQiLCJWNyIsZnVuY3Rpb24o
-KXtyZXR1cm4gSC5EUShILlhGKEguVk0oWy0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0y
-LC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0yLC0y
-LC0yLC0yLC0yLC0yLC0yLC0xLC0yLC0yLC0yLC0yLC0yLDYyLC0yLDYyLC0yLDYzLDUyLDUzLDU0LDU1
-LDU2LDU3LDU4LDU5LDYwLDYxLC0yLC0yLC0yLC0xLC0yLC0yLC0yLDAsMSwyLDMsNCw1LDYsNyw4LDks
-MTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsLTIsLTIsLTIsLTIs
-NjMsLTIsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMs
-NDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsLTIsLTIsLTIsLTIsLTJdLHUudCkpKX0pCnQoJCwiTTUiLCJ3
-USIsZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIHByb2Nlc3MhPSJ1bmRlZmluZWQiJiZPYmplY3QucHJv
-dG90eXBlLnRvU3RyaW5nLmNhbGwocHJvY2Vzcyk9PSJbb2JqZWN0IHByb2Nlc3NdIiYmcHJvY2Vzcy5w
-bGF0Zm9ybT09IndpbjMyIn0pCnQoJCwibWYiLCJ6NCIsZnVuY3Rpb24oKXtyZXR1cm4gUC5udSgiXltc
-XC1cXC4wLTlBLVpfYS16fl0qJCIpfSkKdCgkLCJKRyIsInZaIixmdW5jdGlvbigpe3JldHVybiBQLnV4
-KCl9KQp0KCQsIlNDIiwiQU4iLGZ1bmN0aW9uKCl7cmV0dXJuIFAudE0oWyJBIiwiQUJCUiIsIkFDUk9O
-WU0iLCJBRERSRVNTIiwiQVJFQSIsIkFSVElDTEUiLCJBU0lERSIsIkFVRElPIiwiQiIsIkJESSIsIkJE
-TyIsIkJJRyIsIkJMT0NLUVVPVEUiLCJCUiIsIkJVVFRPTiIsIkNBTlZBUyIsIkNBUFRJT04iLCJDRU5U
-RVIiLCJDSVRFIiwiQ09ERSIsIkNPTCIsIkNPTEdST1VQIiwiQ09NTUFORCIsIkRBVEEiLCJEQVRBTElT
-VCIsIkREIiwiREVMIiwiREVUQUlMUyIsIkRGTiIsIkRJUiIsIkRJViIsIkRMIiwiRFQiLCJFTSIsIkZJ
-RUxEU0VUIiwiRklHQ0FQVElPTiIsIkZJR1VSRSIsIkZPTlQiLCJGT09URVIiLCJGT1JNIiwiSDEiLCJI
-MiIsIkgzIiwiSDQiLCJINSIsIkg2IiwiSEVBREVSIiwiSEdST1VQIiwiSFIiLCJJIiwiSUZSQU1FIiwi
-SU1HIiwiSU5QVVQiLCJJTlMiLCJLQkQiLCJMQUJFTCIsIkxFR0VORCIsIkxJIiwiTUFQIiwiTUFSSyIs
-Ik1FTlUiLCJNRVRFUiIsIk5BViIsIk5PQlIiLCJPTCIsIk9QVEdST1VQIiwiT1BUSU9OIiwiT1VUUFVU
-IiwiUCIsIlBSRSIsIlBST0dSRVNTIiwiUSIsIlMiLCJTQU1QIiwiU0VDVElPTiIsIlNFTEVDVCIsIlNN
-QUxMIiwiU09VUkNFIiwiU1BBTiIsIlNUUklLRSIsIlNUUk9ORyIsIlNVQiIsIlNVTU1BUlkiLCJTVVAi
-LCJUQUJMRSIsIlRCT0RZIiwiVEQiLCJURVhUQVJFQSIsIlRGT09UIiwiVEgiLCJUSEVBRCIsIlRJTUUi
-LCJUUiIsIlRSQUNLIiwiVFQiLCJVIiwiVUwiLCJWQVIiLCJWSURFTyIsIldCUiJdLHUuTil9KQp0KCQs
-Ilg0IiwiaEciLGZ1bmN0aW9uKCl7cmV0dXJuIFAubnUoIl5cXFMrJCIpfSkKdCgkLCJ3TyIsIm93Iixm
-dW5jdGlvbigpe3JldHVybiB1LnYuYihQLk5EKHNlbGYpKX0pCnQoJCwia3QiLCJSOCIsZnVuY3Rpb24o
-KXtyZXR1cm4gSC5ZZygiXyRkYXJ0X2RhcnRPYmplY3QiKX0pCnQoJCwiZksiLCJrSSIsZnVuY3Rpb24o
-KXtyZXR1cm4gZnVuY3Rpb24gRGFydE9iamVjdChhKXt0aGlzLm89YX19KQp0KCQsInF0IiwiekIiLGZ1
-bmN0aW9uKCl7cmV0dXJuIG5ldyBULkdWKCl9KQp0KCQsImZlIiwiS0ciLGZ1bmN0aW9uKCl7cmV0dXJu
-IG5ldyBMLlhBKCl9KQp0KCQsIm1NIiwiblUiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNLmxJKCQuSGso
-KSl9KQp0KCQsInlyIiwiYkQiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFLk9GKFAubnUoIi8iKSxQLm51
-KCJbXi9dJCIpLFAubnUoIl4vIikpfSkKdCgkLCJNayIsIktrIixmdW5jdGlvbigpe3JldHVybiBuZXcg
-TC5JVihQLm51KCJbL1xcXFxdIiksUC5udSgiW14vXFxcXF0kIiksUC5udSgiXihcXFxcXFxcXFteXFxc
-XF0rXFxcXFteXFxcXC9dK3xbYS16QS1aXTpbL1xcXFxdKSIpLFAubnUoIl5bL1xcXFxdKD8hWy9cXFxc
-XSkiKSl9KQp0KCQsImFrIiwiRWIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBGLnJ1KFAubnUoIi8iKSxQ
-Lm51KCIoXlthLXpBLVpdWy0rLmEtekEtWlxcZF0qOi8vfFteL10pJCIpLFAubnUoIlthLXpBLVpdWy0r
-LmEtekEtWlxcZF0qOi8vW14vXSoiKSxQLm51KCJeLyIpKX0pCnQoJCwibHMiLCJIayIsZnVuY3Rpb24o
-KXtyZXR1cm4gTy5SaCgpfSl9KSgpOyhmdW5jdGlvbiBuYXRpdmVTdXBwb3J0KCl7IWZ1bmN0aW9uKCl7
-dmFyIHQ9ZnVuY3Rpb24oYSl7dmFyIG49e30KblthXT0xCnJldHVybiBPYmplY3Qua2V5cyhodW5rSGVs
-cGVycy5jb252ZXJ0VG9GYXN0T2JqZWN0KG4pKVswXX0Kdi5nZXRJc29sYXRlVGFnPWZ1bmN0aW9uKGEp
-e3JldHVybiB0KCJfX19kYXJ0XyIrYSt2Lmlzb2xhdGVUYWcpfQp2YXIgcz0iX19fZGFydF9pc29sYXRl
-X3RhZ3NfIgp2YXIgcj1PYmplY3Rbc118fChPYmplY3Rbc109T2JqZWN0LmNyZWF0ZShudWxsKSkKdmFy
-IHE9Il9aeFl4WCIKZm9yKHZhciBwPTA7O3ArKyl7dmFyIG89dChxKyJfIitwKyJfIikKaWYoIShvIGlu
-IHIpKXtyW29dPTEKdi5pc29sYXRlVGFnPW8KYnJlYWt9fXYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWU9di5n
-ZXRJc29sYXRlVGFnKCJkaXNwYXRjaF9yZWNvcmQiKX0oKQpodW5rSGVscGVycy5zZXRPclVwZGF0ZUlu
-dGVyY2VwdG9yc0J5VGFnKHtET01FcnJvcjpKLnZCLERPTUltcGxlbWVudGF0aW9uOkoudkIsTWVkaWFF
-cnJvcjpKLnZCLE5hdmlnYXRvcjpKLnZCLE5hdmlnYXRvckNvbmN1cnJlbnRIYXJkd2FyZTpKLnZCLE5h
-dmlnYXRvclVzZXJNZWRpYUVycm9yOkoudkIsT3ZlcmNvbnN0cmFpbmVkRXJyb3I6Si52QixQb3NpdGlv
-bkVycm9yOkoudkIsUmFuZ2U6Si52QixTUUxFcnJvcjpKLnZCLERhdGFWaWV3OkguRVQsQXJyYXlCdWZm
-ZXJWaWV3OkguRVQsRmxvYXQzMkFycmF5OkguRGcsRmxvYXQ2NEFycmF5OkguRGcsSW50MTZBcnJheTpI
-LnhqLEludDMyQXJyYXk6SC5kRSxJbnQ4QXJyYXk6SC5aQSxVaW50MTZBcnJheTpILndmLFVpbnQzMkFy
-cmF5OkguUHEsVWludDhDbGFtcGVkQXJyYXk6SC5lRSxDYW52YXNQaXhlbEFycmF5OkguZUUsVWludDhB
-cnJheTpILlY2LEhUTUxBdWRpb0VsZW1lbnQ6Vy5xRSxIVE1MQlJFbGVtZW50OlcucUUsSFRNTEJ1dHRv
-bkVsZW1lbnQ6Vy5xRSxIVE1MQ2FudmFzRWxlbWVudDpXLnFFLEhUTUxDb250ZW50RWxlbWVudDpXLnFF
-LEhUTUxETGlzdEVsZW1lbnQ6Vy5xRSxIVE1MRGF0YUVsZW1lbnQ6Vy5xRSxIVE1MRGF0YUxpc3RFbGVt
-ZW50OlcucUUsSFRNTERldGFpbHNFbGVtZW50OlcucUUsSFRNTERpYWxvZ0VsZW1lbnQ6Vy5xRSxIVE1M
-RGl2RWxlbWVudDpXLnFFLEhUTUxFbWJlZEVsZW1lbnQ6Vy5xRSxIVE1MRmllbGRTZXRFbGVtZW50Olcu
-cUUsSFRNTEhSRWxlbWVudDpXLnFFLEhUTUxIZWFkRWxlbWVudDpXLnFFLEhUTUxIZWFkaW5nRWxlbWVu
-dDpXLnFFLEhUTUxIdG1sRWxlbWVudDpXLnFFLEhUTUxJRnJhbWVFbGVtZW50OlcucUUsSFRNTEltYWdl
-RWxlbWVudDpXLnFFLEhUTUxJbnB1dEVsZW1lbnQ6Vy5xRSxIVE1MTElFbGVtZW50OlcucUUsSFRNTExh
-YmVsRWxlbWVudDpXLnFFLEhUTUxMZWdlbmRFbGVtZW50OlcucUUsSFRNTExpbmtFbGVtZW50OlcucUUs
-SFRNTE1hcEVsZW1lbnQ6Vy5xRSxIVE1MTWVkaWFFbGVtZW50OlcucUUsSFRNTE1lbnVFbGVtZW50Olcu
-cUUsSFRNTE1ldGFFbGVtZW50OlcucUUsSFRNTE1ldGVyRWxlbWVudDpXLnFFLEhUTUxNb2RFbGVtZW50
-OlcucUUsSFRNTE9MaXN0RWxlbWVudDpXLnFFLEhUTUxPYmplY3RFbGVtZW50OlcucUUsSFRNTE9wdEdy
-b3VwRWxlbWVudDpXLnFFLEhUTUxPcHRpb25FbGVtZW50OlcucUUsSFRNTE91dHB1dEVsZW1lbnQ6Vy5x
-RSxIVE1MUGFyYW1FbGVtZW50OlcucUUsSFRNTFBpY3R1cmVFbGVtZW50OlcucUUsSFRNTFByZUVsZW1l
-bnQ6Vy5xRSxIVE1MUHJvZ3Jlc3NFbGVtZW50OlcucUUsSFRNTFF1b3RlRWxlbWVudDpXLnFFLEhUTUxT
-Y3JpcHRFbGVtZW50OlcucUUsSFRNTFNoYWRvd0VsZW1lbnQ6Vy5xRSxIVE1MU2xvdEVsZW1lbnQ6Vy5x
-RSxIVE1MU291cmNlRWxlbWVudDpXLnFFLEhUTUxTcGFuRWxlbWVudDpXLnFFLEhUTUxTdHlsZUVsZW1l
-bnQ6Vy5xRSxIVE1MVGFibGVDYXB0aW9uRWxlbWVudDpXLnFFLEhUTUxUYWJsZUNlbGxFbGVtZW50Olcu
-cUUsSFRNTFRhYmxlRGF0YUNlbGxFbGVtZW50OlcucUUsSFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnQ6
-Vy5xRSxIVE1MVGFibGVDb2xFbGVtZW50OlcucUUsSFRNTFRleHRBcmVhRWxlbWVudDpXLnFFLEhUTUxU
-aW1lRWxlbWVudDpXLnFFLEhUTUxUaXRsZUVsZW1lbnQ6Vy5xRSxIVE1MVHJhY2tFbGVtZW50OlcucUUs
-SFRNTFVMaXN0RWxlbWVudDpXLnFFLEhUTUxVbmtub3duRWxlbWVudDpXLnFFLEhUTUxWaWRlb0VsZW1l
-bnQ6Vy5xRSxIVE1MRGlyZWN0b3J5RWxlbWVudDpXLnFFLEhUTUxGb250RWxlbWVudDpXLnFFLEhUTUxG
-cmFtZUVsZW1lbnQ6Vy5xRSxIVE1MRnJhbWVTZXRFbGVtZW50OlcucUUsSFRNTE1hcnF1ZWVFbGVtZW50
-OlcucUUsSFRNTEVsZW1lbnQ6Vy5xRSxIVE1MQW5jaG9yRWxlbWVudDpXLkdoLEhUTUxBcmVhRWxlbWVu
-dDpXLmZZLEhUTUxCYXNlRWxlbWVudDpXLm5CLEJsb2I6Vy5BeixIVE1MQm9keUVsZW1lbnQ6Vy5RUCxD
-REFUQVNlY3Rpb246Vy5ueCxDaGFyYWN0ZXJEYXRhOlcubngsQ29tbWVudDpXLm54LFByb2Nlc3NpbmdJ
-bnN0cnVjdGlvbjpXLm54LFRleHQ6Vy5ueCxDU1NTdHlsZURlY2xhcmF0aW9uOlcub0osTVNTdHlsZUNT
-U1Byb3BlcnRpZXM6Vy5vSixDU1MyUHJvcGVydGllczpXLm9KLFhNTERvY3VtZW50OlcuUUYsRG9jdW1l
-bnQ6Vy5RRixET01FeGNlcHRpb246Vy5OaCxET01SZWN0UmVhZE9ubHk6Vy5JQixET01Ub2tlbkxpc3Q6
-Vy5uNyxFbGVtZW50OlcuY3YsQWJvcnRQYXltZW50RXZlbnQ6Vy5lYSxBbmltYXRpb25FdmVudDpXLmVh
-LEFuaW1hdGlvblBsYXliYWNrRXZlbnQ6Vy5lYSxBcHBsaWNhdGlvbkNhY2hlRXJyb3JFdmVudDpXLmVh
-LEJhY2tncm91bmRGZXRjaENsaWNrRXZlbnQ6Vy5lYSxCYWNrZ3JvdW5kRmV0Y2hFdmVudDpXLmVhLEJh
-Y2tncm91bmRGZXRjaEZhaWxFdmVudDpXLmVhLEJhY2tncm91bmRGZXRjaGVkRXZlbnQ6Vy5lYSxCZWZv
-cmVJbnN0YWxsUHJvbXB0RXZlbnQ6Vy5lYSxCZWZvcmVVbmxvYWRFdmVudDpXLmVhLEJsb2JFdmVudDpX
-LmVhLENhbk1ha2VQYXltZW50RXZlbnQ6Vy5lYSxDbGlwYm9hcmRFdmVudDpXLmVhLENsb3NlRXZlbnQ6
-Vy5lYSxDdXN0b21FdmVudDpXLmVhLERldmljZU1vdGlvbkV2ZW50OlcuZWEsRGV2aWNlT3JpZW50YXRp
-b25FdmVudDpXLmVhLEVycm9yRXZlbnQ6Vy5lYSxFeHRlbmRhYmxlRXZlbnQ6Vy5lYSxFeHRlbmRhYmxl
-TWVzc2FnZUV2ZW50OlcuZWEsRmV0Y2hFdmVudDpXLmVhLEZvbnRGYWNlU2V0TG9hZEV2ZW50OlcuZWEs
-Rm9yZWlnbkZldGNoRXZlbnQ6Vy5lYSxHYW1lcGFkRXZlbnQ6Vy5lYSxIYXNoQ2hhbmdlRXZlbnQ6Vy5l
-YSxJbnN0YWxsRXZlbnQ6Vy5lYSxNZWRpYUVuY3J5cHRlZEV2ZW50OlcuZWEsTWVkaWFLZXlNZXNzYWdl
-RXZlbnQ6Vy5lYSxNZWRpYVF1ZXJ5TGlzdEV2ZW50OlcuZWEsTWVkaWFTdHJlYW1FdmVudDpXLmVhLE1l
-ZGlhU3RyZWFtVHJhY2tFdmVudDpXLmVhLE1lc3NhZ2VFdmVudDpXLmVhLE1JRElDb25uZWN0aW9uRXZl
-bnQ6Vy5lYSxNSURJTWVzc2FnZUV2ZW50OlcuZWEsTXV0YXRpb25FdmVudDpXLmVhLE5vdGlmaWNhdGlv
-bkV2ZW50OlcuZWEsUGFnZVRyYW5zaXRpb25FdmVudDpXLmVhLFBheW1lbnRSZXF1ZXN0RXZlbnQ6Vy5l
-YSxQYXltZW50UmVxdWVzdFVwZGF0ZUV2ZW50OlcuZWEsUG9wU3RhdGVFdmVudDpXLmVhLFByZXNlbnRh
-dGlvbkNvbm5lY3Rpb25BdmFpbGFibGVFdmVudDpXLmVhLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9z
-ZUV2ZW50OlcuZWEsUHJvbWlzZVJlamVjdGlvbkV2ZW50OlcuZWEsUHVzaEV2ZW50OlcuZWEsUlRDRGF0
-YUNoYW5uZWxFdmVudDpXLmVhLFJUQ0RUTUZUb25lQ2hhbmdlRXZlbnQ6Vy5lYSxSVENQZWVyQ29ubmVj
-dGlvbkljZUV2ZW50OlcuZWEsUlRDVHJhY2tFdmVudDpXLmVhLFNlY3VyaXR5UG9saWN5VmlvbGF0aW9u
-RXZlbnQ6Vy5lYSxTZW5zb3JFcnJvckV2ZW50OlcuZWEsU3BlZWNoUmVjb2duaXRpb25FcnJvcjpXLmVh
-LFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6Vy5lYSxTcGVlY2hTeW50aGVzaXNFdmVudDpXLmVhLFN0b3Jh
-Z2VFdmVudDpXLmVhLFN5bmNFdmVudDpXLmVhLFRyYWNrRXZlbnQ6Vy5lYSxUcmFuc2l0aW9uRXZlbnQ6
-Vy5lYSxXZWJLaXRUcmFuc2l0aW9uRXZlbnQ6Vy5lYSxWUkRldmljZUV2ZW50OlcuZWEsVlJEaXNwbGF5
-RXZlbnQ6Vy5lYSxWUlNlc3Npb25FdmVudDpXLmVhLE1vam9JbnRlcmZhY2VSZXF1ZXN0RXZlbnQ6Vy5l
-YSxVU0JDb25uZWN0aW9uRXZlbnQ6Vy5lYSxJREJWZXJzaW9uQ2hhbmdlRXZlbnQ6Vy5lYSxBdWRpb1By
-b2Nlc3NpbmdFdmVudDpXLmVhLE9mZmxpbmVBdWRpb0NvbXBsZXRpb25FdmVudDpXLmVhLFdlYkdMQ29u
-dGV4dEV2ZW50OlcuZWEsRXZlbnQ6Vy5lYSxJbnB1dEV2ZW50OlcuZWEsRXZlbnRUYXJnZXQ6Vy5EMCxG
-aWxlOlcuVDUsSFRNTEZvcm1FbGVtZW50OlcuaDQsSGlzdG9yeTpXLmJyLEhUTUxEb2N1bWVudDpXLlZi
-LFhNTEh0dHBSZXF1ZXN0OlcuTzcsWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDpXLndhLEltYWdlRGF0
-YTpXLlNnLExvY2F0aW9uOlcudTgsTW91c2VFdmVudDpXLkFqLERyYWdFdmVudDpXLkFqLFBvaW50ZXJF
-dmVudDpXLkFqLFdoZWVsRXZlbnQ6Vy5BaixEb2N1bWVudEZyYWdtZW50OlcudUgsU2hhZG93Um9vdDpX
-LnVILERvY3VtZW50VHlwZTpXLnVILE5vZGU6Vy51SCxOb2RlTGlzdDpXLkJILFJhZGlvTm9kZUxpc3Q6
-Vy5CSCxIVE1MUGFyYWdyYXBoRWxlbWVudDpXLlNOLFByb2dyZXNzRXZlbnQ6Vy5ldyxSZXNvdXJjZVBy
-b2dyZXNzRXZlbnQ6Vy5ldyxIVE1MU2VsZWN0RWxlbWVudDpXLmxwLEhUTUxUYWJsZUVsZW1lbnQ6Vy5U
-YixIVE1MVGFibGVSb3dFbGVtZW50OlcuSXYsSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6Vy5CVCxIVE1M
-VGVtcGxhdGVFbGVtZW50OlcueVksQ29tcG9zaXRpb25FdmVudDpXLnc2LEZvY3VzRXZlbnQ6Vy53NixL
-ZXlib2FyZEV2ZW50OlcudzYsVGV4dEV2ZW50OlcudzYsVG91Y2hFdmVudDpXLnc2LFVJRXZlbnQ6Vy53
-NixXaW5kb3c6Vy5LNSxET01XaW5kb3c6Vy5LNSxEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZTpXLkNt
-LFNlcnZpY2VXb3JrZXJHbG9iYWxTY29wZTpXLkNtLFNoYXJlZFdvcmtlckdsb2JhbFNjb3BlOlcuQ20s
-V29ya2VyR2xvYmFsU2NvcGU6Vy5DbSxBdHRyOlcuQ1EsQ2xpZW50UmVjdDpXLnc0LERPTVJlY3Q6Vy53
-NCxOYW1lZE5vZGVNYXA6Vy5yaCxNb3pOYW1lZEF0dHJNYXA6Vy5yaCxJREJLZXlSYW5nZTpQLmhGLFNW
-R1NjcmlwdEVsZW1lbnQ6UC5uZCxTVkdBRWxlbWVudDpQLmQ1LFNWR0FuaW1hdGVFbGVtZW50OlAuZDUs
-U1ZHQW5pbWF0ZU1vdGlvbkVsZW1lbnQ6UC5kNSxTVkdBbmltYXRlVHJhbnNmb3JtRWxlbWVudDpQLmQ1
-LFNWR0FuaW1hdGlvbkVsZW1lbnQ6UC5kNSxTVkdDaXJjbGVFbGVtZW50OlAuZDUsU1ZHQ2xpcFBhdGhF
-bGVtZW50OlAuZDUsU1ZHRGVmc0VsZW1lbnQ6UC5kNSxTVkdEZXNjRWxlbWVudDpQLmQ1LFNWR0Rpc2Nh
-cmRFbGVtZW50OlAuZDUsU1ZHRWxsaXBzZUVsZW1lbnQ6UC5kNSxTVkdGRUJsZW5kRWxlbWVudDpQLmQ1
-LFNWR0ZFQ29sb3JNYXRyaXhFbGVtZW50OlAuZDUsU1ZHRkVDb21wb25lbnRUcmFuc2ZlckVsZW1lbnQ6
-UC5kNSxTVkdGRUNvbXBvc2l0ZUVsZW1lbnQ6UC5kNSxTVkdGRUNvbnZvbHZlTWF0cml4RWxlbWVudDpQ
-LmQ1LFNWR0ZFRGlmZnVzZUxpZ2h0aW5nRWxlbWVudDpQLmQ1LFNWR0ZFRGlzcGxhY2VtZW50TWFwRWxl
-bWVudDpQLmQ1LFNWR0ZFRGlzdGFudExpZ2h0RWxlbWVudDpQLmQ1LFNWR0ZFRmxvb2RFbGVtZW50OlAu
-ZDUsU1ZHRkVGdW5jQUVsZW1lbnQ6UC5kNSxTVkdGRUZ1bmNCRWxlbWVudDpQLmQ1LFNWR0ZFRnVuY0dF
-bGVtZW50OlAuZDUsU1ZHRkVGdW5jUkVsZW1lbnQ6UC5kNSxTVkdGRUdhdXNzaWFuQmx1ckVsZW1lbnQ6
-UC5kNSxTVkdGRUltYWdlRWxlbWVudDpQLmQ1LFNWR0ZFTWVyZ2VFbGVtZW50OlAuZDUsU1ZHRkVNZXJn
-ZU5vZGVFbGVtZW50OlAuZDUsU1ZHRkVNb3JwaG9sb2d5RWxlbWVudDpQLmQ1LFNWR0ZFT2Zmc2V0RWxl
-bWVudDpQLmQ1LFNWR0ZFUG9pbnRMaWdodEVsZW1lbnQ6UC5kNSxTVkdGRVNwZWN1bGFyTGlnaHRpbmdF
-bGVtZW50OlAuZDUsU1ZHRkVTcG90TGlnaHRFbGVtZW50OlAuZDUsU1ZHRkVUaWxlRWxlbWVudDpQLmQ1
-LFNWR0ZFVHVyYnVsZW5jZUVsZW1lbnQ6UC5kNSxTVkdGaWx0ZXJFbGVtZW50OlAuZDUsU1ZHRm9yZWln
-bk9iamVjdEVsZW1lbnQ6UC5kNSxTVkdHRWxlbWVudDpQLmQ1LFNWR0dlb21ldHJ5RWxlbWVudDpQLmQ1
-LFNWR0dyYXBoaWNzRWxlbWVudDpQLmQ1LFNWR0ltYWdlRWxlbWVudDpQLmQ1LFNWR0xpbmVFbGVtZW50
-OlAuZDUsU1ZHTGluZWFyR3JhZGllbnRFbGVtZW50OlAuZDUsU1ZHTWFya2VyRWxlbWVudDpQLmQ1LFNW
-R01hc2tFbGVtZW50OlAuZDUsU1ZHTWV0YWRhdGFFbGVtZW50OlAuZDUsU1ZHUGF0aEVsZW1lbnQ6UC5k
-NSxTVkdQYXR0ZXJuRWxlbWVudDpQLmQ1LFNWR1BvbHlnb25FbGVtZW50OlAuZDUsU1ZHUG9seWxpbmVF
-bGVtZW50OlAuZDUsU1ZHUmFkaWFsR3JhZGllbnRFbGVtZW50OlAuZDUsU1ZHUmVjdEVsZW1lbnQ6UC5k
-NSxTVkdTZXRFbGVtZW50OlAuZDUsU1ZHU3RvcEVsZW1lbnQ6UC5kNSxTVkdTdHlsZUVsZW1lbnQ6UC5k
-NSxTVkdTVkdFbGVtZW50OlAuZDUsU1ZHU3dpdGNoRWxlbWVudDpQLmQ1LFNWR1N5bWJvbEVsZW1lbnQ6
-UC5kNSxTVkdUU3BhbkVsZW1lbnQ6UC5kNSxTVkdUZXh0Q29udGVudEVsZW1lbnQ6UC5kNSxTVkdUZXh0
-RWxlbWVudDpQLmQ1LFNWR1RleHRQYXRoRWxlbWVudDpQLmQ1LFNWR1RleHRQb3NpdGlvbmluZ0VsZW1l
-bnQ6UC5kNSxTVkdUaXRsZUVsZW1lbnQ6UC5kNSxTVkdVc2VFbGVtZW50OlAuZDUsU1ZHVmlld0VsZW1l
-bnQ6UC5kNSxTVkdHcmFkaWVudEVsZW1lbnQ6UC5kNSxTVkdDb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9u
-RWxlbWVudDpQLmQ1LFNWR0ZFRHJvcFNoYWRvd0VsZW1lbnQ6UC5kNSxTVkdNUGF0aEVsZW1lbnQ6UC5k
-NSxTVkdFbGVtZW50OlAuZDV9KQpodW5rSGVscGVycy5zZXRPclVwZGF0ZUxlYWZUYWdzKHtET01FcnJv
-cjp0cnVlLERPTUltcGxlbWVudGF0aW9uOnRydWUsTWVkaWFFcnJvcjp0cnVlLE5hdmlnYXRvcjp0cnVl
-LE5hdmlnYXRvckNvbmN1cnJlbnRIYXJkd2FyZTp0cnVlLE5hdmlnYXRvclVzZXJNZWRpYUVycm9yOnRy
-dWUsT3ZlcmNvbnN0cmFpbmVkRXJyb3I6dHJ1ZSxQb3NpdGlvbkVycm9yOnRydWUsUmFuZ2U6dHJ1ZSxT
-UUxFcnJvcjp0cnVlLERhdGFWaWV3OnRydWUsQXJyYXlCdWZmZXJWaWV3OmZhbHNlLEZsb2F0MzJBcnJh
-eTp0cnVlLEZsb2F0NjRBcnJheTp0cnVlLEludDE2QXJyYXk6dHJ1ZSxJbnQzMkFycmF5OnRydWUsSW50
-OEFycmF5OnRydWUsVWludDE2QXJyYXk6dHJ1ZSxVaW50MzJBcnJheTp0cnVlLFVpbnQ4Q2xhbXBlZEFy
-cmF5OnRydWUsQ2FudmFzUGl4ZWxBcnJheTp0cnVlLFVpbnQ4QXJyYXk6ZmFsc2UsSFRNTEF1ZGlvRWxl
-bWVudDp0cnVlLEhUTUxCUkVsZW1lbnQ6dHJ1ZSxIVE1MQnV0dG9uRWxlbWVudDp0cnVlLEhUTUxDYW52
-YXNFbGVtZW50OnRydWUsSFRNTENvbnRlbnRFbGVtZW50OnRydWUsSFRNTERMaXN0RWxlbWVudDp0cnVl
-LEhUTUxEYXRhRWxlbWVudDp0cnVlLEhUTUxEYXRhTGlzdEVsZW1lbnQ6dHJ1ZSxIVE1MRGV0YWlsc0Vs
-ZW1lbnQ6dHJ1ZSxIVE1MRGlhbG9nRWxlbWVudDp0cnVlLEhUTUxEaXZFbGVtZW50OnRydWUsSFRNTEVt
-YmVkRWxlbWVudDp0cnVlLEhUTUxGaWVsZFNldEVsZW1lbnQ6dHJ1ZSxIVE1MSFJFbGVtZW50OnRydWUs
-SFRNTEhlYWRFbGVtZW50OnRydWUsSFRNTEhlYWRpbmdFbGVtZW50OnRydWUsSFRNTEh0bWxFbGVtZW50
-OnRydWUsSFRNTElGcmFtZUVsZW1lbnQ6dHJ1ZSxIVE1MSW1hZ2VFbGVtZW50OnRydWUsSFRNTElucHV0
-RWxlbWVudDp0cnVlLEhUTUxMSUVsZW1lbnQ6dHJ1ZSxIVE1MTGFiZWxFbGVtZW50OnRydWUsSFRNTExl
-Z2VuZEVsZW1lbnQ6dHJ1ZSxIVE1MTGlua0VsZW1lbnQ6dHJ1ZSxIVE1MTWFwRWxlbWVudDp0cnVlLEhU
-TUxNZWRpYUVsZW1lbnQ6dHJ1ZSxIVE1MTWVudUVsZW1lbnQ6dHJ1ZSxIVE1MTWV0YUVsZW1lbnQ6dHJ1
-ZSxIVE1MTWV0ZXJFbGVtZW50OnRydWUsSFRNTE1vZEVsZW1lbnQ6dHJ1ZSxIVE1MT0xpc3RFbGVtZW50
-OnRydWUsSFRNTE9iamVjdEVsZW1lbnQ6dHJ1ZSxIVE1MT3B0R3JvdXBFbGVtZW50OnRydWUsSFRNTE9w
-dGlvbkVsZW1lbnQ6dHJ1ZSxIVE1MT3V0cHV0RWxlbWVudDp0cnVlLEhUTUxQYXJhbUVsZW1lbnQ6dHJ1
-ZSxIVE1MUGljdHVyZUVsZW1lbnQ6dHJ1ZSxIVE1MUHJlRWxlbWVudDp0cnVlLEhUTUxQcm9ncmVzc0Vs
-ZW1lbnQ6dHJ1ZSxIVE1MUXVvdGVFbGVtZW50OnRydWUsSFRNTFNjcmlwdEVsZW1lbnQ6dHJ1ZSxIVE1M
-U2hhZG93RWxlbWVudDp0cnVlLEhUTUxTbG90RWxlbWVudDp0cnVlLEhUTUxTb3VyY2VFbGVtZW50OnRy
-dWUsSFRNTFNwYW5FbGVtZW50OnRydWUsSFRNTFN0eWxlRWxlbWVudDp0cnVlLEhUTUxUYWJsZUNhcHRp
-b25FbGVtZW50OnRydWUsSFRNTFRhYmxlQ2VsbEVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVEYXRhQ2VsbEVs
-ZW1lbnQ6dHJ1ZSxIVE1MVGFibGVIZWFkZXJDZWxsRWxlbWVudDp0cnVlLEhUTUxUYWJsZUNvbEVsZW1l
-bnQ6dHJ1ZSxIVE1MVGV4dEFyZWFFbGVtZW50OnRydWUsSFRNTFRpbWVFbGVtZW50OnRydWUsSFRNTFRp
-dGxlRWxlbWVudDp0cnVlLEhUTUxUcmFja0VsZW1lbnQ6dHJ1ZSxIVE1MVUxpc3RFbGVtZW50OnRydWUs
-SFRNTFVua25vd25FbGVtZW50OnRydWUsSFRNTFZpZGVvRWxlbWVudDp0cnVlLEhUTUxEaXJlY3RvcnlF
-bGVtZW50OnRydWUsSFRNTEZvbnRFbGVtZW50OnRydWUsSFRNTEZyYW1lRWxlbWVudDp0cnVlLEhUTUxG
-cmFtZVNldEVsZW1lbnQ6dHJ1ZSxIVE1MTWFycXVlZUVsZW1lbnQ6dHJ1ZSxIVE1MRWxlbWVudDpmYWxz
-ZSxIVE1MQW5jaG9yRWxlbWVudDp0cnVlLEhUTUxBcmVhRWxlbWVudDp0cnVlLEhUTUxCYXNlRWxlbWVu
-dDp0cnVlLEJsb2I6ZmFsc2UsSFRNTEJvZHlFbGVtZW50OnRydWUsQ0RBVEFTZWN0aW9uOnRydWUsQ2hh
-cmFjdGVyRGF0YTp0cnVlLENvbW1lbnQ6dHJ1ZSxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246dHJ1ZSxUZXh0
-OnRydWUsQ1NTU3R5bGVEZWNsYXJhdGlvbjp0cnVlLE1TU3R5bGVDU1NQcm9wZXJ0aWVzOnRydWUsQ1NT
-MlByb3BlcnRpZXM6dHJ1ZSxYTUxEb2N1bWVudDp0cnVlLERvY3VtZW50OmZhbHNlLERPTUV4Y2VwdGlv
-bjp0cnVlLERPTVJlY3RSZWFkT25seTpmYWxzZSxET01Ub2tlbkxpc3Q6dHJ1ZSxFbGVtZW50OmZhbHNl
-LEFib3J0UGF5bWVudEV2ZW50OnRydWUsQW5pbWF0aW9uRXZlbnQ6dHJ1ZSxBbmltYXRpb25QbGF5YmFj
-a0V2ZW50OnRydWUsQXBwbGljYXRpb25DYWNoZUVycm9yRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hD
-bGlja0V2ZW50OnRydWUsQmFja2dyb3VuZEZldGNoRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hGYWls
-RXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hlZEV2ZW50OnRydWUsQmVmb3JlSW5zdGFsbFByb21wdEV2
-ZW50OnRydWUsQmVmb3JlVW5sb2FkRXZlbnQ6dHJ1ZSxCbG9iRXZlbnQ6dHJ1ZSxDYW5NYWtlUGF5bWVu
-dEV2ZW50OnRydWUsQ2xpcGJvYXJkRXZlbnQ6dHJ1ZSxDbG9zZUV2ZW50OnRydWUsQ3VzdG9tRXZlbnQ6
-dHJ1ZSxEZXZpY2VNb3Rpb25FdmVudDp0cnVlLERldmljZU9yaWVudGF0aW9uRXZlbnQ6dHJ1ZSxFcnJv
-ckV2ZW50OnRydWUsRXh0ZW5kYWJsZUV2ZW50OnRydWUsRXh0ZW5kYWJsZU1lc3NhZ2VFdmVudDp0cnVl
-LEZldGNoRXZlbnQ6dHJ1ZSxGb250RmFjZVNldExvYWRFdmVudDp0cnVlLEZvcmVpZ25GZXRjaEV2ZW50
-OnRydWUsR2FtZXBhZEV2ZW50OnRydWUsSGFzaENoYW5nZUV2ZW50OnRydWUsSW5zdGFsbEV2ZW50OnRy
-dWUsTWVkaWFFbmNyeXB0ZWRFdmVudDp0cnVlLE1lZGlhS2V5TWVzc2FnZUV2ZW50OnRydWUsTWVkaWFR
-dWVyeUxpc3RFdmVudDp0cnVlLE1lZGlhU3RyZWFtRXZlbnQ6dHJ1ZSxNZWRpYVN0cmVhbVRyYWNrRXZl
-bnQ6dHJ1ZSxNZXNzYWdlRXZlbnQ6dHJ1ZSxNSURJQ29ubmVjdGlvbkV2ZW50OnRydWUsTUlESU1lc3Nh
-Z2VFdmVudDp0cnVlLE11dGF0aW9uRXZlbnQ6dHJ1ZSxOb3RpZmljYXRpb25FdmVudDp0cnVlLFBhZ2VU
-cmFuc2l0aW9uRXZlbnQ6dHJ1ZSxQYXltZW50UmVxdWVzdEV2ZW50OnRydWUsUGF5bWVudFJlcXVlc3RV
-cGRhdGVFdmVudDp0cnVlLFBvcFN0YXRlRXZlbnQ6dHJ1ZSxQcmVzZW50YXRpb25Db25uZWN0aW9uQXZh
-aWxhYmxlRXZlbnQ6dHJ1ZSxQcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VFdmVudDp0cnVlLFByb21p
-c2VSZWplY3Rpb25FdmVudDp0cnVlLFB1c2hFdmVudDp0cnVlLFJUQ0RhdGFDaGFubmVsRXZlbnQ6dHJ1
-ZSxSVENEVE1GVG9uZUNoYW5nZUV2ZW50OnRydWUsUlRDUGVlckNvbm5lY3Rpb25JY2VFdmVudDp0cnVl
-LFJUQ1RyYWNrRXZlbnQ6dHJ1ZSxTZWN1cml0eVBvbGljeVZpb2xhdGlvbkV2ZW50OnRydWUsU2Vuc29y
-RXJyb3JFdmVudDp0cnVlLFNwZWVjaFJlY29nbml0aW9uRXJyb3I6dHJ1ZSxTcGVlY2hSZWNvZ25pdGlv
-bkV2ZW50OnRydWUsU3BlZWNoU3ludGhlc2lzRXZlbnQ6dHJ1ZSxTdG9yYWdlRXZlbnQ6dHJ1ZSxTeW5j
-RXZlbnQ6dHJ1ZSxUcmFja0V2ZW50OnRydWUsVHJhbnNpdGlvbkV2ZW50OnRydWUsV2ViS2l0VHJhbnNp
-dGlvbkV2ZW50OnRydWUsVlJEZXZpY2VFdmVudDp0cnVlLFZSRGlzcGxheUV2ZW50OnRydWUsVlJTZXNz
-aW9uRXZlbnQ6dHJ1ZSxNb2pvSW50ZXJmYWNlUmVxdWVzdEV2ZW50OnRydWUsVVNCQ29ubmVjdGlvbkV2
-ZW50OnRydWUsSURCVmVyc2lvbkNoYW5nZUV2ZW50OnRydWUsQXVkaW9Qcm9jZXNzaW5nRXZlbnQ6dHJ1
-ZSxPZmZsaW5lQXVkaW9Db21wbGV0aW9uRXZlbnQ6dHJ1ZSxXZWJHTENvbnRleHRFdmVudDp0cnVlLEV2
-ZW50OmZhbHNlLElucHV0RXZlbnQ6ZmFsc2UsRXZlbnRUYXJnZXQ6ZmFsc2UsRmlsZTp0cnVlLEhUTUxG
-b3JtRWxlbWVudDp0cnVlLEhpc3Rvcnk6dHJ1ZSxIVE1MRG9jdW1lbnQ6dHJ1ZSxYTUxIdHRwUmVxdWVz
-dDp0cnVlLFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ6ZmFsc2UsSW1hZ2VEYXRhOnRydWUsTG9jYXRp
-b246dHJ1ZSxNb3VzZUV2ZW50OnRydWUsRHJhZ0V2ZW50OnRydWUsUG9pbnRlckV2ZW50OnRydWUsV2hl
-ZWxFdmVudDp0cnVlLERvY3VtZW50RnJhZ21lbnQ6dHJ1ZSxTaGFkb3dSb290OnRydWUsRG9jdW1lbnRU
-eXBlOnRydWUsTm9kZTpmYWxzZSxOb2RlTGlzdDp0cnVlLFJhZGlvTm9kZUxpc3Q6dHJ1ZSxIVE1MUGFy
-YWdyYXBoRWxlbWVudDp0cnVlLFByb2dyZXNzRXZlbnQ6dHJ1ZSxSZXNvdXJjZVByb2dyZXNzRXZlbnQ6
-dHJ1ZSxIVE1MU2VsZWN0RWxlbWVudDp0cnVlLEhUTUxUYWJsZUVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVS
-b3dFbGVtZW50OnRydWUsSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6dHJ1ZSxIVE1MVGVtcGxhdGVFbGVt
-ZW50OnRydWUsQ29tcG9zaXRpb25FdmVudDp0cnVlLEZvY3VzRXZlbnQ6dHJ1ZSxLZXlib2FyZEV2ZW50
-OnRydWUsVGV4dEV2ZW50OnRydWUsVG91Y2hFdmVudDp0cnVlLFVJRXZlbnQ6ZmFsc2UsV2luZG93OnRy
-dWUsRE9NV2luZG93OnRydWUsRGVkaWNhdGVkV29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxTZXJ2aWNlV29y
-a2VyR2xvYmFsU2NvcGU6dHJ1ZSxTaGFyZWRXb3JrZXJHbG9iYWxTY29wZTp0cnVlLFdvcmtlckdsb2Jh
-bFNjb3BlOnRydWUsQXR0cjp0cnVlLENsaWVudFJlY3Q6dHJ1ZSxET01SZWN0OnRydWUsTmFtZWROb2Rl
-TWFwOnRydWUsTW96TmFtZWRBdHRyTWFwOnRydWUsSURCS2V5UmFuZ2U6dHJ1ZSxTVkdTY3JpcHRFbGVt
-ZW50OnRydWUsU1ZHQUVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRlRWxlbWVudDp0cnVlLFNWR0FuaW1hdGVN
-b3Rpb25FbGVtZW50OnRydWUsU1ZHQW5pbWF0ZVRyYW5zZm9ybUVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRp
-b25FbGVtZW50OnRydWUsU1ZHQ2lyY2xlRWxlbWVudDp0cnVlLFNWR0NsaXBQYXRoRWxlbWVudDp0cnVl
-LFNWR0RlZnNFbGVtZW50OnRydWUsU1ZHRGVzY0VsZW1lbnQ6dHJ1ZSxTVkdEaXNjYXJkRWxlbWVudDp0
-cnVlLFNWR0VsbGlwc2VFbGVtZW50OnRydWUsU1ZHRkVCbGVuZEVsZW1lbnQ6dHJ1ZSxTVkdGRUNvbG9y
-TWF0cml4RWxlbWVudDp0cnVlLFNWR0ZFQ29tcG9uZW50VHJhbnNmZXJFbGVtZW50OnRydWUsU1ZHRkVD
-b21wb3NpdGVFbGVtZW50OnRydWUsU1ZHRkVDb252b2x2ZU1hdHJpeEVsZW1lbnQ6dHJ1ZSxTVkdGRURp
-ZmZ1c2VMaWdodGluZ0VsZW1lbnQ6dHJ1ZSxTVkdGRURpc3BsYWNlbWVudE1hcEVsZW1lbnQ6dHJ1ZSxT
-VkdGRURpc3RhbnRMaWdodEVsZW1lbnQ6dHJ1ZSxTVkdGRUZsb29kRWxlbWVudDp0cnVlLFNWR0ZFRnVu
-Y0FFbGVtZW50OnRydWUsU1ZHRkVGdW5jQkVsZW1lbnQ6dHJ1ZSxTVkdGRUZ1bmNHRWxlbWVudDp0cnVl
-LFNWR0ZFRnVuY1JFbGVtZW50OnRydWUsU1ZHRkVHYXVzc2lhbkJsdXJFbGVtZW50OnRydWUsU1ZHRkVJ
-bWFnZUVsZW1lbnQ6dHJ1ZSxTVkdGRU1lcmdlRWxlbWVudDp0cnVlLFNWR0ZFTWVyZ2VOb2RlRWxlbWVu
-dDp0cnVlLFNWR0ZFTW9ycGhvbG9neUVsZW1lbnQ6dHJ1ZSxTVkdGRU9mZnNldEVsZW1lbnQ6dHJ1ZSxT
-VkdGRVBvaW50TGlnaHRFbGVtZW50OnRydWUsU1ZHRkVTcGVjdWxhckxpZ2h0aW5nRWxlbWVudDp0cnVl
-LFNWR0ZFU3BvdExpZ2h0RWxlbWVudDp0cnVlLFNWR0ZFVGlsZUVsZW1lbnQ6dHJ1ZSxTVkdGRVR1cmJ1
-bGVuY2VFbGVtZW50OnRydWUsU1ZHRmlsdGVyRWxlbWVudDp0cnVlLFNWR0ZvcmVpZ25PYmplY3RFbGVt
-ZW50OnRydWUsU1ZHR0VsZW1lbnQ6dHJ1ZSxTVkdHZW9tZXRyeUVsZW1lbnQ6dHJ1ZSxTVkdHcmFwaGlj
-c0VsZW1lbnQ6dHJ1ZSxTVkdJbWFnZUVsZW1lbnQ6dHJ1ZSxTVkdMaW5lRWxlbWVudDp0cnVlLFNWR0xp
-bmVhckdyYWRpZW50RWxlbWVudDp0cnVlLFNWR01hcmtlckVsZW1lbnQ6dHJ1ZSxTVkdNYXNrRWxlbWVu
-dDp0cnVlLFNWR01ldGFkYXRhRWxlbWVudDp0cnVlLFNWR1BhdGhFbGVtZW50OnRydWUsU1ZHUGF0dGVy
-bkVsZW1lbnQ6dHJ1ZSxTVkdQb2x5Z29uRWxlbWVudDp0cnVlLFNWR1BvbHlsaW5lRWxlbWVudDp0cnVl
-LFNWR1JhZGlhbEdyYWRpZW50RWxlbWVudDp0cnVlLFNWR1JlY3RFbGVtZW50OnRydWUsU1ZHU2V0RWxl
-bWVudDp0cnVlLFNWR1N0b3BFbGVtZW50OnRydWUsU1ZHU3R5bGVFbGVtZW50OnRydWUsU1ZHU1ZHRWxl
-bWVudDp0cnVlLFNWR1N3aXRjaEVsZW1lbnQ6dHJ1ZSxTVkdTeW1ib2xFbGVtZW50OnRydWUsU1ZHVFNw
-YW5FbGVtZW50OnRydWUsU1ZHVGV4dENvbnRlbnRFbGVtZW50OnRydWUsU1ZHVGV4dEVsZW1lbnQ6dHJ1
-ZSxTVkdUZXh0UGF0aEVsZW1lbnQ6dHJ1ZSxTVkdUZXh0UG9zaXRpb25pbmdFbGVtZW50OnRydWUsU1ZH
-VGl0bGVFbGVtZW50OnRydWUsU1ZHVXNlRWxlbWVudDp0cnVlLFNWR1ZpZXdFbGVtZW50OnRydWUsU1ZH
-R3JhZGllbnRFbGVtZW50OnRydWUsU1ZHQ29tcG9uZW50VHJhbnNmZXJGdW5jdGlvbkVsZW1lbnQ6dHJ1
-ZSxTVkdGRURyb3BTaGFkb3dFbGVtZW50OnRydWUsU1ZHTVBhdGhFbGVtZW50OnRydWUsU1ZHRWxlbWVu
-dDpmYWxzZX0pCkguYjAuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5SRy4k
-bmF0aXZlU3VwZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJWaWV3IgpILlZQLiRuYXRpdmVTdXBlcmNsYXNz
-VGFnPSJBcnJheUJ1ZmZlclZpZXciCkguRGcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVy
-VmlldyIKSC5XQi4kbmF0aXZlU3VwZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJWaWV3IgpILlpHLiRuYXRp
-dmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZpZXciCkguUGcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9
-IkFycmF5QnVmZmVyVmlldyJ9KSgpCmNvbnZlcnRBbGxUb0Zhc3RPYmplY3QodykKY29udmVydFRvRmFz
-dE9iamVjdCgkKTsoZnVuY3Rpb24oYSl7aWYodHlwZW9mIGRvY3VtZW50PT09InVuZGVmaW5lZCIpe2Eo
-bnVsbCkKcmV0dXJufWlmKHR5cGVvZiBkb2N1bWVudC5jdXJyZW50U2NyaXB0IT0ndW5kZWZpbmVkJyl7
-YShkb2N1bWVudC5jdXJyZW50U2NyaXB0KQpyZXR1cm59dmFyIHQ9ZG9jdW1lbnQuc2NyaXB0cwpmdW5j
-dGlvbiBvbkxvYWQoYil7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDsrK3IpdFtyXS5yZW1vdmVFdmVudExp
-c3RlbmVyKCJsb2FkIixvbkxvYWQsZmFsc2UpCmEoYi50YXJnZXQpfWZvcih2YXIgcz0wO3M8dC5sZW5n
-dGg7KytzKXRbc10uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsb25Mb2FkLGZhbHNlKX0pKGZ1bmN0aW9u
-KGEpe3YuY3VycmVudFNjcmlwdD1hCmlmKHR5cGVvZiBkYXJ0TWFpblJ1bm5lcj09PSJmdW5jdGlvbiIp
-ZGFydE1haW5SdW5uZXIoTC5JcSxbXSkKZWxzZSBMLklxKFtdKX0pfSkoKQovLyMgc291cmNlTWFwcGlu
-Z1VSTD1taWdyYXRpb24uanMubWFwCg==
+Yl19fQpILmVFLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCnE6ZnVu
+Y3Rpb24oYSxiKXtILlNjKGIpCkgub2QoYixhLGEubGVuZ3RoKQpyZXR1cm4gYVtiXX19CkguVjYucHJv
+dG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe0gu
+U2MoYikKSC5vZChiLGEsYS5sZW5ndGgpCnJldHVybiBhW2JdfSwKJGlWNjoxLAokaW42OjF9CkguUkcu
+cHJvdG90eXBlPXt9CkguVlAucHJvdG90eXBlPXt9CkguV0IucHJvdG90eXBlPXt9CkguWkcucHJvdG90
+eXBlPXt9CkguSmMucHJvdG90eXBlPXsKQzpmdW5jdGlvbihhKXtyZXR1cm4gSC5jRSh2LnR5cGVVbml2
+ZXJzZSx0aGlzLGEpfSwKS3E6ZnVuY3Rpb24oYSl7cmV0dXJuIEgudjUodi50eXBlVW5pdmVyc2UsdGhp
+cyxhKX19CkguRy5wcm90b3R5cGU9e30KSC51OS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVy
+biB0aGlzLmF9fQpILmh6LnByb3RvdHlwZT17fQpILmlNLnByb3RvdHlwZT17fQpQLnRoLnByb3RvdHlw
+ZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYSxzPXQuYQp0LmE9bnVsbApzLiQwKCl9LAokUzox
+OH0KUC5oYS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdCxzCnRoaXMuYS5hPXUuTS5iKGEp
+CnQ9dGhpcy5iCnM9dGhpcy5jCnQuZmlyc3RDaGlsZD90LnJlbW92ZUNoaWxkKHMpOnQuYXBwZW5kQ2hp
+bGQocyl9LAokUzoyMX0KUC5Wcy5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYS4kMCgpfSwK
+JEM6IiQwIiwKJFI6MCwKJFM6MH0KUC5GdC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYS4k
+MCgpfSwKJEM6IiQwIiwKJFI6MCwKJFM6MH0KUC5XMy5wcm90b3R5cGU9ewpDWTpmdW5jdGlvbihhLGIp
+e2lmKHNlbGYuc2V0VGltZW91dCE9bnVsbClzZWxmLnNldFRpbWVvdXQoSC50UihuZXcgUC55SCh0aGlz
+LGIpLDApLGEpCmVsc2UgdGhyb3cgSC5iKFAuTDQoImBzZXRUaW1lb3V0KClgIG5vdCBmb3VuZC4iKSl9
+fQpQLnlILnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dGhpcy5iLiQwKCl9LAokQzoiJDAiLAokUjow
+LAokUzoyfQpQLmloLnByb3RvdHlwZT17CmFNOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyPXRoaXMuJHRp
+CnIuQygiMS8iKS5iKGIpCnQ9IXRoaXMuYnx8ci5DKCJiODwxPiIpLmMoYikKcz10aGlzLmEKaWYodClz
+LlhmKGIpCmVsc2Ugcy5YMihyLmQuYihiKSl9LAp3MDpmdW5jdGlvbihhLGIpe3ZhciB0PXRoaXMuYQpp
+Zih0aGlzLmIpdC5aTChhLGIpCmVsc2UgdC5OayhhLGIpfX0KUC5XTS5wcm90b3R5cGU9ewokMTpmdW5j
+dGlvbihhKXtyZXR1cm4gdGhpcy5hLiQyKDAsYSl9LAokUzoyMH0KUC5TWC5wcm90b3R5cGU9ewokMjpm
+dW5jdGlvbihhLGIpe3RoaXMuYS4kMigxLG5ldyBILmJxKGEsdS5sLmIoYikpKX0sCiRDOiIkMiIsCiRS
+OjIsCiRTOjMzfQpQLkdzLnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hKEguU2MoYSks
+Yil9LAokUzoyM30KUC5QZi5wcm90b3R5cGU9ewp3MDpmdW5jdGlvbihhLGIpe3ZhciB0CmlmKGE9PW51
+bGwpYT1uZXcgUC5uKCkKdD10aGlzLmEKaWYodC5hIT09MCl0aHJvdyBILmIoUC5QVigiRnV0dXJlIGFs
+cmVhZHkgY29tcGxldGVkIikpCnQuTmsoYSxiKX0sCnBtOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLncw
+KGEsbnVsbCl9fQpQLlpmLnByb3RvdHlwZT17CmFNOmZ1bmN0aW9uKGEsYil7dmFyIHQKdGhpcy4kdGku
+QygiMS8iKS5iKGIpCnQ9dGhpcy5hCmlmKHQuYSE9PTApdGhyb3cgSC5iKFAuUFYoIkZ1dHVyZSBhbHJl
+YWR5IGNvbXBsZXRlZCIpKQp0LlhmKGIpfX0KUC5GZS5wcm90b3R5cGU9ewpIUjpmdW5jdGlvbihhKXtp
+ZigodGhpcy5jJjE1KSE9PTYpcmV0dXJuITAKcmV0dXJuIHRoaXMuYi5iLmJ2KHUuYWwuYih0aGlzLmQp
+LGEuYSx1LmNKLHUuSyl9LApLdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmUscz11Lnoscj11LksscT10
+aGlzLiR0aS5DKCIyLyIpLHA9dGhpcy5iLmIKaWYodS5XLmModCkpcmV0dXJuIHEuYihwLnJwKHQsYS5h
+LGEuYixzLHIsdS5sKSkKZWxzZSByZXR1cm4gcS5iKHAuYnYodS55LmIodCksYS5hLHMscikpfX0KUC52
+cy5wcm90b3R5cGU9ewpTcTpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHE9dGhpcy4kdGkKcS5LcShj
+KS5DKCIxLygyKSIpLmIoYSkKdD0kLlgzCmlmKHQhPT1DLk5VKXtjLkMoIkA8MC8+IikuS3EocS5kKS5D
+KCIxKDIpIikuYihhKQppZihiIT1udWxsKWI9UC5WSChiLHQpfXM9bmV3IFAudnMoJC5YMyxjLkMoInZz
+PDA+IikpCnI9Yj09bnVsbD8xOjMKdGhpcy54ZihuZXcgUC5GZShzLHIsYSxiLHEuQygiQDwxPiIpLktx
+KGMpLkMoIkZlPDEsMj4iKSkpCnJldHVybiBzfSwKVzc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5T
+cShhLG51bGwsYil9LApRZDpmdW5jdGlvbihhLGIsYyl7dmFyIHQscz10aGlzLiR0aQpzLktxKGMpLkMo
+IjEvKDIpIikuYihhKQp0PW5ldyBQLnZzKCQuWDMsYy5DKCJ2czwwPiIpKQp0aGlzLnhmKG5ldyBQLkZl
+KHQsKGI9PW51bGw/MTozKXwxNixhLGIscy5DKCJAPDE+IikuS3EoYykuQygiRmU8MSwyPiIpKSkKcmV0
+dXJuIHR9LApPQTpmdW5jdGlvbihhKXt2YXIgdCxzLHIKdS5iZi5iKG51bGwpCnQ9dGhpcy4kdGkKcz0k
+LlgzCnI9bmV3IFAudnMocyx0KQppZihzIT09Qy5OVSlhPVAuVkgoYSxzKQp0aGlzLnhmKG5ldyBQLkZl
+KHIsMixudWxsLGEsdC5DKCJAPDE+IikuS3EodC5kKS5DKCJGZTwxLDI+IikpKQpyZXR1cm4gcn0sCnhm
+OmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcyxyPXMuYQppZihyPD0xKXthLmE9dS54LmIocy5jKQpzLmM9
+YX1lbHNle2lmKHI9PT0yKXt0PXUuXy5iKHMuYykKcj10LmEKaWYocjw0KXt0LnhmKGEpCnJldHVybn1z
+LmE9cgpzLmM9dC5jfVAuVGsobnVsbCxudWxsLHMuYix1Lk0uYihuZXcgUC5kYShzLGEpKSl9fSwKalE6
+ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvPXRoaXMsbj17fQpuLmE9YQppZihhPT1udWxsKXJldHVy
+bgp0PW8uYQppZih0PD0xKXtzPXUueC5iKG8uYykKcj1vLmM9YQppZihzIT1udWxsKXtmb3IoO3E9ci5h
+LHEhPW51bGw7cj1xKTtyLmE9c319ZWxzZXtpZih0PT09Mil7cD11Ll8uYihvLmMpCnQ9cC5hCmlmKHQ8
+NCl7cC5qUShhKQpyZXR1cm59by5hPXQKby5jPXAuY31uLmE9by5OOChhKQpQLlRrKG51bGwsbnVsbCxv
+LmIsdS5NLmIobmV3IFAub1EobixvKSkpfX0sCmFoOmZ1bmN0aW9uKCl7dmFyIHQ9dS54LmIodGhpcy5j
+KQp0aGlzLmM9bnVsbApyZXR1cm4gdGhpcy5OOCh0KX0sCk44OmZ1bmN0aW9uKGEpe3ZhciB0LHMscgpm
+b3IodD1hLHM9bnVsbDt0IT1udWxsO3M9dCx0PXIpe3I9dC5hCnQuYT1zfXJldHVybiBzfSwKSEg6ZnVu
+Y3Rpb24oYSl7dmFyIHQscz10aGlzLHI9cy4kdGkKci5DKCIxLyIpLmIoYSkKaWYoci5DKCJiODwxPiIp
+LmMoYSkpaWYoci5jKGEpKVAuQTkoYSxzKQplbHNlIFAuazMoYSxzKQplbHNle3Q9cy5haCgpCnIuZC5i
+KGEpCnMuYT00CnMuYz1hClAuSFoocyx0KX19LApYMjpmdW5jdGlvbihhKXt2YXIgdCxzPXRoaXMKcy4k
+dGkuZC5iKGEpCnQ9cy5haCgpCnMuYT00CnMuYz1hClAuSFoocyx0KX0sClpMOmZ1bmN0aW9uKGEsYil7
+dmFyIHQscz10aGlzCnUubC5iKGIpCnQ9cy5haCgpCnMuYT04CnMuYz1uZXcgUC5DdyhhLGIpClAuSFoo
+cyx0KX0sClhmOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMscz10LiR0aQpzLkMoIjEvIikuYihhKQppZihz
+LkMoImI4PDE+IikuYyhhKSl7dC5jVShhKQpyZXR1cm59dC5hPTEKUC5UayhudWxsLG51bGwsdC5iLHUu
+TS5iKG5ldyBQLnJIKHQsYSkpKX0sCmNVOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMscz10LiR0aQpzLkMo
+ImI4PDE+IikuYihhKQppZihzLmMoYSkpe2lmKGEuYT09PTgpe3QuYT0xClAuVGsobnVsbCxudWxsLHQu
+Yix1Lk0uYihuZXcgUC5LRih0LGEpKSl9ZWxzZSBQLkE5KGEsdCkKcmV0dXJufVAuazMoYSx0KX0sCk5r
+OmZ1bmN0aW9uKGEsYil7dGhpcy5hPTEKUC5UayhudWxsLG51bGwsdGhpcy5iLHUuTS5iKG5ldyBQLlpM
+KHRoaXMsYSxiKSkpfSwKJGliODoxfQpQLmRhLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7UC5IWih0
+aGlzLmEsdGhpcy5iKX0sCiRTOjB9ClAub1EucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtQLkhaKHRo
+aXMuYix0aGlzLmEuYSl9LAokUzowfQpQLnBWLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0
+PXRoaXMuYQp0LmE9MAp0LkhIKGEpfSwKJFM6MTh9ClAuVTcucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24o
+YSxiKXt1LmwuYihiKQp0aGlzLmEuWkwoYSxiKX0sCiQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLiQy
+KGEsbnVsbCl9LAokQzoiJDIiLAokRDpmdW5jdGlvbigpe3JldHVybltudWxsXX0sCiRTOjQyfQpQLnZy
+LnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7dGhpcy5hLlpMKHRoaXMuYix0aGlzLmMpfSwKJFM6MH0K
+UC5ySC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYQp0LlgyKHQuJHRpLmQuYih0
+aGlzLmIpKX0sCiRTOjB9ClAuS0YucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtQLkE5KHRoaXMuYix0
+aGlzLmEpfSwKJFM6MH0KUC5aTC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYS5aTCh0aGlz
+LmIsdGhpcy5jKX0sCiRTOjB9ClAuUlQucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2YXIgdCxzLHIs
+cSxwLG8sbj10aGlzLG09bnVsbAp0cnl7cj1uLmMKbT1yLmIuYi56eih1LmZPLmIoci5kKSx1LnopfWNh
+dGNoKHEpe3Q9SC5SdShxKQpzPUgudHMocSkKaWYobi5kKXtyPXUubi5iKG4uYS5hLmMpLmEKcD10CnA9
+cj09bnVsbD9wPT1udWxsOnI9PT1wCnI9cH1lbHNlIHI9ITEKcD1uLmIKaWYocilwLmI9dS5uLmIobi5h
+LmEuYykKZWxzZSBwLmI9bmV3IFAuQ3codCxzKQpwLmE9ITAKcmV0dXJufWlmKHUuYy5jKG0pKXtpZiht
+IGluc3RhbmNlb2YgUC52cyYmbS5hPj00KXtpZihtLmE9PT04KXtyPW4uYgpyLmI9dS5uLmIobS5jKQpy
+LmE9ITB9cmV0dXJufW89bi5hLmEKcj1uLmIKci5iPW0uVzcobmV3IFAualoobyksdS56KQpyLmE9ITF9
+fSwKJFM6Mn0KUC5qWi5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfSwKJFM6
+Mzd9ClAucnEucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXt2YXIgdCxzLHIscSxwLG8sbixtPXRoaXMK
+dHJ5e3I9bS5iCnE9ci4kdGkKcD1xLmQKbz1wLmIobS5jKQptLmEuYj1yLmIuYi5idihxLkMoIjIvKDEp
+IikuYihyLmQpLG8scS5DKCIyLyIpLHApfWNhdGNoKG4pe3Q9SC5SdShuKQpzPUgudHMobikKcj1tLmEK
+ci5iPW5ldyBQLkN3KHQscykKci5hPSEwfX0sCiRTOjJ9ClAuUlcucHJvdG90eXBlPXsKJDA6ZnVuY3Rp
+b24oKXt2YXIgdCxzLHIscSxwLG8sbixtLGw9dGhpcwp0cnl7dD11Lm4uYihsLmEuYS5jKQpxPWwuYwpp
+ZihILm9UKHEuSFIodCkpJiZxLmUhPW51bGwpe3A9bC5iCnAuYj1xLkt3KHQpCnAuYT0hMX19Y2F0Y2go
+byl7cz1ILlJ1KG8pCnI9SC50cyhvKQpxPXUubi5iKGwuYS5hLmMpCnA9cS5hCm49cwptPWwuYgppZihw
+PT1udWxsP249PW51bGw6cD09PW4pbS5iPXEKZWxzZSBtLmI9bmV3IFAuQ3cocyxyKQptLmE9ITB9fSwK
+JFM6Mn0KUC5PTS5wcm90b3R5cGU9e30KUC5xaC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXt2YXIg
+dCxzLHI9dGhpcyxxPXt9LHA9bmV3IFAudnMoJC5YMyx1LmZKKQpxLmE9MAp0PUguTGgocikKcz10LkMo
+In4oMSkiKS5iKG5ldyBQLkI1KHEscikpCnUuTS5iKG5ldyBQLlBJKHEscCkpClcuSkUoci5hLHIuYixz
+LCExLHQuZCkKcmV0dXJuIHB9fQpQLkI1LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe0guTGgodGhp
+cy5iKS5kLmIoYSk7Kyt0aGlzLmEuYX0sCiRTOmZ1bmN0aW9uKCl7cmV0dXJuIEguTGgodGhpcy5iKS5D
+KCJjOCgxKSIpfX0KUC5QSS5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe3RoaXMuYi5ISCh0aGlzLmEu
+YSl9LAokUzowfQpQLk1PLnByb3RvdHlwZT17fQpQLmtULnByb3RvdHlwZT17fQpQLnhJLnByb3RvdHlw
+ZT17fQpQLkN3LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIEguZCh0aGlzLmEpfSwKJGlY
+UzoxfQpQLm0wLnByb3RvdHlwZT17JGlKQjoxfQpQLnBLLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7
+dmFyIHQscz10aGlzLmEscj1zLmEKcz1yPT1udWxsP3MuYT1uZXcgUC5uKCk6cgpyPXRoaXMuYgppZihy
+PT1udWxsKXRocm93IEguYihzKQp0PUguYihzKQp0LnN0YWNrPXIudygwKQp0aHJvdyB0fSwKJFM6MH0K
+UC5KaS5wcm90b3R5cGU9ewpiSDpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT1udWxsCnUuTS5iKGEpCnRy
+eXtpZihDLk5VPT09JC5YMyl7YS4kMCgpCnJldHVybn1QLlQ4KHEscSx0aGlzLGEsdS5IKX1jYXRjaChy
+KXt0PUguUnUocikKcz1ILnRzKHIpClAuTDIocSxxLHRoaXMsdCx1LmwuYihzKSl9fSwKRGw6ZnVuY3Rp
+b24oYSxiLGMpe3ZhciB0LHMscixxPW51bGwKYy5DKCJ+KDApIikuYihhKQpjLmIoYikKdHJ5e2lmKEMu
+TlU9PT0kLlgzKXthLiQxKGIpCnJldHVybn1QLnl2KHEscSx0aGlzLGEsYix1LkgsYyl9Y2F0Y2gocil7
+dD1ILlJ1KHIpCnM9SC50cyhyKQpQLkwyKHEscSx0aGlzLHQsdS5sLmIocykpfX0sClJUOmZ1bmN0aW9u
+KGEsYil7cmV0dXJuIG5ldyBQLmhqKHRoaXMsYi5DKCIwKCkiKS5iKGEpLGIpfSwKR1k6ZnVuY3Rpb24o
+YSl7cmV0dXJuIG5ldyBQLlZwKHRoaXMsdS5NLmIoYSkpfSwKUHk6ZnVuY3Rpb24oYSxiKXtyZXR1cm4g
+bmV3IFAuT1IodGhpcyxiLkMoIn4oMCkiKS5iKGEpLGIpfSwKcTpmdW5jdGlvbihhLGIpe3JldHVybiBu
+dWxsfSwKeno6ZnVuY3Rpb24oYSxiKXtiLkMoIjAoKSIpLmIoYSkKaWYoJC5YMz09PUMuTlUpcmV0dXJu
+IGEuJDAoKQpyZXR1cm4gUC5UOChudWxsLG51bGwsdGhpcyxhLGIpfSwKYnY6ZnVuY3Rpb24oYSxiLGMs
+ZCl7Yy5DKCJAPDA+IikuS3EoZCkuQygiMSgyKSIpLmIoYSkKZC5iKGIpCmlmKCQuWDM9PT1DLk5VKXJl
+dHVybiBhLiQxKGIpCnJldHVybiBQLnl2KG51bGwsbnVsbCx0aGlzLGEsYixjLGQpfSwKcnA6ZnVuY3Rp
+b24oYSxiLGMsZCxlLGYpe2QuQygiQDwwPiIpLktxKGUpLktxKGYpLkMoIjEoMiwzKSIpLmIoYSkKZS5i
+KGIpCmYuYihjKQppZigkLlgzPT09Qy5OVSlyZXR1cm4gYS4kMihiLGMpCnJldHVybiBQLlF4KG51bGws
+bnVsbCx0aGlzLGEsYixjLGQsZSxmKX0sCkxqOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBiLkMoIkA8
+MD4iKS5LcShjKS5LcShkKS5DKCIxKDIsMykiKS5iKGEpfX0KUC5oai5wcm90b3R5cGU9ewokMDpmdW5j
+dGlvbigpe3JldHVybiB0aGlzLmEuenoodGhpcy5iLHRoaXMuYyl9LAokUzpmdW5jdGlvbigpe3JldHVy
+biB0aGlzLmMuQygiMCgpIil9fQpQLlZwLnByb3RvdHlwZT17CiQwOmZ1bmN0aW9uKCl7cmV0dXJuIHRo
+aXMuYS5iSCh0aGlzLmIpfSwKJFM6Mn0KUC5PUi5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIg
+dD10aGlzLmMKcmV0dXJuIHRoaXMuYS5EbCh0aGlzLmIsdC5iKGEpLHQpfSwKJFM6ZnVuY3Rpb24oKXty
+ZXR1cm4gdGhpcy5jLkMoIn4oMCkiKX19ClAuYjYucHJvdG90eXBlPXsKZ2t6OmZ1bmN0aW9uKGEpe3Zh
+ciB0PXRoaXMscz1uZXcgUC5sbSh0LHQucixILkxoKHQpLkMoImxtPDE+IikpCnMuYz10LmUKcmV0dXJu
+IHN9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfSwKdGc6ZnVuY3Rpb24oYSxiKXt2YXIgdCxz
+CmlmKHR5cGVvZiBiPT0ic3RyaW5nIiYmYiE9PSJfX3Byb3RvX18iKXt0PXRoaXMuYgppZih0PT1udWxs
+KXJldHVybiExCnJldHVybiB1LkouYih0W2JdKSE9bnVsbH1lbHNle3M9dGhpcy5QUihiKQpyZXR1cm4g
+c319LApQUjpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmQKaWYodD09bnVsbClyZXR1cm4hMQpyZXR1cm4g
+dGhpcy5ERih0W3RoaXMuTihhKV0sYSk+PTB9LAppOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyPXRoaXMK
+SC5MaChyKS5kLmIoYikKaWYodHlwZW9mIGI9PSJzdHJpbmciJiZiIT09Il9fcHJvdG9fXyIpe3Q9ci5i
+CnJldHVybiByLmJRKHQ9PW51bGw/ci5iPVAuVDIoKTp0LGIpfWVsc2UgaWYodHlwZW9mIGI9PSJudW1i
+ZXIiJiYoYiYxMDczNzQxODIzKT09PWIpe3M9ci5jCnJldHVybiByLmJRKHM9PW51bGw/ci5jPVAuVDIo
+KTpzLGIpfWVsc2UgcmV0dXJuIHIuQjcoYil9LApCNzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscT10aGlz
+CkguTGgocSkuZC5iKGEpCnQ9cS5kCmlmKHQ9PW51bGwpdD1xLmQ9UC5UMigpCnM9cS5OKGEpCnI9dFtz
+XQppZihyPT1udWxsKXRbc109W3EueW8oYSldCmVsc2V7aWYocS5ERihyLGEpPj0wKXJldHVybiExCnIu
+cHVzaChxLnlvKGEpKX1yZXR1cm4hMH0sClI6ZnVuY3Rpb24oYSxiKXt2YXIgdD10aGlzCmlmKHR5cGVv
+ZiBiPT0ic3RyaW5nIiYmYiE9PSJfX3Byb3RvX18iKXJldHVybiB0LkwodC5iLGIpCmVsc2UgaWYodHlw
+ZW9mIGI9PSJudW1iZXIiJiYoYiYxMDczNzQxODIzKT09PWIpcmV0dXJuIHQuTCh0LmMsYikKZWxzZSBy
+ZXR1cm4gdC5xZyhiKX0sCnFnOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHA9dGhpcyxvPXAuZAppZihv
+PT1udWxsKXJldHVybiExCnQ9cC5OKGEpCnM9b1t0XQpyPXAuREYocyxhKQppZihyPDApcmV0dXJuITEK
+cT1zLnNwbGljZShyLDEpWzBdCmlmKDA9PT1zLmxlbmd0aClkZWxldGUgb1t0XQpwLkdTKHEpCnJldHVy
+biEwfSwKYlE6ZnVuY3Rpb24oYSxiKXtILkxoKHRoaXMpLmQuYihiKQppZih1LkouYihhW2JdKSE9bnVs
+bClyZXR1cm4hMQphW2JdPXRoaXMueW8oYikKcmV0dXJuITB9LApMOmZ1bmN0aW9uKGEsYil7dmFyIHQK
+aWYoYT09bnVsbClyZXR1cm4hMQp0PXUuSi5iKGFbYl0pCmlmKHQ9PW51bGwpcmV0dXJuITEKdGhpcy5H
+Uyh0KQpkZWxldGUgYVtiXQpyZXR1cm4hMH0sClM6ZnVuY3Rpb24oKXt0aGlzLnI9MTA3Mzc0MTgyMyZ0
+aGlzLnIrMX0sCnlvOmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcyxyPW5ldyBQLmJuKEguTGgocykuZC5i
+KGEpKQppZihzLmU9PW51bGwpcy5lPXMuZj1yCmVsc2V7dD1zLmYKci5jPXQKcy5mPXQuYj1yfSsrcy5h
+CnMuUygpCnJldHVybiByfSwKR1M6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcyxzPWEuYyxyPWEuYgppZihz
+PT1udWxsKXQuZT1yCmVsc2Ugcy5iPXIKaWYocj09bnVsbCl0LmY9cwplbHNlIHIuYz1zOy0tdC5hCnQu
+UygpfSwKTjpmdW5jdGlvbihhKXtyZXR1cm4gSi5oZihhKSYxMDczNzQxODIzfSwKREY6ZnVuY3Rpb24o
+YSxiKXt2YXIgdCxzCmlmKGE9PW51bGwpcmV0dXJuLTEKdD1hLmxlbmd0aApmb3Iocz0wO3M8dDsrK3Mp
+aWYoSi5STShhW3NdLmEsYikpcmV0dXJuIHMKcmV0dXJuLTF9fQpQLmJuLnByb3RvdHlwZT17fQpQLmxt
+LnByb3RvdHlwZT17CmdsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZH0sCkY6ZnVuY3Rpb24oKXt2YXIg
+dD10aGlzLHM9dC5hCmlmKHQuYiE9PXMucil0aHJvdyBILmIoUC5hNChzKSkKZWxzZXtzPXQuYwppZihz
+PT1udWxsKXt0LnNqKG51bGwpCnJldHVybiExfWVsc2V7dC5zaih0LiR0aS5kLmIocy5hKSkKdC5jPXQu
+Yy5iCnJldHVybiEwfX19LApzajpmdW5jdGlvbihhKXt0aGlzLmQ9dGhpcy4kdGkuZC5iKGEpfSwKJGlB
+bjoxfQpQLm1XLnByb3RvdHlwZT17fQpQLkxVLnByb3RvdHlwZT17JGljWDoxLCRpek06MX0KUC5sRC5w
+cm90b3R5cGU9ewpna3o6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILmE3KGEsdGhpcy5nQShhKSxILnpL
+KGEpLkMoImE3PGxELkU+IikpfSwKRTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnEoYSxiKX0sCks6
+ZnVuY3Rpb24oYSxiKXt2YXIgdCxzCkgueksoYSkuQygifihsRC5FKSIpLmIoYikKdD10aGlzLmdBKGEp
+CmZvcihzPTA7czx0Oysrcyl7Yi4kMSh0aGlzLnEoYSxzKSkKaWYodCE9PXRoaXMuZ0EoYSkpdGhyb3cg
+SC5iKFAuYTQoYSkpfX0sCkUyOmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1ILnpLKGEpCnJldHVybiBuZXcg
+SC5BOChhLHQuS3EoYykuQygiMShsRC5FKSIpLmIoYiksdC5DKCJAPGxELkU+IikuS3EoYykuQygiQTg8
+MSwyPiIpKX0sCmR1OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0CkgueksoYSkuQygibEQuRSIpLmIoZCkK
+UC5qQihiLGMsdGhpcy5nQShhKSkKZm9yKHQ9Yjt0PGM7Kyt0KXRoaXMuWShhLHQsZCl9LAp3OmZ1bmN0
+aW9uKGEpe3JldHVybiBQLldFKGEsIlsiLCJdIil9fQpQLmlsLnByb3RvdHlwZT17fQpQLnJhLnByb3Rv
+dHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHQscz10aGlzLmEKaWYoIXMuYSl0aGlzLmIuYSs9Iiwg
+IgpzLmE9ITEKcz10aGlzLmIKdD1zLmErPUguZChhKQpzLmE9dCsiOiAiCnMuYSs9SC5kKGIpfSwKJFM6
+MX0KUC5Zay5wcm90b3R5cGU9ewpLOmZ1bmN0aW9uKGEsYil7dmFyIHQscwpILkxoKHRoaXMpLkMoIn4o
+WWsuSyxZay5WKSIpLmIoYikKZm9yKHQ9Si5JVCh0aGlzLmdWKCkpO3QuRigpOyl7cz10LmdsKCkKYi4k
+MihzLHRoaXMucSgwLHMpKX19LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gSi5IbSh0aGlzLmdWKCkpfSwK
+dzpmdW5jdGlvbihhKXtyZXR1cm4gUC5uTyh0aGlzKX0sCiRpWjA6MX0KUC5LUC5wcm90b3R5cGU9ewpZ
+OmZ1bmN0aW9uKGEsYixjKXt2YXIgdD1ILkxoKHRoaXMpCnQuZC5iKGIpCnQuY2hbMV0uYihjKQp0aHJv
+dyBILmIoUC5MNCgiQ2Fubm90IG1vZGlmeSB1bm1vZGlmaWFibGUgbWFwIikpfX0KUC5Qbi5wcm90b3R5
+cGU9ewpxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYS5xKDAsYil9LApZOmZ1bmN0aW9uKGEsYixj
+KXt2YXIgdD1ILkxoKHRoaXMpCnRoaXMuYS5ZKDAsdC5kLmIoYiksdC5jaFsxXS5iKGMpKX0sCks6ZnVu
+Y3Rpb24oYSxiKXt0aGlzLmEuSygwLEguTGgodGhpcykuQygifigxLDIpIikuYihiKSl9LApnQTpmdW5j
+dGlvbihhKXt2YXIgdD10aGlzLmEKcmV0dXJuIHQuZ0EodCl9LAp3OmZ1bmN0aW9uKGEpe3JldHVybiBK
+LmoodGhpcy5hKX0sCiRpWjA6MX0KUC5Hai5wcm90b3R5cGU9e30KUC5sZi5wcm90b3R5cGU9ewp3OmZ1
+bmN0aW9uKGEpe3JldHVybiBQLldFKHRoaXMsInsiLCJ9Iil9fQpQLlZqLnByb3RvdHlwZT17JGljWDox
+LCRpeHU6MX0KUC5Ydi5wcm90b3R5cGU9ewpGVjpmdW5jdGlvbihhLGIpe3ZhciB0CmZvcih0PUouSVQo
+SC5MaCh0aGlzKS5DKCJjWDwxPiIpLmIoYikpO3QuRigpOyl0aGlzLmkoMCx0LmdsKCkpfSwKdzpmdW5j
+dGlvbihhKXtyZXR1cm4gUC5XRSh0aGlzLCJ7IiwifSIpfSwKSDpmdW5jdGlvbihhLGIpe3ZhciB0LHM9
+UC5yaih0aGlzLHRoaXMucixILkxoKHRoaXMpLmQpCmlmKCFzLkYoKSlyZXR1cm4iIgppZihiPT09IiIp
+e3Q9IiIKZG8gdCs9SC5kKHMuZCkKd2hpbGUocy5GKCkpfWVsc2V7dD1ILmQocy5kKQpmb3IoO3MuRigp
+Oyl0PXQrYitILmQocy5kKX1yZXR1cm4gdC5jaGFyQ29kZUF0KDApPT0wP3Q6dH0sCiRpY1g6MSwKJGl4
+dToxfQpQLm5ZLnByb3RvdHlwZT17fQpQLldZLnByb3RvdHlwZT17fQpQLlJVLnByb3RvdHlwZT17fQpQ
+LnV3LnByb3RvdHlwZT17CnE6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzPXRoaXMuYgppZihzPT1udWxsKXJl
+dHVybiB0aGlzLmMucSgwLGIpCmVsc2UgaWYodHlwZW9mIGIhPSJzdHJpbmciKXJldHVybiBudWxsCmVs
+c2V7dD1zW2JdCnJldHVybiB0eXBlb2YgdD09InVuZGVmaW5lZCI/dGhpcy5mYihiKTp0fX0sCmdBOmZ1
+bmN0aW9uKGEpe3JldHVybiB0aGlzLmI9PW51bGw/dGhpcy5jLmE6dGhpcy5DZigpLmxlbmd0aH0sCmdW
+OmZ1bmN0aW9uKCl7aWYodGhpcy5iPT1udWxsKXt2YXIgdD10aGlzLmMKcmV0dXJuIG5ldyBILmk1KHQs
+SC5MaCh0KS5DKCJpNTwxPiIpKX1yZXR1cm4gbmV3IFAuaTgodGhpcyl9LApZOmZ1bmN0aW9uKGEsYixj
+KXt2YXIgdCxzLHI9dGhpcwppZihyLmI9PW51bGwpci5jLlkoMCxiLGMpCmVsc2UgaWYoci54NChiKSl7
+dD1yLmIKdFtiXT1jCnM9ci5hCmlmKHM9PW51bGw/dCE9bnVsbDpzIT09dClzW2JdPW51bGx9ZWxzZSBy
+LlhLKCkuWSgwLGIsYyl9LAp4NDpmdW5jdGlvbihhKXtpZih0aGlzLmI9PW51bGwpcmV0dXJuIHRoaXMu
+Yy54NChhKQpyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuYSxh
+KX0sCks6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwPXRoaXMKdS5jQS5iKGIpCmlmKHAuYj09bnVs
+bClyZXR1cm4gcC5jLksoMCxiKQp0PXAuQ2YoKQpmb3Iocz0wO3M8dC5sZW5ndGg7KytzKXtyPXRbc10K
+cT1wLmJbcl0KaWYodHlwZW9mIHE9PSJ1bmRlZmluZWQiKXtxPVAuUWUocC5hW3JdKQpwLmJbcl09cX1i
+LiQyKHIscSkKaWYodCE9PXAuYyl0aHJvdyBILmIoUC5hNChwKSl9fSwKQ2Y6ZnVuY3Rpb24oKXt2YXIg
+dD11LmouYih0aGlzLmMpCmlmKHQ9PW51bGwpdD10aGlzLmM9SC5WTShPYmplY3Qua2V5cyh0aGlzLmEp
+LHUucykKcmV0dXJuIHR9LApYSzpmdW5jdGlvbigpe3ZhciB0LHMscixxLHAsbz10aGlzCmlmKG8uYj09
+bnVsbClyZXR1cm4gby5jCnQ9UC5GbCh1Lk4sdS56KQpzPW8uQ2YoKQpmb3Iocj0wO3E9cy5sZW5ndGgs
+cjxxOysrcil7cD1zW3JdCnQuWSgwLHAsby5xKDAscCkpfWlmKHE9PT0wKUMuTm0uaShzLG51bGwpCmVs
+c2UgQy5ObS5zQShzLDApCm8uYT1vLmI9bnVsbApyZXR1cm4gby5jPXR9LApmYjpmdW5jdGlvbihhKXt2
+YXIgdAppZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuYSxhKSlyZXR1
+cm4gbnVsbAp0PVAuUWUodGhpcy5hW2FdKQpyZXR1cm4gdGhpcy5iW2FdPXR9fQpQLmk4LnByb3RvdHlw
+ZT17CmdBOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYQpyZXR1cm4gdC5nQSh0KX0sCkU6ZnVuY3Rpb24o
+YSxiKXt2YXIgdD10aGlzLmEKaWYodC5iPT1udWxsKXQ9dC5nVigpLkUoMCxiKQplbHNle3Q9dC5DZigp
+CmlmKGI8MHx8Yj49dC5sZW5ndGgpcmV0dXJuIEguT0godCxiKQp0PXRbYl19cmV0dXJuIHR9LApna3o6
+ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hCmlmKHQuYj09bnVsbCl7dD10LmdWKCkKdD10Lmdreih0KX1l
+bHNle3Q9dC5DZigpCnQ9bmV3IEoubTEodCx0Lmxlbmd0aCxILnQ2KHQpLkMoIm0xPDE+IikpfXJldHVy
+biB0fX0KUC5DVi5wcm90b3R5cGU9ewp5cjpmdW5jdGlvbihhLGEwLGExKXt2YXIgdCxzLHIscSxwLG8s
+bixtLGwsayxqLGksaCxnLGYsZSxkLGMsYj0iSW52YWxpZCBiYXNlNjQgZW5jb2RpbmcgbGVuZ3RoICIK
+YTE9UC5qQihhMCxhMSxhLmxlbmd0aCkKdD0kLlY3KCkKZm9yKHM9YTAscj1zLHE9bnVsbCxwPS0xLG89
+LTEsbj0wO3M8YTE7cz1tKXttPXMrMQpsPUMueEIuVyhhLHMpCmlmKGw9PT0zNyl7az1tKzIKaWYoazw9
+YTEpe2o9SC5vbyhDLnhCLlcoYSxtKSkKaT1ILm9vKEMueEIuVyhhLG0rMSkpCmg9aioxNitpLShpJjI1
+NikKaWYoaD09PTM3KWg9LTEKbT1rfWVsc2UgaD0tMX1lbHNlIGg9bAppZigwPD1oJiZoPD0xMjcpe2lm
+KGg8MHx8aD49dC5sZW5ndGgpcmV0dXJuIEguT0godCxoKQpnPXRbaF0KaWYoZz49MCl7aD1DLnhCLm0o
+IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2
+Nzg5Ky8iLGcpCmlmKGg9PT1sKWNvbnRpbnVlCmw9aH1lbHNle2lmKGc9PT0tMSl7aWYocDwwKXtmPXE9
+PW51bGw/bnVsbDpxLmEubGVuZ3RoCmlmKGY9PW51bGwpZj0wCnA9Zisocy1yKQpvPXN9KytuCmlmKGw9
+PT02MSljb250aW51ZX1sPWh9aWYoZyE9PS0yKXtpZihxPT1udWxsKXE9bmV3IFAuUm4oIiIpCnEuYSs9
+Qy54Qi5OaihhLHIscykKcS5hKz1ILkx3KGwpCnI9bQpjb250aW51ZX19dGhyb3cgSC5iKFAucnIoIklu
+dmFsaWQgYmFzZTY0IGRhdGEiLGEscykpfWlmKHEhPW51bGwpe2Y9cS5hKz1DLnhCLk5qKGEscixhMSkK
+ZT1mLmxlbmd0aAppZihwPj0wKVAueE0oYSxvLGExLHAsbixlKQplbHNle2Q9Qy5qbi56WShlLTEsNCkr
+MQppZihkPT09MSl0aHJvdyBILmIoUC5ycihiLGEsYTEpKQpmb3IoO2Q8NDspe2YrPSI9IgpxLmE9Zjsr
+K2R9fWY9cS5hCnJldHVybiBDLnhCLmk3KGEsYTAsYTEsZi5jaGFyQ29kZUF0KDApPT0wP2Y6Zil9Yz1h
+MS1hMAppZihwPj0wKVAueE0oYSxvLGExLHAsbixjKQplbHNle2Q9Qy5qbi56WShjLDQpCmlmKGQ9PT0x
+KXRocm93IEguYihQLnJyKGIsYSxhMSkpCmlmKGQ+MSlhPUMueEIuaTcoYSxhMSxhMSxkPT09Mj8iPT0i
+OiI9Iil9cmV0dXJuIGF9fQpQLlU4LnByb3RvdHlwZT17fQpQLlVrLnByb3RvdHlwZT17fQpQLndJLnBy
+b3RvdHlwZT17fQpQLlppLnByb3RvdHlwZT17fQpQLmJ5LnByb3RvdHlwZT17CnBXOmZ1bmN0aW9uKGEs
+YixjKXt2YXIgdAp1LmVwLmIoYykKdD1QLkJTKGIsdGhpcy5nSGUoKS5hKQpyZXR1cm4gdH0sCmdIZTpm
+dW5jdGlvbigpe3JldHVybiBDLkEzfX0KUC5NeC5wcm90b3R5cGU9e30KUC51NS5wcm90b3R5cGU9ewpn
+WkU6ZnVuY3Rpb24oKXtyZXR1cm4gQy5Ra319ClAuRTMucHJvdG90eXBlPXsKV0o6ZnVuY3Rpb24oYSl7
+dmFyIHQscyxyPVAuakIoMCxudWxsLGEubGVuZ3RoKSxxPXItMAppZihxPT09MClyZXR1cm4gbmV3IFVp
+bnQ4QXJyYXkoMCkKdD1uZXcgVWludDhBcnJheShxKjMpCnM9bmV3IFAuUncodCkKaWYocy5HeChhLDAs
+cikhPT1yKXMuTzYoSi5hNihhLHItMSksMCkKcmV0dXJuIG5ldyBVaW50OEFycmF5KHQuc3ViYXJyYXko
+MCxILnJNKDAscy5iLHQubGVuZ3RoKSkpfX0KUC5Sdy5wcm90b3R5cGU9ewpPNjpmdW5jdGlvbihhLGIp
+e3ZhciB0LHM9dGhpcyxyPXMuYyxxPXMuYixwPXErMSxvPXIubGVuZ3RoCmlmKChiJjY0NTEyKT09PTU2
+MzIwKXt0PTY1NTM2KygoYSYxMDIzKTw8MTApfGImMTAyMwpzLmI9cAppZihxPj1vKXJldHVybiBILk9I
+KHIscSkKcltxXT0yNDB8dD4+PjE4CnE9cy5iPXArMQppZihwPj1vKXJldHVybiBILk9IKHIscCkKcltw
+XT0xMjh8dD4+PjEyJjYzCnA9cy5iPXErMQppZihxPj1vKXJldHVybiBILk9IKHIscSkKcltxXT0xMjh8
+dD4+PjYmNjMKcy5iPXArMQppZihwPj1vKXJldHVybiBILk9IKHIscCkKcltwXT0xMjh8dCY2MwpyZXR1
+cm4hMH1lbHNle3MuYj1wCmlmKHE+PW8pcmV0dXJuIEguT0gocixxKQpyW3FdPTIyNHxhPj4+MTIKcT1z
+LmI9cCsxCmlmKHA+PW8pcmV0dXJuIEguT0gocixwKQpyW3BdPTEyOHxhPj4+NiY2MwpzLmI9cSsxCmlm
+KHE+PW8pcmV0dXJuIEguT0gocixxKQpyW3FdPTEyOHxhJjYzCnJldHVybiExfX0sCkd4OmZ1bmN0aW9u
+KGEsYixjKXt2YXIgdCxzLHIscSxwLG8sbixtPXRoaXMKaWYoYiE9PWMmJihDLnhCLm0oYSxjLTEpJjY0
+NTEyKT09PTU1Mjk2KS0tYwpmb3IodD1tLmMscz10Lmxlbmd0aCxyPWI7cjxjOysrcil7cT1DLnhCLlco
+YSxyKQppZihxPD0xMjcpe3A9bS5iCmlmKHA+PXMpYnJlYWsKbS5iPXArMQp0W3BdPXF9ZWxzZSBpZigo
+cSY2NDUxMik9PT01NTI5Nil7aWYobS5iKzM+PXMpYnJlYWsKbz1yKzEKaWYobS5PNihxLEMueEIuVyhh
+LG8pKSlyPW99ZWxzZSBpZihxPD0yMDQ3KXtwPW0uYgpuPXArMQppZihuPj1zKWJyZWFrCm0uYj1uCmlm
+KHA+PXMpcmV0dXJuIEguT0godCxwKQp0W3BdPTE5MnxxPj4+NgptLmI9bisxCnRbbl09MTI4fHEmNjN9
+ZWxzZXtwPW0uYgppZihwKzI+PXMpYnJlYWsKbj1tLmI9cCsxCmlmKHA+PXMpcmV0dXJuIEguT0godCxw
+KQp0W3BdPTIyNHxxPj4+MTIKcD1tLmI9bisxCmlmKG4+PXMpcmV0dXJuIEguT0godCxuKQp0W25dPTEy
+OHxxPj4+NiY2MwptLmI9cCsxCmlmKHA+PXMpcmV0dXJuIEguT0godCxwKQp0W3BdPTEyOHxxJjYzfX1y
+ZXR1cm4gcn19ClAuR1kucHJvdG90eXBlPXsKV0o6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG4s
+bSxsCnUuTC5iKGEpCnQ9UC5reSghMSxhLDAsbnVsbCkKaWYodCE9bnVsbClyZXR1cm4gdApzPVAuakIo
+MCxudWxsLEouSG0oYSkpCnI9UC5jUChhLDAscykKaWYocj4wKXtxPVAuSE0oYSwwLHIpCmlmKHI9PT1z
+KXJldHVybiBxCnA9bmV3IFAuUm4ocSkKbz1yCm49ITF9ZWxzZXtvPTAKcD1udWxsCm49ITB9aWYocD09
+bnVsbClwPW5ldyBQLlJuKCIiKQptPW5ldyBQLmJ6KCExLHApCm0uYz1uCm0uTUUoYSxvLHMpCmlmKG0u
+ZT4wKXtILnZoKFAucnIoIlVuZmluaXNoZWQgVVRGLTggb2N0ZXQgc2VxdWVuY2UiLGEscykpCnAuYSs9
+SC5Mdyg2NTUzMykKbS5mPW0uZT1tLmQ9MH1sPXAuYQpyZXR1cm4gbC5jaGFyQ29kZUF0KDApPT0wP2w6
+bH19ClAuYnoucHJvdG90eXBlPXsKTUU6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0LHMscixxLHAsbyxuLG0s
+bCxrLGosaSxoPXRoaXMsZz0iQmFkIFVURi04IGVuY29kaW5nIDB4Igp1LkwuYihhKQp0PWguZApzPWgu
+ZQpyPWguZgpoLmY9aC5lPWguZD0wCiRsYWJlbDAkMDpmb3IocT1KLlU2KGEpLHA9aC5iLG89YjshMDtv
+PWopeyRsYWJlbDEkMTppZihzPjApe2Rve2lmKG89PT1jKWJyZWFrICRsYWJlbDAkMApuPXEucShhLG8p
+CmlmKHR5cGVvZiBuIT09Im51bWJlciIpcmV0dXJuIG4uek0oKQppZigobiYxOTIpIT09MTI4KXttPVAu
+cnIoZytDLmpuLldaKG4sMTYpLGEsbykKdGhyb3cgSC5iKG0pfWVsc2V7dD0odDw8NnxuJjYzKT4+PjA7
+LS1zOysrb319d2hpbGUocz4wKQptPXItMQppZihtPDB8fG0+PTQpcmV0dXJuIEguT0goQy5HYixtKQpp
+Zih0PD1DLkdiW21dKXttPVAucnIoIk92ZXJsb25nIGVuY29kaW5nIG9mIDB4IitDLmpuLldaKHQsMTYp
+LGEsby1yLTEpCnRocm93IEguYihtKX1pZih0PjExMTQxMTEpe209UC5ycigiQ2hhcmFjdGVyIG91dHNp
+ZGUgdmFsaWQgVW5pY29kZSByYW5nZTogMHgiK0Muam4uV1oodCwxNiksYSxvLXItMSkKdGhyb3cgSC5i
+KG0pfWlmKCFoLmN8fHQhPT02NTI3OSlwLmErPUguTHcodCkKaC5jPSExfWZvcihtPW88YzttOyl7bD1Q
+LmNQKGEsbyxjKQppZihsPjApe2guYz0hMQprPW8rbApwLmErPVAuSE0oYSxvLGspCmlmKGs9PT1jKWJy
+ZWFrfWVsc2Ugaz1vCmo9aysxCm49cS5xKGEsaykKaWYodHlwZW9mIG4hPT0ibnVtYmVyIilyZXR1cm4g
+bi5KKCkKaWYobjwwKXtpPVAucnIoIk5lZ2F0aXZlIFVURi04IGNvZGUgdW5pdDogLTB4IitDLmpuLlda
+KC1uLDE2KSxhLGotMSkKdGhyb3cgSC5iKGkpfWVsc2V7aWYoKG4mMjI0KT09PTE5Mil7dD1uJjMxCnM9
+MQpyPTEKY29udGludWUgJGxhYmVsMCQwfWlmKChuJjI0MCk9PT0yMjQpe3Q9biYxNQpzPTIKcj0yCmNv
+bnRpbnVlICRsYWJlbDAkMH1pZigobiYyNDgpPT09MjQwJiZuPDI0NSl7dD1uJjcKcz0zCnI9Mwpjb250
+aW51ZSAkbGFiZWwwJDB9aT1QLnJyKGcrQy5qbi5XWihuLDE2KSxhLGotMSkKdGhyb3cgSC5iKGkpfX1i
+cmVhayAkbGFiZWwwJDB9aWYocz4wKXtoLmQ9dApoLmU9cwpoLmY9cn19fQpQLldGLnByb3RvdHlwZT17
+CiQyOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyCnUuZm8uYihhKQp0PXRoaXMuYgpzPXRoaXMuYQp0LmEr
+PXMuYQpyPXQuYSs9SC5kKGEuYSkKdC5hPXIrIjogIgp0LmErPVAucChiKQpzLmE9IiwgIn0sCiRTOjMy
+fQpQLmEyLnByb3RvdHlwZT17fQpQLmlQLnByb3RvdHlwZT17CkROOmZ1bmN0aW9uKGEsYil7aWYoYj09
+bnVsbClyZXR1cm4hMQpyZXR1cm4gYiBpbnN0YW5jZW9mIFAuaVAmJnRoaXMuYT09PWIuYSYmITB9LApn
+aU86ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5hCnJldHVybih0XkMuam4ud0codCwzMCkpJjEwNzM3NDE4
+MjN9LAp3OmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMscz1QLkdxKEgudEoodCkpLHI9UC5oMChILk5TKHQp
+KSxxPVAuaDAoSC5qQSh0KSkscD1QLmgwKEguS0wodCkpLG89UC5oMChILmNoKHQpKSxuPVAuaDAoSC5K
+ZCh0KSksbT1QLlZ4KEgubzEodCkpLGw9cysiLSIrcisiLSIrcSsiICIrcCsiOiIrbysiOiIrbisiLiIr
+bQpyZXR1cm4gbH19ClAuQ1AucHJvdG90eXBlPXt9ClAuWFMucHJvdG90eXBlPXt9ClAuQzYucHJvdG90
+eXBlPXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEKaWYodCE9bnVsbClyZXR1cm4iQXNzZXJ0aW9u
+IGZhaWxlZDogIitQLnAodCkKcmV0dXJuIkFzc2VydGlvbiBmYWlsZWQifX0KUC5uLnByb3RvdHlwZT17
+Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIlRocm93IG9mIG51bGwuIn19ClAudS5wcm90b3R5cGU9ewpnWjpm
+dW5jdGlvbigpe3JldHVybiJJbnZhbGlkIGFyZ3VtZW50IisoIXRoaXMuYT8iKHMpIjoiIil9LApndTpm
+dW5jdGlvbigpe3JldHVybiIifSwKdzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwPXRoaXMsbz1wLmMs
+bj1vIT1udWxsPyIgKCIrbysiKSI6IiIKbz1wLmQKdD1vPT1udWxsPyIiOiI6ICIrSC5kKG8pCnM9cC5n
+WigpK24rdAppZighcC5hKXJldHVybiBzCnI9cC5ndSgpCnE9UC5wKHAuYikKcmV0dXJuIHMrcisiOiAi
+K3F9fQpQLmJKLnByb3RvdHlwZT17CmdaOmZ1bmN0aW9uKCl7cmV0dXJuIlJhbmdlRXJyb3IifSwKZ3U6
+ZnVuY3Rpb24oKXt2YXIgdCxzLHI9dGhpcy5lCmlmKHI9PW51bGwpe3I9dGhpcy5mCnQ9ciE9bnVsbD8i
+OiBOb3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICIrSC5kKHIpOiIifWVsc2V7cz10aGlzLmYKaWYocz09
+bnVsbCl0PSI6IE5vdCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIitILmQocikKZWxzZSBpZihzPnIp
+dD0iOiBOb3QgaW4gcmFuZ2UgIitILmQocikrIi4uIitILmQocykrIiwgaW5jbHVzaXZlIgplbHNlIHQ9
+czxyPyI6IFZhbGlkIHZhbHVlIHJhbmdlIGlzIGVtcHR5IjoiOiBPbmx5IHZhbGlkIHZhbHVlIGlzICIr
+SC5kKHIpfXJldHVybiB0fX0KUC5lWS5wcm90b3R5cGU9ewpnWjpmdW5jdGlvbigpe3JldHVybiJSYW5n
+ZUVycm9yIn0sCmd1OmZ1bmN0aW9uKCl7dmFyIHQscz1ILlNjKHRoaXMuYikKaWYodHlwZW9mIHMhPT0i
+bnVtYmVyIilyZXR1cm4gcy5KKCkKaWYoczwwKXJldHVybiI6IGluZGV4IG11c3Qgbm90IGJlIG5lZ2F0
+aXZlIgp0PXRoaXMuZgppZih0PT09MClyZXR1cm4iOiBubyBpbmRpY2VzIGFyZSB2YWxpZCIKcmV0dXJu
+IjogaW5kZXggc2hvdWxkIGJlIGxlc3MgdGhhbiAiK0guZCh0KX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVy
+biB0aGlzLmZ9fQpQLm1wLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG4s
+bSxsPXRoaXMsaz17fSxqPW5ldyBQLlJuKCIiKQprLmE9IiIKZm9yKHQ9bC5jLHM9dC5sZW5ndGgscj0w
+LHE9IiIscD0iIjtyPHM7KytyLHA9IiwgIil7bz10W3JdCmouYT1xK3AKcT1qLmErPVAucChvKQprLmE9
+IiwgIn1sLmQuSygwLG5ldyBQLldGKGssaikpCm49UC5wKGwuYSkKbT1qLncoMCkKdD0iTm9TdWNoTWV0
+aG9kRXJyb3I6IG1ldGhvZCBub3QgZm91bmQ6ICciK0guZChsLmIuYSkrIidcblJlY2VpdmVyOiAiK24r
+IlxuQXJndW1lbnRzOiBbIittKyJdIgpyZXR1cm4gdH19ClAudWIucHJvdG90eXBlPXsKdzpmdW5jdGlv
+bihhKXtyZXR1cm4iVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiAiK3RoaXMuYX19ClAuZHMucHJvdG90eXBl
+PXsKdzpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEKcmV0dXJuIHQhPW51bGw/IlVuaW1wbGVtZW50ZWRF
+cnJvcjogIit0OiJVbmltcGxlbWVudGVkRXJyb3IifX0KUC5sai5wcm90b3R5cGU9ewp3OmZ1bmN0aW9u
+KGEpe3JldHVybiJCYWQgc3RhdGU6ICIrdGhpcy5hfX0KUC5VVi5wcm90b3R5cGU9ewp3OmZ1bmN0aW9u
+KGEpe3ZhciB0PXRoaXMuYQppZih0PT1udWxsKXJldHVybiJDb25jdXJyZW50IG1vZGlmaWNhdGlvbiBk
+dXJpbmcgaXRlcmF0aW9uLiIKcmV0dXJuIkNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGR1cmluZyBpdGVy
+YXRpb246ICIrUC5wKHQpKyIuIn19ClAuazUucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1cm4i
+T3V0IG9mIE1lbW9yeSJ9LAokaVhTOjF9ClAuS1kucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1
+cm4iU3RhY2sgT3ZlcmZsb3cifSwKJGlYUzoxfQpQLmMucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXt2
+YXIgdD10aGlzLmEKcmV0dXJuIHQ9PW51bGw/IlJlYWRpbmcgc3RhdGljIHZhcmlhYmxlIGR1cmluZyBp
+dHMgaW5pdGlhbGl6YXRpb24iOiJSZWFkaW5nIHN0YXRpYyB2YXJpYWJsZSAnIit0KyInIGR1cmluZyBp
+dHMgaW5pdGlhbGl6YXRpb24ifX0KUC5DRC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiJF
+eGNlcHRpb246ICIrdGhpcy5hfX0KUC5hRS5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3ZhciB0LHMs
+cixxLHAsbyxuLG0sbCxrLGosaSxoPXRoaXMuYSxnPWghPW51bGwmJiIiIT09aD8iRm9ybWF0RXhjZXB0
+aW9uOiAiK0guZChoKToiRm9ybWF0RXhjZXB0aW9uIixmPXRoaXMuYyxlPXRoaXMuYgppZih0eXBlb2Yg
+ZT09InN0cmluZyIpe2lmKGYhPW51bGwpaD1mPDB8fGY+ZS5sZW5ndGgKZWxzZSBoPSExCmlmKGgpZj1u
+dWxsCmlmKGY9PW51bGwpe3Q9ZS5sZW5ndGg+Nzg/Qy54Qi5OaihlLDAsNzUpKyIuLi4iOmUKcmV0dXJu
+IGcrIlxuIit0fWZvcihzPTEscj0wLHE9ITEscD0wO3A8ZjsrK3Ape289Qy54Qi5XKGUscCkKaWYobz09
+PTEwKXtpZihyIT09cHx8IXEpKytzCnI9cCsxCnE9ITF9ZWxzZSBpZihvPT09MTMpeysrcwpyPXArMQpx
+PSEwfX1nPXM+MT9nKygiIChhdCBsaW5lICIrcysiLCBjaGFyYWN0ZXIgIisoZi1yKzEpKyIpXG4iKTpn
+KygiIChhdCBjaGFyYWN0ZXIgIisoZisxKSsiKVxuIikKbj1lLmxlbmd0aApmb3IocD1mO3A8bjsrK3Ap
+e289Qy54Qi5tKGUscCkKaWYobz09PTEwfHxvPT09MTMpe249cApicmVha319aWYobi1yPjc4KWlmKGYt
+cjw3NSl7bT1yKzc1Cmw9cgprPSIiCmo9Ii4uLiJ9ZWxzZXtpZihuLWY8NzUpe2w9bi03NQptPW4Kaj0i
+In1lbHNle2w9Zi0zNgptPWYrMzYKaj0iLi4uIn1rPSIuLi4ifWVsc2V7bT1uCmw9cgprPSIiCmo9IiJ9
+aT1DLnhCLk5qKGUsbCxtKQpyZXR1cm4gZytrK2kraisiXG4iK0MueEIuSXgoIiAiLGYtbCtrLmxlbmd0
+aCkrIl5cbiJ9ZWxzZSByZXR1cm4gZiE9bnVsbD9nKygiIChhdCBvZmZzZXQgIitILmQoZikrIikiKTpn
+fX0KUC5FSC5wcm90b3R5cGU9e30KUC5LTi5wcm90b3R5cGU9e30KUC5jWC5wcm90b3R5cGU9ewpldjpm
+dW5jdGlvbihhLGIpe3ZhciB0PUguTGgodGhpcykKcmV0dXJuIG5ldyBILlU1KHRoaXMsdC5DKCJhMihj
+WC5FKSIpLmIoYiksdC5DKCJVNTxjWC5FPiIpKX0sCmdBOmZ1bmN0aW9uKGEpe3ZhciB0LHM9dGhpcy5n
+a3oodGhpcykKZm9yKHQ9MDtzLkYoKTspKyt0CnJldHVybiB0fSwKZ2wwOmZ1bmN0aW9uKGEpe3JldHVy
+biF0aGlzLmdreih0aGlzKS5GKCl9LApncjg6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlzLmdreih0aGlz
+KQppZighcy5GKCkpdGhyb3cgSC5iKEguV3AoKSkKdD1zLmdsKCkKaWYocy5GKCkpdGhyb3cgSC5iKEgu
+ZFUoKSkKcmV0dXJuIHR9LApFOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyClAuazEoYiwiaW5kZXgiKQpm
+b3IodD10aGlzLmdreih0aGlzKSxzPTA7dC5GKCk7KXtyPXQuZ2woKQppZihiPT09cylyZXR1cm4gcjsr
+K3N9dGhyb3cgSC5iKFAuQ2YoYix0aGlzLCJpbmRleCIsbnVsbCxzKSl9LAp3OmZ1bmN0aW9uKGEpe3Jl
+dHVybiBQLkVQKHRoaXMsIigiLCIpIil9fQpQLkFuLnByb3RvdHlwZT17fQpQLnpNLnByb3RvdHlwZT17
+JGljWDoxfQpQLlowLnByb3RvdHlwZT17fQpQLmM4LnByb3RvdHlwZT17CmdpTzpmdW5jdGlvbihhKXty
+ZXR1cm4gUC5rLnByb3RvdHlwZS5naU8uY2FsbCh0aGlzLHRoaXMpfSwKdzpmdW5jdGlvbihhKXtyZXR1
+cm4ibnVsbCJ9fQpQLkZLLnByb3RvdHlwZT17fQpQLmsucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpQLmss
+JGlrOjEsCkROOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXM9PT1ifSwKZ2lPOmZ1bmN0aW9uKGEpe3Jl
+dHVybiBILmVRKHRoaXMpfSwKdzpmdW5jdGlvbihhKXtyZXR1cm4iSW5zdGFuY2Ugb2YgJyIrSC5kKEgu
+TSh0aGlzKSkrIicifSwKZTc6ZnVuY3Rpb24oYSxiKXt1Lm8uYihiKQp0aHJvdyBILmIoUC5scih0aGlz
+LGIuZ1dhKCksYi5nbmQoKSxiLmdWbSgpKSl9LAp0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlz
+LncodGhpcyl9fQpQLk9kLnByb3RvdHlwZT17fQpQLmliLnByb3RvdHlwZT17JGlPZDoxfQpQLnh1LnBy
+b3RvdHlwZT17fQpQLkd6LnByb3RvdHlwZT17fQpQLnFVLnByb3RvdHlwZT17JGl2WDoxfQpQLlJuLnBy
+b3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEubGVuZ3RofSwKdzpmdW5jdGlvbihh
+KXt2YXIgdD10aGlzLmEKcmV0dXJuIHQuY2hhckNvZGVBdCgwKT09MD90OnR9LAokaUJMOjF9ClAuR0Qu
+cHJvdG90eXBlPXt9ClAubjEucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscQp1
+LmYuYihhKQpILnkoYikKdD1KLnJZKGIpLk9ZKGIsIj0iKQppZih0PT09LTEpe2lmKGIhPT0iIilhLlko
+MCxQLmt1KGIsMCxiLmxlbmd0aCx0aGlzLmEsITApLCIiKX1lbHNlIGlmKHQhPT0wKXtzPUMueEIuTmoo
+YiwwLHQpCnI9Qy54Qi5HKGIsdCsxKQpxPXRoaXMuYQphLlkoMCxQLmt1KHMsMCxzLmxlbmd0aCxxLCEw
+KSxQLmt1KHIsMCxyLmxlbmd0aCxxLCEwKSl9cmV0dXJuIGF9LAokUzozOX0KUC5jUy5wcm90b3R5cGU9
+ewokMjpmdW5jdGlvbihhLGIpe3Rocm93IEguYihQLnJyKCJJbGxlZ2FsIElQdjQgYWRkcmVzcywgIith
+LHRoaXMuYSxiKSl9LAokUzoyOX0KUC5WQy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3Rocm93
+IEguYihQLnJyKCJJbGxlZ2FsIElQdjYgYWRkcmVzcywgIithLHRoaXMuYSxiKSl9LAokMTpmdW5jdGlv
+bihhKXtyZXR1cm4gdGhpcy4kMihhLG51bGwpfSwKJFM6MjZ9ClAudHAucHJvdG90eXBlPXsKJDI6ZnVu
+Y3Rpb24oYSxiKXt2YXIgdAppZihiLWE+NCl0aGlzLmEuJDIoImFuIElQdjYgcGFydCBjYW4gb25seSBj
+b250YWluIGEgbWF4aW11bSBvZiA0IGhleCBkaWdpdHMiLGEpCnQ9UC5RQShDLnhCLk5qKHRoaXMuYixh
+LGIpLG51bGwsMTYpCmlmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJuIHQuSigpCmlmKHQ8MHx8dD42
+NTUzNSl0aGlzLmEuJDIoImVhY2ggcGFydCBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiBgMHgwLi4weEZG
+RkZgIixhKQpyZXR1cm4gdH0sCiRTOjE5fQpQLkRuLnByb3RvdHlwZT17CmdrdTpmdW5jdGlvbigpe3Jl
+dHVybiB0aGlzLmJ9LApnSmY6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5jCmlmKHQ9PW51bGwpcmV0dXJu
+IiIKaWYoQy54Qi5uKHQsIlsiKSlyZXR1cm4gQy54Qi5Oaih0LDEsdC5sZW5ndGgtMSkKcmV0dXJuIHR9
+LApndHA6ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpcy5kCmlmKHQ9PW51bGwpcmV0dXJuIFAud0sodGhpcy5h
+KQpyZXR1cm4gdH0sCmd0UDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZgpyZXR1cm4gdD09bnVsbD8iIjp0
+fSwKZ0thOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yCnJldHVybiB0PT1udWxsPyIiOnR9LApubTpmdW5j
+dGlvbihhLGIpe3ZhciB0LHMscixxLHAsbyxuLG0sbD10aGlzCnUuWC5iKG51bGwpCnUuYi5iKGIpCnQ9
+bC5hCnM9dD09PSJmaWxlIgpyPWwuYgpxPWwuZApwPWwuYwppZighKHAhPW51bGwpKXA9ci5sZW5ndGgh
+PT0wfHxxIT1udWxsfHxzPyIiOm51bGwKbz1sLmUKaWYoIXMpbj1wIT1udWxsJiZvLmxlbmd0aCE9PTAK
+ZWxzZSBuPSEwCmlmKG4mJiFDLnhCLm4obywiLyIpKW89Ii8iK28KaWYoYiE9bnVsbCltPVAubGUobnVs
+bCwwLDAsYikKZWxzZSBtPWwuZgpyZXR1cm4gbmV3IFAuRG4odCxyLHAscSxvLG0sbC5yKX0sCmdGajpm
+dW5jdGlvbigpe3ZhciB0LHM9dGhpcy54CmlmKHMhPW51bGwpcmV0dXJuIHMKdD10aGlzLmUKaWYodC5s
+ZW5ndGghPT0wJiZDLnhCLlcodCwwKT09PTQ3KXQ9Qy54Qi5HKHQsMSkKcz10PT09IiI/Qy5kbjpQLkFG
+KG5ldyBILkE4KEguVk0odC5zcGxpdCgiLyIpLHUucyksdS5kTy5iKFAuUEgoKSksdS5kbyksdS5OKQp0
+aGlzLnNvNihzKQpyZXR1cm4gc30sCmdoWTpmdW5jdGlvbigpe3ZhciB0LHM9dGhpcwppZihzLlE9PW51
+bGwpe3Q9cy5mCnMuc1JIKG5ldyBQLkdqKFAuV1godD09bnVsbD8iIjp0KSx1LlQpKX1yZXR1cm4gcy5R
+fSwKSmg6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscSxwLG8KZm9yKHQ9MCxzPTA7Qy54Qi5RaShiLCIu
+Li8iLHMpOyl7cys9MzsrK3R9cj1DLnhCLmNuKGEsIi8iKQp3aGlsZSghMCl7aWYoIShyPjAmJnQ+MCkp
+YnJlYWsKcT1DLnhCLlBrKGEsIi8iLHItMSkKaWYocTwwKWJyZWFrCnA9ci1xCm89cCE9PTIKaWYoIW98
+fHA9PT0zKWlmKEMueEIubShhLHErMSk9PT00NilvPSFvfHxDLnhCLm0oYSxxKzIpPT09NDYKZWxzZSBv
+PSExCmVsc2Ugbz0hMQppZihvKWJyZWFrOy0tdApyPXF9cmV0dXJuIEMueEIuaTcoYSxyKzEsbnVsbCxD
+LnhCLkcoYixzLTMqdCkpfSwKWkk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubVMoUC5oSyhhKSl9LApt
+UzpmdW5jdGlvbihhKXt2YXIgdCxzLHIscSxwLG8sbixtLGwsaz10aGlzLGo9bnVsbAppZihhLmdGaSgp
+Lmxlbmd0aCE9PTApe3Q9YS5nRmkoKQppZihhLmdjaigpKXtzPWEuZ2t1KCkKcj1hLmdKZihhKQpxPWEu
+Z3hBKCk/YS5ndHAoYSk6an1lbHNle3E9agpyPXEKcz0iIn1wPVAueGUoYS5nSWkoYSkpCm89YS5nUUQo
+KT9hLmd0UCgpOmp9ZWxzZXt0PWsuYQppZihhLmdjaigpKXtzPWEuZ2t1KCkKcj1hLmdKZihhKQpxPVAu
+d0IoYS5neEEoKT9hLmd0cChhKTpqLHQpCnA9UC54ZShhLmdJaShhKSkKbz1hLmdRRCgpP2EuZ3RQKCk6
+an1lbHNle3M9ay5iCnI9ay5jCnE9ay5kCmlmKGEuZ0lpKGEpPT09IiIpe3A9ay5lCm89YS5nUUQoKT9h
+Lmd0UCgpOmsuZn1lbHNle2lmKGEuZ3RUKCkpcD1QLnhlKGEuZ0lpKGEpKQplbHNle249ay5lCmlmKG4u
+bGVuZ3RoPT09MClpZihyPT1udWxsKXA9dC5sZW5ndGg9PT0wP2EuZ0lpKGEpOlAueGUoYS5nSWkoYSkp
+CmVsc2UgcD1QLnhlKCIvIithLmdJaShhKSkKZWxzZXttPWsuSmgobixhLmdJaShhKSkKbD10Lmxlbmd0
+aD09PTAKaWYoIWx8fHIhPW51bGx8fEMueEIubihuLCIvIikpcD1QLnhlKG0pCmVsc2UgcD1QLndGKG0s
+IWx8fHIhPW51bGwpfX1vPWEuZ1FEKCk/YS5ndFAoKTpqfX19cmV0dXJuIG5ldyBQLkRuKHQscyxyLHEs
+cCxvLGEuZ1o4KCk/YS5nS2EoKTpqKX0sCmdjajpmdW5jdGlvbigpe3JldHVybiB0aGlzLmMhPW51bGx9
+LApneEE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kIT1udWxsfSwKZ1FEOmZ1bmN0aW9uKCl7cmV0dXJu
+IHRoaXMuZiE9bnVsbH0sCmdaODpmdW5jdGlvbigpe3JldHVybiB0aGlzLnIhPW51bGx9LApndFQ6ZnVu
+Y3Rpb24oKXtyZXR1cm4gQy54Qi5uKHRoaXMuZSwiLyIpfSwKdDQ6ZnVuY3Rpb24oKXt2YXIgdCxzLHI9
+dGhpcyxxPXIuYQppZihxIT09IiImJnEhPT0iZmlsZSIpdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBleHRy
+YWN0IGEgZmlsZSBwYXRoIGZyb20gYSAiK0guZChxKSsiIFVSSSIpKQpxPXIuZgppZigocT09bnVsbD8i
+IjpxKSE9PSIiKXRocm93IEguYihQLkw0KCJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEg
+VVJJIHdpdGggYSBxdWVyeSBjb21wb25lbnQiKSkKcT1yLnIKaWYoKHE9PW51bGw/IiI6cSkhPT0iIil0
+aHJvdyBILmIoUC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhIFVSSSB3aXRoIGEg
+ZnJhZ21lbnQgY29tcG9uZW50IikpCnQ9JC53USgpCmlmKEgub1QodCkpcT1QLm1uKHIpCmVsc2V7aWYo
+ci5jIT1udWxsJiZyLmdKZihyKSE9PSIiKUgudmgoUC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBub24tV2lu
+ZG93cyBmaWxlIHBhdGggZnJvbSBhIGZpbGUgVVJJIHdpdGggYW4gYXV0aG9yaXR5IikpCnM9ci5nRmoo
+KQpQLmtFKHMsITEpCnE9UC52ZyhDLnhCLm4oci5lLCIvIik/Ii8iOiIiLHMsIi8iKQpxPXEuY2hhckNv
+ZGVBdCgwKT09MD9xOnF9cmV0dXJuIHF9LAp3OmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxPXRoaXMscD1x
+LnkKaWYocD09bnVsbCl7cD1xLmEKdD1wLmxlbmd0aCE9PTA/cCsiOiI6IiIKcz1xLmMKcj1zPT1udWxs
+CmlmKCFyfHxwPT09ImZpbGUiKXtwPXQrIi8vIgp0PXEuYgppZih0Lmxlbmd0aCE9PTApcD1wK3QrIkAi
+CmlmKCFyKXArPXMKdD1xLmQKaWYodCE9bnVsbClwPXArIjoiK0guZCh0KX1lbHNlIHA9dApwKz1xLmUK
+dD1xLmYKaWYodCE9bnVsbClwPXArIj8iK3QKdD1xLnIKaWYodCE9bnVsbClwPXArIiMiK3QKcD1xLnk9
+cC5jaGFyQ29kZUF0KDApPT0wP3A6cH1yZXR1cm4gcH0sCkROOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxy
+PXRoaXMKaWYoYj09bnVsbClyZXR1cm4hMQppZihyPT09YilyZXR1cm4hMAppZih1LkQuYyhiKSlpZihy
+LmE9PWIuZ0ZpKCkpaWYoci5jIT1udWxsPT09Yi5nY2ooKSlpZihyLmI9PWIuZ2t1KCkpaWYoci5nSmYo
+cik9PWIuZ0pmKGIpKWlmKHIuZ3RwKHIpPT1iLmd0cChiKSlpZihyLmU9PT1iLmdJaShiKSl7dD1yLmYK
+cz10PT1udWxsCmlmKCFzPT09Yi5nUUQoKSl7aWYocyl0PSIiCmlmKHQ9PT1iLmd0UCgpKXt0PXIucgpz
+PXQ9PW51bGwKaWYoIXM9PT1iLmdaOCgpKXtpZihzKXQ9IiIKdD10PT09Yi5nS2EoKX1lbHNlIHQ9ITF9
+ZWxzZSB0PSExfWVsc2UgdD0hMX1lbHNlIHQ9ITEKZWxzZSB0PSExCmVsc2UgdD0hMQplbHNlIHQ9ITEK
+ZWxzZSB0PSExCmVsc2UgdD0hMQplbHNlIHQ9ITEKcmV0dXJuIHR9LApnaU86ZnVuY3Rpb24oYSl7dmFy
+IHQ9dGhpcy56CnJldHVybiB0PT1udWxsP3RoaXMuej1DLnhCLmdpTyh0aGlzLncoMCkpOnR9LApzbzY6
+ZnVuY3Rpb24oYSl7dGhpcy54PXUuYS5iKGEpfSwKc1JIOmZ1bmN0aW9uKGEpe3RoaXMuUT11LmYuYihh
+KX0sCiRpaUQ6MSwKZ0ZpOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYX0sCmdJaTpmdW5jdGlvbihhKXty
+ZXR1cm4gdGhpcy5lfX0KUC5lMS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt0aHJvdyBILmIoUC5y
+cigiSW52YWxpZCBwb3J0Iix0aGlzLmEsdGhpcy5iKzEpKX0sCiRTOjExfQpQLk5ZLnByb3RvdHlwZT17
+CiQxOmZ1bmN0aW9uKGEpe3ZhciB0PSJJbGxlZ2FsIHBhdGggY2hhcmFjdGVyICIKSC55KGEpCmlmKEou
+emwoYSwiLyIpKWlmKHRoaXMuYSl0aHJvdyBILmIoUC54WSh0K2EpKQplbHNlIHRocm93IEguYihQLkw0
+KHQrYSkpfSwKJFM6MTF9ClAuUloucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuZVAo
+Qy5aSixhLEMueE0sITEpfSwKJFM6NX0KUC5NRS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3Zh
+ciB0PXRoaXMuYixzPXRoaXMuYQp0LmErPXMuYQpzLmE9IiYiCnM9dC5hKz1ILmQoUC5lUChDLkYzLGEs
+Qy54TSwhMCkpCmlmKGIhPW51bGwmJmIubGVuZ3RoIT09MCl7dC5hPXMrIj0iCnQuYSs9SC5kKFAuZVAo
+Qy5GMyxiLEMueE0sITApKX19LAokUzoyMn0KUC55NS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIp
+e3ZhciB0LHMKSC55KGEpCmlmKGI9PW51bGx8fHR5cGVvZiBiPT0ic3RyaW5nIil0aGlzLmEuJDIoYSxI
+LnkoYikpCmVsc2UgZm9yKHQ9Si5JVCh1LlIuYihiKSkscz10aGlzLmE7dC5GKCk7KXMuJDIoYSxILnko
+dC5nbCgpKSl9LAokUzoxMn0KUC5QRS5wcm90b3R5cGU9ewpnbFI6ZnVuY3Rpb24oKXt2YXIgdCxzLHIs
+cSxwPXRoaXMsbz1udWxsLG49cC5jCmlmKG4hPW51bGwpcmV0dXJuIG4Kbj1wLmIKaWYoMD49bi5sZW5n
+dGgpcmV0dXJuIEguT0gobiwwKQp0PXAuYQpuPW5bMF0rMQpzPUMueEIuWFUodCwiPyIsbikKcj10Lmxl
+bmd0aAppZihzPj0wKXtxPVAudU8odCxzKzEscixDLlZDLCExKQpyPXN9ZWxzZSBxPW8KcmV0dXJuIHAu
+Yz1uZXcgUC5xZSgiZGF0YSIsbyxvLG8sUC51Tyh0LG4scixDLldkLCExKSxxLG8pfSwKdzpmdW5jdGlv
+bihhKXt2YXIgdCxzPXRoaXMuYgppZigwPj1zLmxlbmd0aClyZXR1cm4gSC5PSChzLDApCnQ9dGhpcy5h
+CnJldHVybiBzWzBdPT09LTE/ImRhdGE6Iit0OnR9fQpQLnEzLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9u
+KGEpe3JldHVybiBuZXcgVWludDhBcnJheSg5Nil9LAokUzo0Nn0KUC55SS5wcm90b3R5cGU9ewokMjpm
+dW5jdGlvbihhLGIpe3ZhciB0PXRoaXMuYQppZihhPj10Lmxlbmd0aClyZXR1cm4gSC5PSCh0LGEpCnQ9
+dFthXQpKLkNNKHQsMCw5NixiKQpyZXR1cm4gdH0sCiRTOjI0fQpQLmM2LnByb3RvdHlwZT17CiQzOmZ1
+bmN0aW9uKGEsYixjKXt2YXIgdCxzLHIscQpmb3IodD1iLmxlbmd0aCxzPWEubGVuZ3RoLHI9MDtyPHQ7
+KytyKXtxPUMueEIuVyhiLHIpXjk2CmlmKHE+PXMpcmV0dXJuIEguT0goYSxxKQphW3FdPWN9fX0KUC5x
+ZC5wcm90b3R5cGU9ewokMzpmdW5jdGlvbihhLGIsYyl7dmFyIHQscyxyLHEKZm9yKHQ9Qy54Qi5XKGIs
+MCkscz1DLnhCLlcoYiwxKSxyPWEubGVuZ3RoO3Q8PXM7Kyt0KXtxPSh0Xjk2KT4+PjAKaWYocT49cily
+ZXR1cm4gSC5PSChhLHEpCmFbcV09Y319fQpQLlVmLnByb3RvdHlwZT17CmdjajpmdW5jdGlvbigpe3Jl
+dHVybiB0aGlzLmM+MH0sCmd4QTpmdW5jdGlvbigpe3ZhciB0LHMKaWYodGhpcy5jPjApe3Q9dGhpcy5k
+CmlmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJuIHQuaCgpCnM9dGhpcy5lCmlmKHR5cGVvZiBzIT09
+Im51bWJlciIpcmV0dXJuIEgucFkocykKcz10KzE8cwp0PXN9ZWxzZSB0PSExCnJldHVybiB0fSwKZ1FE
+OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5mCmlmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0dXJuIHQuSigp
+CnJldHVybiB0PHRoaXMucn0sCmdaODpmdW5jdGlvbigpe3JldHVybiB0aGlzLnI8dGhpcy5hLmxlbmd0
+aH0sCmdOdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmI9PT00JiZDLnhCLm4odGhpcy5hLCJmaWxlIil9
+LApndmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iPT09NCYmQy54Qi5uKHRoaXMuYSwiaHR0cCIpfSwK
+Z3FCOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYj09PTUmJkMueEIubih0aGlzLmEsImh0dHBzIil9LApn
+dFQ6ZnVuY3Rpb24oKXtyZXR1cm4gQy54Qi5RaSh0aGlzLmEsIi8iLHRoaXMuZSl9LApnRmk6ZnVuY3Rp
+b24oKXt2YXIgdCxzPXRoaXMscj0icGFja2FnZSIscT1zLmIKaWYocTw9MClyZXR1cm4iIgp0PXMueApp
+Zih0IT1udWxsKXJldHVybiB0CmlmKHMuZ3ZoKCkpcT1zLng9Imh0dHAiCmVsc2UgaWYocy5ncUIoKSl7
+cy54PSJodHRwcyIKcT0iaHR0cHMifWVsc2UgaWYocy5nTncoKSl7cy54PSJmaWxlIgpxPSJmaWxlIn1l
+bHNlIGlmKHE9PT03JiZDLnhCLm4ocy5hLHIpKXtzLng9cgpxPXJ9ZWxzZXtxPUMueEIuTmoocy5hLDAs
+cSkKcy54PXF9cmV0dXJuIHF9LApna3U6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmMscz10aGlzLmIrMwpy
+ZXR1cm4gdD5zP0MueEIuTmoodGhpcy5hLHMsdC0xKToiIn0sCmdKZjpmdW5jdGlvbihhKXt2YXIgdD10
+aGlzLmMKcmV0dXJuIHQ+MD9DLnhCLk5qKHRoaXMuYSx0LHRoaXMuZCk6IiJ9LApndHA6ZnVuY3Rpb24o
+YSl7dmFyIHQscz10aGlzCmlmKHMuZ3hBKCkpe3Q9cy5kCmlmKHR5cGVvZiB0IT09Im51bWJlciIpcmV0
+dXJuIHQuaCgpCnJldHVybiBQLlFBKEMueEIuTmoocy5hLHQrMSxzLmUpLG51bGwsbnVsbCl9aWYocy5n
+dmgoKSlyZXR1cm4gODAKaWYocy5ncUIoKSlyZXR1cm4gNDQzCnJldHVybiAwfSwKZ0lpOmZ1bmN0aW9u
+KGEpe3JldHVybiBDLnhCLk5qKHRoaXMuYSx0aGlzLmUsdGhpcy5mKX0sCmd0UDpmdW5jdGlvbigpe3Zh
+ciB0PXRoaXMuZixzPXRoaXMucgppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiB0LkooKQpyZXR1
+cm4gdDxzP0MueEIuTmoodGhpcy5hLHQrMSxzKToiIn0sCmdLYTpmdW5jdGlvbigpe3ZhciB0PXRoaXMu
+cixzPXRoaXMuYQpyZXR1cm4gdDxzLmxlbmd0aD9DLnhCLkcocyx0KzEpOiIifSwKZ0ZqOmZ1bmN0aW9u
+KCl7dmFyIHQscyxyPXRoaXMuZSxxPXRoaXMuZixwPXRoaXMuYQppZihDLnhCLlFpKHAsIi8iLHIpKXtp
+Zih0eXBlb2YgciE9PSJudW1iZXIiKXJldHVybiByLmgoKTsrK3J9aWYocj09cSlyZXR1cm4gQy5kbgp0
+PUguVk0oW10sdS5zKQpzPXIKd2hpbGUoITApe2lmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIHMu
+SigpCmlmKHR5cGVvZiBxIT09Im51bWJlciIpcmV0dXJuIEgucFkocSkKaWYoIShzPHEpKWJyZWFrCmlm
+KEMueEIubShwLHMpPT09NDcpe0MuTm0uaSh0LEMueEIuTmoocCxyLHMpKQpyPXMrMX0rK3N9Qy5ObS5p
+KHQsQy54Qi5OaihwLHIscSkpCnJldHVybiBQLkFGKHQsdS5OKX0sCmdoWTpmdW5jdGlvbigpe3ZhciB0
+PXRoaXMuZgppZih0eXBlb2YgdCE9PSJudW1iZXIiKXJldHVybiB0LkooKQppZih0Pj10aGlzLnIpcmV0
+dXJuIEMuV08KcmV0dXJuIG5ldyBQLkdqKFAuV1godGhpcy5ndFAoKSksdS5UKX0sCmtYOmZ1bmN0aW9u
+KGEpe3ZhciB0LHM9dGhpcy5kCmlmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIHMuaCgpCnQ9cysx
+CnJldHVybiB0K2EubGVuZ3RoPT09dGhpcy5lJiZDLnhCLlFpKHRoaXMuYSxhLHQpfSwKTjk6ZnVuY3Rp
+b24oKXt2YXIgdD10aGlzLHM9dC5yLHI9dC5hCmlmKHM+PXIubGVuZ3RoKXJldHVybiB0CnJldHVybiBu
+ZXcgUC5VZihDLnhCLk5qKHIsMCxzKSx0LmIsdC5jLHQuZCx0LmUsdC5mLHMsdC54KX0sCm5tOmZ1bmN0
+aW9uKGEsYil7dmFyIHQscyxyLHEscCxvLG4sbSxsLGssaixpPXRoaXMsaD1udWxsCnUuWC5iKG51bGwp
+CnUuYi5iKGIpCnQ9aS5nRmkoKQpzPXQ9PT0iZmlsZSIKcj1pLmMKcT1yPjA/Qy54Qi5OaihpLmEsaS5i
+KzMscik6IiIKcD1pLmd4QSgpP2kuZ3RwKGkpOmgKcj1pLmMKaWYocj4wKW89Qy54Qi5OaihpLmEscixp
+LmQpCmVsc2Ugbz1xLmxlbmd0aCE9PTB8fHAhPW51bGx8fHM/IiI6aApyPWkuYQpuPWkuZgptPUMueEIu
+TmoocixpLmUsbikKaWYoIXMpbD1vIT1udWxsJiZtLmxlbmd0aCE9PTAKZWxzZSBsPSEwCmlmKGwmJiFD
+LnhCLm4obSwiLyIpKW09Ii8iK20KaWYoYiE9bnVsbClrPVAubGUoaCwwLDAsYikKZWxzZXtsPWkucgpp
+Zih0eXBlb2YgbiE9PSJudW1iZXIiKXJldHVybiBuLkooKQprPW48bD9DLnhCLk5qKHIsbisxLGwpOmh9
+bj1pLnIKaj1uPHIubGVuZ3RoP0MueEIuRyhyLG4rMSk6aApyZXR1cm4gbmV3IFAuRG4odCxxLG8scCxt
+LGssail9LApaSTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5tUyhQLmhLKGEpKX0sCm1TOmZ1bmN0aW9u
+KGEpe2lmKGEgaW5zdGFuY2VvZiBQLlVmKXJldHVybiB0aGlzLnUxKHRoaXMsYSkKcmV0dXJuIHRoaXMu
+UmUoKS5tUyhhKX0sCnUxOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyLHEscCxvLG4sbSxsLGssaixpLGgs
+ZyxmLGU9Yi5iCmlmKGU+MClyZXR1cm4gYgp0PWIuYwppZih0PjApe3M9YS5iCmlmKHM8PTApcmV0dXJu
+IGIKaWYoYS5nTncoKSlyPWIuZSE9Yi5mCmVsc2UgaWYoYS5ndmgoKSlyPSFiLmtYKCI4MCIpCmVsc2Ug
+cj0hYS5ncUIoKXx8IWIua1goIjQ0MyIpCmlmKHIpe3E9cysxCnA9Qy54Qi5OaihhLmEsMCxxKStDLnhC
+LkcoYi5hLGUrMSkKZT1iLmQKaWYodHlwZW9mIGUhPT0ibnVtYmVyIilyZXR1cm4gZS5oKCkKbz1iLmUK
+aWYodHlwZW9mIG8hPT0ibnVtYmVyIilyZXR1cm4gby5oKCkKbj1iLmYKaWYodHlwZW9mIG4hPT0ibnVt
+YmVyIilyZXR1cm4gbi5oKCkKcmV0dXJuIG5ldyBQLlVmKHAscyx0K3EsZStxLG8rcSxuK3EsYi5yK3Es
+YS54KX1lbHNlIHJldHVybiB0aGlzLlJlKCkubVMoYil9bT1iLmUKZT1iLmYKaWYobT09ZSl7dD1iLnIK
+aWYodHlwZW9mIGUhPT0ibnVtYmVyIilyZXR1cm4gZS5KKCkKaWYoZTx0KXtzPWEuZgppZih0eXBlb2Yg
+cyE9PSJudW1iZXIiKXJldHVybiBzLkhOKCkKcT1zLWUKcmV0dXJuIG5ldyBQLlVmKEMueEIuTmooYS5h
+LDAscykrQy54Qi5HKGIuYSxlKSxhLmIsYS5jLGEuZCxhLmUsZStxLHQrcSxhLngpfWU9Yi5hCmlmKHQ8
+ZS5sZW5ndGgpe3M9YS5yCnJldHVybiBuZXcgUC5VZihDLnhCLk5qKGEuYSwwLHMpK0MueEIuRyhlLHQp
+LGEuYixhLmMsYS5kLGEuZSxhLmYsdCsocy10KSxhLngpfXJldHVybiBhLk45KCl9dD1iLmEKaWYoQy54
+Qi5RaSh0LCIvIixtKSl7cz1hLmUKaWYodHlwZW9mIHMhPT0ibnVtYmVyIilyZXR1cm4gcy5ITigpCmlm
+KHR5cGVvZiBtIT09Im51bWJlciIpcmV0dXJuIEgucFkobSkKcT1zLW0KcD1DLnhCLk5qKGEuYSwwLHMp
+K0MueEIuRyh0LG0pCmlmKHR5cGVvZiBlIT09Im51bWJlciIpcmV0dXJuIGUuaCgpCnJldHVybiBuZXcg
+UC5VZihwLGEuYixhLmMsYS5kLHMsZStxLGIucitxLGEueCl9bD1hLmUKaz1hLmYKaWYobD09ayYmYS5j
+PjApe2Zvcig7Qy54Qi5RaSh0LCIuLi8iLG0pOyl7aWYodHlwZW9mIG0hPT0ibnVtYmVyIilyZXR1cm4g
+bS5oKCkKbSs9M31pZih0eXBlb2YgbCE9PSJudW1iZXIiKXJldHVybiBsLkhOKCkKaWYodHlwZW9mIG0h
+PT0ibnVtYmVyIilyZXR1cm4gSC5wWShtKQpxPWwtbSsxCnA9Qy54Qi5OaihhLmEsMCxsKSsiLyIrQy54
+Qi5HKHQsbSkKaWYodHlwZW9mIGUhPT0ibnVtYmVyIilyZXR1cm4gZS5oKCkKcmV0dXJuIG5ldyBQLlVm
+KHAsYS5iLGEuYyxhLmQsbCxlK3EsYi5yK3EsYS54KX1qPWEuYQpmb3IoaT1sO0MueEIuUWkoaiwiLi4v
+IixpKTspe2lmKHR5cGVvZiBpIT09Im51bWJlciIpcmV0dXJuIGkuaCgpCmkrPTN9aD0wCndoaWxlKCEw
+KXtpZih0eXBlb2YgbSE9PSJudW1iZXIiKXJldHVybiBtLmgoKQpnPW0rMwppZih0eXBlb2YgZSE9PSJu
+dW1iZXIiKXJldHVybiBILnBZKGUpCmlmKCEoZzw9ZSYmQy54Qi5RaSh0LCIuLi8iLG0pKSlicmVhazsr
+K2gKbT1nfWY9IiIKd2hpbGUoITApe2lmKHR5cGVvZiBrIT09Im51bWJlciIpcmV0dXJuIGsub3MoKQpp
+Zih0eXBlb2YgaSE9PSJudW1iZXIiKXJldHVybiBILnBZKGkpCmlmKCEoaz5pKSlicmVhazstLWsKaWYo
+Qy54Qi5tKGosayk9PT00Nyl7aWYoaD09PTApe2Y9Ii8iCmJyZWFrfS0taApmPSIvIn19aWYoaz09PWkm
+JmEuYjw9MCYmIUMueEIuUWkoaiwiLyIsbCkpe20tPWgqMwpmPSIifXE9ay1tK2YubGVuZ3RoCnJldHVy
+biBuZXcgUC5VZihDLnhCLk5qKGosMCxrKStmK0MueEIuRyh0LG0pLGEuYixhLmMsYS5kLGwsZStxLGIu
+citxLGEueCl9LAp0NDpmdW5jdGlvbigpe3ZhciB0LHMscixxLHA9dGhpcwppZihwLmI+PTAmJiFwLmdO
+dygpKXRocm93IEguYihQLkw0KCJDYW5ub3QgZXh0cmFjdCBhIGZpbGUgcGF0aCBmcm9tIGEgIitILmQo
+cC5nRmkoKSkrIiBVUkkiKSkKdD1wLmYKcz1wLmEKaWYodHlwZW9mIHQhPT0ibnVtYmVyIilyZXR1cm4g
+dC5KKCkKaWYodDxzLmxlbmd0aCl7aWYodDxwLnIpdGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBleHRyYWN0
+IGEgZmlsZSBwYXRoIGZyb20gYSBVUkkgd2l0aCBhIHF1ZXJ5IGNvbXBvbmVudCIpKQp0aHJvdyBILmIo
+UC5MNCgiQ2Fubm90IGV4dHJhY3QgYSBmaWxlIHBhdGggZnJvbSBhIFVSSSB3aXRoIGEgZnJhZ21lbnQg
+Y29tcG9uZW50IikpfXI9JC53USgpCmlmKEgub1QocikpdD1QLm1uKHApCmVsc2V7cT1wLmQKaWYodHlw
+ZW9mIHEhPT0ibnVtYmVyIilyZXR1cm4gSC5wWShxKQppZihwLmM8cSlILnZoKFAuTDQoIkNhbm5vdCBl
+eHRyYWN0IGEgbm9uLVdpbmRvd3MgZmlsZSBwYXRoIGZyb20gYSBmaWxlIFVSSSB3aXRoIGFuIGF1dGhv
+cml0eSIpKQp0PUMueEIuTmoocyxwLmUsdCl9cmV0dXJuIHR9LApnaU86ZnVuY3Rpb24oYSl7dmFyIHQ9
+dGhpcy55CnJldHVybiB0PT1udWxsP3RoaXMueT1DLnhCLmdpTyh0aGlzLmEpOnR9LApETjpmdW5jdGlv
+bihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKaWYodGhpcz09PWIpcmV0dXJuITAKcmV0dXJuIHUuRC5j
+KGIpJiZ0aGlzLmE9PT1iLncoMCl9LApSZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMscz1udWxsLHI9dC5n
+RmkoKSxxPXQuZ2t1KCkscD10LmM+MD90LmdKZih0KTpzLG89dC5neEEoKT90Lmd0cCh0KTpzLG49dC5h
+LG09dC5mLGw9Qy54Qi5OaihuLHQuZSxtKSxrPXQucgppZih0eXBlb2YgbSE9PSJudW1iZXIiKXJldHVy
+biBtLkooKQptPW08az90Lmd0UCgpOnMKcmV0dXJuIG5ldyBQLkRuKHIscSxwLG8sbCxtLGs8bi5sZW5n
+dGg/dC5nS2EoKTpzKX0sCnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYX0sCiRpaUQ6MX0KUC5xZS5w
+cm90b3R5cGU9e30KVy5xRS5wcm90b3R5cGU9e30KVy5HaC5wcm90b3R5cGU9ewp3OmZ1bmN0aW9uKGEp
+e3JldHVybiBTdHJpbmcoYSl9LAokaUdoOjF9ClcuZlkucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXty
+ZXR1cm4gU3RyaW5nKGEpfX0KVy5uQi5wcm90b3R5cGU9eyRpbkI6MX0KVy5Bei5wcm90b3R5cGU9eyRp
+QXo6MX0KVy5RUC5wcm90b3R5cGU9eyRpUVA6MX0KVy5ueC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihh
+KXtyZXR1cm4gYS5sZW5ndGh9fQpXLm9KLnByb3RvdHlwZT17CmdBOmZ1bmN0aW9uKGEpe3JldHVybiBh
+Lmxlbmd0aH19ClcuaWQucHJvdG90eXBlPXt9ClcuUUYucHJvdG90eXBlPXt9ClcuTmgucHJvdG90eXBl
+PXsKdzpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEpfX0KVy5JQi5wcm90b3R5cGU9ewp3OmZ1bmN0
+aW9uKGEpe3JldHVybiJSZWN0YW5nbGUgKCIrSC5kKGEubGVmdCkrIiwgIitILmQoYS50b3ApKyIpICIr
+SC5kKGEud2lkdGgpKyIgeCAiK0guZChhLmhlaWdodCl9LApETjpmdW5jdGlvbihhLGIpe2lmKGI9PW51
+bGwpcmV0dXJuITEKcmV0dXJuIHUucS5jKGIpJiZhLmxlZnQ9PT1iLmxlZnQmJmEudG9wPT09Yi50b3Am
+JmEud2lkdGg9PT1iLndpZHRoJiZhLmhlaWdodD09PWIuaGVpZ2h0fSwKZ2lPOmZ1bmN0aW9uKGEpe3Jl
+dHVybiBXLnJFKEMuQ0QuZ2lPKGEubGVmdCksQy5DRC5naU8oYS50b3ApLEMuQ0QuZ2lPKGEud2lkdGgp
+LEMuQ0QuZ2lPKGEuaGVpZ2h0KSl9LAokaXRuOjF9ClcubjcucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24o
+YSl7cmV0dXJuIGEubGVuZ3RofX0KVy53ei5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4g
+dGhpcy5hLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXt2YXIgdApILlNjKGIpCnQ9dGhpcy5hCmlmKGI8
+MHx8Yj49dC5sZW5ndGgpcmV0dXJuIEguT0godCxiKQpyZXR1cm4gdGhpcy4kdGkuZC5iKHRbYl0pfSwK
+WTpmdW5jdGlvbihhLGIsYyl7dGhpcy4kdGkuZC5iKGMpCnRocm93IEguYihQLkw0KCJDYW5ub3QgbW9k
+aWZ5IGxpc3QiKSl9fQpXLmN2LnByb3RvdHlwZT17CmdRZzpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcu
+aTcoYSl9LApnRDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcuSTQoYSl9LApzRDpmdW5jdGlvbihhLGIp
+e3ZhciB0CnUuWC5iKGIpCnQ9dGhpcy5nRChhKQp0LlYxKDApCnQuRlYoMCxiKX0sCnc6ZnVuY3Rpb24o
+YSl7cmV0dXJuIGEubG9jYWxOYW1lfSwKdG46ZnVuY3Rpb24oYSl7dmFyIHQ9ISFhLnNjcm9sbEludG9W
+aWV3SWZOZWVkZWQKaWYodClhLnNjcm9sbEludG9WaWV3SWZOZWVkZWQoKQplbHNlIGEuc2Nyb2xsSW50
+b1ZpZXcoKX0sCnI2OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMscixxCmlmKGM9PW51bGwpe2lmKGQ9
+PW51bGwpe3Q9JC5sdAppZih0PT1udWxsKXt0PUguVk0oW10sdS5rKQpzPW5ldyBXLnZEKHQpCkMuTm0u
+aSh0LFcuVHcobnVsbCkpCkMuTm0uaSh0LFcuQmwoKSkKJC5sdD1zCmQ9c31lbHNlIGQ9dH10PSQuRVUK
+aWYodD09bnVsbCl7dD1uZXcgVy5LbyhkKQokLkVVPXQKYz10fWVsc2V7dC5hPWQKYz10fX1lbHNlIGlm
+KGQhPW51bGwpdGhyb3cgSC5iKFAueFkoInZhbGlkYXRvciBjYW4gb25seSBiZSBwYXNzZWQgaWYgdHJl
+ZVNhbml0aXplciBpcyBudWxsIikpCmlmKCQueG89PW51bGwpe3Q9ZG9jdW1lbnQKcz10LmltcGxlbWVu
+dGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikKJC54bz1zCiQuQk89cy5jcmVhdGVSYW5nZSgpCnM9
+JC54by5jcmVhdGVFbGVtZW50KCJiYXNlIikKdS5jUi5iKHMpCnMuaHJlZj10LmJhc2VVUkkKJC54by5o
+ZWFkLmFwcGVuZENoaWxkKHMpfXQ9JC54bwppZih0LmJvZHk9PW51bGwpe3M9dC5jcmVhdGVFbGVtZW50
+KCJib2R5IikKdC5ib2R5PXUuWS5iKHMpfXQ9JC54bwppZih1LlkuYyhhKSlyPXQuYm9keQplbHNle3I9
+dC5jcmVhdGVFbGVtZW50KGEudGFnTmFtZSkKJC54by5ib2R5LmFwcGVuZENoaWxkKHIpfWlmKCJjcmVh
+dGVDb250ZXh0dWFsRnJhZ21lbnQiIGluIHdpbmRvdy5SYW5nZS5wcm90b3R5cGUmJiFDLk5tLnRnKEMu
+U3EsYS50YWdOYW1lKSl7JC5CTy5zZWxlY3ROb2RlQ29udGVudHMocikKcT0kLkJPLmNyZWF0ZUNvbnRl
+eHR1YWxGcmFnbWVudChiKX1lbHNle3IuaW5uZXJIVE1MPWIKcT0kLnhvLmNyZWF0ZURvY3VtZW50RnJh
+Z21lbnQoKQpmb3IoO3Q9ci5maXJzdENoaWxkLHQhPW51bGw7KXEuYXBwZW5kQ2hpbGQodCl9dD0kLnhv
+LmJvZHkKaWYocj09bnVsbD90IT1udWxsOnIhPT10KUouTHQocikKYy5QbihxKQpkb2N1bWVudC5hZG9w
+dE5vZGUocSkKcmV0dXJuIHF9LApBSDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMucjYoYSxiLGMs
+bnVsbCl9LApzaGY6ZnVuY3Rpb24oYSxiKXt0aGlzLllDKGEsYil9LApwazpmdW5jdGlvbihhLGIsYyl7
+YS50ZXh0Q29udGVudD1udWxsCmEuYXBwZW5kQ2hpbGQodGhpcy5yNihhLGIsbnVsbCxjKSl9LApZQzpm
+dW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnBrKGEsYixudWxsKX0sCmdWbDpmdW5jdGlvbihhKXtyZXR1
+cm4gbmV3IFcuQ3EoYSwiY2xpY2siLCExLHUuUSl9LAokaWN2OjEsCmduczpmdW5jdGlvbihhKXtyZXR1
+cm4gYS50YWdOYW1lfX0KVy5Ddi5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdS5oLmMo
+dS5BLmIoYSkpfSwKJFM6MjV9ClcuZWEucHJvdG90eXBlPXskaWVhOjF9ClcuRDAucHJvdG90eXBlPXsK
+T246ZnVuY3Rpb24oYSxiLGMsZCl7dS5VLmIoYykKaWYoYyE9bnVsbCl0aGlzLnYoYSxiLGMsZCl9LApC
+OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5PbihhLGIsYyxudWxsKX0sCnY6ZnVuY3Rpb24oYSxi
+LGMsZCl7cmV0dXJuIGEuYWRkRXZlbnRMaXN0ZW5lcihiLEgudFIodS5VLmIoYyksMSksZCl9LAokaUQw
+OjF9ClcuVDUucHJvdG90eXBlPXskaVQ1OjF9ClcuaDQucHJvdG90eXBlPXsKZ0E6ZnVuY3Rpb24oYSl7
+cmV0dXJuIGEubGVuZ3RofX0KVy5ici5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5s
+ZW5ndGh9fQpXLlZiLnByb3RvdHlwZT17fQpXLk83LnByb3RvdHlwZT17CmVvOmZ1bmN0aW9uKGEsYixj
+LGQpe3JldHVybiBhLm9wZW4oYixjLCEwKX0sCiRpTzc6MX0KVy5iVS5wcm90b3R5cGU9ewokMjpmdW5j
+dGlvbihhLGIpe3RoaXMuYS5zZXRSZXF1ZXN0SGVhZGVyKEgueShhKSxILnkoYikpfSwKJFM6MTB9Clcu
+aEgucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscAp1LnAuYihhKQp0PXRoaXMu
+YQpzPXQuc3RhdHVzCmlmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIHMudEIoKQpyPXM+PTIwMCYm
+czwzMDAKcT1zPjMwNyYmczw0MDAKcz1yfHxzPT09MHx8cz09PTMwNHx8cQpwPXRoaXMuYgppZihzKXAu
+YU0oMCx0KQplbHNlIHAucG0oYSl9LAokUzoyN30KVy53YS5wcm90b3R5cGU9e30KVy5TZy5wcm90b3R5
+cGU9eyRpU2c6MX0KVy51OC5wcm90b3R5cGU9ewpnRHI6ZnVuY3Rpb24oYSl7aWYoIm9yaWdpbiIgaW4g
+YSlyZXR1cm4gYS5vcmlnaW4KcmV0dXJuIEguZChhLnByb3RvY29sKSsiLy8iK0guZChhLmhvc3QpfSwK
+dzpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEpfSwKJGl1ODoxfQpXLkFqLnByb3RvdHlwZT17JGlB
+ajoxfQpXLmU3LnByb3RvdHlwZT17CmdyODpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEscz10LmNoaWxk
+Tm9kZXMubGVuZ3RoCmlmKHM9PT0wKXRocm93IEguYihQLlBWKCJObyBlbGVtZW50cyIpKQppZihzPjEp
+dGhyb3cgSC5iKFAuUFYoIk1vcmUgdGhhbiBvbmUgZWxlbWVudCIpKQpyZXR1cm4gdC5maXJzdENoaWxk
+fSwKRlY6ZnVuY3Rpb24oYSxiKXt2YXIgdCxzLHIscQp1LmVoLmIoYikKdD1iLmEKcz10aGlzLmEKaWYo
+dCE9PXMpZm9yKHI9dC5jaGlsZE5vZGVzLmxlbmd0aCxxPTA7cTxyOysrcSlzLmFwcGVuZENoaWxkKHQu
+Zmlyc3RDaGlsZCkKcmV0dXJufSwKWTpmdW5jdGlvbihhLGIsYyl7dmFyIHQscwp1LkEuYihjKQp0PXRo
+aXMuYQpzPXQuY2hpbGROb2RlcwppZihiPDB8fGI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMsYikKdC5y
+ZXBsYWNlQ2hpbGQoYyxzW2JdKX0sCmdrejpmdW5jdGlvbihhKXt2YXIgdD10aGlzLmEuY2hpbGROb2Rl
+cwpyZXR1cm4gbmV3IFcuVzkodCx0Lmxlbmd0aCxILnpLKHQpLkMoIlc5PEdtLkU+IikpfSwKZ0E6ZnVu
+Y3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5jaGlsZE5vZGVzLmxlbmd0aH0sCnE6ZnVuY3Rpb24oYSxiKXt2
+YXIgdApILlNjKGIpCnQ9dGhpcy5hLmNoaWxkTm9kZXMKaWYoYjwwfHxiPj10Lmxlbmd0aClyZXR1cm4g
+SC5PSCh0LGIpCnJldHVybiB0W2JdfX0KVy51SC5wcm90b3R5cGU9ewp3ZzpmdW5jdGlvbihhKXt2YXIg
+dD1hLnBhcmVudE5vZGUKaWYodCE9bnVsbCl0LnJlbW92ZUNoaWxkKGEpfSwKRDQ6ZnVuY3Rpb24oYSl7
+dmFyIHQKZm9yKDt0PWEuZmlyc3RDaGlsZCx0IT1udWxsOylhLnJlbW92ZUNoaWxkKHQpfSwKdzpmdW5j
+dGlvbihhKXt2YXIgdD1hLm5vZGVWYWx1ZQpyZXR1cm4gdD09bnVsbD90aGlzLlUoYSk6dH0sCiRpdUg6
+MX0KVy5CSC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LApxOmZ1bmN0
+aW9uKGEsYil7SC5TYyhiKQppZihiPj4+MCE9PWJ8fGI+PWEubGVuZ3RoKXRocm93IEguYihQLkNmKGIs
+YSxudWxsLG51bGwsbnVsbCkpCnJldHVybiBhW2JdfSwKWTpmdW5jdGlvbihhLGIsYyl7dS5BLmIoYykK
+dGhyb3cgSC5iKFAuTDQoIkNhbm5vdCBhc3NpZ24gZWxlbWVudCBvZiBpbW11dGFibGUgTGlzdC4iKSl9
+LApFOmZ1bmN0aW9uKGEsYil7aWYoYjwwfHxiPj1hLmxlbmd0aClyZXR1cm4gSC5PSChhLGIpCnJldHVy
+biBhW2JdfSwKJGlYajoxLAokaWNYOjEsCiRpek06MX0KVy5TTi5wcm90b3R5cGU9e30KVy5ldy5wcm90
+b3R5cGU9eyRpZXc6MX0KVy5scC5wcm90b3R5cGU9ewpnQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5n
+dGh9fQpXLlRiLnByb3RvdHlwZT17CnI2OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0LHMKaWYoImNyZWF0
+ZUNvbnRleHR1YWxGcmFnbWVudCIgaW4gd2luZG93LlJhbmdlLnByb3RvdHlwZSlyZXR1cm4gdGhpcy5E
+VyhhLGIsYyxkKQp0PVcuVTkoIjx0YWJsZT4iK0guZChiKSsiPC90YWJsZT4iLGMsZCkKcz1kb2N1bWVu
+dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkKcy50b1N0cmluZwp0LnRvU3RyaW5nCm5ldyBXLmU3KHMp
+LkZWKDAsbmV3IFcuZTcodCkpCnJldHVybiBzfX0KVy5Jdi5wcm90b3R5cGU9ewpyNjpmdW5jdGlvbihh
+LGIsYyxkKXt2YXIgdCxzLHIscQppZigiY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiBpbiB3aW5kb3cu
+UmFuZ2UucHJvdG90eXBlKXJldHVybiB0aGlzLkRXKGEsYixjLGQpCnQ9ZG9jdW1lbnQKcz10LmNyZWF0
+ZURvY3VtZW50RnJhZ21lbnQoKQp0PUMuSWUucjYodC5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpLGIsYyxk
+KQp0LnRvU3RyaW5nCnQ9bmV3IFcuZTcodCkKcj10LmdyOCh0KQpyLnRvU3RyaW5nCnQ9bmV3IFcuZTco
+cikKcT10LmdyOCh0KQpzLnRvU3RyaW5nCnEudG9TdHJpbmcKbmV3IFcuZTcocykuRlYoMCxuZXcgVy5l
+NyhxKSkKcmV0dXJuIHN9fQpXLkJULnByb3RvdHlwZT17CnI2OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB0
+LHMscgppZigiY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiBpbiB3aW5kb3cuUmFuZ2UucHJvdG90eXBl
+KXJldHVybiB0aGlzLkRXKGEsYixjLGQpCnQ9ZG9jdW1lbnQKcz10LmNyZWF0ZURvY3VtZW50RnJhZ21l
+bnQoKQp0PUMuSWUucjYodC5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpLGIsYyxkKQp0LnRvU3RyaW5nCnQ9
+bmV3IFcuZTcodCkKcj10LmdyOCh0KQpzLnRvU3RyaW5nCnIudG9TdHJpbmcKbmV3IFcuZTcocykuRlYo
+MCxuZXcgVy5lNyhyKSkKcmV0dXJuIHN9fQpXLnlZLnByb3RvdHlwZT17CnBrOmZ1bmN0aW9uKGEsYixj
+KXt2YXIgdCxzCmEudGV4dENvbnRlbnQ9bnVsbAp0PWEuY29udGVudAp0LnRvU3RyaW5nCkouYlQodCkK
+cz10aGlzLnI2KGEsYixudWxsLGMpCmEuY29udGVudC5hcHBlbmRDaGlsZChzKX0sCllDOmZ1bmN0aW9u
+KGEsYil7cmV0dXJuIHRoaXMucGsoYSxiLG51bGwpfSwKJGl5WToxfQpXLnc2LnByb3RvdHlwZT17fQpX
+Lks1LnByb3RvdHlwZT17CmdtVzpmdW5jdGlvbihhKXtyZXR1cm4gYS5sb2NhdGlvbn0sCiRpSzU6MSwK
+JGl2NjoxfQpXLkNtLnByb3RvdHlwZT17JGlDbToxfQpXLkNRLnByb3RvdHlwZT17JGlDUToxfQpXLnc0
+LnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7cmV0dXJuIlJlY3RhbmdsZSAoIitILmQoYS5sZWZ0KSsi
+LCAiK0guZChhLnRvcCkrIikgIitILmQoYS53aWR0aCkrIiB4ICIrSC5kKGEuaGVpZ2h0KX0sCkROOmZ1
+bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQpyZXR1cm4gdS5xLmMoYikmJmEubGVmdD09PWIu
+bGVmdCYmYS50b3A9PT1iLnRvcCYmYS53aWR0aD09PWIud2lkdGgmJmEuaGVpZ2h0PT09Yi5oZWlnaHR9
+LApnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIFcuckUoQy5DRC5naU8oYS5sZWZ0KSxDLkNELmdpTyhhLnRv
+cCksQy5DRC5naU8oYS53aWR0aCksQy5DRC5naU8oYS5oZWlnaHQpKX19ClcucmgucHJvdG90eXBlPXsK
+Z0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKcTpmdW5jdGlvbihhLGIpe0guU2MoYikKaWYo
+Yj4+PjAhPT1ifHxiPj1hLmxlbmd0aCl0aHJvdyBILmIoUC5DZihiLGEsbnVsbCxudWxsLG51bGwpKQpy
+ZXR1cm4gYVtiXX0sClk6ZnVuY3Rpb24oYSxiLGMpe3UuQS5iKGMpCnRocm93IEguYihQLkw0KCJDYW5u
+b3QgYXNzaWduIGVsZW1lbnQgb2YgaW1tdXRhYmxlIExpc3QuIikpfSwKRTpmdW5jdGlvbihhLGIpe2lm
+KGI8MHx8Yj49YS5sZW5ndGgpcmV0dXJuIEguT0goYSxiKQpyZXR1cm4gYVtiXX0sCiRpWGo6MSwKJGlj
+WDoxLAokaXpNOjF9ClcuY2YucHJvdG90eXBlPXsKSzpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAK
+dS5FLmIoYikKZm9yKHQ9dGhpcy5nVigpLHM9dC5sZW5ndGgscj10aGlzLmEscT0wO3E8dC5sZW5ndGg7
+dC5sZW5ndGg9PT1zfHwoMCxILmxrKSh0KSwrK3Epe3A9dFtxXQpiLiQyKHAsci5nZXRBdHRyaWJ1dGUo
+cCkpfX0sCmdWOmZ1bmN0aW9uKCl7dmFyIHQscyxyLHEscD10aGlzLmEuYXR0cmlidXRlcyxvPUguVk0o
+W10sdS5zKQpmb3IodD1wLmxlbmd0aCxzPXUuaDkscj0wO3I8dDsrK3Ipe2lmKHI+PXAubGVuZ3RoKXJl
+dHVybiBILk9IKHAscikKcT1zLmIocFtyXSkKaWYocS5uYW1lc3BhY2VVUkk9PW51bGwpQy5ObS5pKG8s
+cS5uYW1lKX1yZXR1cm4gb319ClcuaTcucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe3JldHVybiB0
+aGlzLmEuZ2V0QXR0cmlidXRlKEgueShiKSl9LApZOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmEuc2V0QXR0
+cmlidXRlKGIsYyl9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nVigpLmxlbmd0aH19ClcuU3ku
+cHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEuYS5nZXRBdHRyaWJ1dGUoImRh
+dGEtIit0aGlzLk8oSC55KGIpKSl9LApZOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmEuYS5zZXRBdHRyaWJ1
+dGUoImRhdGEtIit0aGlzLk8oYiksYyl9LApLOmZ1bmN0aW9uKGEsYil7dGhpcy5hLksoMCxuZXcgVy5L
+Uyh0aGlzLHUuRS5iKGIpKSl9LApnVjpmdW5jdGlvbigpe3ZhciB0PUguVk0oW10sdS5zKQp0aGlzLmEu
+SygwLG5ldyBXLkEzKHRoaXMsdCkpCnJldHVybiB0fSwKZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMu
+Z1YoKS5sZW5ndGh9LAprOmZ1bmN0aW9uKGEpe3ZhciB0LHMscj1ILlZNKGEuc3BsaXQoIi0iKSx1LnMp
+CmZvcih0PTE7dDxyLmxlbmd0aDsrK3Qpe3M9clt0XQppZihzLmxlbmd0aD4wKUMuTm0uWShyLHQsc1sw
+XS50b1VwcGVyQ2FzZSgpK0ouS1YocywxKSl9cmV0dXJuIEMuTm0uSChyLCIiKX0sCk86ZnVuY3Rpb24o
+YSl7dmFyIHQscyxyLHEscApmb3IodD1hLmxlbmd0aCxzPTAscj0iIjtzPHQ7KytzKXtxPWFbc10KcD1x
+LnRvTG93ZXJDYXNlKCkKcj0ocSE9PXAmJnM+MD9yKyItIjpyKStwfXJldHVybiByLmNoYXJDb2RlQXQo
+MCk9PTA/cjpyfX0KVy5LUy5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe2lmKEouclkoYSkubihh
+LCJkYXRhLSIpKXRoaXMuYi4kMih0aGlzLmEuayhDLnhCLkcoYSw1KSksYil9LAokUzoxMH0KVy5BMy5w
+cm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe2lmKEouclkoYSkubihhLCJkYXRhLSIpKUMuTm0uaSh0
+aGlzLmIsdGhpcy5hLmsoQy54Qi5HKGEsNSkpKX0sCiRTOjEwfQpXLkk0LnByb3RvdHlwZT17ClA6ZnVu
+Y3Rpb24oKXt2YXIgdCxzLHIscSxwPVAuTHModS5OKQpmb3IodD10aGlzLmEuY2xhc3NOYW1lLnNwbGl0
+KCIgIikscz10Lmxlbmd0aCxyPTA7cjxzOysrcil7cT1KLlQwKHRbcl0pCmlmKHEubGVuZ3RoIT09MClw
+LmkoMCxxKX1yZXR1cm4gcH0sClg6ZnVuY3Rpb24oYSl7dGhpcy5hLmNsYXNzTmFtZT11LkMuYihhKS5I
+KDAsIiAiKX0sCmdBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEuY2xhc3NMaXN0Lmxlbmd0aH0sClYx
+OmZ1bmN0aW9uKGEpe3RoaXMuYS5jbGFzc05hbWU9IiJ9LAp0ZzpmdW5jdGlvbihhLGIpe3ZhciB0PXRo
+aXMuYS5jbGFzc0xpc3QuY29udGFpbnMoYikKcmV0dXJuIHR9LAppOmZ1bmN0aW9uKGEsYil7dmFyIHQ9
+dGhpcy5hLmNsYXNzTGlzdCxzPXQuY29udGFpbnMoYikKdC5hZGQoYikKcmV0dXJuIXN9LApSOmZ1bmN0
+aW9uKGEsYil7dmFyIHQ9dGhpcy5hLmNsYXNzTGlzdCxzPXQuY29udGFpbnMoYikKdC5yZW1vdmUoYikK
+cmV0dXJuIHN9LApGVjpmdW5jdGlvbihhLGIpe1cuVE4odGhpcy5hLHUuWC5iKGIpKX19ClcuRmsucHJv
+dG90eXBlPXt9ClcuUk8ucHJvdG90eXBlPXt9ClcuQ3EucHJvdG90eXBlPXt9ClcueEMucHJvdG90eXBl
+PXt9Clcudk4ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS4kMSh1LkIuYihh
+KSl9LAokUzoyOH0KVy5KUS5wcm90b3R5cGU9ewpDWTpmdW5jdGlvbihhKXt2YXIgdAppZigkLm9yLmE9
+PT0wKXtmb3IodD0wO3Q8MjYyOysrdCkkLm9yLlkoMCxDLmNtW3RdLFcucFMoKSkKZm9yKHQ9MDt0PDEy
+OysrdCkkLm9yLlkoMCxDLkJJW3RdLFcuVjQoKSl9fSwKaTA6ZnVuY3Rpb24oYSl7cmV0dXJuICQuQU4o
+KS50ZygwLFcuclMoYSkpfSwKRWI6ZnVuY3Rpb24oYSxiLGMpe3ZhciB0PSQub3IucSgwLEguZChXLnJT
+KGEpKSsiOjoiK2IpCmlmKHQ9PW51bGwpdD0kLm9yLnEoMCwiKjo6IitiKQppZih0PT1udWxsKXJldHVy
+biExCnJldHVybiBILnhkKHQuJDQoYSxiLGMsdGhpcykpfSwKJGlrRjoxfQpXLkdtLnByb3RvdHlwZT17
+CmdrejpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcuVzkoYSx0aGlzLmdBKGEpLEgueksoYSkuQygiVzk8
+R20uRT4iKSl9fQpXLnZELnByb3RvdHlwZT17CmkwOmZ1bmN0aW9uKGEpe3JldHVybiBDLk5tLlZyKHRo
+aXMuYSxuZXcgVy5VdihhKSl9LApFYjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEMuTm0uVnIodGhpcy5h
+LG5ldyBXLkVnKGEsYixjKSl9LAokaWtGOjF9ClcuVXYucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7
+cmV0dXJuIHUuZS5iKGEpLmkwKHRoaXMuYSl9LAokUzoxN30KVy5FZy5wcm90b3R5cGU9ewokMTpmdW5j
+dGlvbihhKXtyZXR1cm4gdS5lLmIoYSkuRWIodGhpcy5hLHRoaXMuYix0aGlzLmMpfSwKJFM6MTd9Clcu
+bTYucHJvdG90eXBlPXsKQ1k6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHQscyxyCnRoaXMuYS5GVigwLGMp
+CnQ9Yi5ldigwLG5ldyBXLkVvKCkpCnM9Yi5ldigwLG5ldyBXLldrKCkpCnRoaXMuYi5GVigwLHQpCnI9
+dGhpcy5jCnIuRlYoMCxDLmRuKQpyLkZWKDAscyl9LAppMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5h
+LnRnKDAsVy5yUyhhKSl9LApFYjpmdW5jdGlvbihhLGIsYyl7dmFyIHQ9dGhpcyxzPVcuclMoYSkscj10
+LmMKaWYoci50ZygwLEguZChzKSsiOjoiK2IpKXJldHVybiB0LmQuRHQoYykKZWxzZSBpZihyLnRnKDAs
+Iio6OiIrYikpcmV0dXJuIHQuZC5EdChjKQplbHNle3I9dC5iCmlmKHIudGcoMCxILmQocykrIjo6Iiti
+KSlyZXR1cm4hMAplbHNlIGlmKHIudGcoMCwiKjo6IitiKSlyZXR1cm4hMAplbHNlIGlmKHIudGcoMCxI
+LmQocykrIjo6KiIpKXJldHVybiEwCmVsc2UgaWYoci50ZygwLCIqOjoqIikpcmV0dXJuITB9cmV0dXJu
+ITF9LAokaWtGOjF9ClcuRW8ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIUMuTm0udGco
+Qy5CSSxILnkoYSkpfSwKJFM6OH0KVy5Xay5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4g
+Qy5ObS50ZyhDLkJJLEgueShhKSl9LAokUzo4fQpXLmN0LnByb3RvdHlwZT17CkViOmZ1bmN0aW9uKGEs
+YixjKXtpZih0aGlzLmpGKGEsYixjKSlyZXR1cm4hMAppZihiPT09InRlbXBsYXRlIiYmYz09PSIiKXJl
+dHVybiEwCmlmKGEuZ2V0QXR0cmlidXRlKCJ0ZW1wbGF0ZSIpPT09IiIpcmV0dXJuIHRoaXMuZS50Zygw
+LGIpCnJldHVybiExfX0KVy5JQS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4iVEVNUExB
+VEU6OiIrSC5kKEgueShhKSl9LAokUzo1fQpXLk93LnByb3RvdHlwZT17CmkwOmZ1bmN0aW9uKGEpe3Zh
+ciB0CmlmKHUuZXcuYyhhKSlyZXR1cm4hMQp0PXUuZzcuYyhhKQppZih0JiZXLnJTKGEpPT09ImZvcmVp
+Z25PYmplY3QiKXJldHVybiExCmlmKHQpcmV0dXJuITAKcmV0dXJuITF9LApFYjpmdW5jdGlvbihhLGIs
+Yyl7aWYoYj09PSJpcyJ8fEMueEIubihiLCJvbiIpKXJldHVybiExCnJldHVybiB0aGlzLmkwKGEpfSwK
+JGlrRjoxfQpXLlc5LnByb3RvdHlwZT17CkY6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLHM9dC5jKzEscj10
+LmIKaWYoczxyKXt0LnNwKEoudzIodC5hLHMpKQp0LmM9cwpyZXR1cm4hMH10LnNwKG51bGwpCnQuYz1y
+CnJldHVybiExfSwKZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kfSwKc3A6ZnVuY3Rpb24oYSl7dGhp
+cy5kPXRoaXMuJHRpLmQuYihhKX0sCiRpQW46MX0KVy5kVy5wcm90b3R5cGU9ewpnbVc6ZnVuY3Rpb24o
+YSl7cmV0dXJuIFcuelgodGhpcy5hLmxvY2F0aW9uKX0sCiRpRDA6MSwKJGl2NjoxfQpXLkZiLnByb3Rv
+dHlwZT17fQpXLmtGLnByb3RvdHlwZT17fQpXLm1rLnByb3RvdHlwZT17JGl5MDoxfQpXLktvLnByb3Rv
+dHlwZT17ClBuOmZ1bmN0aW9uKGEpe25ldyBXLmZtKHRoaXMpLiQyKGEsbnVsbCl9LApFUDpmdW5jdGlv
+bihhLGIpe2lmKGI9PW51bGwpSi5MdChhKQplbHNlIGIucmVtb3ZlQ2hpbGQoYSl9LApJNDpmdW5jdGlv
+bihhLGIpe3ZhciB0LHMscixxLHAsbz0hMCxuPW51bGwsbT1udWxsCnRyeXtuPUouaWcoYSkKbT1uLmEu
+Z2V0QXR0cmlidXRlKCJpcyIpCnUuaC5iKGEpCnQ9ZnVuY3Rpb24oYyl7aWYoIShjLmF0dHJpYnV0ZXMg
+aW5zdGFuY2VvZiBOYW1lZE5vZGVNYXApKXJldHVybiB0cnVlCnZhciBsPWMuY2hpbGROb2RlcwppZihj
+Lmxhc3RDaGlsZCYmYy5sYXN0Q2hpbGQhPT1sW2wubGVuZ3RoLTFdKXJldHVybiB0cnVlCmlmKGMuY2hp
+bGRyZW4paWYoIShjLmNoaWxkcmVuIGluc3RhbmNlb2YgSFRNTENvbGxlY3Rpb258fGMuY2hpbGRyZW4g
+aW5zdGFuY2VvZiBOb2RlTGlzdCkpcmV0dXJuIHRydWUKdmFyIGs9MAppZihjLmNoaWxkcmVuKWs9Yy5j
+aGlsZHJlbi5sZW5ndGgKZm9yKHZhciBqPTA7ajxrO2orKyl7dmFyIGk9Yy5jaGlsZHJlbltqXQppZihp
+LmlkPT0nYXR0cmlidXRlcyd8fGkubmFtZT09J2F0dHJpYnV0ZXMnfHxpLmlkPT0nbGFzdENoaWxkJ3x8
+aS5uYW1lPT0nbGFzdENoaWxkJ3x8aS5pZD09J2NoaWxkcmVuJ3x8aS5uYW1lPT0nY2hpbGRyZW4nKXJl
+dHVybiB0cnVlfXJldHVybiBmYWxzZX0oYSkKbz1ILm9UKHQpPyEwOiEoYS5hdHRyaWJ1dGVzIGluc3Rh
+bmNlb2YgTmFtZWROb2RlTWFwKX1jYXRjaChxKXtILlJ1KHEpfXM9ImVsZW1lbnQgdW5wcmludGFibGUi
+CnRyeXtzPUouaihhKX1jYXRjaChxKXtILlJ1KHEpfXRyeXtyPVcuclMoYSkKdGhpcy5rUih1LmguYihh
+KSxiLG8scyxyLHUuRy5iKG4pLEgueShtKSl9Y2F0Y2gocSl7aWYoSC5SdShxKSBpbnN0YW5jZW9mIFAu
+dSl0aHJvdyBxCmVsc2V7dGhpcy5FUChhLGIpCndpbmRvdwpwPSJSZW1vdmluZyBjb3JydXB0ZWQgZWxl
+bWVudCAiK0guZChzKQppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUu
+d2FybihwKX19fSwKa1I6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIHQscyxyLHEscCxvLG49dGhp
+cwppZihjKXtuLkVQKGEsYikKd2luZG93CnQ9IlJlbW92aW5nIGVsZW1lbnQgZHVlIHRvIGNvcnJ1cHRl
+ZCBhdHRyaWJ1dGVzIG9uIDwiK2QrIj4iCmlmKHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIil3aW5k
+b3cuY29uc29sZS53YXJuKHQpCnJldHVybn1pZighbi5hLmkwKGEpKXtuLkVQKGEsYikKd2luZG93CnQ9
+IlJlbW92aW5nIGRpc2FsbG93ZWQgZWxlbWVudCA8IitILmQoZSkrIj4gZnJvbSAiK0guZChiKQppZih0
+eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUud2Fybih0KQpyZXR1cm59aWYo
+ZyE9bnVsbClpZighbi5hLkViKGEsImlzIixnKSl7bi5FUChhLGIpCndpbmRvdwp0PSJSZW1vdmluZyBk
+aXNhbGxvd2VkIHR5cGUgZXh0ZW5zaW9uIDwiK0guZChlKSsnIGlzPSInK2crJyI+JwppZih0eXBlb2Yg
+Y29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNvbnNvbGUud2Fybih0KQpyZXR1cm59dD1mLmdWKCkK
+cz1ILlZNKHQuc2xpY2UoMCksSC50Nih0KS5DKCJqZDwxPiIpKQpmb3Iocj1mLmdWKCkubGVuZ3RoLTEs
+dD1mLmE7cj49MDstLXIpe2lmKHI+PXMubGVuZ3RoKXJldHVybiBILk9IKHMscikKcT1zW3JdCnA9bi5h
+Cm89Si5jSChxKQpILnkocSkKaWYoIXAuRWIoYSxvLHQuZ2V0QXR0cmlidXRlKHEpKSl7d2luZG93CnA9
+IlJlbW92aW5nIGRpc2FsbG93ZWQgYXR0cmlidXRlIDwiK0guZChlKSsiICIrcSsnPSInK0guZCh0Lmdl
+dEF0dHJpYnV0ZShxKSkrJyI+JwppZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpd2luZG93LmNv
+bnNvbGUud2FybihwKQp0LnJlbW92ZUF0dHJpYnV0ZShxKX19aWYodS5hVy5jKGEpKW4uUG4oYS5jb250
+ZW50KX0sCiRpb246MX0KVy5mbS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixx
+LHA9dGhpcy5hCnN3aXRjaChhLm5vZGVUeXBlKXtjYXNlIDE6cC5JNChhLGIpCmJyZWFrCmNhc2UgODpj
+YXNlIDExOmNhc2UgMzpjYXNlIDQ6YnJlYWsKZGVmYXVsdDpwLkVQKGEsYil9dD1hLmxhc3RDaGlsZApm
+b3IocD11LkE7bnVsbCE9dDspe3M9bnVsbAp0cnl7cz10LnByZXZpb3VzU2libGluZ31jYXRjaChyKXtI
+LlJ1KHIpCnE9cC5iKHQpCmEucmVtb3ZlQ2hpbGQocSkKdD1udWxsCnM9YS5sYXN0Q2hpbGR9aWYodCE9
+bnVsbCl0aGlzLiQyKHQsYSkKdD1wLmIocyl9fSwKJFM6MzF9ClcuTGUucHJvdG90eXBlPXt9ClcuSzcu
+cHJvdG90eXBlPXt9ClcuckIucHJvdG90eXBlPXt9ClcuWFcucHJvdG90eXBlPXt9Clcub2EucHJvdG90
+eXBlPXt9ClAuaUoucHJvdG90eXBlPXsKVkg6ZnVuY3Rpb24oYSl7dmFyIHQscz10aGlzLmEscj1zLmxl
+bmd0aApmb3IodD0wO3Q8cjsrK3QpaWYoc1t0XT09PWEpcmV0dXJuIHQKQy5ObS5pKHMsYSkKQy5ObS5p
+KHRoaXMuYixudWxsKQpyZXR1cm4gcn0sClB2OmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxPXRoaXMscD17
+fQppZihhPT1udWxsKXJldHVybiBhCmlmKEgubChhKSlyZXR1cm4gYQppZih0eXBlb2YgYT09Im51bWJl
+ciIpcmV0dXJuIGEKaWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBhCmlmKGEgaW5zdGFuY2VvZiBQ
+LmlQKXJldHVybiBuZXcgRGF0ZShhLmEpCmlmKHUuZnYuYyhhKSl0aHJvdyBILmIoUC5TWSgic3RydWN0
+dXJlZCBjbG9uZSBvZiBSZWdFeHAiKSkKaWYodS5jOC5jKGEpKXJldHVybiBhCmlmKHUuZC5jKGEpKXJl
+dHVybiBhCmlmKHUuSS5jKGEpKXJldHVybiBhCnQ9dS5kRC5jKGEpfHwhMQppZih0KXJldHVybiBhCmlm
+KHUuRy5jKGEpKXtzPXEuVkgoYSkKdD1xLmIKaWYocz49dC5sZW5ndGgpcmV0dXJuIEguT0godCxzKQpy
+PXAuYT10W3NdCmlmKHIhPW51bGwpcmV0dXJuIHIKcj17fQpwLmE9cgpDLk5tLlkodCxzLHIpCmEuSygw
+LG5ldyBQLmxSKHAscSkpCnJldHVybiBwLmF9aWYodS5qLmMoYSkpe3M9cS5WSChhKQpwPXEuYgppZihz
+Pj1wLmxlbmd0aClyZXR1cm4gSC5PSChwLHMpCnI9cFtzXQppZihyIT1udWxsKXJldHVybiByCnJldHVy
+biBxLmVrKGEscyl9aWYodS5lSC5jKGEpKXtzPXEuVkgoYSkKdD1xLmIKaWYocz49dC5sZW5ndGgpcmV0
+dXJuIEguT0godCxzKQpyPXAuYj10W3NdCmlmKHIhPW51bGwpcmV0dXJuIHIKcj17fQpwLmI9cgpDLk5t
+LlkodCxzLHIpCnEuaW0oYSxuZXcgUC5qZyhwLHEpKQpyZXR1cm4gcC5ifXRocm93IEguYihQLlNZKCJz
+dHJ1Y3R1cmVkIGNsb25lIG9mIG90aGVyIHR5cGUiKSl9LAplazpmdW5jdGlvbihhLGIpe3ZhciB0LHM9
+Si5VNihhKSxyPXMuZ0EoYSkscT1uZXcgQXJyYXkocikKQy5ObS5ZKHRoaXMuYixiLHEpCmZvcih0PTA7
+dDxyOysrdClDLk5tLlkocSx0LHRoaXMuUHYocy5xKGEsdCkpKQpyZXR1cm4gcX19ClAubFIucHJvdG90
+eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXt0aGlzLmEuYVthXT10aGlzLmIuUHYoYil9LAokUzoxfQpQLmpn
+LnByb3RvdHlwZT17CiQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hLmJbYV09dGhpcy5iLlB2KGIpfSwKJFM6
+MX0KUC5CZi5wcm90b3R5cGU9ewppbTpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxCnUuYjguYihiKQpm
+b3IodD1PYmplY3Qua2V5cyhhKSxzPXQubGVuZ3RoLHI9MDtyPHM7KytyKXtxPXRbcl0KYi4kMihxLGFb
+cV0pfX19ClAuQXMucHJvdG90eXBlPXsKVDpmdW5jdGlvbihhKXt2YXIgdApILnkoYSkKdD0kLmhHKCku
+YgppZih0eXBlb2YgYSE9InN0cmluZyIpSC52aChILnRMKGEpKQppZih0LnRlc3QoYSkpcmV0dXJuIGEK
+dGhyb3cgSC5iKFAuTDMoYSwidmFsdWUiLCJOb3QgYSB2YWxpZCBjbGFzcyB0b2tlbiIpKX0sCnc6ZnVu
+Y3Rpb24oYSl7cmV0dXJuIHRoaXMuUCgpLkgoMCwiICIpfSwKZ2t6OmZ1bmN0aW9uKGEpe3ZhciB0PXRo
+aXMuUCgpCnJldHVybiBQLnJqKHQsdC5yLEguTGgodCkuZCl9LApnQTpmdW5jdGlvbihhKXtyZXR1cm4g
+dGhpcy5QKCkuYX0sCnRnOmZ1bmN0aW9uKGEsYil7dGhpcy5UKGIpCnJldHVybiB0aGlzLlAoKS50Zygw
+LGIpfSwKaTpmdW5jdGlvbihhLGIpe3RoaXMuVChiKQpyZXR1cm4gSC54ZCh0aGlzLk9TKG5ldyBQLkdF
+KGIpKSl9LApSOmZ1bmN0aW9uKGEsYil7dmFyIHQscwp0aGlzLlQoYikKdD10aGlzLlAoKQpzPXQuUigw
+LGIpCnRoaXMuWCh0KQpyZXR1cm4gc30sCkZWOmZ1bmN0aW9uKGEsYil7dGhpcy5PUyhuZXcgUC5ONyh0
+aGlzLHUuWC5iKGIpKSl9LApWMTpmdW5jdGlvbihhKXt0aGlzLk9TKG5ldyBQLnVRKCkpfSwKT1M6ZnVu
+Y3Rpb24oYSl7dmFyIHQscwp1LmNoLmIoYSkKdD10aGlzLlAoKQpzPWEuJDEodCkKdGhpcy5YKHQpCnJl
+dHVybiBzfX0KUC5HRS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gdS5DLmIoYSkuaSgw
+LHRoaXMuYSl9LAokUzo0NX0KUC5ONy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdD10aGlz
+LmIscz1ILnQ2KHQpCnJldHVybiB1LkMuYihhKS5GVigwLG5ldyBILkE4KHQscy5DKCJxVSgxKSIpLmIo
+dGhpcy5hLmd1TSgpKSxzLkMoIkE4PDEscVU+IikpKX0sCiRTOjE0fQpQLnVRLnByb3RvdHlwZT17CiQx
+OmZ1bmN0aW9uKGEpe3UuQy5iKGEpCmlmKGEuYT4wKXthLmI9YS5jPWEuZD1hLmU9YS5mPW51bGwKYS5h
+PTAKYS5TKCl9cmV0dXJuIG51bGx9LAokUzoxNH0KUC5oRi5wcm90b3R5cGU9eyRpaEY6MX0KUC5QQy5w
+cm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdAp1LlouYihhKQp0PWZ1bmN0aW9uKGIsYyxkKXty
+ZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYihjLGQsdGhpcyxBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBw
+bHkoYXJndW1lbnRzKSl9fShQLlI0LGEsITEpClAuRG0odCwkLncoKSxhKQpyZXR1cm4gdH0sCiRTOjR9
+ClAuWW0ucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyB0aGlzLmEoYSl9LAokUzo0
+fQpQLk56LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5yNyhhKX0sCiRTOjM0
+fQpQLm5wLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5UeihhLHUuYW0pfSwK
+JFM6MzV9ClAuVXQucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLkU0KGEpfSwK
+JFM6MzZ9ClAuRTQucHJvdG90eXBlPXsKcTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiIT0ic3RyaW5n
+IiYmdHlwZW9mIGIhPSJudW1iZXIiKXRocm93IEguYihQLnhZKCJwcm9wZXJ0eSBpcyBub3QgYSBTdHJp
+bmcgb3IgbnVtIikpCnJldHVybiBQLkw3KHRoaXMuYVtiXSl9LApZOmZ1bmN0aW9uKGEsYixjKXtpZih0
+eXBlb2YgYiE9InN0cmluZyImJnR5cGVvZiBiIT0ibnVtYmVyIil0aHJvdyBILmIoUC54WSgicHJvcGVy
+dHkgaXMgbm90IGEgU3RyaW5nIG9yIG51bSIpKQp0aGlzLmFbYl09UC53WShjKX0sCkROOmZ1bmN0aW9u
+KGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQpyZXR1cm4gYiBpbnN0YW5jZW9mIFAuRTQmJnRoaXMuYT09
+PWIuYX0sCnc6ZnVuY3Rpb24oYSl7dmFyIHQscwp0cnl7dD1TdHJpbmcodGhpcy5hKQpyZXR1cm4gdH1j
+YXRjaChzKXtILlJ1KHMpCnQ9dGhpcy54YigwKQpyZXR1cm4gdH19LApWNzpmdW5jdGlvbihhLGIpe3Zh
+ciB0LHM9dGhpcy5hCmlmKGI9PW51bGwpdD1udWxsCmVsc2V7dD1ILnQ2KGIpCnQ9UC5DSChuZXcgSC5B
+OChiLHQuQygiQCgxKSIpLmIoUC5pRygpKSx0LkMoIkE4PDEsQD4iKSksITAsdS56KX1yZXR1cm4gUC5M
+NyhzW2FdLmFwcGx5KHMsdCkpfSwKZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiAwfX0KUC5yNy5wcm90b3R5
+cGU9e30KUC5Uei5wcm90b3R5cGU9ewpjUDpmdW5jdGlvbihhKXt2YXIgdD10aGlzLHM9YTwwfHxhPj10
+LmdBKHQpCmlmKHMpdGhyb3cgSC5iKFAuVEUoYSwwLHQuZ0EodCksbnVsbCxudWxsKSl9LApxOmZ1bmN0
+aW9uKGEsYil7aWYodHlwZW9mIGI9PSJudW1iZXIiJiZiPT09Qy5qbi55dShiKSl0aGlzLmNQKEguU2Mo
+YikpCnJldHVybiB0aGlzLiR0aS5kLmIodGhpcy5VcigwLGIpKX0sClk6ZnVuY3Rpb24oYSxiLGMpe3Zh
+ciB0CnRoaXMuJHRpLmQuYihjKQp0PUMuam4ueXUoYikKaWYoYj09PXQpdGhpcy5jUChiKQp0aGlzLmU0
+KDAsYixjKX0sCmdBOmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuYS5sZW5ndGgKaWYodHlwZW9mIHQ9PT0i
+bnVtYmVyIiYmdD4+PjA9PT10KXJldHVybiB0CnRocm93IEguYihQLlBWKCJCYWQgSnNBcnJheSBsZW5n
+dGgiKSl9LAokaWNYOjEsCiRpek06MX0KUC5jby5wcm90b3R5cGU9e30KUC5uZC5wcm90b3R5cGU9eyRp
+bmQ6MX0KUC5LZS5wcm90b3R5cGU9ewpQOmZ1bmN0aW9uKCl7dmFyIHQscyxyLHEscD10aGlzLmEuZ2V0
+QXR0cmlidXRlKCJjbGFzcyIpLG89UC5Mcyh1Lk4pCmlmKHA9PW51bGwpcmV0dXJuIG8KZm9yKHQ9cC5z
+cGxpdCgiICIpLHM9dC5sZW5ndGgscj0wO3I8czsrK3Ipe3E9Si5UMCh0W3JdKQppZihxLmxlbmd0aCE9
+PTApby5pKDAscSl9cmV0dXJuIG99LApYOmZ1bmN0aW9uKGEpe3RoaXMuYS5zZXRBdHRyaWJ1dGUoImNs
+YXNzIixhLkgoMCwiICIpKX19ClAuZDUucHJvdG90eXBlPXsKZ0Q6ZnVuY3Rpb24oYSl7cmV0dXJuIG5l
+dyBQLktlKGEpfSwKc2hmOmZ1bmN0aW9uKGEsYil7dGhpcy5ZQyhhLGIpfSwKcjY6ZnVuY3Rpb24oYSxi
+LGMsZCl7dmFyIHQscyxyLHEscCxvCmlmKGQ9PW51bGwpe3Q9SC5WTShbXSx1LmspCmQ9bmV3IFcudkQo
+dCkKQy5ObS5pKHQsVy5UdyhudWxsKSkKQy5ObS5pKHQsVy5CbCgpKQpDLk5tLmkodCxuZXcgVy5Pdygp
+KX1jPW5ldyBXLktvKGQpCnM9JzxzdmcgdmVyc2lvbj0iMS4xIj4nK0guZChiKSsiPC9zdmc+Igp0PWRv
+Y3VtZW50CnI9dC5ib2R5CnE9KHImJkMuUlkpLkFIKHIscyxjKQpwPXQuY3JlYXRlRG9jdW1lbnRGcmFn
+bWVudCgpCnEudG9TdHJpbmcKdD1uZXcgVy5lNyhxKQpvPXQuZ3I4KHQpCmZvcig7dD1vLmZpcnN0Q2hp
+bGQsdCE9bnVsbDspcC5hcHBlbmRDaGlsZCh0KQpyZXR1cm4gcH0sCmdWbDpmdW5jdGlvbihhKXtyZXR1
+cm4gbmV3IFcuQ3EoYSwiY2xpY2siLCExLHUuUSl9LAokaWQ1OjF9ClAubjYucHJvdG90eXBlPXskaWNY
+OjEsJGl6TToxLCRpQVM6MX0KVS5kMi5wcm90b3R5cGU9e30KVS5TZS5wcm90b3R5cGU9e30KVS51Ri5w
+cm90b3R5cGU9e30KVS5NbC5wcm90b3R5cGU9e30KVS55RC5wcm90b3R5cGU9e30KVS53Yi5wcm90b3R5
+cGU9e30KQi5qOC5wcm90b3R5cGU9e30KQi5xcC5wcm90b3R5cGU9e30KVC5HVi5wcm90b3R5cGU9e30K
+TC5lLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0LHMscixxLHAsbwp1LkIuYihhKQp0PXdp
+bmRvdy5sb2NhdGlvbi5wYXRobmFtZQpzPUwuRzYod2luZG93LmxvY2F0aW9uLmhyZWYpCnI9TC5hSyh3
+aW5kb3cubG9jYXRpb24uaHJlZikKTC5HZSgpCmlmKHQhPT0iLyImJnQhPT1KLlQwKGRvY3VtZW50LnF1
+ZXJ5U2VsZWN0b3IoIi5yb290IikudGV4dENvbnRlbnQpKUwuRzcodCxzLHIsITAsbmV3IEwuVlcodCxz
+LHIpKQpxPUoucUYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmFwcGx5LW1pZ3JhdGlvbiIpKQpwPXEu
+JHRpCm89cC5DKCJ+KDEpIikuYihuZXcgTC5vWigpKQp1Lk0uYihudWxsKQpXLkpFKHEuYSxxLmIsbywh
+MSxwLmQpfSwKJFM6MTN9CkwuVlcucHJvdG90eXBlPXsKJDA6ZnVuY3Rpb24oKXtMLkZyKHRoaXMuYSx0
+aGlzLmIsdGhpcy5jKX0sCiRTOjB9Ckwub1oucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dS5WLmIo
+YSkKTC50eSgiL2FwcGx5LW1pZ3JhdGlvbiIpLlc3KG5ldyBMLmpyKCksdS5QKS5PQShuZXcgTC5xbCgp
+KX0sCiRTOjZ9CkwuanIucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQKdS5yLmIoYSkKdD1k
+b2N1bWVudC5ib2R5CnQuY2xhc3NMaXN0LnJlbW92ZSgicHJvcG9zZWQiKQp0LmNsYXNzTGlzdC5hZGQo
+ImFwcGxpZWQiKX0sCiRTOjd9CkwucWwucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtMLnFKKCJh
+cHBseSBtaWdyYXRpb24gZXJyb3I6ICIrSC5kKGEpLGIpCndpbmRvdy5hbGVydCgiQ291bGQgbm90IGFw
+cGx5IG1pZ3JhdGlvbiAoIitILmQoYSkrIikuIil9LAokQzoiJDIiLAokUjoyLAokUzoxfQpMLkwucHJv
+dG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQscyxyCnUuQi5iKGEpCnQ9d2luZG93LmxvY2F0aW9u
+LnBhdGhuYW1lCnM9TC5HNih3aW5kb3cubG9jYXRpb24uaHJlZikKcj1MLmFLKHdpbmRvdy5sb2NhdGlv
+bi5ocmVmKQppZih0Lmxlbmd0aD4xKUwuRzcodCxzLHIsITEsbnVsbCkKZWxzZXtMLkJFKHQsbmV3IEIu
+cXAoIiIsIiIsIiIsQy54RCksITApCkwuQlgoIiZuYnNwOyIsbnVsbCl9fSwKJFM6MTN9CkwuV3gucHJv
+dG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHE9ImNvbGxhcHNlZCIKdS5WLmIoYSkKdD10
+aGlzLmEKcz1KLlJFKHQpCnI9dGhpcy5iCmlmKCFzLmdEKHQpLnRnKDAscSkpe3MuZ0QodCkuaSgwLHEp
+CkouZFIocikuaSgwLHEpfWVsc2V7cy5nRCh0KS5SKDAscSkKSi5kUihyKS5SKDAscSl9fSwKJFM6Nn0K
+TC5BTy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdD1KLnFGKHUuaC5iKGEpKSxzPXQuJHRp
+LHI9cy5DKCJ+KDEpIikuYihuZXcgTC5kTih0aGlzLmEpKQp1Lk0uYihudWxsKQpXLkpFKHQuYSx0LmIs
+ciwhMSxzLmQpfSwKJFM6M30KTC5kTi5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdAp1LlYu
+YihhKQp0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInRhYmxlW2RhdGEtcGF0aF0iKQp0LnRvU3RyaW5n
+CkwudDIoYSx0aGlzLmEsdC5nZXRBdHRyaWJ1dGUoImRhdGEtIituZXcgVy5TeShuZXcgVy5pNyh0KSku
+TygicGF0aCIpKSl9LAokUzo2fQpMLkhvLnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0LHMs
+cgp1LmguYihhKQp0PUoucUYoYSkKcz10LiR0aQpyPXMuQygifigxKSIpLmIobmV3IEwueHooYSx0aGlz
+LmEpKQp1Lk0uYihudWxsKQpXLkpFKHQuYSx0LmIsciwhMSxzLmQpfSwKJFM6M30KTC54ei5wcm90b3R5
+cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdAp1LlYuYihhKQp0PXRoaXMuYQpMLmhYKHRoaXMuYixQLlFB
+KHQuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbmV3IFcuU3kobmV3IFcuaTcodCkpLk8oIm9mZnNldCIpKSxu
+dWxsLG51bGwpKX0sCiRTOjZ9CkwuSUMucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQ9Si5x
+Rih1LmguYihhKSkscz10LiR0aQpzLkMoIn4oMSkiKS5iKEwuSDAoKSkKdS5NLmIobnVsbCkKVy5KRSh0
+LmEsdC5iLEwuSDAoKSwhMSxzLmQpfSwKJFM6M30KTC5MMS5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihh
+KXt2YXIgdAp1LnIuYihhKQp0PWEuc3RhdHVzCmlmKHQ9PT0yMDApcmV0dXJuIGEKZWxzZSB0aHJvdyBI
+LmIoIlJlcXVlc3QgZmFpbGVkOyBzdGF0dXMgb2YgIitILmQodCkpfSwKJFM6NDF9CkwublQucHJvdG90
+eXBlPXsKJDA6ZnVuY3Rpb24oKXtMLkZyKHRoaXMuYS5hLHRoaXMuYix0aGlzLmMpfSwKJFM6MH0KTC5C
+Wi5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe0wuRnIodGhpcy5hLmEsbnVsbCxudWxsKX0sCiRTOjB9
+CkwuR0gucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dS5oLmIoYSkKJC56QigpLnRvU3RyaW5nCnUu
+di5iKCQub3coKS5xKDAsImhsanMiKSkuVjcoImhpZ2hsaWdodEJsb2NrIixbYV0pfSwKJFM6M30KTC5E
+VC5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXt2YXIgdAp1LnIuYihhKQp0PWEuc3RhdHVzCmlmKHQ9
+PT0yMDApe0wuVDEoVS55dShDLkN0LnBXKDAsYS5yZXNwb25zZVRleHQsbnVsbCkpKQpMLnlYKCIuZWRp
+dC1wYW5lbCAucGFuZWwtY29udGVudCIsITEpfWVsc2Ugd2luZG93LmFsZXJ0KCJSZXF1ZXN0IGZhaWxl
+ZDsgc3RhdHVzIG9mICIrSC5kKHQpKX0sCiRTOjd9CkwuZUgucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24o
+YSxiKXtMLnFKKCJsb2FkUmVnaW9uRXhwbGFuYXRpb246ICIrSC5kKGEpLGIpCndpbmRvdy5hbGVydCgi
+Q291bGQgbm90IGxvYWQgIitILmQodGhpcy5hKSsiICgiK0guZChhKSsiKS4iKX0sCiRDOiIkMiIsCiRS
+OjIsCiRTOjF9CkwuekQucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7dmFyIHQscyxyPXRoaXMKdS5y
+LmIoYSkKdD1hLnN0YXR1cwppZih0PT09MjAwKXtzPXIuYQpMLkJFKHMsQi5ZZih1LmIuYihDLkN0LnBX
+KDAsYS5yZXNwb25zZVRleHQsbnVsbCkpKSxyLmIpCnQ9ci5jCkwuZkcodCxyLmQpCkwuQlgoQy54Qi50
+ZyhzLCI/Iik/Qy54Qi5OaihzLDAsQy54Qi5PWShzLCI/IikpOnMsdCkKdD1yLmUKaWYodCE9bnVsbCl0
+LiQwKCl9ZWxzZSB3aW5kb3cuYWxlcnQoIlJlcXVlc3QgZmFpbGVkOyBzdGF0dXMgb2YgIitILmQodCkp
+fSwKJFM6N30KTC5PRS5wcm90b3R5cGU9ewokMjpmdW5jdGlvbihhLGIpe0wucUooImxvYWRGaWxlOiAi
+K0guZChhKSxiKQp3aW5kb3cuYWxlcnQoIkNvdWxkIG5vdCBsb2FkICIrdGhpcy5hKyIgKCIrSC5kKGEp
+KyIpLiIpfSwKJEM6IiQyIiwKJFI6MiwKJFM6MX0KTC5UVy5wcm90b3R5cGU9ewokMTpmdW5jdGlvbihh
+KXt2YXIgdCxzLHIKdS5yLmIoYSkKdD1hLnN0YXR1cwppZih0PT09MjAwKXtzPUMuQ3QucFcoMCxhLnJl
+c3BvbnNlVGV4dCxudWxsKQpyPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5uYXYtdHJlZSIpCkoubDUo
+ciwiIikKTC50WChyLEwubUsocykpfWVsc2Ugd2luZG93LmFsZXJ0KCJSZXF1ZXN0IGZhaWxlZDsgc3Rh
+dHVzIG9mICIrSC5kKHQpKX0sCiRTOjd9CkwueHIucHJvdG90eXBlPXsKJDI6ZnVuY3Rpb24oYSxiKXtM
+LnFKKCJsb2FkTmF2aWdhdGlvblRyZWU6ICIrSC5kKGEpLGIpCndpbmRvdy5hbGVydCgiQ291bGQgbm90
+IGxvYWQgIit0aGlzLmErIiAoIitILmQoYSkrIikuIil9LAokQzoiJDIiLAokUjoyLAokUzoxfQpMLkVF
+LnByb3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe3ZhciB0LHMKdS5WLmIoYSkKdD10aGlzLmEKcz10aGlz
+LmIKTC5hZih3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsdCxzLCEwLG5ldyBMLlFMKHQscykpCkwuaFgo
+dGhpcy5jLHQpfSwKJFM6Nn0KTC5RTC5wcm90b3R5cGU9ewokMDpmdW5jdGlvbigpe0wuRnIod2luZG93
+LmxvY2F0aW9uLnBhdGhuYW1lLHRoaXMuYSx0aGlzLmIpfSwKJFM6MH0KTC5WUy5wcm90b3R5cGU9ewok
+MTpmdW5jdGlvbihhKXt2YXIgdCxzPSJzZWxlY3RlZC1maWxlIgp1LmguYihhKQphLnRvU3RyaW5nCnQ9
+Si5SRShhKQppZihhLmdldEF0dHJpYnV0ZSgiZGF0YS0iK25ldyBXLlN5KG5ldyBXLmk3KGEpKS5PKCJu
+YW1lIikpPT09dGhpcy5hLmEpdC5nRChhKS5pKDAscykKZWxzZSB0LmdEKGEpLlIoMCxzKX0sCiRTOjN9
+CkwuVEQucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEwudDIodS5WLmIoYSksITAsbnVs
+bCl9LAokUzoxNn0KTC5YQS5wcm90b3R5cGU9ewpFYjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuITB9LApp
+MDpmdW5jdGlvbihhKXtyZXR1cm4hMH0sCiRpa0Y6MX0KTC5aWi5wcm90b3R5cGU9e30KTC55OC5wcm90
+b3R5cGU9ewp3OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJ9fQpNLmxJLnByb3RvdHlwZT17CldPOmZ1
+bmN0aW9uKGEsYil7dmFyIHQscz1udWxsCk0uWUYoImFic29sdXRlIixILlZNKFtiLG51bGwsbnVsbCxu
+dWxsLG51bGwsbnVsbCxudWxsXSx1LnMpKQp0PXRoaXMuYQp0PXQuWXIoYik+MCYmIXQuaEsoYikKaWYo
+dClyZXR1cm4gYgp0PUQuUlgoKQpyZXR1cm4gdGhpcy5xNygwLHQsYixzLHMscyxzLHMscyl9LAp0TTpm
+dW5jdGlvbihhKXt2YXIgdCxzLHI9WC5DTChhLHRoaXMuYSkKci5JVigpCnQ9ci5kCnM9dC5sZW5ndGgK
+aWYocz09PTApe3Q9ci5iCnJldHVybiB0PT1udWxsPyIuIjp0fWlmKHM9PT0xKXt0PXIuYgpyZXR1cm4g
+dD09bnVsbD8iLiI6dH1pZigwPj1zKXJldHVybiBILk9IKHQsLTEpCnQucG9wKCkKQy5ObS5tdihyLmUp
+CnIuSVYoKQpyZXR1cm4gci53KDApfSwKcTc6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe3ZhciB0
+PUguVk0oW2IsYyxkLGUsZixnLGgsaV0sdS5zKQpNLllGKCJqb2luIix0KQpyZXR1cm4gdGhpcy5JUChu
+ZXcgSC5VNSh0LHUuYkIuYihuZXcgTS5NaSgpKSx1LmNjKSl9LApJUDpmdW5jdGlvbihhKXt2YXIgdCxz
+LHIscSxwLG8sbixtLGwKdS5YLmIoYSkKZm9yKHQ9YS4kdGkscz10LkMoImEyKGNYLkUpIikuYihuZXcg
+TS5xNygpKSxyPWEuZ2t6KGEpLHQ9bmV3IEguU08ocixzLHQuQygiU088Y1guRT4iKSkscz10aGlzLmEs
+cT0hMSxwPSExLG89IiI7dC5GKCk7KXtuPXIuZ2woKQppZihzLmhLKG4pJiZwKXttPVguQ0wobixzKQps
+PW8uY2hhckNvZGVBdCgwKT09MD9vOm8Kbz1DLnhCLk5qKGwsMCxzLlNwKGwsITApKQptLmI9bwppZihz
+LmRzKG8pKUMuTm0uWShtLmUsMCxzLmdtSSgpKQpvPW0udygwKX1lbHNlIGlmKHMuWXIobik+MCl7cD0h
+cy5oSyhuKQpvPUguZChuKX1lbHNle2lmKCEobi5sZW5ndGg+MCYmcy5VZChuWzBdKSkpaWYocSlvKz1z
+LmdtSSgpCm8rPUguZChuKX1xPXMuZHMobil9cmV0dXJuIG8uY2hhckNvZGVBdCgwKT09MD9vOm99LApv
+NTpmdW5jdGlvbihhKXt2YXIgdAppZighdGhpcy55MyhhKSlyZXR1cm4gYQp0PVguQ0woYSx0aGlzLmEp
+CnQuclIoKQpyZXR1cm4gdC53KDApfSwKeTM6ZnVuY3Rpb24oYSl7dmFyIHQscyxyLHEscCxvLG4sbSxs
+LGsKYS50b1N0cmluZwp0PXRoaXMuYQpzPXQuWXIoYSkKaWYocyE9PTApe2lmKHQ9PT0kLktrKCkpZm9y
+KHI9MDtyPHM7KytyKWlmKEMueEIuVyhhLHIpPT09NDcpcmV0dXJuITAKcT1zCnA9NDd9ZWxzZXtxPTAK
+cD1udWxsfWZvcihvPW5ldyBILnFqKGEpLmEsbj1vLmxlbmd0aCxyPXEsbT1udWxsO3I8bjsrK3IsbT1w
+LHA9bCl7bD1DLnhCLm0obyxyKQppZih0LnI0KGwpKXtpZih0PT09JC5LaygpJiZsPT09NDcpcmV0dXJu
+ITAKaWYocCE9bnVsbCYmdC5yNChwKSlyZXR1cm4hMAppZihwPT09NDYpaz1tPT1udWxsfHxtPT09NDZ8
+fHQucjQobSkKZWxzZSBrPSExCmlmKGspcmV0dXJuITB9fWlmKHA9PW51bGwpcmV0dXJuITAKaWYodC5y
+NChwKSlyZXR1cm4hMAppZihwPT09NDYpdD1tPT1udWxsfHx0LnI0KG0pfHxtPT09NDYKZWxzZSB0PSEx
+CmlmKHQpcmV0dXJuITAKcmV0dXJuITF9LApIUDpmdW5jdGlvbihhLGIpe3ZhciB0LHMscixxLHAsbz10
+aGlzLG49J1VuYWJsZSB0byBmaW5kIGEgcGF0aCB0byAiJwpiPW8uV08oMCxiKQp0PW8uYQppZih0Llly
+KGIpPD0wJiZ0LllyKGEpPjApcmV0dXJuIG8ubzUoYSkKaWYodC5ZcihhKTw9MHx8dC5oSyhhKSlhPW8u
+V08oMCxhKQppZih0LllyKGEpPD0wJiZ0LllyKGIpPjApdGhyb3cgSC5iKFguSlQobitILmQoYSkrJyIg
+ZnJvbSAiJytILmQoYikrJyIuJykpCnM9WC5DTChiLHQpCnMuclIoKQpyPVguQ0woYSx0KQpyLnJSKCkK
+cT1zLmQKaWYocS5sZW5ndGg+MCYmSi5STShxWzBdLCIuIikpcmV0dXJuIHIudygwKQpxPXMuYgpwPXIu
+YgppZihxIT1wKXE9cT09bnVsbHx8cD09bnVsbHx8IXQuTmMocSxwKQplbHNlIHE9ITEKaWYocSlyZXR1
+cm4gci53KDApCndoaWxlKCEwKXtxPXMuZAppZihxLmxlbmd0aD4wKXtwPXIuZApxPXAubGVuZ3RoPjAm
+JnQuTmMocVswXSxwWzBdKX1lbHNlIHE9ITEKaWYoIXEpYnJlYWsKQy5ObS5XNChzLmQsMCkKQy5ObS5X
+NChzLmUsMSkKQy5ObS5XNChyLmQsMCkKQy5ObS5XNChyLmUsMSl9cT1zLmQKaWYocS5sZW5ndGg+MCYm
+Si5STShxWzBdLCIuLiIpKXRocm93IEguYihYLkpUKG4rSC5kKGEpKyciIGZyb20gIicrSC5kKGIpKyci
+LicpKQpxPXUuTgpDLk5tLlVHKHIuZCwwLFAuTzgocy5kLmxlbmd0aCwiLi4iLHEpKQpDLk5tLlkoci5l
+LDAsIiIpCkMuTm0uVUcoci5lLDEsUC5POChzLmQubGVuZ3RoLHQuZ21JKCkscSkpCnQ9ci5kCnE9dC5s
+ZW5ndGgKaWYocT09PTApcmV0dXJuIi4iCmlmKHE+MSYmSi5STShDLk5tLmdyWih0KSwiLiIpKXt0PXIu
+ZAppZigwPj10Lmxlbmd0aClyZXR1cm4gSC5PSCh0LC0xKQp0LnBvcCgpCnQ9ci5lCkMuTm0ubXYodCkK
+Qy5ObS5tdih0KQpDLk5tLmkodCwiIil9ci5iPSIiCnIuSVYoKQpyZXR1cm4gci53KDApfX0KTS5NaS5w
+cm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gSC55KGEpIT1udWxsfSwKJFM6OH0KTS5xNy5w
+cm90b3R5cGU9ewokMTpmdW5jdGlvbihhKXtyZXR1cm4gSC55KGEpIT09IiJ9LAokUzo4fQpNLk5vLnBy
+b3RvdHlwZT17CiQxOmZ1bmN0aW9uKGEpe0gueShhKQpyZXR1cm4gYT09bnVsbD8ibnVsbCI6JyInK2Er
+JyInfSwKJFM6NX0KQi5MdS5wcm90b3R5cGU9ewp4WjpmdW5jdGlvbihhKXt2YXIgdCxzPXRoaXMuWXIo
+YSkKaWYocz4wKXJldHVybiBKLmxkKGEsMCxzKQppZih0aGlzLmhLKGEpKXtpZigwPj1hLmxlbmd0aCly
+ZXR1cm4gSC5PSChhLDApCnQ9YVswXX1lbHNlIHQ9bnVsbApyZXR1cm4gdH0sCk5jOmZ1bmN0aW9uKGEs
+Yil7cmV0dXJuIGE9PWJ9fQpYLldELnByb3RvdHlwZT17CklWOmZ1bmN0aW9uKCl7dmFyIHQscyxyPXRo
+aXMKd2hpbGUoITApe3Q9ci5kCmlmKCEodC5sZW5ndGghPT0wJiZKLlJNKEMuTm0uZ3JaKHQpLCIiKSkp
+YnJlYWsKdD1yLmQKaWYoMD49dC5sZW5ndGgpcmV0dXJuIEguT0godCwtMSkKdC5wb3AoKQpDLk5tLm12
+KHIuZSl9dD1yLmUKcz10Lmxlbmd0aAppZihzPjApQy5ObS5ZKHQscy0xLCIiKX0sCnJSOmZ1bmN0aW9u
+KCl7dmFyIHQscyxyLHEscCxvLG4sbT10aGlzLGw9SC5WTShbXSx1LnMpCmZvcih0PW0uZCxzPXQubGVu
+Z3RoLHI9MCxxPTA7cTx0Lmxlbmd0aDt0Lmxlbmd0aD09PXN8fCgwLEgubGspKHQpLCsrcSl7cD10W3Fd
+Cm89Si5pYShwKQppZighKG8uRE4ocCwiLiIpfHxvLkROKHAsIiIpKSlpZihvLkROKHAsIi4uIikpaWYo
+bC5sZW5ndGg+MClsLnBvcCgpCmVsc2UgKytyCmVsc2UgQy5ObS5pKGwscCl9aWYobS5iPT1udWxsKUMu
+Tm0uVUcobCwwLFAuTzgociwiLi4iLHUuTikpCmlmKGwubGVuZ3RoPT09MCYmbS5iPT1udWxsKUMuTm0u
+aShsLCIuIikKbj1QLmRIKGwubGVuZ3RoLG5ldyBYLnFSKG0pLCEwLHUuTikKdD1tLmIKdD10IT1udWxs
+JiZsLmxlbmd0aD4wJiZtLmEuZHModCk/bS5hLmdtSSgpOiIiCkgudDYobikuZC5iKHQpCmlmKCEhbi5m
+aXhlZCRsZW5ndGgpSC52aChQLkw0KCJpbnNlcnQiKSkKbi5zcGxpY2UoMCwwLHQpCm0uc25KKGwpCm0u
+c1BoKG4pCnQ9bS5iCmlmKHQhPW51bGwmJm0uYT09PSQuS2soKSl7dC50b1N0cmluZwptLmI9SC55cyh0
+LCIvIiwiXFwiKX1tLklWKCl9LAp3OmZ1bmN0aW9uKGEpe3ZhciB0LHMscj10aGlzLHE9ci5iCnE9cSE9
+bnVsbD9xOiIiCmZvcih0PTA7dDxyLmQubGVuZ3RoOysrdCl7cz1yLmUKaWYodD49cy5sZW5ndGgpcmV0
+dXJuIEguT0gocyx0KQpzPXErSC5kKHNbdF0pCnE9ci5kCmlmKHQ+PXEubGVuZ3RoKXJldHVybiBILk9I
+KHEsdCkKcT1zK0guZChxW3RdKX1xKz1ILmQoQy5ObS5nclooci5lKSkKcmV0dXJuIHEuY2hhckNvZGVB
+dCgwKT09MD9xOnF9LApzbko6ZnVuY3Rpb24oYSl7dGhpcy5kPXUuYS5iKGEpfSwKc1BoOmZ1bmN0aW9u
+KGEpe3RoaXMuZT11LmEuYihhKX19ClgucVIucHJvdG90eXBlPXsKJDE6ZnVuY3Rpb24oYSl7cmV0dXJu
+IHRoaXMuYS5hLmdtSSgpfSwKJFM6NDN9ClguZHYucHJvdG90eXBlPXsKdzpmdW5jdGlvbihhKXtyZXR1
+cm4iUGF0aEV4Y2VwdGlvbjogIit0aGlzLmF9fQpPLnpMLnByb3RvdHlwZT17Cnc6ZnVuY3Rpb24oYSl7
+cmV0dXJuIHRoaXMuZ29jKHRoaXMpfX0KRS5PRi5wcm90b3R5cGU9ewpVZDpmdW5jdGlvbihhKXtyZXR1
+cm4gQy54Qi50ZyhhLCIvIil9LApyNDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PTQ3fSwKZHM6ZnVuY3Rp
+b24oYSl7dmFyIHQ9YS5sZW5ndGgKcmV0dXJuIHQhPT0wJiZDLnhCLm0oYSx0LTEpIT09NDd9LApTcDpm
+dW5jdGlvbihhLGIpe2lmKGEubGVuZ3RoIT09MCYmQy54Qi5XKGEsMCk9PT00NylyZXR1cm4gMQpyZXR1
+cm4gMH0sCllyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlNwKGEsITEpfSwKaEs6ZnVuY3Rpb24oYSl7
+cmV0dXJuITF9LApnb2M6ZnVuY3Rpb24oKXtyZXR1cm4icG9zaXgifSwKZ21JOmZ1bmN0aW9uKCl7cmV0
+dXJuIi8ifX0KRi5ydS5wcm90b3R5cGU9ewpVZDpmdW5jdGlvbihhKXtyZXR1cm4gQy54Qi50ZyhhLCIv
+Iil9LApyNDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PTQ3fSwKZHM6ZnVuY3Rpb24oYSl7dmFyIHQ9YS5s
+ZW5ndGgKaWYodD09PTApcmV0dXJuITEKaWYoQy54Qi5tKGEsdC0xKSE9PTQ3KXJldHVybiEwCnJldHVy
+biBDLnhCLlRjKGEsIjovLyIpJiZ0aGlzLllyKGEpPT09dH0sClNwOmZ1bmN0aW9uKGEsYil7dmFyIHQs
+cyxyLHEscD1hLmxlbmd0aAppZihwPT09MClyZXR1cm4gMAppZihDLnhCLlcoYSwwKT09PTQ3KXJldHVy
+biAxCmZvcih0PTA7dDxwOysrdCl7cz1DLnhCLlcoYSx0KQppZihzPT09NDcpcmV0dXJuIDAKaWYocz09
+PTU4KXtpZih0PT09MClyZXR1cm4gMApyPUMueEIuWFUoYSwiLyIsQy54Qi5RaShhLCIvLyIsdCsxKT90
+KzM6dCkKaWYocjw9MClyZXR1cm4gcAppZighYnx8cDxyKzMpcmV0dXJuIHIKaWYoIUMueEIubihhLCJm
+aWxlOi8vIikpcmV0dXJuIHIKaWYoIUIuWXUoYSxyKzEpKXJldHVybiByCnE9ciszCnJldHVybiBwPT09
+cT9xOnIrNH19cmV0dXJuIDB9LApZcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5TcChhLCExKX0sCmhL
+OmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aCE9PTAmJkMueEIuVyhhLDApPT09NDd9LApnb2M6ZnVu
+Y3Rpb24oKXtyZXR1cm4idXJsIn0sCmdtSTpmdW5jdGlvbigpe3JldHVybiIvIn19CkwuSVYucHJvdG90
+eXBlPXsKVWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEMueEIudGcoYSwiLyIpfSwKcjQ6ZnVuY3Rpb24oYSl7
+cmV0dXJuIGE9PT00N3x8YT09PTkyfSwKZHM6ZnVuY3Rpb24oYSl7dmFyIHQ9YS5sZW5ndGgKaWYodD09
+PTApcmV0dXJuITEKdD1DLnhCLm0oYSx0LTEpCnJldHVybiEodD09PTQ3fHx0PT09OTIpfSwKU3A6ZnVu
+Y3Rpb24oYSxiKXt2YXIgdCxzLHI9YS5sZW5ndGgKaWYocj09PTApcmV0dXJuIDAKdD1DLnhCLlcoYSww
+KQppZih0PT09NDcpcmV0dXJuIDEKaWYodD09PTkyKXtpZihyPDJ8fEMueEIuVyhhLDEpIT09OTIpcmV0
+dXJuIDEKcz1DLnhCLlhVKGEsIlxcIiwyKQppZihzPjApe3M9Qy54Qi5YVShhLCJcXCIscysxKQppZihz
+PjApcmV0dXJuIHN9cmV0dXJuIHJ9aWYocjwzKXJldHVybiAwCmlmKCFCLk9TKHQpKXJldHVybiAwCmlm
+KEMueEIuVyhhLDEpIT09NTgpcmV0dXJuIDAKcj1DLnhCLlcoYSwyKQppZighKHI9PT00N3x8cj09PTky
+KSlyZXR1cm4gMApyZXR1cm4gM30sCllyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlNwKGEsITEpfSwK
+aEs6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuWXIoYSk9PT0xfSwKT3Q6ZnVuY3Rpb24oYSxiKXt2YXIg
+dAppZihhPT09YilyZXR1cm4hMAppZihhPT09NDcpcmV0dXJuIGI9PT05MgppZihhPT09OTIpcmV0dXJu
+IGI9PT00NwppZigoYV5iKSE9PTMyKXJldHVybiExCnQ9YXwzMgpyZXR1cm4gdD49OTcmJnQ8PTEyMn0s
+Ck5jOmZ1bmN0aW9uKGEsYil7dmFyIHQscyxyCmlmKGE9PWIpcmV0dXJuITAKdD1hLmxlbmd0aAppZih0
+IT09Yi5sZW5ndGgpcmV0dXJuITEKZm9yKHM9Si5yWShiKSxyPTA7cjx0OysrcilpZighdGhpcy5PdChD
+LnhCLlcoYSxyKSxzLlcoYixyKSkpcmV0dXJuITEKcmV0dXJuITB9LApnb2M6ZnVuY3Rpb24oKXtyZXR1
+cm4id2luZG93cyJ9LApnbUk6ZnVuY3Rpb24oKXtyZXR1cm4iXFwifX07KGZ1bmN0aW9uIGFsaWFzZXMo
+KXt2YXIgdD1KLnZCLnByb3RvdHlwZQp0LlU9dC53CnQuU2o9dC5lNwp0PUouTUYucHJvdG90eXBlCnQu
+dD10LncKdD1QLmNYLnByb3RvdHlwZQp0LkdHPXQuZXYKdD1QLmsucHJvdG90eXBlCnQueGI9dC53CnQ9
+Vy5jdi5wcm90b3R5cGUKdC5EVz10LnI2CnQ9Vy5tNi5wcm90b3R5cGUKdC5qRj10LkViCnQ9UC5FNC5w
+cm90b3R5cGUKdC5Vcj10LnEKdC5lND10Lll9KSgpOyhmdW5jdGlvbiBpbnN0YWxsVGVhck9mZnMoKXt2
+YXIgdD1odW5rSGVscGVycy5fc3RhdGljXzEscz1odW5rSGVscGVycy5fc3RhdGljXzAscj1odW5rSGVs
+cGVycy5pbnN0YWxsSW5zdGFuY2VUZWFyT2ZmLHE9aHVua0hlbHBlcnMuaW5zdGFsbFN0YXRpY1RlYXJP
+ZmYscD1odW5rSGVscGVycy5faW5zdGFuY2VfMXUKdChQLCJFWCIsIlpWIiw5KQp0KFAsInl0Iiwib0Ei
+LDkpCnQoUCwicVciLCJCeiIsOSkKcyhQLCJVSSIsImVOIiwyKQpyKFAuUGYucHJvdG90eXBlLCJnWUoi
+LDAsMSxudWxsLFsiJDIiLCIkMSJdLFsidzAiLCJwbSJdLDQ0LDApCnQoUCwiUEgiLCJNdCIsNSkKcShX
+LCJwUyIsNCxudWxsLFsiJDQiXSxbInlXIl0sMTUsMCkKcShXLCJWNCIsNCxudWxsLFsiJDQiXSxbIlFX
+Il0sMTUsMCkKcChQLkFzLnByb3RvdHlwZSwiZ3VNIiwiVCIsNSkKdChQLCJpRyIsIndZIiw0KQp0KFAs
+IncwIiwiTDciLDMwKQp0KEwsIkgwIiwidW0iLDE2KX0pKCk7KGZ1bmN0aW9uIGluaGVyaXRhbmNlKCl7
+dmFyIHQ9aHVua0hlbHBlcnMubWl4aW4scz1odW5rSGVscGVycy5pbmhlcml0LHI9aHVua0hlbHBlcnMu
+aW5oZXJpdE1hbnkKcyhQLmssbnVsbCkKcihQLmssW0guZW8sSi52QixKLm0xLFAublksUC5jWCxILmE3
+LFAuQW4sSC5TVSxILlJlLEgud3YsUC5QbixILldVLEguTEksSC5UcCxILmY5LFAuWFMsSC5icSxILlhP
+LFAuWWssSC5kYixILk42LEguVlIsSC5FSyxILlBiLEgudFEsSC5TZCxILkpjLEguRyxQLlczLFAuaWgs
+UC5QZixQLkZlLFAudnMsUC5PTSxQLnFoLFAuTU8sUC5rVCxQLnhJLFAuQ3csUC5tMCxQLlh2LFAuYm4s
+UC5sbSxQLmxELFAuS1AsUC5sZixQLldZLFAuVWssUC5SdyxQLmJ6LFAuYTIsUC5pUCxQLkZLLFAuazUs
+UC5LWSxQLkNELFAuYUUsUC5FSCxQLnpNLFAuWjAsUC5jOCxQLk9kLFAuaWIsUC5HeixQLnFVLFAuUm4s
+UC5HRCxQLkRuLFAuUEUsUC5VZixXLmlkLFcuRmssVy5KUSxXLkdtLFcudkQsVy5tNixXLk93LFcuVzks
+Vy5kVyxXLkZiLFcua0YsVy5tayxXLktvLFAuaUosUC5FNCxQLm42LFUuZDIsVS5TZSxVLnVGLFUuTWws
+VS55RCxVLndiLEIuajgsQi5xcCxULkdWLEwuWEEsTC5aWixMLnk4LE0ubEksTy56TCxYLldELFguZHZd
+KQpyKEoudkIsW0oueUUsSi5ZRSxKLk1GLEouamQsSi5xSSxKLkRyLEguRVQsVy5EMCxXLkF6LFcuTGUs
+Vy5OaCxXLklCLFcubjcsVy5lYSxXLmJyLFcuU2csVy51OCxXLks3LFcuWFcsUC5oRl0pCnIoSi5NRixb
+Si5pQyxKLmtkLEouYzVdKQpzKEouUG8sSi5qZCkKcihKLnFJLFtKLnVyLEouVkFdKQpzKFAuTFUsUC5u
+WSkKcihQLkxVLFtILlhDLFcud3osVy5lN10pCnMoSC5xaixILlhDKQpyKFAuY1gsW0guYlEsSC5VNSxQ
+Lm1XLEgudW5dKQpyKEguYlEsW0guYUwsSC5pNSxQLnh1XSkKcihILmFMLFtILm5ILEguQTgsUC5pOF0p
+CnMoSC5TTyxQLkFuKQpzKFAuUlUsUC5QbikKcyhQLkdqLFAuUlUpCnMoSC5QRCxQLkdqKQpzKEguTFAs
+SC5XVSkKcihILlRwLFtILkNqLEguQW0sSC5sYyxILmRDLEgud04sSC5WWCxQLnRoLFAuaGEsUC5WcyxQ
+LkZ0LFAueUgsUC5XTSxQLlNYLFAuR3MsUC5kYSxQLm9RLFAucFYsUC5VNyxQLnZyLFAuckgsUC5LRixQ
+LlpMLFAuUlQsUC5qWixQLnJxLFAuUlcsUC5CNSxQLlBJLFAucEssUC5oaixQLlZwLFAuT1IsUC5yYSxQ
+LldGLFAubjEsUC5jUyxQLlZDLFAudHAsUC5lMSxQLk5ZLFAuUlosUC5NRSxQLnk1LFAucTMsUC55SSxQ
+LmM2LFAucWQsVy5DdixXLmJVLFcuaEgsVy5LUyxXLkEzLFcudk4sVy5VdixXLkVnLFcuRW8sVy5XayxX
+LklBLFcuZm0sUC5sUixQLmpnLFAuR0UsUC5ONyxQLnVRLFAuUEMsUC5ZbSxQLk56LFAubnAsUC5VdCxM
+LmUsTC5WVyxMLm9aLEwuanIsTC5xbCxMLkwsTC5XeCxMLkFPLEwuZE4sTC5IbyxMLnh6LEwuSUMsTC5M
+MSxMLm5ULEwuQlosTC5HSCxMLkRULEwuZUgsTC56RCxMLk9FLEwuVFcsTC54cixMLkVFLEwuUUwsTC5W
+UyxMLlRELE0uTWksTS5xNyxNLk5vLFgucVJdKQpyKFAuWFMsW0guVzAsSC5heixILnZWLEguRXEsUC5D
+NixILnU5LFAubixQLnUsUC5tcCxQLnViLFAuZHMsUC5saixQLlVWLFAuY10pCnIoSC5sYyxbSC56eCxI
+LnJUXSkKcyhILmtZLFAuQzYpCnMoUC5pbCxQLllrKQpyKFAuaWwsW0guTjUsUC51dyxXLmNmLFcuU3ld
+KQpzKEguS1csUC5tVykKcyhILmIwLEguRVQpCnIoSC5iMCxbSC5SRyxILldCXSkKcyhILlZQLEguUkcp
+CnMoSC5EZyxILlZQKQpzKEguWkcsSC5XQikKcyhILlBnLEguWkcpCnIoSC5QZyxbSC54aixILmRFLEgu
+WkEsSC53ZixILlBxLEguZUUsSC5WNl0pCnIoSC51OSxbSC5oeixILmlNXSkKcyhQLlpmLFAuUGYpCnMo
+UC5KaSxQLm0wKQpzKFAuYjYsUC5YdikKcyhQLlZqLFAuV1kpCnIoUC5VayxbUC5DVixQLlppLFAuYnld
+KQpzKFAud0ksUC5rVCkKcihQLndJLFtQLlU4LFAuTXgsUC5FMyxQLkdZXSkKcyhQLnU1LFAuWmkpCnIo
+UC5GSyxbUC5DUCxQLktOXSkKcihQLnUsW1AuYkosUC5lWV0pCnMoUC5xZSxQLkRuKQpyKFcuRDAsW1cu
+dUgsVy53YSxXLks1LFcuQ21dKQpyKFcudUgsW1cuY3YsVy5ueCxXLlFGLFcuQ1FdKQpyKFcuY3YsW1cu
+cUUsUC5kNV0pCnIoVy5xRSxbVy5HaCxXLmZZLFcubkIsVy5RUCxXLmg0LFcuU04sVy5scCxXLlRiLFcu
+SXYsVy5CVCxXLnlZXSkKcyhXLm9KLFcuTGUpCnMoVy5UNSxXLkF6KQpzKFcuVmIsVy5RRikKcyhXLk83
+LFcud2EpCnIoVy5lYSxbVy53NixXLmV3XSkKcyhXLkFqLFcudzYpCnMoVy5yQixXLks3KQpzKFcuQkgs
+Vy5yQikKcyhXLnc0LFcuSUIpCnMoVy5vYSxXLlhXKQpzKFcucmgsVy5vYSkKcyhXLmk3LFcuY2YpCnMo
+UC5BcyxQLlZqKQpyKFAuQXMsW1cuSTQsUC5LZV0pCnMoVy5STyxQLnFoKQpzKFcuQ3EsVy5STykKcyhX
+LnhDLFAuTU8pCnMoVy5jdCxXLm02KQpzKFAuQmYsUC5pSikKcihQLkU0LFtQLnI3LFAuY29dKQpzKFAu
+VHosUC5jbykKcyhQLm5kLFAuZDUpCnMoQi5MdSxPLnpMKQpyKEIuTHUsW0UuT0YsRi5ydSxMLklWXSkK
+dChILlhDLEguUmUpCnQoSC5SRyxQLmxEKQp0KEguVlAsSC5TVSkKdChILldCLFAubEQpCnQoSC5aRyxI
+LlNVKQp0KFAublksUC5sRCkKdChQLldZLFAubGYpCnQoUC5SVSxQLktQKQp0KFcuTGUsVy5pZCkKdChX
+Lks3LFAubEQpCnQoVy5yQixXLkdtKQp0KFcuWFcsUC5sRCkKdChXLm9hLFcuR20pCnQoUC5jbyxQLmxE
+KX0pKCkKdmFyIHY9e3R5cGVVbml2ZXJzZTp7ZUM6bmV3IE1hcCgpLHRSOnt9LGVUOnt9LHRQVjp7fSxz
+RUE6W119LG1hbmdsZWRHbG9iYWxOYW1lczp7S046ImludCIsQ1A6ImRvdWJsZSIsRks6Im51bSIscVU6
+IlN0cmluZyIsYTI6ImJvb2wiLGM4OiJOdWxsIix6TToiTGlzdCJ9LG1hbmdsZWROYW1lczp7fSxnZXRU
+eXBlRnJvbU5hbWU6Z2V0R2xvYmFsRnJvbU5hbWUsbWV0YWRhdGE6W10sdHlwZXM6WyJjOCgpIiwiYzgo
+QCxAKSIsIn4oKSIsImM4KGN2KSIsIkAoQCkiLCJxVShxVSkiLCJjOChBaikiLCJjOChPNykiLCJhMihx
+VSkiLCJ+KH4oKSkiLCJjOChxVSxxVSkiLCJjOChxVSkiLCJjOChxVSxAKSIsImM4KGVhKSIsIn4oeHU8
+cVU+KSIsImEyKGN2LHFVLHFVLEpRKSIsIn4oQWopIiwiYTIoa0YpIiwiYzgoQCkiLCJLTihLTixLTiki
+LCJ+KEApIiwiYzgofigpKSIsIn4ocVUscVUpIiwiYzgoS04sQCkiLCJuNihALEApIiwiYTIodUgpIiwi
+fihxVVtAXSkiLCJjOChldykiLCJAKGVhKSIsIn4ocVUsS04pIiwiayhAKSIsIn4odUgsdUgpIiwiYzgo
+R0QsQCkiLCJjOChALEd6KSIsInI3KEApIiwiVHo8QD4oQCkiLCJFNChAKSIsInZzPEA+KEApIiwiQChA
+LHFVKSIsIlowPHFVLHFVPihaMDxxVSxxVT4scVUpIiwiQChxVSkiLCJPNyhPNykiLCJjOChAW0d6XSki
+LCJxVShLTikiLCJ+KGtbR3pdKSIsImEyKHh1PHFVPikiLCJuNihLTikiXSxpbnRlcmNlcHRvcnNCeVRh
+ZzpudWxsLGxlYWZUYWdzOm51bGx9CkgueGIodi50eXBlVW5pdmVyc2UsSlNPTi5wYXJzZSgneyJjNSI6
+Ik1GIiwiaUMiOiJNRiIsImtkIjoiTUYiLCJyeCI6ImVhIiwiZTUiOiJlYSIsIlkwIjoiZDUiLCJXdCI6
+ImQ1IiwidjAiOiJldyIsIk1yIjoicUUiLCJlTCI6InFFIiwiSTAiOiJ1SCIsImhzIjoidUgiLCJYZyI6
+IlFGIiwieWMiOiJBaiIsInk0IjoidzYiLCJhUCI6IkNtIiwieGMiOiJueCIsImtKIjoibngiLCJ6VSI6
+IkRnIiwiZGYiOiJFVCIsInlFIjp7ImEyIjpbXX0sIllFIjp7ImM4IjpbXX0sIk1GIjp7InZtIjpbXSwi
+RUgiOltdfSwiamQiOnsiek0iOlsiMSJdLCJjWCI6WyIxIl19LCJQbyI6eyJqZCI6WyIxIl0sInpNIjpb
+IjEiXSwiY1giOlsiMSJdfSwibTEiOnsiQW4iOlsiMSJdfSwicUkiOnsiQ1AiOltdLCJGSyI6W119LCJ1
+ciI6eyJLTiI6W10sIkNQIjpbXSwiRksiOltdfSwiVkEiOnsiQ1AiOltdLCJGSyI6W119LCJEciI6eyJx
+VSI6W10sInZYIjpbXX0sInFqIjp7IlJlIjpbIktOIl0sImxEIjpbIktOIl0sInpNIjpbIktOIl0sImNY
+IjpbIktOIl0sImxELkUiOiJLTiIsIlJlLkUiOiJLTiJ9LCJiUSI6eyJjWCI6WyIxIl19LCJhTCI6eyJj
+WCI6WyIxIl19LCJuSCI6eyJhTCI6WyIxIl0sImNYIjpbIjEiXSwiYUwuRSI6IjEiLCJjWC5FIjoiMSJ9
+LCJhNyI6eyJBbiI6WyIxIl19LCJBOCI6eyJhTCI6WyIyIl0sImNYIjpbIjIiXSwiYUwuRSI6IjIiLCJj
+WC5FIjoiMiJ9LCJVNSI6eyJjWCI6WyIxIl0sImNYLkUiOiIxIn0sIlNPIjp7IkFuIjpbIjEiXX0sIlhD
+Ijp7IlJlIjpbIjEiXSwibEQiOlsiMSJdLCJ6TSI6WyIxIl0sImNYIjpbIjEiXX0sInd2Ijp7IkdEIjpb
+XX0sIlBEIjp7IkdqIjpbIjEiLCIyIl0sIlJVIjpbIjEiLCIyIl0sIlBuIjpbIjEiLCIyIl0sIktQIjpb
+IjEiLCIyIl0sIlowIjpbIjEiLCIyIl19LCJXVSI6eyJaMCI6WyIxIiwiMiJdfSwiTFAiOnsiV1UiOlsi
+MSIsIjIiXSwiWjAiOlsiMSIsIjIiXX0sIkxJIjp7InZRIjpbXX0sIlcwIjp7IlhTIjpbXX0sImF6Ijp7
+IlhTIjpbXX0sInZWIjp7IlhTIjpbXX0sIlhPIjp7Ikd6IjpbXX0sIlRwIjp7IkVIIjpbXX0sImxjIjp7
+IkVIIjpbXX0sInp4Ijp7IkVIIjpbXX0sInJUIjp7IkVIIjpbXX0sIkVxIjp7IlhTIjpbXX0sImtZIjp7
+IlhTIjpbXX0sIk41Ijp7IkZvIjpbIjEiLCIyIl0sIllrIjpbIjEiLCIyIl0sIlowIjpbIjEiLCIyIl0s
+IllrLksiOiIxIiwiWWsuViI6IjIifSwiaTUiOnsiY1giOlsiMSJdLCJjWC5FIjoiMSJ9LCJONiI6eyJB
+biI6WyIxIl19LCJWUiI6eyJ3TCI6W10sInZYIjpbXX0sIkVLIjp7ImliIjpbXSwiT2QiOltdfSwiS1ci
+OnsiY1giOlsiaWIiXSwiY1guRSI6ImliIn0sIlBiIjp7IkFuIjpbImliIl19LCJ0USI6eyJPZCI6W119
+LCJ1biI6eyJjWCI6WyJPZCJdLCJjWC5FIjoiT2QifSwiU2QiOnsiQW4iOlsiT2QiXX0sIkVUIjp7IkFT
+IjpbXX0sImIwIjp7IlhqIjpbIkAiXSwiRVQiOltdLCJBUyI6W119LCJEZyI6eyJsRCI6WyJDUCJdLCJY
+aiI6WyJAIl0sInpNIjpbIkNQIl0sIkVUIjpbXSwiU1UiOlsiQ1AiXSwiQVMiOltdLCJjWCI6WyJDUCJd
+LCJsRC5FIjoiQ1AifSwiUGciOnsibEQiOlsiS04iXSwiek0iOlsiS04iXSwiWGoiOlsiQCJdLCJFVCI6
+W10sIlNVIjpbIktOIl0sIkFTIjpbXSwiY1giOlsiS04iXX0sInhqIjp7ImxEIjpbIktOIl0sInpNIjpb
+IktOIl0sIlhqIjpbIkAiXSwiRVQiOltdLCJTVSI6WyJLTiJdLCJBUyI6W10sImNYIjpbIktOIl0sImxE
+LkUiOiJLTiJ9LCJkRSI6eyJsRCI6WyJLTiJdLCJ6TSI6WyJLTiJdLCJYaiI6WyJAIl0sIkVUIjpbXSwi
+U1UiOlsiS04iXSwiQVMiOltdLCJjWCI6WyJLTiJdLCJsRC5FIjoiS04ifSwiWkEiOnsibEQiOlsiS04i
+XSwiek0iOlsiS04iXSwiWGoiOlsiQCJdLCJFVCI6W10sIlNVIjpbIktOIl0sIkFTIjpbXSwiY1giOlsi
+S04iXSwibEQuRSI6IktOIn0sIndmIjp7ImxEIjpbIktOIl0sInpNIjpbIktOIl0sIlhqIjpbIkAiXSwi
+RVQiOltdLCJTVSI6WyJLTiJdLCJBUyI6W10sImNYIjpbIktOIl0sImxELkUiOiJLTiJ9LCJQcSI6eyJs
+RCI6WyJLTiJdLCJ6TSI6WyJLTiJdLCJYaiI6WyJAIl0sIkVUIjpbXSwiU1UiOlsiS04iXSwiQVMiOltd
+LCJjWCI6WyJLTiJdLCJsRC5FIjoiS04ifSwiZUUiOnsibEQiOlsiS04iXSwiek0iOlsiS04iXSwiWGoi
+OlsiQCJdLCJFVCI6W10sIlNVIjpbIktOIl0sIkFTIjpbXSwiY1giOlsiS04iXSwibEQuRSI6IktOIn0s
+IlY2Ijp7Im42IjpbXSwibEQiOlsiS04iXSwiek0iOlsiS04iXSwiWGoiOlsiQCJdLCJFVCI6W10sIlNV
+IjpbIktOIl0sIkFTIjpbXSwiY1giOlsiS04iXSwibEQuRSI6IktOIn0sInU5Ijp7IlhTIjpbXX0sImh6
+Ijp7IlhTIjpbXX0sImlNIjp7IlhTIjpbXX0sIlpmIjp7IlBmIjpbIjEiXX0sInZzIjp7ImI4IjpbIjEi
+XX0sIkN3Ijp7IlhTIjpbXX0sIm0wIjp7IkpCIjpbXX0sIkppIjp7IkpCIjpbXX0sImI2Ijp7Ilh2Ijpb
+IjEiXSwieHUiOlsiMSJdLCJjWCI6WyIxIl19LCJsbSI6eyJBbiI6WyIxIl19LCJtVyI6eyJjWCI6WyIx
+Il19LCJMVSI6eyJsRCI6WyIxIl0sInpNIjpbIjEiXSwiY1giOlsiMSJdfSwiaWwiOnsiWWsiOlsiMSIs
+IjIiXSwiWjAiOlsiMSIsIjIiXX0sIllrIjp7IlowIjpbIjEiLCIyIl19LCJQbiI6eyJaMCI6WyIxIiwi
+MiJdfSwiR2oiOnsiUlUiOlsiMSIsIjIiXSwiUG4iOlsiMSIsIjIiXSwiS1AiOlsiMSIsIjIiXSwiWjAi
+OlsiMSIsIjIiXX0sIlZqIjp7ImxmIjpbIjEiXSwieHUiOlsiMSJdLCJjWCI6WyIxIl19LCJYdiI6eyJ4
+dSI6WyIxIl0sImNYIjpbIjEiXX0sInV3Ijp7IllrIjpbInFVIiwiQCJdLCJaMCI6WyJxVSIsIkAiXSwi
+WWsuSyI6InFVIiwiWWsuViI6IkAifSwiaTgiOnsiYUwiOlsicVUiXSwiY1giOlsicVUiXSwiYUwuRSI6
+InFVIiwiY1guRSI6InFVIn0sIkNWIjp7IlVrIjpbInpNPEtOPiIsInFVIl0sIlVrLlMiOiJ6TTxLTj4i
+fSwiVTgiOnsid0kiOlsiek08S04+IiwicVUiXX0sIlppIjp7IlVrIjpbInFVIiwiek08S04+Il19LCJi
+eSI6eyJVayI6WyJrIiwicVUiXSwiVWsuUyI6ImsifSwiTXgiOnsid0kiOlsicVUiLCJrIl19LCJ1NSI6
+eyJVayI6WyJxVSIsInpNPEtOPiJdLCJVay5TIjoicVUifSwiRTMiOnsid0kiOlsicVUiLCJ6TTxLTj4i
+XX0sIkdZIjp7IndJIjpbInpNPEtOPiIsInFVIl19LCJDUCI6eyJGSyI6W119LCJDNiI6eyJYUyI6W119
+LCJuIjp7IlhTIjpbXX0sInUiOnsiWFMiOltdfSwiYkoiOnsiWFMiOltdfSwiZVkiOnsiWFMiOltdfSwi
+bXAiOnsiWFMiOltdfSwidWIiOnsiWFMiOltdfSwiZHMiOnsiWFMiOltdfSwibGoiOnsiWFMiOltdfSwi
+VVYiOnsiWFMiOltdfSwiazUiOnsiWFMiOltdfSwiS1kiOnsiWFMiOltdfSwiYyI6eyJYUyI6W119LCJL
+TiI6eyJGSyI6W119LCJ6TSI6eyJjWCI6WyIxIl19LCJpYiI6eyJPZCI6W119LCJ4dSI6eyJjWCI6WyIx
+Il19LCJxVSI6eyJ2WCI6W119LCJSbiI6eyJCTCI6W119LCJEbiI6eyJpRCI6W119LCJVZiI6eyJpRCI6
+W119LCJxZSI6eyJpRCI6W119LCJxRSI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiR2giOnsiY3Yi
+OltdLCJ1SCI6W10sIkQwIjpbXX0sImZZIjp7ImN2IjpbXSwidUgiOltdLCJEMCI6W119LCJuQiI6eyJj
+diI6W10sInVIIjpbXSwiRDAiOltdfSwiUVAiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIm54Ijp7
+InVIIjpbXSwiRDAiOltdfSwiUUYiOnsidUgiOltdLCJEMCI6W119LCJJQiI6eyJ0biI6WyJGSyJdfSwi
+d3oiOnsibEQiOlsiMSJdLCJ6TSI6WyIxIl0sImNYIjpbIjEiXSwibEQuRSI6IjEifSwiY3YiOnsidUgi
+OltdLCJEMCI6W119LCJUNSI6eyJBeiI6W119LCJoNCI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwi
+VmIiOnsidUgiOltdLCJEMCI6W119LCJPNyI6eyJEMCI6W119LCJ3YSI6eyJEMCI6W119LCJBaiI6eyJl
+YSI6W119LCJlNyI6eyJsRCI6WyJ1SCJdLCJ6TSI6WyJ1SCJdLCJjWCI6WyJ1SCJdLCJsRC5FIjoidUgi
+fSwidUgiOnsiRDAiOltdfSwiQkgiOnsiR20iOlsidUgiXSwibEQiOlsidUgiXSwiek0iOlsidUgiXSwi
+WGoiOlsidUgiXSwiY1giOlsidUgiXSwibEQuRSI6InVIIiwiR20uRSI6InVIIn0sIlNOIjp7ImN2Ijpb
+XSwidUgiOltdLCJEMCI6W119LCJldyI6eyJlYSI6W119LCJscCI6eyJjdiI6W10sInVIIjpbXSwiRDAi
+OltdfSwiVGIiOnsiY3YiOltdLCJ1SCI6W10sIkQwIjpbXX0sIkl2Ijp7ImN2IjpbXSwidUgiOltdLCJE
+MCI6W119LCJCVCI6eyJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwieVkiOnsiY3YiOltdLCJ1SCI6W10s
+IkQwIjpbXX0sInc2Ijp7ImVhIjpbXX0sIks1Ijp7InY2IjpbXSwiRDAiOltdfSwiQ20iOnsiRDAiOltd
+fSwiQ1EiOnsidUgiOltdLCJEMCI6W119LCJ3NCI6eyJ0biI6WyJGSyJdfSwicmgiOnsiR20iOlsidUgi
+XSwibEQiOlsidUgiXSwiek0iOlsidUgiXSwiWGoiOlsidUgiXSwiY1giOlsidUgiXSwibEQuRSI6InVI
+IiwiR20uRSI6InVIIn0sImNmIjp7IllrIjpbInFVIiwicVUiXSwiWjAiOlsicVUiLCJxVSJdfSwiaTci
+OnsiWWsiOlsicVUiLCJxVSJdLCJaMCI6WyJxVSIsInFVIl0sIllrLksiOiJxVSIsIllrLlYiOiJxVSJ9
+LCJTeSI6eyJZayI6WyJxVSIsInFVIl0sIlowIjpbInFVIiwicVUiXSwiWWsuSyI6InFVIiwiWWsuViI6
+InFVIn0sIkk0Ijp7ImxmIjpbInFVIl0sInh1IjpbInFVIl0sImNYIjpbInFVIl19LCJSTyI6eyJxaCI6
+WyIxIl19LCJDcSI6eyJSTyI6WyIxIl0sInFoIjpbIjEiXX0sInhDIjp7Ik1PIjpbIjEiXX0sIkpRIjp7
+ImtGIjpbXX0sInZEIjp7ImtGIjpbXX0sIm02Ijp7ImtGIjpbXX0sImN0Ijp7ImtGIjpbXX0sIk93Ijp7
+ImtGIjpbXX0sIlc5Ijp7IkFuIjpbIjEiXX0sImRXIjp7InY2IjpbXSwiRDAiOltdfSwibWsiOnsieTAi
+OltdfSwiS28iOnsib24iOltdfSwiQXMiOnsibGYiOlsicVUiXSwieHUiOlsicVUiXSwiY1giOlsicVUi
+XX0sInI3Ijp7IkU0IjpbXX0sIlR6Ijp7ImxEIjpbIjEiXSwiek0iOlsiMSJdLCJFNCI6W10sImNYIjpb
+IjEiXSwibEQuRSI6IjEifSwibmQiOnsiZDUiOltdLCJjdiI6W10sInVIIjpbXSwiRDAiOltdfSwiS2Ui
+OnsibGYiOlsicVUiXSwieHUiOlsicVUiXSwiY1giOlsicVUiXX0sImQ1Ijp7ImN2IjpbXSwidUgiOltd
+LCJEMCI6W119LCJuNiI6eyJ6TSI6WyJLTiJdLCJBUyI6W10sImNYIjpbIktOIl19LCJYQSI6eyJrRiI6
+W119LCJPRiI6eyJMdSI6W119LCJydSI6eyJMdSI6W119LCJJViI6eyJMdSI6W119fScpKQpILkZGKHYu
+dHlwZVVuaXZlcnNlLEpTT04ucGFyc2UoJ3siYlEiOjEsIlhDIjoxLCJNTyI6MSwia1QiOjIsIm1XIjox
+LCJMVSI6MSwiaWwiOjIsIlZqIjoxLCJuWSI6MSwiV1kiOjEsImNvIjoxfScpKQp2YXIgdT0oZnVuY3Rp
+b24gcnRpaSgpe3ZhciB0PUguTjAKcmV0dXJue2k6dCgiR2giKSxuOnQoIkN3IiksY1I6dCgibkIiKSxk
+OnQoIkF6IiksWTp0KCJRUCIpLGdGOnQoIlBEPEdELEA+IiksaDp0KCJjdiIpLGJVOnQoIlhTIiksQjp0
+KCJlYSIpLGFTOnQoIkQwIiksYzg6dCgiVDUiKSxaOnQoIkVIIiksYzp0KCJiODxAPiIpLHI6dCgiTzci
+KSxJOnQoIlNnIiksbzp0KCJ2USIpLGVoOnQoImNYPHVIPiIpLFg6dCgiY1g8cVU+IiksUjp0KCJjWDxA
+PiIpLGZBOnQoImpkPFNlPiIpLHU6dCgiamQ8ajg+IiksYlA6dCgiamQ8dUY+IiksZmg6dCgiamQ8Wlo+
+Iiksazp0KCJqZDxrRj4iKSxzOnQoImpkPHFVPiIpLGhoOnQoImpkPHlEPiIpLGFKOnQoImpkPHdiPiIp
+LG06dCgiamQ8QD4iKSx0OnQoImpkPEtOPiIpLGVIOnQoInZtIiksZzp0KCJjNSIpLGFVOnQoIlhqPEA+
+IiksYW06dCgiVHo8QD4iKSxlbzp0KCJONTxHRCxAPiIpLHY6dCgiRTQiKSxkejp0KCJoRiIpLGE6dCgi
+ek08cVU+Iiksajp0KCJ6TTxAPiIpLEw6dCgiek08S04+IiksRjp0KCJ1OCIpLGY6dCgiWjA8cVUscVU+
+IiksYjp0KCJaMDxxVSxAPiIpLEc6dCgiWjA8QCxAPiIpLGR2OnQoIkE4PHFVLHFVPiIpLGRvOnQoIkE4
+PHFVLEA+IiksVjp0KCJBaiIpLGREOnQoIkVUIiksYm06dCgiVjYiKSxBOnQoInVIIiksZTp0KCJrRiIp
+LFA6dCgiYzgiKSxLOnQoImsiKSxwOnQoImV3IikscTp0KCJ0bjxGSz4iKSxmdjp0KCJ3TCIpLGF2OnQo
+IkpjIiksZXc6dCgibmQiKSxDOnQoInh1PHFVPiIpLGw6dCgiR3oiKSxOOnQoInFVIiksZEc6dCgicVUo
+cVUpIiksZzc6dCgiZDUiKSxmbzp0KCJHRCIpLGFXOnQoInlZIiksdzp0KCJBUyIpLGdjOnQoIm42Iiks
+YWs6dCgia2QiKSxUOnQoIkdqPHFVLHFVPiIpLEQ6dCgiaUQiKSxjYzp0KCJVNTxxVT4iKSxnNDp0KCJL
+NSIpLGNpOnQoInY2IiksZzI6dCgiQ20iKSxiajp0KCJaZjxPNz4iKSxoOTp0KCJDUSIpLGFjOnQoImU3
+IiksUTp0KCJDcTxBaj4iKSxTOnQoInd6PGN2PiIpLHg6dCgiRmU8QCxAPiIpLGFvOnQoInZzPE83PiIp
+LF86dCgidnM8QD4iKSxmSjp0KCJ2czxLTj4iKSxPOnQoIkpRIiksSjp0KCJibiIpLGNKOnQoImEyIiks
+YWw6dCgiYTIoaykiKSxiQjp0KCJhMihxVSkiKSxiZjp0KCJhMihAKSIpLHo6dCgiQCIpLGZPOnQoIkAo
+KSIpLFU6dCgiQChlYSkiKSx5OnQoIkAoaykiKSxlcDp0KCJAKGssaykiKSxXOnQoIkAoayxHeikiKSxj
+aDp0KCJAKHh1PHFVPikiKSxkTzp0KCJAKHFVKSIpLGI4OnQoIkAoQCxAKSIpLGVnOnQoIktOIiksSDp0
+KCJ+IiksTTp0KCJ+KCkiKSxhbjp0KCJ+KGV3KSIpLEU6dCgifihxVSxxVSkiKSxjQTp0KCJ+KHFVLEAp
+Iil9fSkoKTsoZnVuY3Rpb24gY29uc3RhbnRzKCl7dmFyIHQ9aHVua0hlbHBlcnMubWFrZUNvbnN0TGlz
+dApDLlJZPVcuUVAucHJvdG90eXBlCkMuQlo9Vy5WYi5wcm90b3R5cGUKQy5EdD1XLk83LnByb3RvdHlw
+ZQpDLk9rPUoudkIucHJvdG90eXBlCkMuTm09Si5qZC5wcm90b3R5cGUKQy5qbj1KLnVyLnByb3RvdHlw
+ZQpDLmpOPUouWUUucHJvdG90eXBlCkMuQ0Q9Si5xSS5wcm90b3R5cGUKQy54Qj1KLkRyLnByb3RvdHlw
+ZQpDLkRHPUouYzUucHJvdG90eXBlCkMuRXg9Vy51OC5wcm90b3R5cGUKQy5MdD1XLlNOLnByb3RvdHlw
+ZQpDLlpRPUouaUMucHJvdG90eXBlCkMuSWU9Vy5UYi5wcm90b3R5cGUKQy52Qj1KLmtkLnByb3RvdHlw
+ZQpDLm9sPVcuSzUucHJvdG90eXBlCkMueTg9bmV3IFAuVTgoKQpDLmg5PW5ldyBQLkNWKCkKQy5PND1m
+dW5jdGlvbiBnZXRUYWdGYWxsYmFjayhvKSB7CiAgdmFyIHMgPSBPYmplY3QucHJvdG90eXBlLnRvU3Ry
+aW5nLmNhbGwobyk7CiAgcmV0dXJuIHMuc3Vic3RyaW5nKDgsIHMubGVuZ3RoIC0gMSk7Cn0KQy5ZcT1m
+dW5jdGlvbigpIHsKICB2YXIgdG9TdHJpbmdGdW5jdGlvbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJp
+bmc7CiAgZnVuY3Rpb24gZ2V0VGFnKG8pIHsKICAgIHZhciBzID0gdG9TdHJpbmdGdW5jdGlvbi5jYWxs
+KG8pOwogICAgcmV0dXJuIHMuc3Vic3RyaW5nKDgsIHMubGVuZ3RoIC0gMSk7CiAgfQogIGZ1bmN0aW9u
+IGdldFVua25vd25UYWcob2JqZWN0LCB0YWcpIHsKICAgIGlmICgvXkhUTUxbQS1aXS4qRWxlbWVudCQv
+LnRlc3QodGFnKSkgewogICAgICB2YXIgbmFtZSA9IHRvU3RyaW5nRnVuY3Rpb24uY2FsbChvYmplY3Qp
+OwogICAgICBpZiAobmFtZSA9PSAiW29iamVjdCBPYmplY3RdIikgcmV0dXJuIG51bGw7CiAgICAgIHJl
+dHVybiAiSFRNTEVsZW1lbnQiOwogICAgfQogIH0KICBmdW5jdGlvbiBnZXRVbmtub3duVGFnR2VuZXJp
+Y0Jyb3dzZXIob2JqZWN0LCB0YWcpIHsKICAgIGlmIChzZWxmLkhUTUxFbGVtZW50ICYmIG9iamVjdCBp
+bnN0YW5jZW9mIEhUTUxFbGVtZW50KSByZXR1cm4gIkhUTUxFbGVtZW50IjsKICAgIHJldHVybiBnZXRV
+bmtub3duVGFnKG9iamVjdCwgdGFnKTsKICB9CiAgZnVuY3Rpb24gcHJvdG90eXBlRm9yVGFnKHRhZykg
+ewogICAgaWYgKHR5cGVvZiB3aW5kb3cgPT0gInVuZGVmaW5lZCIpIHJldHVybiBudWxsOwogICAgaWYg
+KHR5cGVvZiB3aW5kb3dbdGFnXSA9PSAidW5kZWZpbmVkIikgcmV0dXJuIG51bGw7CiAgICB2YXIgY29u
+c3RydWN0b3IgPSB3aW5kb3dbdGFnXTsKICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgIT0gImZ1bmN0
+aW9uIikgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gY29uc3RydWN0b3IucHJvdG90eXBlOwogIH0KICBm
+dW5jdGlvbiBkaXNjcmltaW5hdG9yKHRhZykgeyByZXR1cm4gbnVsbDsgfQogIHZhciBpc0Jyb3dzZXIg
+PSB0eXBlb2YgbmF2aWdhdG9yID09ICJvYmplY3QiOwogIHJldHVybiB7CiAgICBnZXRUYWc6IGdldFRh
+ZywKICAgIGdldFVua25vd25UYWc6IGlzQnJvd3NlciA/IGdldFVua25vd25UYWdHZW5lcmljQnJvd3Nl
+ciA6IGdldFVua25vd25UYWcsCiAgICBwcm90b3R5cGVGb3JUYWc6IHByb3RvdHlwZUZvclRhZywKICAg
+IGRpc2NyaW1pbmF0b3I6IGRpc2NyaW1pbmF0b3IgfTsKfQpDLndiPWZ1bmN0aW9uKGdldFRhZ0ZhbGxi
+YWNrKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKGhvb2tzKSB7CiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAh
+PSAib2JqZWN0IikgcmV0dXJuIGhvb2tzOwogICAgdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudDsK
+ICAgIGlmICh1YS5pbmRleE9mKCJEdW1wUmVuZGVyVHJlZSIpID49IDApIHJldHVybiBob29rczsKICAg
+IGlmICh1YS5pbmRleE9mKCJDaHJvbWUiKSA+PSAwKSB7CiAgICAgIGZ1bmN0aW9uIGNvbmZpcm0ocCkg
+ewogICAgICAgIHJldHVybiB0eXBlb2Ygd2luZG93ID09ICJvYmplY3QiICYmIHdpbmRvd1twXSAmJiB3
+aW5kb3dbcF0ubmFtZSA9PSBwOwogICAgICB9CiAgICAgIGlmIChjb25maXJtKCJXaW5kb3ciKSAmJiBj
+b25maXJtKCJIVE1MRWxlbWVudCIpKSByZXR1cm4gaG9va3M7CiAgICB9CiAgICBob29rcy5nZXRUYWcg
+PSBnZXRUYWdGYWxsYmFjazsKICB9Owp9CkMuS1U9ZnVuY3Rpb24oaG9va3MpIHsKICBpZiAodHlwZW9m
+IGRhcnRFeHBlcmltZW50YWxGaXh1cEdldFRhZyAhPSAiZnVuY3Rpb24iKSByZXR1cm4gaG9va3M7CiAg
+aG9va3MuZ2V0VGFnID0gZGFydEV4cGVyaW1lbnRhbEZpeHVwR2V0VGFnKGhvb2tzLmdldFRhZyk7Cn0K
+Qy5mUT1mdW5jdGlvbihob29rcykgewogIHZhciBnZXRUYWcgPSBob29rcy5nZXRUYWc7CiAgdmFyIHBy
+b3RvdHlwZUZvclRhZyA9IGhvb2tzLnByb3RvdHlwZUZvclRhZzsKICBmdW5jdGlvbiBnZXRUYWdGaXhl
+ZChvKSB7CiAgICB2YXIgdGFnID0gZ2V0VGFnKG8pOwogICAgaWYgKHRhZyA9PSAiRG9jdW1lbnQiKSB7
+CiAgICAgIGlmICghIW8ueG1sVmVyc2lvbikgcmV0dXJuICIhRG9jdW1lbnQiOwogICAgICByZXR1cm4g
+IiFIVE1MRG9jdW1lbnQiOwogICAgfQogICAgcmV0dXJuIHRhZzsKICB9CiAgZnVuY3Rpb24gcHJvdG90
+eXBlRm9yVGFnRml4ZWQodGFnKSB7CiAgICBpZiAodGFnID09ICJEb2N1bWVudCIpIHJldHVybiBudWxs
+OwogICAgcmV0dXJuIHByb3RvdHlwZUZvclRhZyh0YWcpOwogIH0KICBob29rcy5nZXRUYWcgPSBnZXRU
+YWdGaXhlZDsKICBob29rcy5wcm90b3R5cGVGb3JUYWcgPSBwcm90b3R5cGVGb3JUYWdGaXhlZDsKfQpD
+LmRrPWZ1bmN0aW9uKGhvb2tzKSB7CiAgdmFyIHVzZXJBZ2VudCA9IHR5cGVvZiBuYXZpZ2F0b3IgPT0g
+Im9iamVjdCIgPyBuYXZpZ2F0b3IudXNlckFnZW50IDogIiI7CiAgaWYgKHVzZXJBZ2VudC5pbmRleE9m
+KCJGaXJlZm94IikgPT0gLTEpIHJldHVybiBob29rczsKICB2YXIgZ2V0VGFnID0gaG9va3MuZ2V0VGFn
+OwogIHZhciBxdWlja01hcCA9IHsKICAgICJCZWZvcmVVbmxvYWRFdmVudCI6ICJFdmVudCIsCiAgICAi
+RGF0YVRyYW5zZmVyIjogIkNsaXBib2FyZCIsCiAgICAiR2VvR2VvbG9jYXRpb24iOiAiR2VvbG9jYXRp
+b24iLAogICAgIkxvY2F0aW9uIjogIiFMb2NhdGlvbiIsCiAgICAiV29ya2VyTWVzc2FnZUV2ZW50Ijog
+Ik1lc3NhZ2VFdmVudCIsCiAgICAiWE1MRG9jdW1lbnQiOiAiIURvY3VtZW50In07CiAgZnVuY3Rpb24g
+Z2V0VGFnRmlyZWZveChvKSB7CiAgICB2YXIgdGFnID0gZ2V0VGFnKG8pOwogICAgcmV0dXJuIHF1aWNr
+TWFwW3RhZ10gfHwgdGFnOwogIH0KICBob29rcy5nZXRUYWcgPSBnZXRUYWdGaXJlZm94Owp9CkMueGk9
+ZnVuY3Rpb24oaG9va3MpIHsKICB2YXIgdXNlckFnZW50ID0gdHlwZW9mIG5hdmlnYXRvciA9PSAib2Jq
+ZWN0IiA/IG5hdmlnYXRvci51c2VyQWdlbnQgOiAiIjsKICBpZiAodXNlckFnZW50LmluZGV4T2YoIlRy
+aWRlbnQvIikgPT0gLTEpIHJldHVybiBob29rczsKICB2YXIgZ2V0VGFnID0gaG9va3MuZ2V0VGFnOwog
+IHZhciBxdWlja01hcCA9IHsKICAgICJCZWZvcmVVbmxvYWRFdmVudCI6ICJFdmVudCIsCiAgICAiRGF0
+YVRyYW5zZmVyIjogIkNsaXBib2FyZCIsCiAgICAiSFRNTERERWxlbWVudCI6ICJIVE1MRWxlbWVudCIs
+CiAgICAiSFRNTERURWxlbWVudCI6ICJIVE1MRWxlbWVudCIsCiAgICAiSFRNTFBocmFzZUVsZW1lbnQi
+OiAiSFRNTEVsZW1lbnQiLAogICAgIlBvc2l0aW9uIjogIkdlb3Bvc2l0aW9uIgogIH07CiAgZnVuY3Rp
+b24gZ2V0VGFnSUUobykgewogICAgdmFyIHRhZyA9IGdldFRhZyhvKTsKICAgIHZhciBuZXdUYWcgPSBx
+dWlja01hcFt0YWddOwogICAgaWYgKG5ld1RhZykgcmV0dXJuIG5ld1RhZzsKICAgIGlmICh0YWcgPT0g
+Ik9iamVjdCIpIHsKICAgICAgaWYgKHdpbmRvdy5EYXRhVmlldyAmJiAobyBpbnN0YW5jZW9mIHdpbmRv
+dy5EYXRhVmlldykpIHJldHVybiAiRGF0YVZpZXciOwogICAgfQogICAgcmV0dXJuIHRhZzsKICB9CiAg
+ZnVuY3Rpb24gcHJvdG90eXBlRm9yVGFnSUUodGFnKSB7CiAgICB2YXIgY29uc3RydWN0b3IgPSB3aW5k
+b3dbdGFnXTsKICAgIGlmIChjb25zdHJ1Y3RvciA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVy
+biBjb25zdHJ1Y3Rvci5wcm90b3R5cGU7CiAgfQogIGhvb2tzLmdldFRhZyA9IGdldFRhZ0lFOwogIGhv
+b2tzLnByb3RvdHlwZUZvclRhZyA9IHByb3RvdHlwZUZvclRhZ0lFOwp9CkMuaTc9ZnVuY3Rpb24oaG9v
+a3MpIHsgcmV0dXJuIGhvb2tzOyB9CgpDLkN0PW5ldyBQLmJ5KCkKQy5FcT1uZXcgUC5rNSgpCkMueE09
+bmV3IFAudTUoKQpDLlFrPW5ldyBQLkUzKCkKQy5OVT1uZXcgUC5KaSgpCkMuQTM9bmV3IFAuTXgobnVs
+bCkKQy5HYj1ILlZNKHQoWzEyNywyMDQ3LDY1NTM1LDExMTQxMTFdKSx1LnQpCkMuYWs9SC5WTSh0KFsw
+LDAsMzI3NzYsMzM3OTIsMSwxMDI0MCwwLDBdKSx1LnQpCkMuY209SC5WTSh0KFsiKjo6Y2xhc3MiLCIq
+OjpkaXIiLCIqOjpkcmFnZ2FibGUiLCIqOjpoaWRkZW4iLCIqOjppZCIsIio6OmluZXJ0IiwiKjo6aXRl
+bXByb3AiLCIqOjppdGVtcmVmIiwiKjo6aXRlbXNjb3BlIiwiKjo6bGFuZyIsIio6OnNwZWxsY2hlY2si
+LCIqOjp0aXRsZSIsIio6OnRyYW5zbGF0ZSIsIkE6OmFjY2Vzc2tleSIsIkE6OmNvb3JkcyIsIkE6Omhy
+ZWZsYW5nIiwiQTo6bmFtZSIsIkE6OnNoYXBlIiwiQTo6dGFiaW5kZXgiLCJBOjp0YXJnZXQiLCJBOjp0
+eXBlIiwiQVJFQTo6YWNjZXNza2V5IiwiQVJFQTo6YWx0IiwiQVJFQTo6Y29vcmRzIiwiQVJFQTo6bm9o
+cmVmIiwiQVJFQTo6c2hhcGUiLCJBUkVBOjp0YWJpbmRleCIsIkFSRUE6OnRhcmdldCIsIkFVRElPOjpj
+b250cm9scyIsIkFVRElPOjpsb29wIiwiQVVESU86Om1lZGlhZ3JvdXAiLCJBVURJTzo6bXV0ZWQiLCJB
+VURJTzo6cHJlbG9hZCIsIkJETzo6ZGlyIiwiQk9EWTo6YWxpbmsiLCJCT0RZOjpiZ2NvbG9yIiwiQk9E
+WTo6bGluayIsIkJPRFk6OnRleHQiLCJCT0RZOjp2bGluayIsIkJSOjpjbGVhciIsIkJVVFRPTjo6YWNj
+ZXNza2V5IiwiQlVUVE9OOjpkaXNhYmxlZCIsIkJVVFRPTjo6bmFtZSIsIkJVVFRPTjo6dGFiaW5kZXgi
+LCJCVVRUT046OnR5cGUiLCJCVVRUT046OnZhbHVlIiwiQ0FOVkFTOjpoZWlnaHQiLCJDQU5WQVM6Ondp
+ZHRoIiwiQ0FQVElPTjo6YWxpZ24iLCJDT0w6OmFsaWduIiwiQ09MOjpjaGFyIiwiQ09MOjpjaGFyb2Zm
+IiwiQ09MOjpzcGFuIiwiQ09MOjp2YWxpZ24iLCJDT0w6OndpZHRoIiwiQ09MR1JPVVA6OmFsaWduIiwi
+Q09MR1JPVVA6OmNoYXIiLCJDT0xHUk9VUDo6Y2hhcm9mZiIsIkNPTEdST1VQOjpzcGFuIiwiQ09MR1JP
+VVA6OnZhbGlnbiIsIkNPTEdST1VQOjp3aWR0aCIsIkNPTU1BTkQ6OmNoZWNrZWQiLCJDT01NQU5EOjpj
+b21tYW5kIiwiQ09NTUFORDo6ZGlzYWJsZWQiLCJDT01NQU5EOjpsYWJlbCIsIkNPTU1BTkQ6OnJhZGlv
+Z3JvdXAiLCJDT01NQU5EOjp0eXBlIiwiREFUQTo6dmFsdWUiLCJERUw6OmRhdGV0aW1lIiwiREVUQUlM
+Uzo6b3BlbiIsIkRJUjo6Y29tcGFjdCIsIkRJVjo6YWxpZ24iLCJETDo6Y29tcGFjdCIsIkZJRUxEU0VU
+OjpkaXNhYmxlZCIsIkZPTlQ6OmNvbG9yIiwiRk9OVDo6ZmFjZSIsIkZPTlQ6OnNpemUiLCJGT1JNOjph
+Y2NlcHQiLCJGT1JNOjphdXRvY29tcGxldGUiLCJGT1JNOjplbmN0eXBlIiwiRk9STTo6bWV0aG9kIiwi
+Rk9STTo6bmFtZSIsIkZPUk06Om5vdmFsaWRhdGUiLCJGT1JNOjp0YXJnZXQiLCJGUkFNRTo6bmFtZSIs
+IkgxOjphbGlnbiIsIkgyOjphbGlnbiIsIkgzOjphbGlnbiIsIkg0OjphbGlnbiIsIkg1OjphbGlnbiIs
+Ikg2OjphbGlnbiIsIkhSOjphbGlnbiIsIkhSOjpub3NoYWRlIiwiSFI6OnNpemUiLCJIUjo6d2lkdGgi
+LCJIVE1MOjp2ZXJzaW9uIiwiSUZSQU1FOjphbGlnbiIsIklGUkFNRTo6ZnJhbWVib3JkZXIiLCJJRlJB
+TUU6OmhlaWdodCIsIklGUkFNRTo6bWFyZ2luaGVpZ2h0IiwiSUZSQU1FOjptYXJnaW53aWR0aCIsIklG
+UkFNRTo6d2lkdGgiLCJJTUc6OmFsaWduIiwiSU1HOjphbHQiLCJJTUc6OmJvcmRlciIsIklNRzo6aGVp
+Z2h0IiwiSU1HOjpoc3BhY2UiLCJJTUc6OmlzbWFwIiwiSU1HOjpuYW1lIiwiSU1HOjp1c2VtYXAiLCJJ
+TUc6OnZzcGFjZSIsIklNRzo6d2lkdGgiLCJJTlBVVDo6YWNjZXB0IiwiSU5QVVQ6OmFjY2Vzc2tleSIs
+IklOUFVUOjphbGlnbiIsIklOUFVUOjphbHQiLCJJTlBVVDo6YXV0b2NvbXBsZXRlIiwiSU5QVVQ6OmF1
+dG9mb2N1cyIsIklOUFVUOjpjaGVja2VkIiwiSU5QVVQ6OmRpc2FibGVkIiwiSU5QVVQ6OmlucHV0bW9k
+ZSIsIklOUFVUOjppc21hcCIsIklOUFVUOjpsaXN0IiwiSU5QVVQ6Om1heCIsIklOUFVUOjptYXhsZW5n
+dGgiLCJJTlBVVDo6bWluIiwiSU5QVVQ6Om11bHRpcGxlIiwiSU5QVVQ6Om5hbWUiLCJJTlBVVDo6cGxh
+Y2Vob2xkZXIiLCJJTlBVVDo6cmVhZG9ubHkiLCJJTlBVVDo6cmVxdWlyZWQiLCJJTlBVVDo6c2l6ZSIs
+IklOUFVUOjpzdGVwIiwiSU5QVVQ6OnRhYmluZGV4IiwiSU5QVVQ6OnR5cGUiLCJJTlBVVDo6dXNlbWFw
+IiwiSU5QVVQ6OnZhbHVlIiwiSU5TOjpkYXRldGltZSIsIktFWUdFTjo6ZGlzYWJsZWQiLCJLRVlHRU46
+OmtleXR5cGUiLCJLRVlHRU46Om5hbWUiLCJMQUJFTDo6YWNjZXNza2V5IiwiTEFCRUw6OmZvciIsIkxF
+R0VORDo6YWNjZXNza2V5IiwiTEVHRU5EOjphbGlnbiIsIkxJOjp0eXBlIiwiTEk6OnZhbHVlIiwiTElO
+Szo6c2l6ZXMiLCJNQVA6Om5hbWUiLCJNRU5VOjpjb21wYWN0IiwiTUVOVTo6bGFiZWwiLCJNRU5VOjp0
+eXBlIiwiTUVURVI6OmhpZ2giLCJNRVRFUjo6bG93IiwiTUVURVI6Om1heCIsIk1FVEVSOjptaW4iLCJN
+RVRFUjo6dmFsdWUiLCJPQkpFQ1Q6OnR5cGVtdXN0bWF0Y2giLCJPTDo6Y29tcGFjdCIsIk9MOjpyZXZl
+cnNlZCIsIk9MOjpzdGFydCIsIk9MOjp0eXBlIiwiT1BUR1JPVVA6OmRpc2FibGVkIiwiT1BUR1JPVVA6
+OmxhYmVsIiwiT1BUSU9OOjpkaXNhYmxlZCIsIk9QVElPTjo6bGFiZWwiLCJPUFRJT046OnNlbGVjdGVk
+IiwiT1BUSU9OOjp2YWx1ZSIsIk9VVFBVVDo6Zm9yIiwiT1VUUFVUOjpuYW1lIiwiUDo6YWxpZ24iLCJQ
+UkU6OndpZHRoIiwiUFJPR1JFU1M6Om1heCIsIlBST0dSRVNTOjptaW4iLCJQUk9HUkVTUzo6dmFsdWUi
+LCJTRUxFQ1Q6OmF1dG9jb21wbGV0ZSIsIlNFTEVDVDo6ZGlzYWJsZWQiLCJTRUxFQ1Q6Om11bHRpcGxl
+IiwiU0VMRUNUOjpuYW1lIiwiU0VMRUNUOjpyZXF1aXJlZCIsIlNFTEVDVDo6c2l6ZSIsIlNFTEVDVDo6
+dGFiaW5kZXgiLCJTT1VSQ0U6OnR5cGUiLCJUQUJMRTo6YWxpZ24iLCJUQUJMRTo6Ymdjb2xvciIsIlRB
+QkxFOjpib3JkZXIiLCJUQUJMRTo6Y2VsbHBhZGRpbmciLCJUQUJMRTo6Y2VsbHNwYWNpbmciLCJUQUJM
+RTo6ZnJhbWUiLCJUQUJMRTo6cnVsZXMiLCJUQUJMRTo6c3VtbWFyeSIsIlRBQkxFOjp3aWR0aCIsIlRC
+T0RZOjphbGlnbiIsIlRCT0RZOjpjaGFyIiwiVEJPRFk6OmNoYXJvZmYiLCJUQk9EWTo6dmFsaWduIiwi
+VEQ6OmFiYnIiLCJURDo6YWxpZ24iLCJURDo6YXhpcyIsIlREOjpiZ2NvbG9yIiwiVEQ6OmNoYXIiLCJU
+RDo6Y2hhcm9mZiIsIlREOjpjb2xzcGFuIiwiVEQ6OmhlYWRlcnMiLCJURDo6aGVpZ2h0IiwiVEQ6Om5v
+d3JhcCIsIlREOjpyb3dzcGFuIiwiVEQ6OnNjb3BlIiwiVEQ6OnZhbGlnbiIsIlREOjp3aWR0aCIsIlRF
+WFRBUkVBOjphY2Nlc3NrZXkiLCJURVhUQVJFQTo6YXV0b2NvbXBsZXRlIiwiVEVYVEFSRUE6OmNvbHMi
+LCJURVhUQVJFQTo6ZGlzYWJsZWQiLCJURVhUQVJFQTo6aW5wdXRtb2RlIiwiVEVYVEFSRUE6Om5hbWUi
+LCJURVhUQVJFQTo6cGxhY2Vob2xkZXIiLCJURVhUQVJFQTo6cmVhZG9ubHkiLCJURVhUQVJFQTo6cmVx
+dWlyZWQiLCJURVhUQVJFQTo6cm93cyIsIlRFWFRBUkVBOjp0YWJpbmRleCIsIlRFWFRBUkVBOjp3cmFw
+IiwiVEZPT1Q6OmFsaWduIiwiVEZPT1Q6OmNoYXIiLCJURk9PVDo6Y2hhcm9mZiIsIlRGT09UOjp2YWxp
+Z24iLCJUSDo6YWJiciIsIlRIOjphbGlnbiIsIlRIOjpheGlzIiwiVEg6OmJnY29sb3IiLCJUSDo6Y2hh
+ciIsIlRIOjpjaGFyb2ZmIiwiVEg6OmNvbHNwYW4iLCJUSDo6aGVhZGVycyIsIlRIOjpoZWlnaHQiLCJU
+SDo6bm93cmFwIiwiVEg6OnJvd3NwYW4iLCJUSDo6c2NvcGUiLCJUSDo6dmFsaWduIiwiVEg6OndpZHRo
+IiwiVEhFQUQ6OmFsaWduIiwiVEhFQUQ6OmNoYXIiLCJUSEVBRDo6Y2hhcm9mZiIsIlRIRUFEOjp2YWxp
+Z24iLCJUUjo6YWxpZ24iLCJUUjo6Ymdjb2xvciIsIlRSOjpjaGFyIiwiVFI6OmNoYXJvZmYiLCJUUjo6
+dmFsaWduIiwiVFJBQ0s6OmRlZmF1bHQiLCJUUkFDSzo6a2luZCIsIlRSQUNLOjpsYWJlbCIsIlRSQUNL
+OjpzcmNsYW5nIiwiVUw6OmNvbXBhY3QiLCJVTDo6dHlwZSIsIlZJREVPOjpjb250cm9scyIsIlZJREVP
+OjpoZWlnaHQiLCJWSURFTzo6bG9vcCIsIlZJREVPOjptZWRpYWdyb3VwIiwiVklERU86Om11dGVkIiwi
+VklERU86OnByZWxvYWQiLCJWSURFTzo6d2lkdGgiXSksdS5zKQpDLlZDPUguVk0odChbMCwwLDY1NDkw
+LDQ1MDU1LDY1NTM1LDM0ODE1LDY1NTM0LDE4NDMxXSksdS50KQpDLm1LPUguVk0odChbMCwwLDI2NjI0
+LDEwMjMsNjU1MzQsMjA0Nyw2NTUzNCwyMDQ3XSksdS50KQpDLlNxPUguVk0odChbIkhFQUQiLCJBUkVB
+IiwiQkFTRSIsIkJBU0VGT05UIiwiQlIiLCJDT0wiLCJDT0xHUk9VUCIsIkVNQkVEIiwiRlJBTUUiLCJG
+UkFNRVNFVCIsIkhSIiwiSU1BR0UiLCJJTUciLCJJTlBVVCIsIklTSU5ERVgiLCJMSU5LIiwiTUVUQSIs
+IlBBUkFNIiwiU09VUkNFIiwiU1RZTEUiLCJUSVRMRSIsIldCUiJdKSx1LnMpCkMueEQ9SC5WTSh0KFtd
+KSx1LnUpCkMuZG49SC5WTSh0KFtdKSx1LnMpCkMuaFU9SC5WTSh0KFtdKSx1Lm0pCkMudG89SC5WTSh0
+KFswLDAsMzI3MjIsMTIyODcsNjU1MzQsMzQ4MTUsNjU1MzQsMTg0MzFdKSx1LnQpCkMuRjM9SC5WTSh0
+KFswLDAsMjQ1NzYsMTAyMyw2NTUzNCwzNDgxNSw2NTUzNCwxODQzMV0pLHUudCkKQy5lYT1ILlZNKHQo
+WzAsMCwzMjc1NCwxMTI2Myw2NTUzNCwzNDgxNSw2NTUzNCwxODQzMV0pLHUudCkKQy5aSj1ILlZNKHQo
+WzAsMCwzMjcyMiwxMjI4Nyw2NTUzNSwzNDgxNSw2NTUzNCwxODQzMV0pLHUudCkKQy5XZD1ILlZNKHQo
+WzAsMCw2NTQ5MCwxMjI4Nyw2NTUzNSwzNDgxNSw2NTUzNCwxODQzMV0pLHUudCkKQy5ReD1ILlZNKHQo
+WyJiaW5kIiwiaWYiLCJyZWYiLCJyZXBlYXQiLCJzeW50YXgiXSksdS5zKQpDLkJJPUguVk0odChbIkE6
+OmhyZWYiLCJBUkVBOjpocmVmIiwiQkxPQ0tRVU9URTo6Y2l0ZSIsIkJPRFk6OmJhY2tncm91bmQiLCJD
+T01NQU5EOjppY29uIiwiREVMOjpjaXRlIiwiRk9STTo6YWN0aW9uIiwiSU1HOjpzcmMiLCJJTlBVVDo6
+c3JjIiwiSU5TOjpjaXRlIiwiUTo6Y2l0ZSIsIlZJREVPOjpwb3N0ZXIiXSksdS5zKQpDLldPPW5ldyBI
+LkxQKDAse30sQy5kbixILk4wKCJMUDxxVSxxVT4iKSkKQy5pSD1ILlZNKHQoW10pLEguTjAoImpkPEdE
+PiIpKQpDLkNNPW5ldyBILkxQKDAse30sQy5pSCxILk4wKCJMUDxHRCxAPiIpKQpDLlkyPW5ldyBMLnk4
+KCJOYXZpZ2F0aW9uVHJlZU5vZGVUeXBlLmRpcmVjdG9yeSIpCkMucmY9bmV3IEwueTgoIk5hdmlnYXRp
+b25UcmVlTm9kZVR5cGUuZmlsZSIpCkMuVGU9bmV3IEgud3YoImNhbGwiKX0pKCk7KGZ1bmN0aW9uIHN0
+YXRpY0ZpZWxkcygpeyQueWo9MAokLm1KPW51bGwKJC5QND1udWxsCiQuTkY9bnVsbAokLlRYPW51bGwK
+JC54Nz1udWxsCiQubnc9bnVsbAokLnZ2PW51bGwKJC5Cdj1udWxsCiQuUzY9bnVsbAokLms4PW51bGwK
+JC5tZz1udWxsCiQuVUQ9ITEKJC5YMz1DLk5VCiQueGc9W10KJC54bz1udWxsCiQuQk89bnVsbAokLmx0
+PW51bGwKJC5FVT1udWxsCiQub3I9UC5GbCh1Lk4sdS5aKQokLkk2PW51bGwKJC5GZj1udWxsfSkoKTso
+ZnVuY3Rpb24gbGF6eUluaXRpYWxpemVycygpe3ZhciB0PWh1bmtIZWxwZXJzLmxhenkKdCgkLCJmYSIs
+InciLGZ1bmN0aW9uKCl7cmV0dXJuIEguWWcoIl8kZGFydF9kYXJ0Q2xvc3VyZSIpfSkKdCgkLCJZMiIs
+IlVOIixmdW5jdGlvbigpe3JldHVybiBILllnKCJfJGRhcnRfanMiKX0pCnQoJCwiVTIiLCJTbiIsZnVu
+Y3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KHsKdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iJHJlY2Vp
+dmVyJCJ9fSkpfSkKdCgkLCJ4cSIsImxxIixmdW5jdGlvbigpe3JldHVybiBILmNNKEguUzcoeyRtZXRo
+b2QkOm51bGwsCnRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIiRyZWNlaXZlciQifX0pKX0pCnQoJCwi
+UjEiLCJOOSIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KG51bGwpKX0pCnQoJCwiZk4iLCJpSSIs
+ZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShmdW5jdGlvbigpe3ZhciAkYXJndW1lbnRzRXhwciQ9JyRhcmd1
+bWVudHMkJwp0cnl7bnVsbC4kbWV0aG9kJCgkYXJndW1lbnRzRXhwciQpfWNhdGNoKHMpe3JldHVybiBz
+Lm1lc3NhZ2V9fSgpKX0pCnQoJCwicWkiLCJLZiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILlM3KHZv
+aWQgMCkpfSkKdCgkLCJyWiIsIlpoIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dmFy
+ICRhcmd1bWVudHNFeHByJD0nJGFyZ3VtZW50cyQnCnRyeXsodm9pZCAwKS4kbWV0aG9kJCgkYXJndW1l
+bnRzRXhwciQpfWNhdGNoKHMpe3JldHVybiBzLm1lc3NhZ2V9fSgpKX0pCnQoJCwia3EiLCJyTiIsZnVu
+Y3Rpb24oKXtyZXR1cm4gSC5jTShILk1qKG51bGwpKX0pCnQoJCwidHQiLCJjMyIsZnVuY3Rpb24oKXty
+ZXR1cm4gSC5jTShmdW5jdGlvbigpe3RyeXtudWxsLiRtZXRob2QkfWNhdGNoKHMpe3JldHVybiBzLm1l
+c3NhZ2V9fSgpKX0pCnQoJCwiZHQiLCJISyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILk1qKHZvaWQg
+MCkpfSkKdCgkLCJBNyIsInIxIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dHJ5eyh2
+b2lkIDApLiRtZXRob2QkfWNhdGNoKHMpe3JldHVybiBzLm1lc3NhZ2V9fSgpKX0pCnQoJCwiV2MiLCJ1
+dCIsZnVuY3Rpb24oKXtyZXR1cm4gUC5PaigpfSkKdCgkLCJraCIsInJmIixmdW5jdGlvbigpe3JldHVy
+biBQLldJKCl9KQp0KCQsImJ0IiwiVjciLGZ1bmN0aW9uKCl7cmV0dXJuIEguRFEoSC5YRihILlZNKFst
+MiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwt
+MiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMiwtMSwtMiwtMiwt
+MiwtMiwtMiw2MiwtMiw2MiwtMiw2Myw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSwtMiwtMiwt
+MiwtMSwtMiwtMiwtMiwwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4
+LDE5LDIwLDIxLDIyLDIzLDI0LDI1LC0yLC0yLC0yLC0yLDYzLC0yLDI2LDI3LDI4LDI5LDMwLDMxLDMy
+LDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLC0y
+LC0yLC0yLC0yLC0yXSx1LnQpKSl9KQp0KCQsIk01Iiwid1EiLGZ1bmN0aW9uKCl7cmV0dXJuIHR5cGVv
+ZiBwcm9jZXNzIT0idW5kZWZpbmVkIiYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHByb2Nl
+c3MpPT0iW29iamVjdCBwcm9jZXNzXSImJnByb2Nlc3MucGxhdGZvcm09PSJ3aW4zMiJ9KQp0KCQsIm1m
+IiwiejQiLGZ1bmN0aW9uKCl7cmV0dXJuIFAubnUoIl5bXFwtXFwuMC05QS1aX2Eten5dKiQiKX0pCnQo
+JCwiSkciLCJ2WiIsZnVuY3Rpb24oKXtyZXR1cm4gUC51eCgpfSkKdCgkLCJTQyIsIkFOIixmdW5jdGlv
+bigpe3JldHVybiBQLnRNKFsiQSIsIkFCQlIiLCJBQ1JPTllNIiwiQUREUkVTUyIsIkFSRUEiLCJBUlRJ
+Q0xFIiwiQVNJREUiLCJBVURJTyIsIkIiLCJCREkiLCJCRE8iLCJCSUciLCJCTE9DS1FVT1RFIiwiQlIi
+LCJCVVRUT04iLCJDQU5WQVMiLCJDQVBUSU9OIiwiQ0VOVEVSIiwiQ0lURSIsIkNPREUiLCJDT0wiLCJD
+T0xHUk9VUCIsIkNPTU1BTkQiLCJEQVRBIiwiREFUQUxJU1QiLCJERCIsIkRFTCIsIkRFVEFJTFMiLCJE
+Rk4iLCJESVIiLCJESVYiLCJETCIsIkRUIiwiRU0iLCJGSUVMRFNFVCIsIkZJR0NBUFRJT04iLCJGSUdV
+UkUiLCJGT05UIiwiRk9PVEVSIiwiRk9STSIsIkgxIiwiSDIiLCJIMyIsIkg0IiwiSDUiLCJINiIsIkhF
+QURFUiIsIkhHUk9VUCIsIkhSIiwiSSIsIklGUkFNRSIsIklNRyIsIklOUFVUIiwiSU5TIiwiS0JEIiwi
+TEFCRUwiLCJMRUdFTkQiLCJMSSIsIk1BUCIsIk1BUksiLCJNRU5VIiwiTUVURVIiLCJOQVYiLCJOT0JS
+IiwiT0wiLCJPUFRHUk9VUCIsIk9QVElPTiIsIk9VVFBVVCIsIlAiLCJQUkUiLCJQUk9HUkVTUyIsIlEi
+LCJTIiwiU0FNUCIsIlNFQ1RJT04iLCJTRUxFQ1QiLCJTTUFMTCIsIlNPVVJDRSIsIlNQQU4iLCJTVFJJ
+S0UiLCJTVFJPTkciLCJTVUIiLCJTVU1NQVJZIiwiU1VQIiwiVEFCTEUiLCJUQk9EWSIsIlREIiwiVEVY
+VEFSRUEiLCJURk9PVCIsIlRIIiwiVEhFQUQiLCJUSU1FIiwiVFIiLCJUUkFDSyIsIlRUIiwiVSIsIlVM
+IiwiVkFSIiwiVklERU8iLCJXQlIiXSx1Lk4pfSkKdCgkLCJYNCIsImhHIixmdW5jdGlvbigpe3JldHVy
+biBQLm51KCJeXFxTKyQiKX0pCnQoJCwid08iLCJvdyIsZnVuY3Rpb24oKXtyZXR1cm4gdS52LmIoUC5O
+RChzZWxmKSl9KQp0KCQsImt0IiwiUjgiLGZ1bmN0aW9uKCl7cmV0dXJuIEguWWcoIl8kZGFydF9kYXJ0
+T2JqZWN0Iil9KQp0KCQsImZLIiwia0kiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uIERhcnRPYmpl
+Y3QoYSl7dGhpcy5vPWF9fSkKdCgkLCJxdCIsInpCIixmdW5jdGlvbigpe3JldHVybiBuZXcgVC5HVigp
+fSkKdCgkLCJFWSIsImZpIixmdW5jdGlvbigpe3JldHVybiBXLlpyKCkucXVlcnlTZWxlY3RvcigiaGVh
+ZGVyIil9KQp0KCQsIlRSIiwiRFciLGZ1bmN0aW9uKCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9y
+KCJmb290ZXIiKX0pCnQoJCwiVzYiLCJoTCIsZnVuY3Rpb24oKXtyZXR1cm4gVy5acigpLnF1ZXJ5U2Vs
+ZWN0b3IoIi5lZGl0LXBhbmVsIC5wYW5lbC1jb250ZW50Iil9KQp0KCQsImhUIiwibVEiLGZ1bmN0aW9u
+KCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9yKCIuZWRpdC1saXN0IC5wYW5lbC1jb250ZW50Iil9
+KQp0KCQsImF2IiwiRDkiLGZ1bmN0aW9uKCl7cmV0dXJuIFcuWnIoKS5xdWVyeVNlbGVjdG9yKCIjdW5p
+dC1uYW1lIil9KQp0KCQsImZlIiwiS0ciLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBMLlhBKCl9KQp0KCQs
+Im1NIiwiblUiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNLmxJKCQuSGsoKSl9KQp0KCQsInlyIiwiYkQi
+LGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFLk9GKFAubnUoIi8iKSxQLm51KCJbXi9dJCIpLFAubnUoIl4v
+IikpfSkKdCgkLCJNayIsIktrIixmdW5jdGlvbigpe3JldHVybiBuZXcgTC5JVihQLm51KCJbL1xcXFxd
+IiksUC5udSgiW14vXFxcXF0kIiksUC5udSgiXihcXFxcXFxcXFteXFxcXF0rXFxcXFteXFxcXC9dK3xb
+YS16QS1aXTpbL1xcXFxdKSIpLFAubnUoIl5bL1xcXFxdKD8hWy9cXFxcXSkiKSl9KQp0KCQsImFrIiwi
+RWIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBGLnJ1KFAubnUoIi8iKSxQLm51KCIoXlthLXpBLVpdWy0r
+LmEtekEtWlxcZF0qOi8vfFteL10pJCIpLFAubnUoIlthLXpBLVpdWy0rLmEtekEtWlxcZF0qOi8vW14v
+XSoiKSxQLm51KCJeLyIpKX0pCnQoJCwibHMiLCJIayIsZnVuY3Rpb24oKXtyZXR1cm4gTy5SaCgpfSl9
+KSgpOyhmdW5jdGlvbiBuYXRpdmVTdXBwb3J0KCl7IWZ1bmN0aW9uKCl7dmFyIHQ9ZnVuY3Rpb24oYSl7
+dmFyIG49e30KblthXT0xCnJldHVybiBPYmplY3Qua2V5cyhodW5rSGVscGVycy5jb252ZXJ0VG9GYXN0
+T2JqZWN0KG4pKVswXX0Kdi5nZXRJc29sYXRlVGFnPWZ1bmN0aW9uKGEpe3JldHVybiB0KCJfX19kYXJ0
+XyIrYSt2Lmlzb2xhdGVUYWcpfQp2YXIgcz0iX19fZGFydF9pc29sYXRlX3RhZ3NfIgp2YXIgcj1PYmpl
+Y3Rbc118fChPYmplY3Rbc109T2JqZWN0LmNyZWF0ZShudWxsKSkKdmFyIHE9Il9aeFl4WCIKZm9yKHZh
+ciBwPTA7O3ArKyl7dmFyIG89dChxKyJfIitwKyJfIikKaWYoIShvIGluIHIpKXtyW29dPTEKdi5pc29s
+YXRlVGFnPW8KYnJlYWt9fXYuZGlzcGF0Y2hQcm9wZXJ0eU5hbWU9di5nZXRJc29sYXRlVGFnKCJkaXNw
+YXRjaF9yZWNvcmQiKX0oKQpodW5rSGVscGVycy5zZXRPclVwZGF0ZUludGVyY2VwdG9yc0J5VGFnKHtE
+T01FcnJvcjpKLnZCLERPTUltcGxlbWVudGF0aW9uOkoudkIsTWVkaWFFcnJvcjpKLnZCLE5hdmlnYXRv
+cjpKLnZCLE5hdmlnYXRvckNvbmN1cnJlbnRIYXJkd2FyZTpKLnZCLE5hdmlnYXRvclVzZXJNZWRpYUVy
+cm9yOkoudkIsT3ZlcmNvbnN0cmFpbmVkRXJyb3I6Si52QixQb3NpdGlvbkVycm9yOkoudkIsUmFuZ2U6
+Si52QixTUUxFcnJvcjpKLnZCLERhdGFWaWV3OkguRVQsQXJyYXlCdWZmZXJWaWV3OkguRVQsRmxvYXQz
+MkFycmF5OkguRGcsRmxvYXQ2NEFycmF5OkguRGcsSW50MTZBcnJheTpILnhqLEludDMyQXJyYXk6SC5k
+RSxJbnQ4QXJyYXk6SC5aQSxVaW50MTZBcnJheTpILndmLFVpbnQzMkFycmF5OkguUHEsVWludDhDbGFt
+cGVkQXJyYXk6SC5lRSxDYW52YXNQaXhlbEFycmF5OkguZUUsVWludDhBcnJheTpILlY2LEhUTUxBdWRp
+b0VsZW1lbnQ6Vy5xRSxIVE1MQlJFbGVtZW50OlcucUUsSFRNTEJ1dHRvbkVsZW1lbnQ6Vy5xRSxIVE1M
+Q2FudmFzRWxlbWVudDpXLnFFLEhUTUxDb250ZW50RWxlbWVudDpXLnFFLEhUTUxETGlzdEVsZW1lbnQ6
+Vy5xRSxIVE1MRGF0YUVsZW1lbnQ6Vy5xRSxIVE1MRGF0YUxpc3RFbGVtZW50OlcucUUsSFRNTERldGFp
+bHNFbGVtZW50OlcucUUsSFRNTERpYWxvZ0VsZW1lbnQ6Vy5xRSxIVE1MRGl2RWxlbWVudDpXLnFFLEhU
+TUxFbWJlZEVsZW1lbnQ6Vy5xRSxIVE1MRmllbGRTZXRFbGVtZW50OlcucUUsSFRNTEhSRWxlbWVudDpX
+LnFFLEhUTUxIZWFkRWxlbWVudDpXLnFFLEhUTUxIZWFkaW5nRWxlbWVudDpXLnFFLEhUTUxIdG1sRWxl
+bWVudDpXLnFFLEhUTUxJRnJhbWVFbGVtZW50OlcucUUsSFRNTEltYWdlRWxlbWVudDpXLnFFLEhUTUxJ
+bnB1dEVsZW1lbnQ6Vy5xRSxIVE1MTElFbGVtZW50OlcucUUsSFRNTExhYmVsRWxlbWVudDpXLnFFLEhU
+TUxMZWdlbmRFbGVtZW50OlcucUUsSFRNTExpbmtFbGVtZW50OlcucUUsSFRNTE1hcEVsZW1lbnQ6Vy5x
+RSxIVE1MTWVkaWFFbGVtZW50OlcucUUsSFRNTE1lbnVFbGVtZW50OlcucUUsSFRNTE1ldGFFbGVtZW50
+OlcucUUsSFRNTE1ldGVyRWxlbWVudDpXLnFFLEhUTUxNb2RFbGVtZW50OlcucUUsSFRNTE9MaXN0RWxl
+bWVudDpXLnFFLEhUTUxPYmplY3RFbGVtZW50OlcucUUsSFRNTE9wdEdyb3VwRWxlbWVudDpXLnFFLEhU
+TUxPcHRpb25FbGVtZW50OlcucUUsSFRNTE91dHB1dEVsZW1lbnQ6Vy5xRSxIVE1MUGFyYW1FbGVtZW50
+OlcucUUsSFRNTFBpY3R1cmVFbGVtZW50OlcucUUsSFRNTFByZUVsZW1lbnQ6Vy5xRSxIVE1MUHJvZ3Jl
+c3NFbGVtZW50OlcucUUsSFRNTFF1b3RlRWxlbWVudDpXLnFFLEhUTUxTY3JpcHRFbGVtZW50OlcucUUs
+SFRNTFNoYWRvd0VsZW1lbnQ6Vy5xRSxIVE1MU2xvdEVsZW1lbnQ6Vy5xRSxIVE1MU291cmNlRWxlbWVu
+dDpXLnFFLEhUTUxTcGFuRWxlbWVudDpXLnFFLEhUTUxTdHlsZUVsZW1lbnQ6Vy5xRSxIVE1MVGFibGVD
+YXB0aW9uRWxlbWVudDpXLnFFLEhUTUxUYWJsZUNlbGxFbGVtZW50OlcucUUsSFRNTFRhYmxlRGF0YUNl
+bGxFbGVtZW50OlcucUUsSFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnQ6Vy5xRSxIVE1MVGFibGVDb2xF
+bGVtZW50OlcucUUsSFRNTFRleHRBcmVhRWxlbWVudDpXLnFFLEhUTUxUaW1lRWxlbWVudDpXLnFFLEhU
+TUxUaXRsZUVsZW1lbnQ6Vy5xRSxIVE1MVHJhY2tFbGVtZW50OlcucUUsSFRNTFVMaXN0RWxlbWVudDpX
+LnFFLEhUTUxVbmtub3duRWxlbWVudDpXLnFFLEhUTUxWaWRlb0VsZW1lbnQ6Vy5xRSxIVE1MRGlyZWN0
+b3J5RWxlbWVudDpXLnFFLEhUTUxGb250RWxlbWVudDpXLnFFLEhUTUxGcmFtZUVsZW1lbnQ6Vy5xRSxI
+VE1MRnJhbWVTZXRFbGVtZW50OlcucUUsSFRNTE1hcnF1ZWVFbGVtZW50OlcucUUsSFRNTEVsZW1lbnQ6
+Vy5xRSxIVE1MQW5jaG9yRWxlbWVudDpXLkdoLEhUTUxBcmVhRWxlbWVudDpXLmZZLEhUTUxCYXNlRWxl
+bWVudDpXLm5CLEJsb2I6Vy5BeixIVE1MQm9keUVsZW1lbnQ6Vy5RUCxDREFUQVNlY3Rpb246Vy5ueCxD
+aGFyYWN0ZXJEYXRhOlcubngsQ29tbWVudDpXLm54LFByb2Nlc3NpbmdJbnN0cnVjdGlvbjpXLm54LFRl
+eHQ6Vy5ueCxDU1NTdHlsZURlY2xhcmF0aW9uOlcub0osTVNTdHlsZUNTU1Byb3BlcnRpZXM6Vy5vSixD
+U1MyUHJvcGVydGllczpXLm9KLFhNTERvY3VtZW50OlcuUUYsRG9jdW1lbnQ6Vy5RRixET01FeGNlcHRp
+b246Vy5OaCxET01SZWN0UmVhZE9ubHk6Vy5JQixET01Ub2tlbkxpc3Q6Vy5uNyxFbGVtZW50OlcuY3Ys
+QWJvcnRQYXltZW50RXZlbnQ6Vy5lYSxBbmltYXRpb25FdmVudDpXLmVhLEFuaW1hdGlvblBsYXliYWNr
+RXZlbnQ6Vy5lYSxBcHBsaWNhdGlvbkNhY2hlRXJyb3JFdmVudDpXLmVhLEJhY2tncm91bmRGZXRjaENs
+aWNrRXZlbnQ6Vy5lYSxCYWNrZ3JvdW5kRmV0Y2hFdmVudDpXLmVhLEJhY2tncm91bmRGZXRjaEZhaWxF
+dmVudDpXLmVhLEJhY2tncm91bmRGZXRjaGVkRXZlbnQ6Vy5lYSxCZWZvcmVJbnN0YWxsUHJvbXB0RXZl
+bnQ6Vy5lYSxCZWZvcmVVbmxvYWRFdmVudDpXLmVhLEJsb2JFdmVudDpXLmVhLENhbk1ha2VQYXltZW50
+RXZlbnQ6Vy5lYSxDbGlwYm9hcmRFdmVudDpXLmVhLENsb3NlRXZlbnQ6Vy5lYSxDdXN0b21FdmVudDpX
+LmVhLERldmljZU1vdGlvbkV2ZW50OlcuZWEsRGV2aWNlT3JpZW50YXRpb25FdmVudDpXLmVhLEVycm9y
+RXZlbnQ6Vy5lYSxFeHRlbmRhYmxlRXZlbnQ6Vy5lYSxFeHRlbmRhYmxlTWVzc2FnZUV2ZW50OlcuZWEs
+RmV0Y2hFdmVudDpXLmVhLEZvbnRGYWNlU2V0TG9hZEV2ZW50OlcuZWEsRm9yZWlnbkZldGNoRXZlbnQ6
+Vy5lYSxHYW1lcGFkRXZlbnQ6Vy5lYSxIYXNoQ2hhbmdlRXZlbnQ6Vy5lYSxJbnN0YWxsRXZlbnQ6Vy5l
+YSxNZWRpYUVuY3J5cHRlZEV2ZW50OlcuZWEsTWVkaWFLZXlNZXNzYWdlRXZlbnQ6Vy5lYSxNZWRpYVF1
+ZXJ5TGlzdEV2ZW50OlcuZWEsTWVkaWFTdHJlYW1FdmVudDpXLmVhLE1lZGlhU3RyZWFtVHJhY2tFdmVu
+dDpXLmVhLE1lc3NhZ2VFdmVudDpXLmVhLE1JRElDb25uZWN0aW9uRXZlbnQ6Vy5lYSxNSURJTWVzc2Fn
+ZUV2ZW50OlcuZWEsTXV0YXRpb25FdmVudDpXLmVhLE5vdGlmaWNhdGlvbkV2ZW50OlcuZWEsUGFnZVRy
+YW5zaXRpb25FdmVudDpXLmVhLFBheW1lbnRSZXF1ZXN0RXZlbnQ6Vy5lYSxQYXltZW50UmVxdWVzdFVw
+ZGF0ZUV2ZW50OlcuZWEsUG9wU3RhdGVFdmVudDpXLmVhLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25BdmFp
+bGFibGVFdmVudDpXLmVhLFByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZUV2ZW50OlcuZWEsUHJvbWlz
+ZVJlamVjdGlvbkV2ZW50OlcuZWEsUHVzaEV2ZW50OlcuZWEsUlRDRGF0YUNoYW5uZWxFdmVudDpXLmVh
+LFJUQ0RUTUZUb25lQ2hhbmdlRXZlbnQ6Vy5lYSxSVENQZWVyQ29ubmVjdGlvbkljZUV2ZW50OlcuZWEs
+UlRDVHJhY2tFdmVudDpXLmVhLFNlY3VyaXR5UG9saWN5VmlvbGF0aW9uRXZlbnQ6Vy5lYSxTZW5zb3JF
+cnJvckV2ZW50OlcuZWEsU3BlZWNoUmVjb2duaXRpb25FcnJvcjpXLmVhLFNwZWVjaFJlY29nbml0aW9u
+RXZlbnQ6Vy5lYSxTcGVlY2hTeW50aGVzaXNFdmVudDpXLmVhLFN0b3JhZ2VFdmVudDpXLmVhLFN5bmNF
+dmVudDpXLmVhLFRyYWNrRXZlbnQ6Vy5lYSxUcmFuc2l0aW9uRXZlbnQ6Vy5lYSxXZWJLaXRUcmFuc2l0
+aW9uRXZlbnQ6Vy5lYSxWUkRldmljZUV2ZW50OlcuZWEsVlJEaXNwbGF5RXZlbnQ6Vy5lYSxWUlNlc3Np
+b25FdmVudDpXLmVhLE1vam9JbnRlcmZhY2VSZXF1ZXN0RXZlbnQ6Vy5lYSxVU0JDb25uZWN0aW9uRXZl
+bnQ6Vy5lYSxJREJWZXJzaW9uQ2hhbmdlRXZlbnQ6Vy5lYSxBdWRpb1Byb2Nlc3NpbmdFdmVudDpXLmVh
+LE9mZmxpbmVBdWRpb0NvbXBsZXRpb25FdmVudDpXLmVhLFdlYkdMQ29udGV4dEV2ZW50OlcuZWEsRXZl
+bnQ6Vy5lYSxJbnB1dEV2ZW50OlcuZWEsRXZlbnRUYXJnZXQ6Vy5EMCxGaWxlOlcuVDUsSFRNTEZvcm1F
+bGVtZW50OlcuaDQsSGlzdG9yeTpXLmJyLEhUTUxEb2N1bWVudDpXLlZiLFhNTEh0dHBSZXF1ZXN0Olcu
+TzcsWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDpXLndhLEltYWdlRGF0YTpXLlNnLExvY2F0aW9uOlcu
+dTgsTW91c2VFdmVudDpXLkFqLERyYWdFdmVudDpXLkFqLFBvaW50ZXJFdmVudDpXLkFqLFdoZWVsRXZl
+bnQ6Vy5BaixEb2N1bWVudEZyYWdtZW50OlcudUgsU2hhZG93Um9vdDpXLnVILERvY3VtZW50VHlwZTpX
+LnVILE5vZGU6Vy51SCxOb2RlTGlzdDpXLkJILFJhZGlvTm9kZUxpc3Q6Vy5CSCxIVE1MUGFyYWdyYXBo
+RWxlbWVudDpXLlNOLFByb2dyZXNzRXZlbnQ6Vy5ldyxSZXNvdXJjZVByb2dyZXNzRXZlbnQ6Vy5ldyxI
+VE1MU2VsZWN0RWxlbWVudDpXLmxwLEhUTUxUYWJsZUVsZW1lbnQ6Vy5UYixIVE1MVGFibGVSb3dFbGVt
+ZW50OlcuSXYsSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ6Vy5CVCxIVE1MVGVtcGxhdGVFbGVtZW50Olcu
+eVksQ29tcG9zaXRpb25FdmVudDpXLnc2LEZvY3VzRXZlbnQ6Vy53NixLZXlib2FyZEV2ZW50OlcudzYs
+VGV4dEV2ZW50OlcudzYsVG91Y2hFdmVudDpXLnc2LFVJRXZlbnQ6Vy53NixXaW5kb3c6Vy5LNSxET01X
+aW5kb3c6Vy5LNSxEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZTpXLkNtLFNlcnZpY2VXb3JrZXJHbG9i
+YWxTY29wZTpXLkNtLFNoYXJlZFdvcmtlckdsb2JhbFNjb3BlOlcuQ20sV29ya2VyR2xvYmFsU2NvcGU6
+Vy5DbSxBdHRyOlcuQ1EsQ2xpZW50UmVjdDpXLnc0LERPTVJlY3Q6Vy53NCxOYW1lZE5vZGVNYXA6Vy5y
+aCxNb3pOYW1lZEF0dHJNYXA6Vy5yaCxJREJLZXlSYW5nZTpQLmhGLFNWR1NjcmlwdEVsZW1lbnQ6UC5u
+ZCxTVkdBRWxlbWVudDpQLmQ1LFNWR0FuaW1hdGVFbGVtZW50OlAuZDUsU1ZHQW5pbWF0ZU1vdGlvbkVs
+ZW1lbnQ6UC5kNSxTVkdBbmltYXRlVHJhbnNmb3JtRWxlbWVudDpQLmQ1LFNWR0FuaW1hdGlvbkVsZW1l
+bnQ6UC5kNSxTVkdDaXJjbGVFbGVtZW50OlAuZDUsU1ZHQ2xpcFBhdGhFbGVtZW50OlAuZDUsU1ZHRGVm
+c0VsZW1lbnQ6UC5kNSxTVkdEZXNjRWxlbWVudDpQLmQ1LFNWR0Rpc2NhcmRFbGVtZW50OlAuZDUsU1ZH
+RWxsaXBzZUVsZW1lbnQ6UC5kNSxTVkdGRUJsZW5kRWxlbWVudDpQLmQ1LFNWR0ZFQ29sb3JNYXRyaXhF
+bGVtZW50OlAuZDUsU1ZHRkVDb21wb25lbnRUcmFuc2ZlckVsZW1lbnQ6UC5kNSxTVkdGRUNvbXBvc2l0
+ZUVsZW1lbnQ6UC5kNSxTVkdGRUNvbnZvbHZlTWF0cml4RWxlbWVudDpQLmQ1LFNWR0ZFRGlmZnVzZUxp
+Z2h0aW5nRWxlbWVudDpQLmQ1LFNWR0ZFRGlzcGxhY2VtZW50TWFwRWxlbWVudDpQLmQ1LFNWR0ZFRGlz
+dGFudExpZ2h0RWxlbWVudDpQLmQ1LFNWR0ZFRmxvb2RFbGVtZW50OlAuZDUsU1ZHRkVGdW5jQUVsZW1l
+bnQ6UC5kNSxTVkdGRUZ1bmNCRWxlbWVudDpQLmQ1LFNWR0ZFRnVuY0dFbGVtZW50OlAuZDUsU1ZHRkVG
+dW5jUkVsZW1lbnQ6UC5kNSxTVkdGRUdhdXNzaWFuQmx1ckVsZW1lbnQ6UC5kNSxTVkdGRUltYWdlRWxl
+bWVudDpQLmQ1LFNWR0ZFTWVyZ2VFbGVtZW50OlAuZDUsU1ZHRkVNZXJnZU5vZGVFbGVtZW50OlAuZDUs
+U1ZHRkVNb3JwaG9sb2d5RWxlbWVudDpQLmQ1LFNWR0ZFT2Zmc2V0RWxlbWVudDpQLmQ1LFNWR0ZFUG9p
+bnRMaWdodEVsZW1lbnQ6UC5kNSxTVkdGRVNwZWN1bGFyTGlnaHRpbmdFbGVtZW50OlAuZDUsU1ZHRkVT
+cG90TGlnaHRFbGVtZW50OlAuZDUsU1ZHRkVUaWxlRWxlbWVudDpQLmQ1LFNWR0ZFVHVyYnVsZW5jZUVs
+ZW1lbnQ6UC5kNSxTVkdGaWx0ZXJFbGVtZW50OlAuZDUsU1ZHRm9yZWlnbk9iamVjdEVsZW1lbnQ6UC5k
+NSxTVkdHRWxlbWVudDpQLmQ1LFNWR0dlb21ldHJ5RWxlbWVudDpQLmQ1LFNWR0dyYXBoaWNzRWxlbWVu
+dDpQLmQ1LFNWR0ltYWdlRWxlbWVudDpQLmQ1LFNWR0xpbmVFbGVtZW50OlAuZDUsU1ZHTGluZWFyR3Jh
+ZGllbnRFbGVtZW50OlAuZDUsU1ZHTWFya2VyRWxlbWVudDpQLmQ1LFNWR01hc2tFbGVtZW50OlAuZDUs
+U1ZHTWV0YWRhdGFFbGVtZW50OlAuZDUsU1ZHUGF0aEVsZW1lbnQ6UC5kNSxTVkdQYXR0ZXJuRWxlbWVu
+dDpQLmQ1LFNWR1BvbHlnb25FbGVtZW50OlAuZDUsU1ZHUG9seWxpbmVFbGVtZW50OlAuZDUsU1ZHUmFk
+aWFsR3JhZGllbnRFbGVtZW50OlAuZDUsU1ZHUmVjdEVsZW1lbnQ6UC5kNSxTVkdTZXRFbGVtZW50OlAu
+ZDUsU1ZHU3RvcEVsZW1lbnQ6UC5kNSxTVkdTdHlsZUVsZW1lbnQ6UC5kNSxTVkdTVkdFbGVtZW50OlAu
+ZDUsU1ZHU3dpdGNoRWxlbWVudDpQLmQ1LFNWR1N5bWJvbEVsZW1lbnQ6UC5kNSxTVkdUU3BhbkVsZW1l
+bnQ6UC5kNSxTVkdUZXh0Q29udGVudEVsZW1lbnQ6UC5kNSxTVkdUZXh0RWxlbWVudDpQLmQ1LFNWR1Rl
+eHRQYXRoRWxlbWVudDpQLmQ1LFNWR1RleHRQb3NpdGlvbmluZ0VsZW1lbnQ6UC5kNSxTVkdUaXRsZUVs
+ZW1lbnQ6UC5kNSxTVkdVc2VFbGVtZW50OlAuZDUsU1ZHVmlld0VsZW1lbnQ6UC5kNSxTVkdHcmFkaWVu
+dEVsZW1lbnQ6UC5kNSxTVkdDb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9uRWxlbWVudDpQLmQ1LFNWR0ZF
+RHJvcFNoYWRvd0VsZW1lbnQ6UC5kNSxTVkdNUGF0aEVsZW1lbnQ6UC5kNSxTVkdFbGVtZW50OlAuZDV9
+KQpodW5rSGVscGVycy5zZXRPclVwZGF0ZUxlYWZUYWdzKHtET01FcnJvcjp0cnVlLERPTUltcGxlbWVu
+dGF0aW9uOnRydWUsTWVkaWFFcnJvcjp0cnVlLE5hdmlnYXRvcjp0cnVlLE5hdmlnYXRvckNvbmN1cnJl
+bnRIYXJkd2FyZTp0cnVlLE5hdmlnYXRvclVzZXJNZWRpYUVycm9yOnRydWUsT3ZlcmNvbnN0cmFpbmVk
+RXJyb3I6dHJ1ZSxQb3NpdGlvbkVycm9yOnRydWUsUmFuZ2U6dHJ1ZSxTUUxFcnJvcjp0cnVlLERhdGFW
+aWV3OnRydWUsQXJyYXlCdWZmZXJWaWV3OmZhbHNlLEZsb2F0MzJBcnJheTp0cnVlLEZsb2F0NjRBcnJh
+eTp0cnVlLEludDE2QXJyYXk6dHJ1ZSxJbnQzMkFycmF5OnRydWUsSW50OEFycmF5OnRydWUsVWludDE2
+QXJyYXk6dHJ1ZSxVaW50MzJBcnJheTp0cnVlLFVpbnQ4Q2xhbXBlZEFycmF5OnRydWUsQ2FudmFzUGl4
+ZWxBcnJheTp0cnVlLFVpbnQ4QXJyYXk6ZmFsc2UsSFRNTEF1ZGlvRWxlbWVudDp0cnVlLEhUTUxCUkVs
+ZW1lbnQ6dHJ1ZSxIVE1MQnV0dG9uRWxlbWVudDp0cnVlLEhUTUxDYW52YXNFbGVtZW50OnRydWUsSFRN
+TENvbnRlbnRFbGVtZW50OnRydWUsSFRNTERMaXN0RWxlbWVudDp0cnVlLEhUTUxEYXRhRWxlbWVudDp0
+cnVlLEhUTUxEYXRhTGlzdEVsZW1lbnQ6dHJ1ZSxIVE1MRGV0YWlsc0VsZW1lbnQ6dHJ1ZSxIVE1MRGlh
+bG9nRWxlbWVudDp0cnVlLEhUTUxEaXZFbGVtZW50OnRydWUsSFRNTEVtYmVkRWxlbWVudDp0cnVlLEhU
+TUxGaWVsZFNldEVsZW1lbnQ6dHJ1ZSxIVE1MSFJFbGVtZW50OnRydWUsSFRNTEhlYWRFbGVtZW50OnRy
+dWUsSFRNTEhlYWRpbmdFbGVtZW50OnRydWUsSFRNTEh0bWxFbGVtZW50OnRydWUsSFRNTElGcmFtZUVs
+ZW1lbnQ6dHJ1ZSxIVE1MSW1hZ2VFbGVtZW50OnRydWUsSFRNTElucHV0RWxlbWVudDp0cnVlLEhUTUxM
+SUVsZW1lbnQ6dHJ1ZSxIVE1MTGFiZWxFbGVtZW50OnRydWUsSFRNTExlZ2VuZEVsZW1lbnQ6dHJ1ZSxI
+VE1MTGlua0VsZW1lbnQ6dHJ1ZSxIVE1MTWFwRWxlbWVudDp0cnVlLEhUTUxNZWRpYUVsZW1lbnQ6dHJ1
+ZSxIVE1MTWVudUVsZW1lbnQ6dHJ1ZSxIVE1MTWV0YUVsZW1lbnQ6dHJ1ZSxIVE1MTWV0ZXJFbGVtZW50
+OnRydWUsSFRNTE1vZEVsZW1lbnQ6dHJ1ZSxIVE1MT0xpc3RFbGVtZW50OnRydWUsSFRNTE9iamVjdEVs
+ZW1lbnQ6dHJ1ZSxIVE1MT3B0R3JvdXBFbGVtZW50OnRydWUsSFRNTE9wdGlvbkVsZW1lbnQ6dHJ1ZSxI
+VE1MT3V0cHV0RWxlbWVudDp0cnVlLEhUTUxQYXJhbUVsZW1lbnQ6dHJ1ZSxIVE1MUGljdHVyZUVsZW1l
+bnQ6dHJ1ZSxIVE1MUHJlRWxlbWVudDp0cnVlLEhUTUxQcm9ncmVzc0VsZW1lbnQ6dHJ1ZSxIVE1MUXVv
+dGVFbGVtZW50OnRydWUsSFRNTFNjcmlwdEVsZW1lbnQ6dHJ1ZSxIVE1MU2hhZG93RWxlbWVudDp0cnVl
+LEhUTUxTbG90RWxlbWVudDp0cnVlLEhUTUxTb3VyY2VFbGVtZW50OnRydWUsSFRNTFNwYW5FbGVtZW50
+OnRydWUsSFRNTFN0eWxlRWxlbWVudDp0cnVlLEhUTUxUYWJsZUNhcHRpb25FbGVtZW50OnRydWUsSFRN
+TFRhYmxlQ2VsbEVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVEYXRhQ2VsbEVsZW1lbnQ6dHJ1ZSxIVE1MVGFi
+bGVIZWFkZXJDZWxsRWxlbWVudDp0cnVlLEhUTUxUYWJsZUNvbEVsZW1lbnQ6dHJ1ZSxIVE1MVGV4dEFy
+ZWFFbGVtZW50OnRydWUsSFRNTFRpbWVFbGVtZW50OnRydWUsSFRNTFRpdGxlRWxlbWVudDp0cnVlLEhU
+TUxUcmFja0VsZW1lbnQ6dHJ1ZSxIVE1MVUxpc3RFbGVtZW50OnRydWUsSFRNTFVua25vd25FbGVtZW50
+OnRydWUsSFRNTFZpZGVvRWxlbWVudDp0cnVlLEhUTUxEaXJlY3RvcnlFbGVtZW50OnRydWUsSFRNTEZv
+bnRFbGVtZW50OnRydWUsSFRNTEZyYW1lRWxlbWVudDp0cnVlLEhUTUxGcmFtZVNldEVsZW1lbnQ6dHJ1
+ZSxIVE1MTWFycXVlZUVsZW1lbnQ6dHJ1ZSxIVE1MRWxlbWVudDpmYWxzZSxIVE1MQW5jaG9yRWxlbWVu
+dDp0cnVlLEhUTUxBcmVhRWxlbWVudDp0cnVlLEhUTUxCYXNlRWxlbWVudDp0cnVlLEJsb2I6ZmFsc2Us
+SFRNTEJvZHlFbGVtZW50OnRydWUsQ0RBVEFTZWN0aW9uOnRydWUsQ2hhcmFjdGVyRGF0YTp0cnVlLENv
+bW1lbnQ6dHJ1ZSxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246dHJ1ZSxUZXh0OnRydWUsQ1NTU3R5bGVEZWNs
+YXJhdGlvbjp0cnVlLE1TU3R5bGVDU1NQcm9wZXJ0aWVzOnRydWUsQ1NTMlByb3BlcnRpZXM6dHJ1ZSxY
+TUxEb2N1bWVudDp0cnVlLERvY3VtZW50OmZhbHNlLERPTUV4Y2VwdGlvbjp0cnVlLERPTVJlY3RSZWFk
+T25seTpmYWxzZSxET01Ub2tlbkxpc3Q6dHJ1ZSxFbGVtZW50OmZhbHNlLEFib3J0UGF5bWVudEV2ZW50
+OnRydWUsQW5pbWF0aW9uRXZlbnQ6dHJ1ZSxBbmltYXRpb25QbGF5YmFja0V2ZW50OnRydWUsQXBwbGlj
+YXRpb25DYWNoZUVycm9yRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hDbGlja0V2ZW50OnRydWUsQmFj
+a2dyb3VuZEZldGNoRXZlbnQ6dHJ1ZSxCYWNrZ3JvdW5kRmV0Y2hGYWlsRXZlbnQ6dHJ1ZSxCYWNrZ3Jv
+dW5kRmV0Y2hlZEV2ZW50OnRydWUsQmVmb3JlSW5zdGFsbFByb21wdEV2ZW50OnRydWUsQmVmb3JlVW5s
+b2FkRXZlbnQ6dHJ1ZSxCbG9iRXZlbnQ6dHJ1ZSxDYW5NYWtlUGF5bWVudEV2ZW50OnRydWUsQ2xpcGJv
+YXJkRXZlbnQ6dHJ1ZSxDbG9zZUV2ZW50OnRydWUsQ3VzdG9tRXZlbnQ6dHJ1ZSxEZXZpY2VNb3Rpb25F
+dmVudDp0cnVlLERldmljZU9yaWVudGF0aW9uRXZlbnQ6dHJ1ZSxFcnJvckV2ZW50OnRydWUsRXh0ZW5k
+YWJsZUV2ZW50OnRydWUsRXh0ZW5kYWJsZU1lc3NhZ2VFdmVudDp0cnVlLEZldGNoRXZlbnQ6dHJ1ZSxG
+b250RmFjZVNldExvYWRFdmVudDp0cnVlLEZvcmVpZ25GZXRjaEV2ZW50OnRydWUsR2FtZXBhZEV2ZW50
+OnRydWUsSGFzaENoYW5nZUV2ZW50OnRydWUsSW5zdGFsbEV2ZW50OnRydWUsTWVkaWFFbmNyeXB0ZWRF
+dmVudDp0cnVlLE1lZGlhS2V5TWVzc2FnZUV2ZW50OnRydWUsTWVkaWFRdWVyeUxpc3RFdmVudDp0cnVl
+LE1lZGlhU3RyZWFtRXZlbnQ6dHJ1ZSxNZWRpYVN0cmVhbVRyYWNrRXZlbnQ6dHJ1ZSxNZXNzYWdlRXZl
+bnQ6dHJ1ZSxNSURJQ29ubmVjdGlvbkV2ZW50OnRydWUsTUlESU1lc3NhZ2VFdmVudDp0cnVlLE11dGF0
+aW9uRXZlbnQ6dHJ1ZSxOb3RpZmljYXRpb25FdmVudDp0cnVlLFBhZ2VUcmFuc2l0aW9uRXZlbnQ6dHJ1
+ZSxQYXltZW50UmVxdWVzdEV2ZW50OnRydWUsUGF5bWVudFJlcXVlc3RVcGRhdGVFdmVudDp0cnVlLFBv
+cFN0YXRlRXZlbnQ6dHJ1ZSxQcmVzZW50YXRpb25Db25uZWN0aW9uQXZhaWxhYmxlRXZlbnQ6dHJ1ZSxQ
+cmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VFdmVudDp0cnVlLFByb21pc2VSZWplY3Rpb25FdmVudDp0
+cnVlLFB1c2hFdmVudDp0cnVlLFJUQ0RhdGFDaGFubmVsRXZlbnQ6dHJ1ZSxSVENEVE1GVG9uZUNoYW5n
+ZUV2ZW50OnRydWUsUlRDUGVlckNvbm5lY3Rpb25JY2VFdmVudDp0cnVlLFJUQ1RyYWNrRXZlbnQ6dHJ1
+ZSxTZWN1cml0eVBvbGljeVZpb2xhdGlvbkV2ZW50OnRydWUsU2Vuc29yRXJyb3JFdmVudDp0cnVlLFNw
+ZWVjaFJlY29nbml0aW9uRXJyb3I6dHJ1ZSxTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OnRydWUsU3BlZWNo
+U3ludGhlc2lzRXZlbnQ6dHJ1ZSxTdG9yYWdlRXZlbnQ6dHJ1ZSxTeW5jRXZlbnQ6dHJ1ZSxUcmFja0V2
+ZW50OnRydWUsVHJhbnNpdGlvbkV2ZW50OnRydWUsV2ViS2l0VHJhbnNpdGlvbkV2ZW50OnRydWUsVlJE
+ZXZpY2VFdmVudDp0cnVlLFZSRGlzcGxheUV2ZW50OnRydWUsVlJTZXNzaW9uRXZlbnQ6dHJ1ZSxNb2pv
+SW50ZXJmYWNlUmVxdWVzdEV2ZW50OnRydWUsVVNCQ29ubmVjdGlvbkV2ZW50OnRydWUsSURCVmVyc2lv
+bkNoYW5nZUV2ZW50OnRydWUsQXVkaW9Qcm9jZXNzaW5nRXZlbnQ6dHJ1ZSxPZmZsaW5lQXVkaW9Db21w
+bGV0aW9uRXZlbnQ6dHJ1ZSxXZWJHTENvbnRleHRFdmVudDp0cnVlLEV2ZW50OmZhbHNlLElucHV0RXZl
+bnQ6ZmFsc2UsRXZlbnRUYXJnZXQ6ZmFsc2UsRmlsZTp0cnVlLEhUTUxGb3JtRWxlbWVudDp0cnVlLEhp
+c3Rvcnk6dHJ1ZSxIVE1MRG9jdW1lbnQ6dHJ1ZSxYTUxIdHRwUmVxdWVzdDp0cnVlLFhNTEh0dHBSZXF1
+ZXN0RXZlbnRUYXJnZXQ6ZmFsc2UsSW1hZ2VEYXRhOnRydWUsTG9jYXRpb246dHJ1ZSxNb3VzZUV2ZW50
+OnRydWUsRHJhZ0V2ZW50OnRydWUsUG9pbnRlckV2ZW50OnRydWUsV2hlZWxFdmVudDp0cnVlLERvY3Vt
+ZW50RnJhZ21lbnQ6dHJ1ZSxTaGFkb3dSb290OnRydWUsRG9jdW1lbnRUeXBlOnRydWUsTm9kZTpmYWxz
+ZSxOb2RlTGlzdDp0cnVlLFJhZGlvTm9kZUxpc3Q6dHJ1ZSxIVE1MUGFyYWdyYXBoRWxlbWVudDp0cnVl
+LFByb2dyZXNzRXZlbnQ6dHJ1ZSxSZXNvdXJjZVByb2dyZXNzRXZlbnQ6dHJ1ZSxIVE1MU2VsZWN0RWxl
+bWVudDp0cnVlLEhUTUxUYWJsZUVsZW1lbnQ6dHJ1ZSxIVE1MVGFibGVSb3dFbGVtZW50OnRydWUsSFRN
+TFRhYmxlU2VjdGlvbkVsZW1lbnQ6dHJ1ZSxIVE1MVGVtcGxhdGVFbGVtZW50OnRydWUsQ29tcG9zaXRp
+b25FdmVudDp0cnVlLEZvY3VzRXZlbnQ6dHJ1ZSxLZXlib2FyZEV2ZW50OnRydWUsVGV4dEV2ZW50OnRy
+dWUsVG91Y2hFdmVudDp0cnVlLFVJRXZlbnQ6ZmFsc2UsV2luZG93OnRydWUsRE9NV2luZG93OnRydWUs
+RGVkaWNhdGVkV29ya2VyR2xvYmFsU2NvcGU6dHJ1ZSxTZXJ2aWNlV29ya2VyR2xvYmFsU2NvcGU6dHJ1
+ZSxTaGFyZWRXb3JrZXJHbG9iYWxTY29wZTp0cnVlLFdvcmtlckdsb2JhbFNjb3BlOnRydWUsQXR0cjp0
+cnVlLENsaWVudFJlY3Q6dHJ1ZSxET01SZWN0OnRydWUsTmFtZWROb2RlTWFwOnRydWUsTW96TmFtZWRB
+dHRyTWFwOnRydWUsSURCS2V5UmFuZ2U6dHJ1ZSxTVkdTY3JpcHRFbGVtZW50OnRydWUsU1ZHQUVsZW1l
+bnQ6dHJ1ZSxTVkdBbmltYXRlRWxlbWVudDp0cnVlLFNWR0FuaW1hdGVNb3Rpb25FbGVtZW50OnRydWUs
+U1ZHQW5pbWF0ZVRyYW5zZm9ybUVsZW1lbnQ6dHJ1ZSxTVkdBbmltYXRpb25FbGVtZW50OnRydWUsU1ZH
+Q2lyY2xlRWxlbWVudDp0cnVlLFNWR0NsaXBQYXRoRWxlbWVudDp0cnVlLFNWR0RlZnNFbGVtZW50OnRy
+dWUsU1ZHRGVzY0VsZW1lbnQ6dHJ1ZSxTVkdEaXNjYXJkRWxlbWVudDp0cnVlLFNWR0VsbGlwc2VFbGVt
+ZW50OnRydWUsU1ZHRkVCbGVuZEVsZW1lbnQ6dHJ1ZSxTVkdGRUNvbG9yTWF0cml4RWxlbWVudDp0cnVl
+LFNWR0ZFQ29tcG9uZW50VHJhbnNmZXJFbGVtZW50OnRydWUsU1ZHRkVDb21wb3NpdGVFbGVtZW50OnRy
+dWUsU1ZHRkVDb252b2x2ZU1hdHJpeEVsZW1lbnQ6dHJ1ZSxTVkdGRURpZmZ1c2VMaWdodGluZ0VsZW1l
+bnQ6dHJ1ZSxTVkdGRURpc3BsYWNlbWVudE1hcEVsZW1lbnQ6dHJ1ZSxTVkdGRURpc3RhbnRMaWdodEVs
+ZW1lbnQ6dHJ1ZSxTVkdGRUZsb29kRWxlbWVudDp0cnVlLFNWR0ZFRnVuY0FFbGVtZW50OnRydWUsU1ZH
+RkVGdW5jQkVsZW1lbnQ6dHJ1ZSxTVkdGRUZ1bmNHRWxlbWVudDp0cnVlLFNWR0ZFRnVuY1JFbGVtZW50
+OnRydWUsU1ZHRkVHYXVzc2lhbkJsdXJFbGVtZW50OnRydWUsU1ZHRkVJbWFnZUVsZW1lbnQ6dHJ1ZSxT
+VkdGRU1lcmdlRWxlbWVudDp0cnVlLFNWR0ZFTWVyZ2VOb2RlRWxlbWVudDp0cnVlLFNWR0ZFTW9ycGhv
+bG9neUVsZW1lbnQ6dHJ1ZSxTVkdGRU9mZnNldEVsZW1lbnQ6dHJ1ZSxTVkdGRVBvaW50TGlnaHRFbGVt
+ZW50OnRydWUsU1ZHRkVTcGVjdWxhckxpZ2h0aW5nRWxlbWVudDp0cnVlLFNWR0ZFU3BvdExpZ2h0RWxl
+bWVudDp0cnVlLFNWR0ZFVGlsZUVsZW1lbnQ6dHJ1ZSxTVkdGRVR1cmJ1bGVuY2VFbGVtZW50OnRydWUs
+U1ZHRmlsdGVyRWxlbWVudDp0cnVlLFNWR0ZvcmVpZ25PYmplY3RFbGVtZW50OnRydWUsU1ZHR0VsZW1l
+bnQ6dHJ1ZSxTVkdHZW9tZXRyeUVsZW1lbnQ6dHJ1ZSxTVkdHcmFwaGljc0VsZW1lbnQ6dHJ1ZSxTVkdJ
+bWFnZUVsZW1lbnQ6dHJ1ZSxTVkdMaW5lRWxlbWVudDp0cnVlLFNWR0xpbmVhckdyYWRpZW50RWxlbWVu
+dDp0cnVlLFNWR01hcmtlckVsZW1lbnQ6dHJ1ZSxTVkdNYXNrRWxlbWVudDp0cnVlLFNWR01ldGFkYXRh
+RWxlbWVudDp0cnVlLFNWR1BhdGhFbGVtZW50OnRydWUsU1ZHUGF0dGVybkVsZW1lbnQ6dHJ1ZSxTVkdQ
+b2x5Z29uRWxlbWVudDp0cnVlLFNWR1BvbHlsaW5lRWxlbWVudDp0cnVlLFNWR1JhZGlhbEdyYWRpZW50
+RWxlbWVudDp0cnVlLFNWR1JlY3RFbGVtZW50OnRydWUsU1ZHU2V0RWxlbWVudDp0cnVlLFNWR1N0b3BF
+bGVtZW50OnRydWUsU1ZHU3R5bGVFbGVtZW50OnRydWUsU1ZHU1ZHRWxlbWVudDp0cnVlLFNWR1N3aXRj
+aEVsZW1lbnQ6dHJ1ZSxTVkdTeW1ib2xFbGVtZW50OnRydWUsU1ZHVFNwYW5FbGVtZW50OnRydWUsU1ZH
+VGV4dENvbnRlbnRFbGVtZW50OnRydWUsU1ZHVGV4dEVsZW1lbnQ6dHJ1ZSxTVkdUZXh0UGF0aEVsZW1l
+bnQ6dHJ1ZSxTVkdUZXh0UG9zaXRpb25pbmdFbGVtZW50OnRydWUsU1ZHVGl0bGVFbGVtZW50OnRydWUs
+U1ZHVXNlRWxlbWVudDp0cnVlLFNWR1ZpZXdFbGVtZW50OnRydWUsU1ZHR3JhZGllbnRFbGVtZW50OnRy
+dWUsU1ZHQ29tcG9uZW50VHJhbnNmZXJGdW5jdGlvbkVsZW1lbnQ6dHJ1ZSxTVkdGRURyb3BTaGFkb3dF
+bGVtZW50OnRydWUsU1ZHTVBhdGhFbGVtZW50OnRydWUsU1ZHRWxlbWVudDpmYWxzZX0pCkguYjAuJG5h
+dGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5SRy4kbmF0aXZlU3VwZXJjbGFzc1Rh
+Zz0iQXJyYXlCdWZmZXJWaWV3IgpILlZQLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJBcnJheUJ1ZmZlclZp
+ZXciCkguRGcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyIKSC5XQi4kbmF0aXZl
+U3VwZXJjbGFzc1RhZz0iQXJyYXlCdWZmZXJWaWV3IgpILlpHLiRuYXRpdmVTdXBlcmNsYXNzVGFnPSJB
+cnJheUJ1ZmZlclZpZXciCkguUGcuJG5hdGl2ZVN1cGVyY2xhc3NUYWc9IkFycmF5QnVmZmVyVmlldyJ9
+KSgpCmNvbnZlcnRBbGxUb0Zhc3RPYmplY3QodykKY29udmVydFRvRmFzdE9iamVjdCgkKTsoZnVuY3Rp
+b24oYSl7aWYodHlwZW9mIGRvY3VtZW50PT09InVuZGVmaW5lZCIpe2EobnVsbCkKcmV0dXJufWlmKHR5
+cGVvZiBkb2N1bWVudC5jdXJyZW50U2NyaXB0IT0ndW5kZWZpbmVkJyl7YShkb2N1bWVudC5jdXJyZW50
+U2NyaXB0KQpyZXR1cm59dmFyIHQ9ZG9jdW1lbnQuc2NyaXB0cwpmdW5jdGlvbiBvbkxvYWQoYil7Zm9y
+KHZhciByPTA7cjx0Lmxlbmd0aDsrK3IpdFtyXS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixvbkxv
+YWQsZmFsc2UpCmEoYi50YXJnZXQpfWZvcih2YXIgcz0wO3M8dC5sZW5ndGg7KytzKXRbc10uYWRkRXZl
+bnRMaXN0ZW5lcigibG9hZCIsb25Mb2FkLGZhbHNlKX0pKGZ1bmN0aW9uKGEpe3YuY3VycmVudFNjcmlw
+dD1hCmlmKHR5cGVvZiBkYXJ0TWFpblJ1bm5lcj09PSJmdW5jdGlvbiIpZGFydE1haW5SdW5uZXIoTC5J
+cSxbXSkKZWxzZSBMLklxKFtdKX0pfSkoKQovLyMgc291cmNlTWFwcGluZ1VSTD1taWdyYXRpb24uanMu
+bWFwCg==
 ''';
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/unit_renderer.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/unit_renderer.dart
index 29267f3d..5817faa 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/unit_renderer.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/unit_renderer.dart
@@ -174,11 +174,10 @@
           return 'added-region';
         case RegionType.remove:
           return 'removed-region';
-        case RegionType.unchanged:
-          return 'unchanged-region';
-        default:
-          return null;
+        case RegionType.informative:
+          return 'informative-region';
       }
+      throw StateError('Unexpected RegionType $type');
     }
 
     int previousOffset = 0;
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/web/migration.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/web/migration.dart
index e72631a..53b9557 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/web/migration.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/web/migration.dart
@@ -25,7 +25,7 @@
     loadNavigationTree();
     if (path != '/' && path != rootPath) {
       // TODO(srawlins): replaceState?
-      loadFile(path, offset, lineNumber, callback: () {
+      loadFile(path, offset, lineNumber, true, callback: () {
         pushState(path, offset, lineNumber);
       });
     }
@@ -49,10 +49,10 @@
     int offset = getOffset(window.location.href);
     int lineNumber = getLine(window.location.href);
     if (path.length > 1) {
-      loadFile(path, offset, lineNumber);
+      loadFile(path, offset, lineNumber, false);
     } else {
       // Blank out the page, for the index screen.
-      writeCodeAndRegions(path, FileDetails.empty());
+      writeCodeAndRegions(path, FileDetails.empty(), true);
       updatePage('&nbsp;', null);
     }
   });
@@ -79,7 +79,7 @@
   });
 }
 
-void addClickHandlers(String selector) {
+void addClickHandlers(String selector, bool clearEditDetails) {
   Element parentElement = document.querySelector(selector);
 
   // Add navigation handlers for navigation links in the source code.
@@ -88,7 +88,7 @@
     link.onClick.listen((event) {
       Element tableElement = document.querySelector('table[data-path]');
       String parentPath = tableElement.dataset['path'];
-      handleNavLinkClick(event, relativeTo: parentPath);
+      handleNavLinkClick(event, clearEditDetails, relativeTo: parentPath);
     });
   });
 
@@ -134,7 +134,8 @@
 }
 
 void handleNavLinkClick(
-  MouseEvent event, {
+  MouseEvent event,
+  bool clearEditDetails, {
   String relativeTo,
 }) {
   Element target = event.currentTarget;
@@ -153,11 +154,11 @@
   int lineNumber = getLine(location);
 
   if (offset != null) {
-    navigate(path, offset, lineNumber, callback: () {
+    navigate(path, offset, lineNumber, clearEditDetails, callback: () {
       pushState(path, offset, lineNumber);
     });
   } else {
-    navigate(path, null, null, callback: () {
+    navigate(path, null, null, clearEditDetails, callback: () {
       pushState(path, null, null);
     });
   }
@@ -202,7 +203,7 @@
     if (xhr.status == 200) {
       var response = EditDetails.fromJson(jsonDecode(xhr.responseText));
       populateEditDetails(response);
-      addClickHandlers('.edit-panel .panel-content');
+      addClickHandlers('.edit-panel .panel-content', false);
     } else {
       window.alert('Request failed; status of ${xhr.status}');
     }
@@ -218,12 +219,13 @@
 void loadFile(
   String path,
   int offset,
-  int line, {
+  int line,
+  bool clearEditDetails, {
   VoidCallback callback,
 }) {
   // Handle the case where we're requesting a directory.
   if (!path.endsWith('.dart')) {
-    writeCodeAndRegions(path, FileDetails.empty());
+    writeCodeAndRegions(path, FileDetails.empty(), clearEditDetails);
     updatePage(path);
     if (callback != null) {
       callback();
@@ -239,7 +241,8 @@
   ).then((HttpRequest xhr) {
     if (xhr.status == 200) {
       Map<String, dynamic> response = jsonDecode(xhr.responseText);
-      writeCodeAndRegions(path, FileDetails.fromJson(response));
+      writeCodeAndRegions(
+          path, FileDetails.fromJson(response), clearEditDetails);
       maybeScrollToAndHighlight(offset, line);
       String filePathPart =
           path.contains('?') ? path.substring(0, path.indexOf('?')) : path;
@@ -287,11 +290,22 @@
   window.console.error('$st');
 }
 
+final Element headerPanel = document.querySelector('header');
+final Element footerPanel = document.querySelector('footer');
+
+/// Scroll an element into view if it is not visible.
 void maybeScrollIntoView(Element element) {
   Rectangle rect = element.getBoundingClientRect();
-  if (rect.bottom > window.innerHeight) {
+  // A line of text in the code view is 14px high. Including it here means we
+  // only choose to _not_ scroll a line of code into view if the entire line is
+  // visible.
+  var lineHeight = 14;
+  var visibleCeiling = headerPanel.offsetHeight + lineHeight;
+  var visibleFloor =
+      window.innerHeight - (footerPanel.offsetHeight + lineHeight);
+  if (rect.bottom > visibleFloor) {
     element.scrollIntoView();
-  } else if (rect.top < 0) {
+  } else if (rect.top < visibleCeiling) {
     element.scrollIntoView();
   }
 }
@@ -324,8 +338,7 @@
   } else {
     // If no offset is given, this is likely a navigation link, and we need to
     // scroll back to the top of the page.
-    target = document.getElementById('unit-name');
-    maybeScrollIntoView(target);
+    maybeScrollIntoView(unitName);
   }
 }
 
@@ -336,7 +349,8 @@
 void navigate(
   String path,
   int offset,
-  int lineNumber, {
+  int lineNumber,
+  bool clearEditDetails, {
   VoidCallback callback,
 }) {
   int currentOffset = getOffset(window.location.href);
@@ -349,7 +363,7 @@
       callback();
     }
   } else {
-    loadFile(path, offset, lineNumber, callback: callback);
+    loadFile(path, offset, lineNumber, clearEditDetails, callback: callback);
   }
 }
 
@@ -357,8 +371,9 @@
   return count == 1 ? single : (multiple ?? '${single}s');
 }
 
+final Element editPanel = document.querySelector('.edit-panel .panel-content');
+
 void populateEditDetails([EditDetails response]) {
-  var editPanel = document.querySelector('.edit-panel .panel-content');
   editPanel.innerHtml = '';
 
   if (response == null) {
@@ -378,65 +393,17 @@
   int line = response.line;
   Element explanation = editPanel.append(document.createElement('p'));
   explanation.append(Text('$explanationMessage at $relPath:$line.'));
-  int detailCount = response.details.length;
-  if (detailCount == 0) {
-    // Having 0 details is not necessarily an expected possibility, but handling
-    // the possibility prevents awkward text, "for 0 reasons:".
-  } else {
-    editPanel.append(ParagraphElement()..text = 'Edit rationale:');
-
-    Element detailList = editPanel.append(document.createElement('ul'));
-    for (var detail in response.details) {
-      var detailItem = detailList.append(document.createElement('li'));
-      detailItem.append(Text(detail.description));
-      var link = detail.link;
-      if (link != null) {
-        detailItem.append(Text(' ('));
-        detailItem.append(_aElementForLink(link, parentDirectory));
-        detailItem.append(Text(')'));
-      }
-    }
-  }
-
-  if (response.edits != null) {
-    for (var edit in response.edits) {
-      Element editParagraph = editPanel.append(document.createElement('p'));
-      Element a = editParagraph.append(document.createElement('a'));
-      a.append(Text(edit.description));
-      a.setAttribute('href', edit.href);
-      a.classes = ['post-link', 'before-apply'];
-    }
-  }
-
-  for (var trace in response.traces) {
-    var traceParagraph =
-        editPanel.append(document.createElement('p')..classes = ['trace']);
-    traceParagraph.append(Text('Nullability trace for: '));
-    traceParagraph.append(document.createElement('span')
-      ..classes = ['type-description']
-      ..append(Text(trace.description)));
-    var ul = traceParagraph
-        .append(document.createElement('ul')..classes = ['trace']);
-    for (var entry in trace.entries) {
-      var li = ul.append(document.createElement('li')..innerHtml = '&#x274F; ');
-      li.append(document.createElement('span')
-        ..classes = ['function']
-        ..append(Text(entry.function ?? 'unknown')));
-      var link = entry.link;
-      if (link != null) {
-        li.append(Text(' ('));
-        li.append(_aElementForLink(link, parentDirectory));
-        li.append(Text(')'));
-      }
-      li.append(Text(': '));
-      li.append(Text(entry.description));
-    }
-  }
+  _populateEditTraces(response, editPanel, parentDirectory);
+  _populateEditLinks(response, editPanel);
+  _populateEditRationale(response, editPanel, parentDirectory);
 }
 
+final Element editListElement =
+    document.querySelector('.edit-list .panel-content');
+
 /// Write the contents of the Edit List, from JSON data [editListData].
-void populateProposedEdits(String path, List<EditListItem> edits) {
-  Element editListElement = document.querySelector('.edit-list .panel-content');
+void populateProposedEdits(
+    String path, List<EditListItem> edits, bool clearEditDetails) {
   editListElement.innerHtml = '';
 
   Element p = editListElement.append(document.createElement('p'));
@@ -459,7 +426,7 @@
     anchor.dataset['line'] = '$line';
     anchor.append(Text('line $line'));
     anchor.onClick.listen((MouseEvent event) {
-      navigate(window.location.pathname, offset, line, callback: () {
+      navigate(window.location.pathname, offset, line, true, callback: () {
         pushState(window.location.pathname, offset, line);
       });
       loadAndPopulateEditDetails(path, offset);
@@ -467,8 +434,9 @@
     item.append(Text(': ${edit.explanation}'));
   }
 
-  // Clear out any existing edit details.
-  populateEditDetails();
+  if (clearEditDetails) {
+    populateEditDetails();
+  }
 }
 
 void pushState(String path, int offset, int line) {
@@ -509,13 +477,14 @@
   }
 }
 
+final Element unitName = document.querySelector('#unit-name');
+
 /// Update the heading and navigation links.
 ///
 /// Call this after updating page content on a navigation.
 void updatePage(String path, [int offset]) {
   path = relativePath(path);
   // Update page heading.
-  Element unitName = document.querySelector('#unit-name');
   unitName.text = path;
   // Update navigation styles.
   document.querySelectorAll('.nav-panel .nav-link').forEach((Element link) {
@@ -529,17 +498,17 @@
 }
 
 /// Load data from [data] into the .code and the .regions divs.
-void writeCodeAndRegions(String path, FileDetails data) {
+void writeCodeAndRegions(String path, FileDetails data, bool clearEditDetails) {
   Element regionsElement = document.querySelector('.regions');
   Element codeElement = document.querySelector('.code');
 
   _PermissiveNodeValidator.setInnerHtml(regionsElement, data.regions);
   _PermissiveNodeValidator.setInnerHtml(codeElement, data.navigationContent);
-  populateProposedEdits(path, data.edits);
+  populateProposedEdits(path, data.edits, clearEditDetails);
 
   highlightAllCode();
-  addClickHandlers('.code');
-  addClickHandlers('.regions');
+  addClickHandlers('.code', true);
+  addClickHandlers('.regions', true);
 }
 
 void writeNavigationSubtree(
@@ -564,7 +533,7 @@
       a.dataset['name'] = entity.path;
       a.setAttribute('href', entity.href);
       a.append(Text(entity.name));
-      a.onClick.listen(handleNavLinkClick);
+      a.onClick.listen((MouseEvent event) => handleNavLinkClick(event, true));
       int editCount = entity.editCount;
       if (editCount > 0) {
         Element editsBadge = li.append(document.createElement('span'));
@@ -590,6 +559,70 @@
   return a;
 }
 
+void _populateEditLinks(EditDetails response, Element editPanel) {
+  if (response.edits != null) {
+    for (var edit in response.edits) {
+      Element editParagraph = editPanel.append(document.createElement('p'));
+      Element a = editParagraph.append(document.createElement('a'));
+      a.append(Text(edit.description));
+      a.setAttribute('href', edit.href);
+      a.classes = ['post-link', 'before-apply'];
+    }
+  }
+}
+
+void _populateEditRationale(
+    EditDetails response, Element editPanel, String parentDirectory) {
+  int detailCount = response.details.length;
+  if (detailCount == 0) {
+    // Having 0 details is not necessarily an expected possibility, but handling
+    // the possibility prevents awkward text, "for 0 reasons:".
+  } else {
+    editPanel
+        .append(ParagraphElement()..text = 'Edit rationale (experimental):');
+
+    Element detailList = editPanel.append(document.createElement('ul'));
+    for (var detail in response.details) {
+      var detailItem = detailList.append(document.createElement('li'));
+      detailItem.append(Text(detail.description));
+      var link = detail.link;
+      if (link != null) {
+        detailItem.append(Text(' ('));
+        detailItem.append(_aElementForLink(link, parentDirectory));
+        detailItem.append(Text(')'));
+      }
+    }
+  }
+}
+
+void _populateEditTraces(
+    EditDetails response, Element editPanel, String parentDirectory) {
+  for (var trace in response.traces) {
+    var traceParagraph =
+        editPanel.append(document.createElement('p')..classes = ['trace']);
+    traceParagraph.append(document.createElement('span')
+      ..classes = ['type-description']
+      ..append(Text(trace.description)));
+    traceParagraph.append(Text(':'));
+    var ul = traceParagraph
+        .append(document.createElement('ul')..classes = ['trace']);
+    for (var entry in trace.entries) {
+      var li = ul.append(document.createElement('li')..innerHtml = '&#x274F; ');
+      li.append(document.createElement('span')
+        ..classes = ['function']
+        ..append(Text(entry.function ?? 'unknown')));
+      var link = entry.link;
+      if (link != null) {
+        li.append(Text(' ('));
+        li.append(_aElementForLink(link, parentDirectory));
+        li.append(Text(')'));
+      }
+      li.append(Text(': '));
+      li.append(Text(entry.description));
+    }
+  }
+}
+
 class _PermissiveNodeValidator implements NodeValidator {
   static _PermissiveNodeValidator instance = _PermissiveNodeValidator();
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
index 98ce643..edb8e87 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
@@ -4,6 +4,8 @@
 
 import 'dart:async';
 
+import 'package:analysis_server/src/protocol_server.dart'
+    show CompletionSuggestion;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -16,10 +18,8 @@
     show GenericInferrer, LibraryScope;
 import 'package:analyzer/src/generated/type_system.dart' show GenericInferrer;
 
-import '../../../protocol_server.dart' show CompletionSuggestion;
-
-/// A contributor for calculating suggestions based on the members of
-/// extensions.
+/// A contributor that produces suggestions based on the members of an
+/// extension.
 class ExtensionMemberContributor extends DartCompletionContributor {
   MemberSuggestionBuilder builder;
 
@@ -27,15 +27,15 @@
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request) async {
     LibraryElement containingLibrary = request.libraryElement;
-    // Gracefully degrade if the library element is not resolved
-    // e.g. detached part file or source change
+    // Gracefully degrade if the library could not be determined, such as with a
+    // detached part file or source change.
     if (containingLibrary == null) {
       return const <CompletionSuggestion>[];
     }
 
-    builder = MemberSuggestionBuilder(containingLibrary);
+    builder = MemberSuggestionBuilder(request);
 
-    // Recompute the target since resolution may have changed it.
+    // Recompute the target because resolution might have changed it.
     Expression expression = request.dotTarget;
 
     if (expression == null) {
@@ -48,12 +48,18 @@
         var extension = request.target.containingNode
             .thisOrAncestorOfType<ExtensionDeclaration>();
         if (extension != null) {
-          var type = extension.extendedType.type;
-          if (type is InterfaceType) {
+          var extendedType = extension.extendedType.type;
+          if (extendedType is InterfaceType) {
             var types = <InterfaceType>[];
-            ClassElementImpl.collectAllSupertypes(types, type, null);
+            ClassElementImpl.collectAllSupertypes(types, extendedType, null);
             for (var type in types) {
-              _addTypeMembers(type);
+              double inheritanceDistance;
+              if (request.useNewRelevance) {
+                inheritanceDistance = builder.request.featureComputer
+                    .inheritanceDistanceFeature(
+                        extendedType.element, type.element);
+              }
+              _addTypeMembers(type, inheritanceDistance);
             }
           }
         }
@@ -68,28 +74,27 @@
     if (expression is Identifier) {
       Element elem = expression.staticElement;
       if (elem is ClassElement) {
-        // Suggestions provided by StaticMemberContributor
+        // Suggestions provided by StaticMemberContributor.
         return const <CompletionSuggestion>[];
       } else if (elem is ExtensionElement) {
-        // Suggestions provided by StaticMemberContributor
+        // Suggestions provided by StaticMemberContributor.
         return const <CompletionSuggestion>[];
       } else if (elem is PrefixElement) {
-        // Suggestions provided by LibraryMemberContributor
+        // Suggestions provided by LibraryMemberContributor.
         return const <CompletionSuggestion>[];
       }
     }
     if (expression is ExtensionOverride) {
-      _addInstanceMembers(expression.staticElement);
+      _addInstanceMembers(expression.staticElement, -1.0);
     } else {
       var type = expression.staticType;
       if (type == null) {
-        // Without a type we cannot find the extensions that apply.
-        // We shouldn't get to this point, but there's an NPE if we invoke
+        // Without a type we can't find the extensions that apply. We shouldn't
+        // get to this point, but there's an NPE if we invoke
         // `_resolveExtendedType` when `type` is `null`, so we guard against it
         // to ensure that we can return the suggestions from other providers.
         return const <CompletionSuggestion>[];
       }
-
       _addExtensionMembers(containingLibrary, type);
       expression.staticType;
     }
@@ -103,42 +108,42 @@
       var extendedType =
           _resolveExtendedType(containingLibrary, extension, type);
       if (extendedType != null && typeSystem.isSubtypeOf(type, extendedType)) {
+        double inheritanceDistance;
+        if (builder.request.useNewRelevance) {
+          inheritanceDistance = builder.request.featureComputer
+              .inheritanceDistanceFeature(type.element, extendedType.element);
+        }
         // TODO(brianwilkerson) We might want to apply the substitution to the
         //  members of the extension for display purposes.
-        _addInstanceMembers(extension);
+        _addInstanceMembers(extension, inheritanceDistance);
       }
     }
   }
 
-  void _addInstanceMembers(ExtensionElement extension) {
-    for (MethodElement method in extension.methods) {
+  void _addInstanceMembers(
+      ExtensionElement extension, double inheritanceDistance) {
+    for (var method in extension.methods) {
       if (!method.isStatic) {
-        builder.addSuggestion(method);
+        builder.addSuggestionForMethod(
+            method: method, inheritanceDistance: inheritanceDistance);
       }
     }
-    for (PropertyAccessorElement accessor in extension.accessors) {
+    for (var accessor in extension.accessors) {
       if (!accessor.isStatic) {
-        builder.addSuggestion(accessor);
+        builder.addSuggestionForAccessor(
+            accessor: accessor, inheritanceDistance: inheritanceDistance);
       }
     }
   }
 
-  void _addTypeMembers(InterfaceType type) {
-    for (var elem in type.methods) {
-      builder.addSuggestion(elem);
+  void _addTypeMembers(InterfaceType type, double inheritanceDistance) {
+    for (var method in type.methods) {
+      builder.addSuggestionForMethod(
+          method: method, inheritanceDistance: inheritanceDistance);
     }
-    var variables = <Element>{};
-    for (var elem in type.accessors) {
-      if (elem.isSynthetic) {
-        var variable = elem.variable;
-        // Ensure we don't have duplicate suggestions for accessors of non-final
-        // fields (which have a getter and setter).
-        if (variables.add(variable)) {
-          builder.addSuggestion(elem.variable);
-        }
-      } else {
-        builder.addSuggestion(elem);
-      }
+    for (var accessor in type.accessors) {
+      builder.addSuggestionForAccessor(
+          accessor: accessor, inheritanceDistance: inheritanceDistance);
     }
   }
 
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 93f984f..d4f91c3 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
@@ -7,7 +7,7 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart'
-    show ClassElement, FieldElement;
+    show ClassElement, Element, FieldElement;
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/dart/element/type_system.dart';
@@ -89,6 +89,11 @@
     }
   }
 
+  /// Return the value of the _has deprecated_ feature for the given [element].
+  double hasDeprecatedFeature(Element element) {
+    return element.hasDeprecated ? 0.0 : 1.0;
+  }
+
   /// Return the inheritance distance between the [subclass] and the
   /// [superclass]. We define the inheritance distance between two types to be
   /// zero if the two types are the same and the minimum number of edges that
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart
index 0267de3..c632403 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart
@@ -4,6 +4,8 @@
 
 import 'dart:async';
 
+import 'package:analysis_server/src/protocol_server.dart'
+    show CompletionSuggestion, CompletionSuggestionKind;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analysis_server/src/services/completion/dart/utilities.dart';
@@ -12,107 +14,117 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
-import 'package:analyzer_plugin/src/utilities/completion/optype.dart';
 
-import '../../../protocol_server.dart'
-    show CompletionSuggestion, CompletionSuggestionKind;
+/// A contributor that produces suggestions based on the instance members from
+/// the supertypes of a given type. More concretely, this class produces
+/// suggestions for places where an inherited instance member might be invoked
+/// via an implicit target of `this`.
+class InheritedReferenceContributor extends DartCompletionContributor {
+  /// The builder used to build the suggestions.
+  MemberSuggestionBuilder builder;
 
-/// Return the class containing the target
-/// or `null` if the target is in a static method or field
-/// or not in a class.
-ClassOrMixinDeclaration _enclosingClass(CompletionTarget target) {
-  AstNode node = target.containingNode;
-  while (node != null) {
-    if (node is ClassOrMixinDeclaration) {
-      return node;
-    } else if (node is MethodDeclaration) {
-      if (node.isStatic) {
-        return null;
-      }
-    } else if (node is FieldDeclaration) {
-      if (node.isStatic) {
-        return null;
-      }
-    }
-    node = node.parent;
-  }
-  return null;
-}
-
-/// A contributor for calculating suggestions for inherited references.
-class InheritedReferenceContributor extends DartCompletionContributor
-    with ElementSuggestionBuilder {
-  @override
-  LibraryElement containingLibrary;
-
-  @override
+  /// The kind of suggestion to make.
   CompletionSuggestionKind kind;
 
   @override
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     if (!request.includeIdentifiers) {
       return const <CompletionSuggestion>[];
     }
 
-    ClassOrMixinDeclaration classDecl = _enclosingClass(request.target);
-    if (classDecl == null || classDecl.declaredElement == null) {
+    var member = _enclosingMember(request.target);
+    if (member == null) {
       return const <CompletionSuggestion>[];
     }
-    containingLibrary = request.libraryElement;
-    if (classDecl is ClassDeclaration) {
-      return _computeSuggestionsForClass2(classDecl.declaredElement, request);
-    } else if (classDecl is MixinDeclaration) {
-      return _computeSuggestionsForClass2(classDecl.declaredElement, request);
+    var classOrMixin = member.parent;
+    if (classOrMixin is ClassOrMixinDeclaration &&
+        classOrMixin.declaredElement != null) {
+      builder = MemberSuggestionBuilder(request);
+      return _computeSuggestionsForClass(classOrMixin.declaredElement, request);
     }
     return const <CompletionSuggestion>[];
   }
 
   void _addSuggestionsForType(InterfaceType type, DartCompletionRequest request,
+      double inheritanceDistance,
       {bool isFunctionalArgument = false}) {
-    OpType opType = request.opType;
+    var opType = request.opType;
     if (!isFunctionalArgument) {
-      for (PropertyAccessorElement elem in type.accessors) {
-        if (elem.isGetter) {
+      for (var accessor in type.accessors) {
+        if (accessor.isGetter) {
           if (opType.includeReturnValueSuggestions) {
-            addSuggestion(elem);
+            builder.addSuggestionForAccessor(
+                accessor: accessor, inheritanceDistance: inheritanceDistance);
           }
         } else {
           if (opType.includeVoidReturnSuggestions) {
-            addSuggestion(elem);
+            builder.addSuggestionForAccessor(
+                accessor: accessor, inheritanceDistance: inheritanceDistance);
           }
         }
       }
     }
-    for (MethodElement elem in type.methods) {
-      if (elem.returnType == null) {
-        addSuggestion(elem);
-      } else if (!elem.returnType.isVoid) {
+    for (var method in type.methods) {
+      if (method.returnType == null) {
+        builder.addSuggestionForMethod(
+            method: method,
+            inheritanceDistance: inheritanceDistance,
+            kind: kind);
+      } else if (!method.returnType.isVoid) {
         if (opType.includeReturnValueSuggestions) {
-          addSuggestion(elem);
+          builder.addSuggestionForMethod(
+              method: method,
+              inheritanceDistance: inheritanceDistance,
+              kind: kind);
         }
       } else {
         if (opType.includeVoidReturnSuggestions) {
-          CompletionSuggestion suggestion = addSuggestion(elem);
-          _updateFlutterSuggestions(request, elem, suggestion);
+          var suggestion = builder.addSuggestionForMethod(
+              method: method,
+              inheritanceDistance: inheritanceDistance,
+              kind: kind);
+          _updateFlutterSuggestions(request, method, suggestion);
         }
       }
     }
   }
 
-  List<CompletionSuggestion> _computeSuggestionsForClass2(
+  List<CompletionSuggestion> _computeSuggestionsForClass(
       ClassElement classElement, DartCompletionRequest request) {
-    bool isFunctionalArgument = request.target.isFunctionalArgument();
+    var isFunctionalArgument = request.target.isFunctionalArgument();
     kind = isFunctionalArgument
         ? CompletionSuggestionKind.IDENTIFIER
         : CompletionSuggestionKind.INVOCATION;
-    for (InterfaceType type in classElement.allSupertypes) {
-      _addSuggestionsForType(type, request,
+    for (var type in classElement.allSupertypes) {
+      double inheritanceDistance;
+      if (request.useNewRelevance) {
+        inheritanceDistance = request.featureComputer
+            .inheritanceDistanceFeature(classElement, type.element);
+      }
+      _addSuggestionsForType(type, request, inheritanceDistance,
           isFunctionalArgument: isFunctionalArgument);
     }
-    return suggestions;
+    return builder.suggestions.toList();
+  }
+
+  /// Return the class member containing the target or `null` if the target is
+  /// in a static method or static field or not in a class member.
+  ClassMember _enclosingMember(CompletionTarget target) {
+    AstNode node = target.containingNode;
+    while (node != null) {
+      if (node is MethodDeclaration) {
+        if (!node.isStatic) {
+          return node;
+        }
+      } else if (node is FieldDeclaration) {
+        if (!node.isStatic) {
+          return node;
+        }
+      }
+      node = node.parent;
+    }
+    return null;
   }
 
   void _updateFlutterSuggestions(DartCompletionRequest request, Element element,
@@ -124,7 +136,7 @@
         element.name == 'setState' &&
         Flutter.of(request.result).isExactState(element.enclosingElement)) {
       // Find the line indentation.
-      String indent = getRequestLineIndent(request);
+      var indent = getRequestLineIndent(request);
 
       // Let the user know that we are going to insert a complete statement.
       suggestion.displayText = 'setState(() {});';
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
index d08d787..baff745 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
@@ -71,10 +71,10 @@
     if (entity == node.rightParenthesis) {
       _addExpressionKeywords(node);
       Token previous = node.findPrevious(entity as Token);
-      if (previous.isSynthetic) {
+      if (previous != null && previous.isSynthetic) {
         previous = node.findPrevious(previous);
       }
-      if (previous.lexeme == ')') {
+      if (previous != null && previous.lexeme == ')') {
         _addSuggestion(Keyword.ASYNC);
         _addSuggestion2(ASYNC_STAR);
         _addSuggestion2(SYNC_STAR);
@@ -128,14 +128,15 @@
       if (expression is SimpleIdentifier) {
         Token token = expression.token;
         Token previous = node.findPrevious(token);
-        if (previous.isSynthetic) {
+        if (previous != null && previous.isSynthetic) {
           previous = node.findPrevious(previous);
         }
         Token next = token.next;
         if (next.isSynthetic) {
           next = next.next;
         }
-        if (previous.type == TokenType.CLOSE_PAREN &&
+        if (previous != null &&
+            previous.type == TokenType.CLOSE_PAREN &&
             next.type == TokenType.OPEN_CURLY_BRACKET) {
           _addSuggestion(Keyword.ASYNC);
           _addSuggestion2(ASYNC_STAR);
@@ -511,6 +512,11 @@
         }
       }
     }
+    if (entity == node.returnType || entity == node.name) {
+      // If the cursor is at the beginning of the declaration, include the class
+      // body keywords.  See dartbug.com/41039.
+      _addClassBodyKeywords();
+    }
   }
 
   @override
@@ -938,7 +944,9 @@
     if (entity is AstNode) {
       Token token = entity.beginToken;
       Token previousToken = entity.findPrevious(token);
-      return previousToken.isSynthetic && previousToken.type == type;
+      return previousToken != null &&
+          previousToken.isSynthetic &&
+          previousToken.type == type;
     }
     return false;
   }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
index 0386f36..5c11d07 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
@@ -26,8 +26,6 @@
   @override
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     SimpleIdentifier targetId = _getTargetId(request.target);
     if (targetId == null) {
       return const <CompletionSuggestion>[];
@@ -109,7 +107,7 @@
         displayTextBuffer.isNotEmpty ? displayTextBuffer.toString() : null;
     CompletionSuggestion suggestion = CompletionSuggestion(
         CompletionSuggestionKind.OVERRIDE,
-        DART_RELEVANCE_HIGH,
+        request.useNewRelevance ? Relevance.override : DART_RELEVANCE_HIGH,
         completion,
         selectionRange.offset - offsetDelta,
         selectionRange.length,
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
index f88d1ae7..988a547 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
@@ -13,6 +13,7 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/visitor.dart';
+import 'package:meta/meta.dart';
 
 /// A contributor that produces suggestions based on the static members of a
 /// given class, enum, or extension. More concretely, this class produces
@@ -107,18 +108,39 @@
       return;
     }
     var relevance = DART_RELEVANCE_DEFAULT;
-    if (request.useNewRelevance) {
+    var useNewRelevance = request.useNewRelevance;
+    if (useNewRelevance) {
       var contextType = request.featureComputer
           .contextTypeFeature(request.contextType, elementType);
-      relevance = toRelevance(contextType, 500);
+      var hasDeprecated = request.featureComputer.hasDeprecatedFeature(element);
+      relevance = _computeRelevance(
+          contextType: contextType, hasDeprecated: hasDeprecated);
     }
-    CompletionSuggestion suggestion =
-        createSuggestion(element, completion: completion, relevance: relevance);
+    CompletionSuggestion suggestion = createSuggestion(element,
+        completion: completion,
+        relevance: relevance,
+        useNewRelevance: useNewRelevance);
     if (suggestion != null) {
       suggestions.add(suggestion);
     }
   }
 
+  /// Compute a relevance value from the given feature scores:
+  /// - [contextType] is higher if the type of the element matches the context
+  ///   type,
+  /// - [hasDeprecated] is higher if the element is not deprecated,
+  /// - [inheritanceDistance] is higher if the element is defined closer to the
+  ///   target type,
+  /// - [startsWithDollar] is higher if the element's name doe _not_ start with
+  ///   a dollar sign, and
+  /// - [superMatches] is higher if the element is being invoked through `super`
+  ///   and the element's name matches the name of the enclosing method.
+  int _computeRelevance(
+      {@required double contextType, @required double hasDeprecated}) {
+    var score = weightedAverage([contextType, hasDeprecated], [1.0, 0.5]);
+    return toRelevance(score, Relevance.member);
+  }
+
   /// Determine whether the [element] is one of the synthetic enum accessors
   /// for which we should generate a suggestion.
   bool _isSpecialEnumField(FieldElement element) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
index d551db7..cda9b55 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
@@ -7,21 +7,24 @@
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
 import 'package:analysis_server/src/protocol_server.dart'
     hide Element, ElementKind;
+import 'package:analysis_server/src/protocol_server.dart'
+    show CompletionSuggestion;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/feature_computer.dart';
 import 'package:analysis_server/src/services/completion/dart/utilities.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/visitor.dart';
 import 'package:analyzer/src/util/comment.dart';
-
-import '../../../protocol_server.dart' show CompletionSuggestion;
+import 'package:meta/meta.dart';
 
 /// Return a suggestion based upon the given element or `null` if a suggestion
 /// is not appropriate for the given element.
 CompletionSuggestion createSuggestion(Element element,
     {String completion,
-    CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
-    int relevance = DART_RELEVANCE_DEFAULT}) {
+    CompletionSuggestionKind kind,
+    int relevance = DART_RELEVANCE_DEFAULT,
+    bool useNewRelevance = false}) {
   if (element == null) {
     return null;
   }
@@ -30,15 +33,13 @@
     return null;
   }
   completion ??= element.displayName;
+  kind ??= CompletionSuggestionKind.INVOCATION;
   bool isDeprecated = element.hasDeprecated;
+  if (!useNewRelevance && isDeprecated) {
+    relevance = DART_RELEVANCE_LOW;
+  }
   CompletionSuggestion suggestion = CompletionSuggestion(
-      kind,
-      isDeprecated ? DART_RELEVANCE_LOW : relevance,
-      completion,
-      completion.length,
-      0,
-      isDeprecated,
-      false);
+      kind, relevance, completion, completion.length, 0, isDeprecated, false);
 
   // Attach docs.
   String doc = getDartDocPlainText(element.documentationComment);
@@ -100,6 +101,7 @@
   CompletionSuggestion addSuggestion(Element element,
       {String prefix,
       int relevance = DART_RELEVANCE_DEFAULT,
+      bool useNewRelevance = false,
       String elementCompletion}) {
     if (element.isPrivate) {
       if (element.library != containingLibrary) {
@@ -118,7 +120,10 @@
       return null;
     }
     CompletionSuggestion suggestion = createSuggestion(element,
-        completion: completion, kind: kind, relevance: relevance);
+        completion: completion,
+        kind: kind,
+        relevance: relevance,
+        useNewRelevance: useNewRelevance);
     if (suggestion != null) {
       if (element.isSynthetic && element is PropertyAccessorElement) {
         String cacheKey;
@@ -253,8 +258,8 @@
   /// field, a method, or a getter/setter pair.
   static const int _COMPLETION_TYPE_FIELD_OR_METHOD_OR_GETSET = 3;
 
-  /// The library containing the unit in which the completion is requested.
-  final LibraryElement containingLibrary;
+  /// The request for which suggestions are being built.
+  final DartCompletionRequest request;
 
   /// Map indicating, for each possible completion identifier, whether we have
   /// already generated completions for a getter, setter, or both.  The "both"
@@ -265,11 +270,11 @@
   /// compared.
   final Map<String, int> _completionTypesGenerated = HashMap<String, int>();
 
-  /// Map from completion identifier to completion suggestion
+  /// A map from a completion identifier to a completion suggestion.
   final Map<String, CompletionSuggestion> _suggestionMap =
       <String, CompletionSuggestion>{};
 
-  MemberSuggestionBuilder(this.containingLibrary);
+  MemberSuggestionBuilder(this.request);
 
   Iterable<CompletionSuggestion> get suggestions => _suggestionMap.values;
 
@@ -278,37 +283,147 @@
     _suggestionMap[suggestion.completion] = suggestion;
   }
 
-  /// Add a suggestion based upon the given element, provided that it is not
-  /// shadowed by a previously added suggestion.
-  void addSuggestion(Element element,
-      {int relevance, bool useNewRelevance = false}) {
-    if (element.isPrivate) {
-      if (element.library != containingLibrary) {
-        // Do not suggest private members for imported libraries
-        return;
+  /// Add a suggestion for the given [method].
+  CompletionSuggestion addSuggestionForAccessor(
+      {@required PropertyAccessorElement accessor,
+      String containingMethodName,
+      @required double inheritanceDistance}) {
+    int oldRelevance() {
+      if (accessor.hasDeprecated) {
+        return DART_RELEVANCE_LOW;
       }
-    }
-    String identifier = element.displayName;
-
-    if (useNewRelevance) {
-      assert(relevance != null);
-    } else {
-      relevance ??= DART_RELEVANCE_DEFAULT;
-      if (relevance == DART_RELEVANCE_DEFAULT && identifier != null) {
+      String identifier = accessor.displayName;
+      if (identifier != null && identifier.startsWith(r'$')) {
         // Decrease relevance of suggestions starting with $
         // https://github.com/dart-lang/sdk/issues/27303
-        if (identifier.startsWith(r'$')) {
-          relevance = DART_RELEVANCE_LOW;
-        }
+        return DART_RELEVANCE_LOW;
       }
+      return DART_RELEVANCE_DEFAULT;
     }
 
+    if (!accessor.isAccessibleIn(request.libraryElement)) {
+      // Don't suggest private members from imported libraries.
+      return null;
+    }
+    if (accessor.isSynthetic) {
+      // Avoid visiting a field twice. All fields induce a getter, but only
+      // non-final fields induce a setter, so we don't add a suggestion for a
+      // synthetic setter.
+      if (accessor.isGetter) {
+        var variable = accessor.variable;
+        int relevance;
+        var useNewRelevance = request.useNewRelevance;
+        if (useNewRelevance) {
+          var featureComputer = request.featureComputer;
+          var contextType = featureComputer.contextTypeFeature(
+              request.contextType, variable.type);
+          var hasDeprecated = featureComputer.hasDeprecatedFeature(accessor);
+          var startsWithDollar =
+              featureComputer.startsWithDollarFeature(accessor.name);
+          var superMatches = featureComputer.superMatchesFeature(
+              containingMethodName, accessor.name);
+          relevance = _computeRelevance(
+              contextType: contextType,
+              hasDeprecated: hasDeprecated,
+              inheritanceDistance: inheritanceDistance,
+              startsWithDollar: startsWithDollar,
+              superMatches: superMatches);
+        } else {
+          relevance = oldRelevance();
+        }
+        return _addSuggestion(variable, relevance, useNewRelevance);
+      }
+    } else {
+      var type =
+          accessor.isGetter ? accessor.returnType : accessor.parameters[0].type;
+      int relevance;
+      var useNewRelevance = request.useNewRelevance;
+      if (useNewRelevance) {
+        var featureComputer = request.featureComputer;
+        var contextType =
+            featureComputer.contextTypeFeature(request.contextType, type);
+        var hasDeprecated = featureComputer.hasDeprecatedFeature(accessor);
+        var startsWithDollar =
+            featureComputer.startsWithDollarFeature(accessor.name);
+        var superMatches = featureComputer.superMatchesFeature(
+            containingMethodName, accessor.name);
+        relevance = _computeRelevance(
+            contextType: contextType,
+            hasDeprecated: hasDeprecated,
+            inheritanceDistance: inheritanceDistance,
+            startsWithDollar: startsWithDollar,
+            superMatches: superMatches);
+      } else {
+        relevance = oldRelevance();
+      }
+      return _addSuggestion(accessor, relevance, useNewRelevance);
+    }
+    return null;
+  }
+
+  /// Add a suggestion for the given [method].
+  CompletionSuggestion addSuggestionForMethod(
+      {@required MethodElement method,
+      String containingMethodName,
+      CompletionSuggestionKind kind,
+      @required double inheritanceDistance}) {
+    int oldRelevance() {
+      if (method.hasDeprecated) {
+        return DART_RELEVANCE_LOW;
+      } else if (method.name == containingMethodName) {
+        // Boost the relevance of a super expression calling a method of the
+        // same name as the containing method.
+        return DART_RELEVANCE_HIGH;
+      }
+      String identifier = method.displayName;
+      if (identifier != null && identifier.startsWith(r'$')) {
+        // Decrease relevance of suggestions starting with $
+        // https://github.com/dart-lang/sdk/issues/27303
+        return DART_RELEVANCE_LOW;
+      }
+      return DART_RELEVANCE_DEFAULT;
+    }
+
+    if (!method.isAccessibleIn(request.libraryElement)) {
+      // Don't suggest private members from imported libraries.
+      return null;
+    }
+    int relevance;
+    var useNewRelevance = request.useNewRelevance;
+    if (useNewRelevance) {
+      var featureComputer = request.featureComputer;
+      var contextType = featureComputer.contextTypeFeature(
+          request.contextType, method.returnType);
+      var hasDeprecated = featureComputer.hasDeprecatedFeature(method);
+      var startsWithDollar =
+          featureComputer.startsWithDollarFeature(method.name);
+      var superMatches = featureComputer.superMatchesFeature(
+          containingMethodName, method.name);
+      relevance = _computeRelevance(
+          contextType: contextType,
+          hasDeprecated: hasDeprecated,
+          inheritanceDistance: inheritanceDistance,
+          startsWithDollar: startsWithDollar,
+          superMatches: superMatches);
+    } else {
+      relevance = oldRelevance();
+    }
+    return _addSuggestion(method, relevance, useNewRelevance, kind: kind);
+  }
+
+  /// Add a suggestion for the given [element] with the given [relevance],
+  /// provided that it is not shadowed by a previously added suggestion.
+  CompletionSuggestion _addSuggestion(
+      Element element, int relevance, bool useNewRelevance,
+      {CompletionSuggestionKind kind}) {
+    String identifier = element.displayName;
+
     int alreadyGenerated = _completionTypesGenerated.putIfAbsent(
         identifier, () => _COMPLETION_TYPE_NONE);
     if (element is MethodElement) {
       // Anything shadows a method.
       if (alreadyGenerated != _COMPLETION_TYPE_NONE) {
-        return;
+        return null;
       }
       _completionTypesGenerated[identifier] =
           _COMPLETION_TYPE_FIELD_OR_METHOD_OR_GETSET;
@@ -316,13 +431,13 @@
       if (element.isGetter) {
         // Getters, fields, and methods shadow a getter.
         if ((alreadyGenerated & _COMPLETION_TYPE_GETTER) != 0) {
-          return;
+          return null;
         }
         _completionTypesGenerated[identifier] |= _COMPLETION_TYPE_GETTER;
       } else {
         // Setters, fields, and methods shadow a setter.
         if ((alreadyGenerated & _COMPLETION_TYPE_SETTER) != 0) {
-          return;
+          return null;
         }
         _completionTypesGenerated[identifier] |= _COMPLETION_TYPE_SETTER;
       }
@@ -330,19 +445,52 @@
       // Fields and methods shadow a field.  A getter/setter pair shadows a
       // field, but a getter or setter by itself doesn't.
       if (alreadyGenerated == _COMPLETION_TYPE_FIELD_OR_METHOD_OR_GETSET) {
-        return;
+        return null;
       }
       _completionTypesGenerated[identifier] =
           _COMPLETION_TYPE_FIELD_OR_METHOD_OR_GETSET;
     } else {
       // Unexpected element type; skip it.
       assert(false);
-      return;
+      return null;
     }
-    CompletionSuggestion suggestion =
-        createSuggestion(element, relevance: relevance);
+    CompletionSuggestion suggestion = createSuggestion(element,
+        kind: kind, relevance: relevance, useNewRelevance: useNewRelevance);
     if (suggestion != null) {
       addCompletionSuggestion(suggestion);
     }
+    return suggestion;
+  }
+
+  /// Compute a relevance value from the given feature scores:
+  /// - [contextType] is higher if the type of the element matches the context
+  ///   type,
+  /// - [hasDeprecated] is higher if the element is not deprecated,
+  /// - [inheritanceDistance] is higher if the element is defined closer to the
+  ///   target type,
+  /// - [startsWithDollar] is higher if the element's name doe _not_ start with
+  ///   a dollar sign, and
+  /// - [superMatches] is higher if the element is being invoked through `super`
+  ///   and the element's name matches the name of the enclosing method.
+  int _computeRelevance(
+      {@required double contextType,
+      @required double hasDeprecated,
+      @required double inheritanceDistance,
+      @required double startsWithDollar,
+      @required double superMatches}) {
+    var score = weightedAverage([
+      contextType,
+      hasDeprecated,
+      inheritanceDistance,
+      startsWithDollar,
+      superMatches
+    ], [
+      1.0,
+      0.5,
+      1.0,
+      0.5,
+      1.0
+    ]);
+    return toRelevance(score, Relevance.member);
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
index 096051b..f65db45 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
@@ -8,14 +8,12 @@
 import 'package:analysis_server/src/protocol_server.dart'
     show CompletionSuggestion, CompletionSuggestionKind;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
-import 'package:analysis_server/src/services/completion/dart/feature_computer.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as protocol;
 import 'package:analyzer_plugin/src/utilities/visitors/local_declaration_visitor.dart';
-import 'package:meta/meta.dart';
 
 /// A contributor that produces suggestions based on the instance members of a
 /// given type, whether declared by that type directly or inherited from a
@@ -27,13 +25,13 @@
   Future<List<CompletionSuggestion>> computeSuggestions(
       DartCompletionRequest request) async {
     LibraryElement containingLibrary = request.libraryElement;
-    // Gracefully degrade if the library element is not resolved
-    // e.g. detached part file or source change
+    // Gracefully degrade if the library could not be determined, such as with a
+    // detached part file or source change.
     if (containingLibrary == null) {
       return const <CompletionSuggestion>[];
     }
 
-    // Recompute the target since resolution may have changed it
+    // Recompute the target because resolution might have changed it.
     Expression expression = request.dotTarget;
     if (expression == null ||
         expression.isSynthetic ||
@@ -43,20 +41,20 @@
     if (expression is Identifier) {
       Element elem = expression.staticElement;
       if (elem is ClassElement) {
-        // Suggestions provided by StaticMemberContributor
+        // Suggestions provided by StaticMemberContributor.
         return const <CompletionSuggestion>[];
       }
       if (elem is PrefixElement) {
-        // Suggestions provided by LibraryMemberContributor
+        // Suggestions provided by LibraryMemberContributor.
         return const <CompletionSuggestion>[];
       }
     }
 
-    // Determine the target expression's type
+    // Determine the target expression's type.
     DartType type = expression.staticType;
     if (type == null || type.isDynamic) {
-      // If the expression does not provide a good type
-      // then attempt to get a better type from the element
+      // If the expression does not provide a good type, then attempt to get a
+      // better type from the element.
       if (expression is Identifier) {
         Element elem = expression.staticElement;
         if (elem is FunctionTypedElement) {
@@ -68,8 +66,8 @@
         }
         if ((type == null || type.isDynamic) &&
             expression is SimpleIdentifier) {
-          // If the element does not provide a good type
-          // then attempt to get a better type from a local declaration
+          // If the element does not provide a good type, then attempt to get a
+          // better type from a local declaration.
           _LocalBestTypeVisitor visitor =
               _LocalBestTypeVisitor(expression.name, request.offset);
           if (visitor.visit(expression) && visitor.typeFound != null) {
@@ -82,12 +80,12 @@
     List<InterfaceType> mixins;
     List<InterfaceType> superclassConstraints;
     if (expression is SuperExpression && type is InterfaceType) {
-      // Suggest members from superclass if target is "super"
+      // Suggest members from superclass if target is "super".
       mixins = (type as InterfaceType).mixins;
       superclassConstraints = (type as InterfaceType).superclassConstraints;
       type = (type as InterfaceType).superclass;
-      // Determine the name of the containing method because
-      // the most likely completion is a super expression with same name
+      // Determine the name of the containing method because the most likely
+      // completion is a super expression with same name.
       MethodDeclaration containingMethod =
           expression.thisOrAncestorOfType<MethodDeclaration>();
       if (containingMethod != null) {
@@ -98,11 +96,11 @@
       }
     }
     if (type == null || type.isDynamic) {
-      // Suggest members from object if target is "dynamic"
+      // Suggest members from object if target is "dynamic".
       type = request.objectType;
     }
 
-    // Build the suggestions
+    // Build the suggestions.
     if (type is InterfaceType) {
       _SuggestionBuilder builder = _SuggestionBuilder(request);
       builder.buildSuggestions(type, containingMethodName,
@@ -110,24 +108,25 @@
       return builder.suggestions.toList();
     }
     if (type is FunctionType) {
-      return [_SuggestionBuilder._createFunctionCallSuggestion()];
+      _SuggestionBuilder builder = _SuggestionBuilder(request);
+      return [builder._createFunctionCallSuggestion()];
     }
 
     return const <CompletionSuggestion>[];
   }
 }
 
-/// An [AstVisitor] which looks for a declaration with the given name
-/// and if found, tries to determine a type for that declaration.
+/// An [AstVisitor] which looks for a declaration with the given name and if
+/// found, tries to determine a type for that declaration.
 class _LocalBestTypeVisitor extends LocalDeclarationVisitor {
   /// The name for the declaration to be found.
   final String targetName;
 
-  /// The best type for the found declaration,
-  /// or `null` if no declaration found or failed to determine a type.
+  /// The best type for the found declaration, or `null` if no declaration found
+  /// or failed to determine a type.
   DartType typeFound;
 
-  /// Construct a new instance to search for a declaration
+  /// Construct a new instance to search for a declaration.
   _LocalBestTypeVisitor(this.targetName, int offset) : super(offset);
 
   @override
@@ -221,7 +220,7 @@
   @override
   void declaredParam(SimpleIdentifier name, TypeAnnotation type) {
     if (name.name == targetName) {
-      // Type provided by the element in computeFull above
+      // Type provided by the element in computeFull above.
       finished();
     }
   }
@@ -230,7 +229,7 @@
   void declaredTopLevelVar(
       VariableDeclarationList varList, VariableDeclaration varDecl) {
     if (varDecl.name.name == targetName) {
-      // Type provided by the element in computeFull above
+      // Type provided by the element in computeFull above.
       finished();
     }
   }
@@ -239,9 +238,8 @@
 /// This class provides suggestions based upon the visible instance members in
 /// an interface type.
 class _SuggestionBuilder extends MemberSuggestionBuilder {
-  final DartCompletionRequest request;
-
-  _SuggestionBuilder(this.request) : super(request.libraryElement);
+  /// Initialize a newly created suggestion builder.
+  _SuggestionBuilder(DartCompletionRequest request) : super(request);
 
   /// Return completion suggestions for 'dot' completions on the given [type].
   /// If the 'dot' completion is a super expression, then [containingMethodName]
@@ -259,78 +257,27 @@
     if (superclassConstraints != null) {
       types.addAll(superclassConstraints);
     }
-    var featureComputer = request.featureComputer;
-    for (InterfaceType targetType in types) {
-      var inheritanceDistance = featureComputer.inheritanceDistanceFeature(
-          type.element, targetType.element);
-      for (MethodElement method in targetType.methods) {
-        // Exclude static methods when completion on an instance
+    for (var targetType in types) {
+      double inheritanceDistance;
+      if (request.useNewRelevance) {
+        inheritanceDistance = request.featureComputer
+            .inheritanceDistanceFeature(type.element, targetType.element);
+      }
+      for (var method in targetType.methods) {
+        // Exclude static methods when completion on an instance.
         if (!method.isStatic) {
-          // Boost the relevance of a super expression
-          // calling a method of the same name as the containing method
-          int relevance;
-          if (request.useNewRelevance) {
-            var contextType = featureComputer.contextTypeFeature(
-                request.contextType, method.returnType);
-            var startsWithDollar =
-                featureComputer.startsWithDollarFeature(method.name);
-            var superMatches = featureComputer.superMatchesFeature(
-                containingMethodName, method.name);
-            relevance = _computeRelevance(
-                contextType: contextType,
-                inheritanceDistance: inheritanceDistance,
-                startsWithDollar: startsWithDollar,
-                superMatches: superMatches);
-          } else {
-            relevance = method.name == containingMethodName
-                ? DART_RELEVANCE_HIGH
-                : DART_RELEVANCE_DEFAULT;
-          }
-          addSuggestion(method, relevance: relevance);
+          addSuggestionForMethod(
+              method: method,
+              containingMethodName: containingMethodName,
+              inheritanceDistance: inheritanceDistance);
         }
       }
-      for (PropertyAccessorElement propertyAccessor in targetType.accessors) {
-        if (!propertyAccessor.isStatic) {
-          if (propertyAccessor.isSynthetic) {
-            // Avoid visiting a field twice
-            if (propertyAccessor.isGetter) {
-              var variable = propertyAccessor.variable;
-              int relevance;
-              if (request.useNewRelevance) {
-                var contextType = featureComputer.contextTypeFeature(
-                    request.contextType, variable.type);
-                var startsWithDollar = featureComputer
-                    .startsWithDollarFeature(propertyAccessor.name);
-                var superMatches = featureComputer.superMatchesFeature(
-                    containingMethodName, propertyAccessor.name);
-                relevance = _computeRelevance(
-                    contextType: contextType,
-                    inheritanceDistance: inheritanceDistance,
-                    startsWithDollar: startsWithDollar,
-                    superMatches: superMatches);
-              }
-              addSuggestion(variable, relevance: relevance);
-            }
-          } else {
-            var type = propertyAccessor.isGetter
-                ? propertyAccessor.returnType
-                : propertyAccessor.parameters[0].type;
-            int relevance;
-            if (request.useNewRelevance) {
-              var contextType =
-                  featureComputer.contextTypeFeature(request.contextType, type);
-              var startsWithDollar = featureComputer
-                  .startsWithDollarFeature(propertyAccessor.name);
-              var superMatches = featureComputer.superMatchesFeature(
-                  containingMethodName, propertyAccessor.name);
-              relevance = _computeRelevance(
-                  contextType: contextType,
-                  inheritanceDistance: inheritanceDistance,
-                  startsWithDollar: startsWithDollar,
-                  superMatches: superMatches);
-            }
-            addSuggestion(propertyAccessor, relevance: relevance);
-          }
+      for (var accessor in targetType.accessors) {
+        if (!accessor.isStatic) {
+          addSuggestionForAccessor(
+              accessor: accessor,
+              containingMethodName: containingMethodName,
+              inheritanceDistance: inheritanceDistance);
         }
       }
       if (targetType.isDartCoreFunction) {
@@ -339,24 +286,26 @@
     }
   }
 
-  /// Compute a relevance value from the given feature scores:
-  /// - [contextType] is higher if the type of the element matches the context
-  ///   type,
-  /// - [inheritanceDistance] is higher if the element is defined closer to the
-  ///   target type,
-  /// - [startsWithDollar] is higher if the element's name doe _not_ start with
-  ///   a dollar sign, and
-  /// - [superMatches] is higher if the element is being invoked through `super`
-  ///   and the element's name matches the name of the enclosing method.
-  int _computeRelevance(
-      {@required double contextType,
-      @required double inheritanceDistance,
-      @required double startsWithDollar,
-      @required double superMatches}) {
-    var score = weightedAverage(
-        [contextType, inheritanceDistance, startsWithDollar, superMatches],
-        [1.0, 1.0, 0.5, 1.0]);
-    return toRelevance(score, 500);
+  CompletionSuggestion _createFunctionCallSuggestion() {
+    const callString = 'call()';
+    final element = protocol.Element(
+        protocol.ElementKind.METHOD, callString, protocol.Element.makeFlags(),
+        location: null,
+        typeParameters: null,
+        parameters: null,
+        returnType: 'void');
+    return CompletionSuggestion(
+      CompletionSuggestionKind.INVOCATION,
+      request.useNewRelevance ? Relevance.callFunction : DART_RELEVANCE_HIGH,
+      callString,
+      callString.length,
+      0,
+      false,
+      false,
+      displayText: callString,
+      element: element,
+      returnType: 'void',
+    );
   }
 
   /// Get a list of [InterfaceType]s that should be searched to find the
@@ -394,26 +343,4 @@
     }
     return result;
   }
-
-  static CompletionSuggestion _createFunctionCallSuggestion() {
-    const callString = 'call()';
-    final element = protocol.Element(
-        protocol.ElementKind.METHOD, callString, protocol.Element.makeFlags(),
-        location: null,
-        typeParameters: null,
-        parameters: null,
-        returnType: 'void');
-    return CompletionSuggestion(
-      CompletionSuggestionKind.INVOCATION,
-      DART_RELEVANCE_HIGH,
-      callString,
-      callString.length,
-      0,
-      false,
-      false,
-      displayText: callString,
-      element: element,
-      returnType: 'void',
-    );
-  }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index 785aec6..c4c3ff7 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -1985,7 +1985,10 @@
     _SimpleIdentifierRecursiveAstVisitor visitor =
         _SimpleIdentifierRecursiveAstVisitor((SimpleIdentifier node) {
       Element element = node.staticElement;
-      if (element != null && namespace[node.name] == element) {
+      if (element != null &&
+          (namespace[node.name] == element ||
+              (node.name != element.name &&
+                  namespace[element.name] == element))) {
         referencedNames.add(element.displayName);
       }
     });
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 906e521..cc2d77c 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -706,6 +706,9 @@
         await _addFix_addConst();
         await _addFix_replaceNewWithConst();
       }
+      if (errorCode.name == LintNames.prefer_const_constructors_in_immutables) {
+        await _addFix_addConstToConstructor();
+      }
       if (errorCode.name == LintNames.prefer_if_null_operators) {
         await _addFix_convertToIfNullOperator();
       }
@@ -804,6 +807,23 @@
     }
   }
 
+  Future<void> _addFix_addConstToConstructor() async {
+    var node = coveredNode;
+    if (node is SimpleIdentifier) {
+      node = node.parent;
+    }
+    if (node is ConstructorDeclaration) {
+      final changeBuilder = _newDartChangeBuilder();
+      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+        final offset = (node as ConstructorDeclaration)
+            .firstTokenAfterCommentAndMetadata
+            .offset;
+        builder.addSimpleInsertion(offset, 'const ');
+      });
+      _addFixFromBuilder(changeBuilder, DartFixKind.ADD_CONST);
+    }
+  }
+
   Future<void> _addFix_addCurlyBraces() async {
     final changeBuilder = await createBuilder_useCurlyBraces();
     _addFixFromBuilder(changeBuilder, DartFixKind.ADD_CURLY_BRACES);
@@ -3519,7 +3539,10 @@
         if (combinators.length == 1) {
           Token previousToken =
               combinator.parent.findPrevious(combinator.beginToken);
-          return range.endEnd(previousToken, combinator);
+          if (previousToken != null) {
+            return range.endEnd(previousToken, combinator);
+          }
+          return null;
         }
         int index = combinators.indexOf(combinator);
         if (index < 0) {
diff --git a/pkg/analysis_server/lib/src/services/linter/lint_names.dart b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
index 549d182..6a91795 100644
--- a/pkg/analysis_server/lib/src/services/linter/lint_names.dart
+++ b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
@@ -45,6 +45,8 @@
   static const String prefer_conditional_assignment =
       'prefer_conditional_assignment';
   static const String prefer_const_constructors = 'prefer_const_constructors';
+  static const String prefer_const_constructors_in_immutables =
+      'prefer_const_constructors_in_immutables';
   static const String prefer_const_declarations = 'prefer_const_declarations';
   static const String prefer_contains = 'prefer_contains';
   static const String prefer_equal_for_default_values =
diff --git a/pkg/analysis_server/test/client/relevance/test_all.dart b/pkg/analysis_server/test/client/relevance/test_all.dart
deleted file mode 100644
index 26af7cd..0000000
--- a/pkg/analysis_server/test/client/relevance/test_all.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.
-
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import 'type_member_relevance_test.dart' as type_member_relevance_test;
-
-void main() {
-  defineReflectiveSuite(() {
-    type_member_relevance_test.main();
-  });
-}
diff --git a/pkg/analysis_server/test/client/test_all.dart b/pkg/analysis_server/test/client/test_all.dart
index 1d2a312..417c4d3 100644
--- a/pkg/analysis_server/test/client/test_all.dart
+++ b/pkg/analysis_server/test/client/test_all.dart
@@ -5,11 +5,9 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'completion_driver_test.dart' as completion_driver;
-import 'relevance/test_all.dart' as relevance_tests;
 
 void main() {
   defineReflectiveSuite(() {
     completion_driver.main();
-    relevance_tests.main();
   });
 }
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 14b27ab..1827123 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
@@ -859,6 +859,27 @@
     assertSuggestKeywords(classBodyKeywords);
   }
 
+  Future<void> test_class_body_return_no_whitespace() async {
+    addTestSource('class A { ^foo() {}}');
+    await computeSuggestions();
+    expect(suggestions, isNotEmpty);
+    assertSuggestKeywords(classBodyKeywords);
+  }
+
+  Future<void> test_class_body_return_prefix() async {
+    addTestSource('class A { d^ foo() {}}');
+    await computeSuggestions();
+    expect(suggestions, isNotEmpty);
+    assertSuggestKeywords(classBodyKeywords);
+  }
+
+  Future<void> test_class_body_return_whitespace() async {
+    addTestSource('class A { ^ foo() {}}');
+    await computeSuggestions();
+    expect(suggestions, isNotEmpty);
+    assertSuggestKeywords(classBodyKeywords);
+  }
+
   Future<void> test_class_extends() async {
     addTestSource('class A extends foo ^');
     await computeSuggestions();
@@ -1891,6 +1912,20 @@
     assertSuggestKeywords(EXPRESSION_START_INSTANCE);
   }
 
+  Future<void> test_method_body_return_with_header() async {
+    addTestSource('class A { @override ^ foo() {}}');
+    await computeSuggestions();
+    expect(suggestions, isNotEmpty);
+    assertSuggestKeywords(classBodyKeywords);
+  }
+
+  Future<void> test_method_body_return_with_header_prefix() async {
+    addTestSource('class A { @override d^ foo() {}}');
+    await computeSuggestions();
+    expect(suggestions, isNotEmpty);
+    assertSuggestKeywords(classBodyKeywords);
+  }
+
   Future<void> test_method_invocation() async {
     addTestSource('class A { foo() {bar.^}}');
     await computeSuggestions();
@@ -1939,7 +1974,7 @@
   }
 
   Future<void> test_method_param_prefix() async {
-    addTestSource('class A { foo(t^) {});}');
+    addTestSource('class A { foo(t^) {}}');
     await computeSuggestions();
     expect(suggestions, isNotEmpty);
     assertSuggestKeywords(methodParameter);
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
new file mode 100644
index 0000000..79a5bbf
--- /dev/null
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/completion_relevance.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 'package:analysis_server/src/analysis_server.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../../../client/completion_driver_test.dart';
+
+@reflectiveTest
+class CompletionRelevanceTest extends AbstractCompletionDriverTest {
+  @override
+  AnalysisServerOptions get serverOptions =>
+      AnalysisServerOptions()..useNewRelevance = true;
+
+  @override
+  bool get supportsAvailableSuggestions => true;
+
+  /// Assert that all of the given completions were produced and that the
+  /// suggestions are ordered in decreasing order based on relevance scores.
+  void assertOrder(List<CompletionSuggestion> suggestions) {
+    var length = suggestions.length;
+    expect(length, greaterThan(1),
+        reason: 'Test must specify more than one suggestion');
+    var previous = suggestions[0];
+    for (int i = 1; i < length; i++) {
+      var current = suggestions[i];
+      expect(current.relevance, lessThan(previous.relevance));
+      previous = current;
+    }
+  }
+}
diff --git a/pkg/analysis_server/test/client/relevance/type_member_relevance_test.dart b/pkg/analysis_server/test/services/completion/dart/relevance/instance_member_relevance_test.dart
similarity index 84%
rename from pkg/analysis_server/test/client/relevance/type_member_relevance_test.dart
rename to pkg/analysis_server/test/services/completion/dart/relevance/instance_member_relevance_test.dart
index 7d1c53e..9558d8d 100644
--- a/pkg/analysis_server/test/client/relevance/type_member_relevance_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/instance_member_relevance_test.dart
@@ -7,16 +7,16 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../completion_driver_test.dart';
+import '../../../../client/completion_driver_test.dart';
 
 void main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(TypeMemberRelevanceTest);
+    defineReflectiveTests(InstanceMemberRelevanceTest);
   });
 }
 
 @reflectiveTest
-class TypeMemberRelevanceTest extends AbstractCompletionDriverTest {
+class InstanceMemberRelevanceTest extends AbstractCompletionDriverTest {
   @override
   AnalysisServerOptions get serverOptions =>
       AnalysisServerOptions()..useNewRelevance = true;
@@ -65,6 +65,24 @@
     ]);
   }
 
+  Future<void> test_hasDeprecated() async {
+    await addTestFile('''
+class C {
+  void a() {}
+  @deprecated
+  void b() {}
+}
+
+void f(C c) {
+  c.^
+}
+''');
+    assertOrder([
+      suggestionWith(completion: 'a'),
+      suggestionWith(completion: 'b'),
+    ]);
+  }
+
   Future<void> test_inheritanceDepth() async {
     await addTestFile('''
 class A {
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/static_member_relevance_test.dart b/pkg/analysis_server/test/services/completion/dart/relevance/static_member_relevance_test.dart
new file mode 100644
index 0000000..e16d539
--- /dev/null
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/static_member_relevance_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 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'completion_relevance.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(StaticMemberRelevanceTest);
+  });
+}
+
+@reflectiveTest
+class StaticMemberRelevanceTest extends CompletionRelevanceTest {
+  Future<void> test_contextType() async {
+    await addTestFile(r'''
+class A {}
+class B extends A {}
+class C extends B {}
+class D {}
+
+class E {
+  static A a() {}
+  static B b() {}
+  static C c() {}
+  static D d() {}
+}
+
+void f(B b) {}
+void g() {
+  f(E.^);
+}
+''');
+    assertOrder([
+      suggestionWith(completion: 'b'), // same
+      suggestionWith(completion: 'c'), // subtype
+      suggestionWith(completion: 'd'), // unrelated
+      suggestionWith(completion: 'a'), // supertype
+    ]);
+  }
+
+  Future<void> test_hasDeprecated() async {
+    await addTestFile('''
+class C {
+  static void a() {}
+  @deprecated
+  static void b() {}
+}
+
+void f() {
+  C.^
+}
+''');
+    assertOrder([
+      suggestionWith(completion: 'a'),
+      suggestionWith(completion: 'b'),
+    ]);
+  }
+}
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/test_all.dart b/pkg/analysis_server/test/services/completion/dart/relevance/test_all.dart
index c0f3240..c0235e1 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/test_all.dart
@@ -7,11 +7,15 @@
 import 'arglist_parameter_relevance_test.dart' as arglist_parameters;
 import 'bool_assignment_relevance_test.dart' as bool_assignments;
 import 'deprecated_member_relevance_test.dart' as deprecated_members;
+import 'instance_member_relevance_test.dart' as instance_member_relevance;
+import 'static_member_relevance_test.dart' as static_member_relevance;
 
 void main() {
   defineReflectiveSuite(() {
     arglist_parameters.main();
     bool_assignments.main();
     deprecated_members.main();
+    instance_member_relevance.main();
+    static_member_relevance.main();
   });
 }
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 b75fd7e..7dd7a0d 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
@@ -2271,12 +2271,7 @@
 ''');
 
     await computeSuggestions();
-    assertSuggest(
-      'call()',
-      selectionOffset: 6,
-      elemKind: ElementKind.METHOD,
-      isSynthetic: true,
-    );
+    assertNotSuggested('call');
   }
 
   Future<void> test_InterfaceType_Function_implemented_call() async {
@@ -2289,12 +2284,7 @@
 ''');
 
     await computeSuggestions();
-    assertSuggest(
-      'call()',
-      selectionOffset: 6,
-      elemKind: ElementKind.METHOD,
-      isSynthetic: true,
-    );
+    assertNotSuggested('call');
   }
 
   Future<void> test_InterpolationExpression() async {
diff --git a/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart b/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart
index 544d429..af7a168 100644
--- a/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart
+++ b/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart
@@ -292,6 +292,7 @@
 
   void assertTraceEntry(
       UnitInfo unit, TraceEntryInfo entryInfo, String function, int offset) {
+    assert(offset >= 0);
     var lineInfo = LineInfo.fromContent(unit.content);
     var expectedLocation = lineInfo.getLocation(offset);
     expect(entryInfo.target.filePath, unit.path);
@@ -398,7 +399,7 @@
 }
 ''', migratedContent: '''
 class C<T extends Object?> {
-  C(T/*!*/ t);
+  C(T /*!*/ t);
 }
 
 void main() {
@@ -442,7 +443,7 @@
   f(null);
 }
 ''', migratedContent: '''
-f<T extends Object?>(T/*!*/ t) {}
+f<T extends Object?>(T /*!*/ t) {}
 
 void main() {
   f(null);
@@ -462,15 +463,15 @@
   if (i != null) print('NULL');
 }
 ''', migratedContent: '''
-void g(int i) {
+void g(int  i) {
   print(i.isEven);
   /* if (i != null) */ print('NULL');
 }
 ''');
     List<RegionInfo> regions = unit.fixRegions;
     expect(regions, hasLength(2));
-    assertRegion(region: regions[0], offset: 37, length: 3);
-    assertRegion(region: regions[1], offset: 55, length: 3);
+    assertRegion(region: regions[0], offset: 38, length: 3);
+    assertRegion(region: regions[1], offset: 56, length: 3);
   }
 
   Future<void> test_discardElse() async {
@@ -481,7 +482,7 @@
   else print('NOT NULL');
 }
 ''', migratedContent: '''
-void g(int i) {
+void g(int  i) {
   print(i.isEven);
   /* if (i != null) */ print('NULL'); /*
   else print('NOT NULL'); */
@@ -489,10 +490,10 @@
 ''');
     List<RegionInfo> regions = unit.fixRegions;
     expect(regions, hasLength(4));
-    assertRegion(region: regions[0], offset: 37, length: 3);
-    assertRegion(region: regions[1], offset: 55, length: 3);
-    assertRegion(region: regions[2], offset: 72, length: 3);
-    assertRegion(region: regions[3], offset: 101, length: 3);
+    assertRegion(region: regions[0], offset: 38, length: 3);
+    assertRegion(region: regions[1], offset: 56, length: 3);
+    assertRegion(region: regions[2], offset: 73, length: 3);
+    assertRegion(region: regions[3], offset: 102, length: 3);
   }
 
   Future<void> test_dynamicValueIsUsed() async {
@@ -506,7 +507,7 @@
   f(i);
 }
 ''', migratedContent: '''
-bool f(int? i) {
+bool  f(int? i) {
   if (i == null) return true;
   else return false;
 }
@@ -515,11 +516,11 @@
   f(i);
 }
 ''');
-    List<RegionInfo> regions = unit.regions;
+    List<RegionInfo> regions = unit.fixRegions;
     expect(regions, hasLength(1));
     var region = regions[0];
     var edits = region.edits;
-    assertRegion(region: region, offset: 10, details: [
+    assertRegion(region: region, offset: 11, details: [
       'A dynamic value, which is nullable is passed as an argument'
     ]);
     assertDetail(detail: region.details[0], offset: 104, length: 1);
@@ -537,7 +538,7 @@
   f(<int>[]);
 }
 ''', migratedContent: '''
-void f(List<int?> list) {
+void f(List<int?>  list) {
   list[0] = null;
 }
 
@@ -547,13 +548,13 @@
 ''');
     List<RegionInfo> regions = unit.regions;
     expect(regions, hasLength(3));
-    // regions[0] is the hard edge that f's parameter is non-nullable.
-    assertRegion(region: regions[1], offset: 15, details: [
+    assertRegion(region: regions[0], offset: 15, details: [
       "An explicit 'null' is assigned in the function 'f'",
     ]);
+    // regions[1] is the hard edge that f's parameter is non-nullable.
     assertRegion(
         region: regions[2],
-        offset: 66,
+        offset: 67,
         details: ['This is later required to accept null.']);
   }
 
@@ -729,8 +730,8 @@
 }
 ''', migratedContent: '''
 class C {
-  f(void Function(int)? cb1) {}
-  g(void Function(int) cb2) {
+  f(void Function(int )? cb1) {}
+  g(void Function(int )  cb2) {
     f(cb2);
   }
   h() => f(null);
@@ -740,7 +741,7 @@
     expect(regions, hasLength(1));
     assertRegion(
         region: regions[0],
-        offset: 32,
+        offset: 33,
         details: ["An explicit 'null' is passed as an argument"]);
     assertDetail(detail: regions[0].details[0], offset: 98, length: 4);
   }
@@ -757,10 +758,10 @@
 }
 ''', migratedContent: '''
 class C {
-  f(void Function(int?) cb1) {
+  f(void Function(int?)  cb1) {
     cb1(null);
   }
-  g(void Function(int?) cb2) {
+  g(void Function(int?)  cb2) {
     f(cb2);
   }
 }
@@ -771,7 +772,7 @@
         region: regions[0],
         offset: 31,
         details: ["An explicit 'null' is passed as an argument"]);
-    assertRegion(region: regions[1], offset: 81, details: [
+    assertRegion(region: regions[1], offset: 82, details: [
       'The function-typed element in which this parameter is declared is '
           'assigned to a function whose matching parameter is nullable'
     ]);
@@ -789,8 +790,8 @@
 }
 ''', migratedContent: '''
 class C {
-  void Function(int?) _cb = (x) {};
-  f(void Function(int?) cb) {
+  void Function(int?)  _cb = (x) {};
+  f(void Function(int?)  cb) {
     _cb = cb;
   }
   g() => _cb(null);
@@ -799,7 +800,7 @@
     List<RegionInfo> regions = unit.fixRegions;
     expect(regions, hasLength(2));
     // regions[0] is `void Function(int?) _cb`.
-    assertRegion(region: regions[1], offset: 67, details: [
+    assertRegion(region: regions[1], offset: 68, details: [
       'The function-typed element in which this parameter is declared is '
           'assigned to a function whose matching parameter is nullable'
     ]);
@@ -815,8 +816,8 @@
 }
 ''', migratedContent: '''
 class C {
-  void Function(int?) _cb;
-  C(void Function(int?) cb): _cb = cb;
+  void Function(int?)  _cb;
+  C(void Function(int?)  cb): _cb = cb;
   f() => _cb(null);
 }
 ''');
@@ -826,7 +827,7 @@
         region: regions[0],
         offset: 29,
         details: ["An explicit 'null' is passed as an argument"]);
-    assertRegion(region: regions[1], offset: 58, details: [
+    assertRegion(region: regions[1], offset: 59, details: [
       'The function-typed element in which this parameter is declared is '
           'assigned to a function whose matching parameter is nullable'
     ]);
@@ -873,8 +874,8 @@
 }
 ''', migratedContent: '''
 class C {
-  int? Function() _cb = () => 7;
-  f(int? Function() cb) {
+  int? Function()  _cb = () => 7;
+  f(int? Function()  cb) {
     _cb = cb;
   }
   g() {
@@ -899,8 +900,8 @@
 }
 ''', migratedContent: '''
 class C {
-  int level;
-  int level2;
+  int  level;
+  int  level2;
   C({required this.level}) : this.level2 = level + 1;
 }
 ''');
@@ -908,7 +909,7 @@
     expect(regions, hasLength(1));
     var region = regions[0];
     var edits = region.edits;
-    assertRegion(region: region, offset: 42, length: 9, details: [
+    assertRegion(region: region, offset: 44, length: 9, details: [
       'This parameter is non-nullable, so cannot have an implicit default '
           "value of 'null'"
     ]);
@@ -924,15 +925,15 @@
 }
 ''', migratedContent: '''
 class C {
-  int level = 0;
-  bool f({required int lvl}) => lvl >= level;
+  int  level = 0;
+  bool  f({required int  lvl}) => lvl >= level;
 }
 ''');
     List<RegionInfo> regions = unit.fixRegions;
     expect(regions, hasLength(1));
     var region = regions[0];
     var edits = region.edits;
-    assertRegion(region: region, offset: 37, length: 9, details: [
+    assertRegion(region: region, offset: 39, length: 9, details: [
       'This parameter is non-nullable, so cannot have an implicit default '
           "value of 'null'"
     ]);
@@ -949,9 +950,9 @@
 ''';
     var migratedContent = '''
 class C {
-  C? operator+(C c) => null;
+  C? operator+(C  c) => null;
 }
-C/*!*/ _f(C c) => (c + c)!;
+C /*!*/ _f(C  c) => (c + c)!;
 ''';
     UnitInfo unit = await buildInfoForSingleTestFile(originalContent,
         migratedContent: migratedContent);
@@ -1005,13 +1006,13 @@
 }
 ''', migratedContent: '''
 void f() {
-  List<int?> list = List<int?>(10);
+  List<int?>  list = List<int?>(10);
 }
 ''');
-    List<RegionInfo> regions = unit.regions;
+    List<RegionInfo> regions = unit.fixRegions;
     expect(regions, hasLength(2));
     // regions[0] is `num? a`.
-    assertRegion(region: regions[1], offset: 39, details: [
+    assertRegion(region: regions[1], offset: 40, details: [
       'A length is specified in the "List()" constructor and the list items '
           'are initialized to null'
     ]);
@@ -1099,8 +1100,8 @@
 ''', migratedContent: '''
 void f() {
   String? s = null;
-  var x = <String?, bool>{"hello": false, s: true};
-  var y = <bool, String?>{false: "hello", true: s};
+  var x = <String?, bool >{"hello": false, s: true};
+  var y = <bool , String?>{false: "hello", true: s};
 }
 ''');
     List<RegionInfo> regions = unit.fixRegions;
@@ -1113,7 +1114,7 @@
     assertDetail(detail: regions[1].details[0], offset: 71, length: 1);
     assertRegion(
         region: regions[2],
-        offset: 106,
+        offset: 108,
         details: ['This map is initialized with a nullable value on line 4']);
     assertDetail(detail: regions[2].details[0], offset: 128, length: 1);
   }
@@ -1136,7 +1137,7 @@
 class B extends A {
   void m({num? p = 0}) {}
 }
-void f(A a) {
+void f(A  a) {
   a.m(p: null);
 }
 ''');
@@ -1155,30 +1156,24 @@
   assert(s != null);
 }
 ''', migratedContent: '''
-void f(String s) {
+void f(String  s) {
   assert(s != null);
 }
 ''');
-    List<RegionInfo> regions = unit.nonNullableTypeRegions;
+    List<RegionInfo> regions = unit.informativeRegions;
     expect(regions, hasLength(1));
-    assertRegion(
-        region: regions[0],
-        offset: 7,
-        length: 6,
-        details: ['This value is asserted to be non-null']);
+    assertRegion(region: regions[0], offset: 13, length: 1, details: []);
   }
 
   Future<void> test_nonNullableType_exclamationComment() async {
     UnitInfo unit = await buildInfoForSingleTestFile('''
 void f(String /*!*/ s) {}
 ''', migratedContent: '''
-void f(String /*!*/ s) {}
+void f(String  /*!*/ s) {}
 ''');
-    List<RegionInfo> regions = unit.nonNullableTypeRegions;
+    List<RegionInfo> regions = unit.informativeRegions;
     expect(regions, hasLength(1));
-    assertRegion(region: regions[0], offset: 7, length: 6, details: [
-      'This type is annotated with a non-nullability comment ("/*!*/")'
-    ]);
+    assertRegion(region: regions[0], offset: 13, length: 1, details: []);
   }
 
   Future<void> test_nonNullableType_unconditionalFieldAccess() async {
@@ -1187,15 +1182,13 @@
   print(s.length);
 }
 ''', migratedContent: '''
-void f(String s) {
+void f(String  s) {
   print(s.length);
 }
 ''');
-    List<RegionInfo> regions = unit.nonNullableTypeRegions;
+    List<RegionInfo> regions = unit.informativeRegions;
     expect(regions, hasLength(1));
-    assertRegion(region: regions[0], offset: 7, length: 6, details: [
-      'This value is unconditionally used in a non-nullable context'
-    ]);
+    assertRegion(region: regions[0], offset: 13, length: 1, details: []);
   }
 
   Future<void> test_nullCheck_onMemberAccess() async {
@@ -1318,7 +1311,7 @@
 class C extends B {
   void m(Object? p) {}
 }
-void f(A a) {
+void f(A  a) {
   a.m(null);
 }
 ''');
@@ -1359,7 +1352,7 @@
 class C extends B {
   void m(Object? p) {}
 }
-void f(A a) {
+void f(A  a) {
   a.m(null);
 }
 ''');
@@ -1371,8 +1364,7 @@
     ]);
   }
 
-  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/39378')
-  Future<void> test_parameter_fromOverridden_implicit() async {
+  Future<void> test_parameter_fromOverridden_implicitDynamic() async {
     UnitInfo unit = await buildInfoForSingleTestFile('''
 class A {
   void m(p) {}
@@ -1385,17 +1377,12 @@
   void m(p) {}
 }
 class B extends A {
-  void m(Object? p) {}
+  void m(Object  p) {}
 }
 ''');
-    List<RegionInfo> regions = unit.fixRegions;
+    List<RegionInfo> regions = unit.informativeRegions;
     expect(regions, hasLength(1));
-    // TODO(brianwilkerson) The detail should read something like
-    //  "The overridden method accepts a nullable type"
-    assertRegion(
-        region: regions[0],
-        offset: 62,
-        details: ['A nullable value is assigned']);
+    assertRegion(region: regions[0], offset: 62, details: []);
   }
 
   Future<void> test_parameter_fromOverriddenField_explicit() async {
@@ -1414,7 +1401,7 @@
 class B extends A {
   void set m(Object? p) {}
 }
-void f(A a) => a.m = null;
+void f(A  a) => a.m = null;
 ''');
     List<RegionInfo> regions = unit.fixRegions;
     expect(regions, hasLength(2));
@@ -1428,6 +1415,15 @@
     ]);
     assertDetail(detail: regions[0].details[1], offset: 90, length: 4);
     assertDetail(detail: regions[1].details[0], offset: 12, length: 3);
+
+    expect(regions[0].traces, hasLength(1));
+    var trace = regions[0].traces.single;
+    expect(trace.description, 'Nullability reason');
+    var entries = trace.entries;
+    expect(entries, hasLength(1));
+    // Entry 0 is the nullability of the type of A.m.
+    // TODO(srawlins): "A" is probably incorrect here. Should be "A.m".
+    assertTraceEntry(unit, entries[0], 'A', unit.content.indexOf('int?'));
   }
 
   Future<void> test_parameter_named_omittedInCall() async {
@@ -1457,15 +1453,15 @@
 }
 void h(int x) {}
 ''', migratedContent: '''
-int f({int? compare}) => 7
+int  f({int? compare}) => 7
 void g() {
   h(f());
 }
-void h(int x) {}
+void h(int  x) {}
 ''');
     List<RegionInfo> regions = unit.fixRegions;
     expect(regions, hasLength(1));
-    assertRegion(region: regions[0], offset: 10, details: [
+    assertRegion(region: regions[0], offset: 11, details: [
       "This parameter has an implicit default value of 'null'",
       'This named parameter is omitted in a call to this function'
     ]);
@@ -1540,15 +1536,15 @@
     // Note: even though `as int` is removed, it still shows up in the
     // preview, since we show deleted text.
     var migratedContent = '''
-void f(num n, int?/*?*/ i) {
-  if (n is! int) return;
+void f(num  n, int?/*?*/ i) {
+  if (n is! int ) return;
   print((n as int).isEven);
   print(i! + 1);
 }
 ''';
     UnitInfo unit = await buildInfoForSingleTestFile(originalContent,
         migratedContent: migratedContent, removeViaComments: false);
-    List<RegionInfo> regions = unit.regions;
+    List<RegionInfo> regions = unit.fixRegions;
     expect(regions, hasLength(3));
     // regions[0] is the addition of `?` to the type of `i`.
     assertRegion(
@@ -1596,7 +1592,7 @@
 }
 ''', migratedContent: '''
 String? g() {
-  int x = 1;
+  int  x = 1;
   if (x == 2) return x == 3 ? "Hello" : null;
   return "Hello";
 }
@@ -1733,7 +1729,7 @@
 ''', migratedContent: '''
 void f() {
   String? s = null;
-  var x = <List<String?>>{
+  var x = <List<String?> >{
     ["hello"],
     if (1 == 2) [s]
   };
@@ -1777,7 +1773,7 @@
   if (i == null) return;
 }
 ''', migratedContent: '''
-void f(int/*!*/ i) {
+void f(int /*!*/ i) {
   /* if (i == null) return; */
 }
 ''');
@@ -1785,9 +1781,15 @@
         .where(
             (regionInfo) => regionInfo.offset == unit.content.indexOf('/* if'))
         .single;
-    // The reason data associated with dead code removal is a non-nullable node,
-    // and we don't currently generate a trace for non-nullable nodes.
-    expect(region.traces, isEmpty);
+    expect(region.traces, hasLength(1));
+    var trace = region.traces.single;
+    expect(trace.description, 'Non-nullability reason');
+    var entries = trace.entries;
+    expect(entries, hasLength(2));
+    // Entry 0 is the nullability of f's argument
+    assertTraceEntry(unit, entries[0], 'f', unit.content.indexOf('int'));
+    // Entry 1 is the edge from f's argument to never, due to the `/*!*/` hint.
+    assertTraceEntry(unit, entries[1], 'f', unit.content.indexOf('int'));
   }
 
   Future<void> test_trace_nullableType() async {
@@ -1816,7 +1818,7 @@
     var trace = region.traces.single;
     expect(trace.description, 'Nullability reason');
     var entries = trace.entries;
-    expect(entries, hasLength(6));
+    expect(entries, hasLength(5));
     // Entry 0 is the nullability of f's argument
     assertTraceEntry(
         unit, entries[0], 'f', unit.content.indexOf('int? i) {} // f'));
@@ -1830,16 +1832,12 @@
     assertTraceEntry(unit, entries[3], 'h', unit.content.indexOf('null'));
     // Entry 4 is the nullability of the null literal.
     assertTraceEntry(unit, entries[4], 'h', unit.content.indexOf('null'));
-    // Entry 5 is the edge from always to null.
-    // TODO(paulberry): this edge provides no additional useful information and
-    // shouldn't be included in the trace.
-    assertTraceEntry(unit, entries[5], 'h', unit.content.indexOf('null'));
   }
 
   Future<void> test_trace_nullCheck() async {
     UnitInfo unit = await buildInfoForSingleTestFile(
         'int f(int/*?*/ i) => i + 1;',
-        migratedContent: 'int f(int?/*?*/ i) => i! + 1;');
+        migratedContent: 'int  f(int?/*?*/ i) => i! + 1;');
     var region = unit.regions
         .where((regionInfo) => regionInfo.offset == unit.content.indexOf('! +'))
         .single;
@@ -1847,13 +1845,11 @@
     var trace = region.traces.single;
     expect(trace.description, 'Nullability reason');
     var entries = trace.entries;
-    expect(entries, hasLength(2));
+    expect(entries, hasLength(1));
     // Entry 0 is the nullability of the type of i.
-    assertTraceEntry(unit, entries[0], 'f', unit.content.indexOf('int?'));
+    // TODO(paulberry): -1 is a bug.
+    assertTraceEntry(unit, entries[0], 'f', unit.content.indexOf('int?') - 1);
     // Entry 1 is the edge from always to the type of i.
-    // TODO(paulberry): this edge provides no additional useful information and
-    // shouldn't be included in the trace.
-    assertTraceEntry(unit, entries[1], 'f', unit.content.indexOf('int?'));
   }
 
   Future<void> test_trace_nullCheck_notNullableReason() async {
@@ -1868,10 +1864,10 @@
   g(i);
 }
 ''', migratedContent: '''
-void f(int i) { // f
+void f(int  i) { // f
   assert(i != null);
 }
-void g(int i) { // g
+void g(int  i) { // g
   f(i); // call f
 }
 void h(int?/*?*/ i) {
@@ -1887,25 +1883,19 @@
     var trace = region.traces[1];
     expect(trace.description, 'Non-nullability reason');
     var entries = trace.entries;
-    expect(entries, hasLength(5));
+    expect(entries, hasLength(4));
     // Entry 0 is the nullability of g's argument
     assertTraceEntry(
-        unit, entries[0], 'g', unit.content.indexOf('int i) { // g'));
+        unit, entries[0], 'g', unit.content.indexOf('int  i) { // g'));
     // Entry 1 is the edge from g's argument to f's argument, due to g's call to
     // f.
     assertTraceEntry(
         unit, entries[1], 'g', unit.content.indexOf('i); // call f'));
     // Entry 2 is the nullability of f's argument
     assertTraceEntry(
-        unit, entries[2], 'f', unit.content.indexOf('int i) { // f'));
+        unit, entries[2], 'f', unit.content.indexOf('int  i) { // f'));
     // Entry 3 is the edge f's argument to never, due to the assert.
     assertTraceEntry(unit, entries[3], 'f', unit.content.indexOf('assert'));
-    // Entry 4 is the "never" node.
-    // TODO(paulberry): this node provides no additional useful information and
-    // shouldn't be included in the trace.
-    expect(entries[4].description, 'never');
-    expect(entries[4].function, null);
-    expect(entries[4].target, null);
   }
 
   Future<void> test_trace_substitutionNode() async {
@@ -1917,12 +1907,12 @@
 Map<int, String> x = {};
 String/*!*/ y = x[0];
 ''', migratedContent: '''
-class C<T extends Object/*!*/> {}
+class C<T extends Object /*!*/> {}
 
 C<int? /*?*/ >? c;
 
-Map<int, String> x = {};
-String/*!*/ y = x[0]!;
+Map<int , String >  x = {};
+String /*!*/ y = x[0]!;
 ''');
     var region = unit.regions
         .where((regionInfo) => regionInfo.offset == unit.content.indexOf('!;'))
@@ -1935,6 +1925,21 @@
     expect(region.traces[0].description, 'Non-nullability reason');
   }
 
+  Future<void> test_type_not_made_nullable() async {
+    UnitInfo unit = await buildInfoForSingleTestFile('int i = 0;',
+        migratedContent: 'int  i = 0;');
+    var region = unit.regions
+        .where((regionInfo) => regionInfo.offset == unit.content.indexOf('  i'))
+        .single;
+    expect(region.length, 1);
+    expect(region.lineNumber, 1);
+    expect(region.explanation, "Type 'int' was not made nullable");
+    expect(region.details, isEmpty);
+    expect(region.edits.map((edit) => edit.description).toSet(),
+        {'Force type to be non-nullable.', 'Force type to be nullable.'});
+    expect(region.traces, isEmpty);
+  }
+
   Future<void> test_uninitializedField() async {
     UnitInfo unit = await buildInfoForSingleTestFile('''
 class C {
@@ -2006,7 +2011,7 @@
   if (1 == 2) v1 = 7;
   g(v1!);
 }
-void g(int i) => print(i.isEven);
+void g(int  i) => print(i.isEven);
 ''');
     List<RegionInfo> regions = unit.fixRegions;
     expect(regions, hasLength(2));
diff --git a/pkg/analysis_server/test/src/edit/nnbd_migration/nnbd_migration_test_base.dart b/pkg/analysis_server/test/src/edit/nnbd_migration/nnbd_migration_test_base.dart
index 0412601..427e00e 100644
--- a/pkg/analysis_server/test/src/edit/nnbd_migration/nnbd_migration_test_base.dart
+++ b/pkg/analysis_server/test/src/edit/nnbd_migration/nnbd_migration_test_base.dart
@@ -101,8 +101,7 @@
     // Build the migration info.
     InstrumentationInformation info = instrumentationListener.data;
     InfoBuilder builder = InfoBuilder(
-        resourceProvider, includedRoot, info, listener, adapter, migration,
-        explainNonNullableTypes: true);
+        resourceProvider, includedRoot, info, listener, adapter, migration);
     infos = await builder.explainMigration();
   }
 }
diff --git a/pkg/analysis_server/test/src/edit/nnbd_migration/region_renderer_test.dart b/pkg/analysis_server/test/src/edit/nnbd_migration/region_renderer_test.dart
index c004b7e..3f1d5ea 100644
--- a/pkg/analysis_server/test/src/edit/nnbd_migration/region_renderer_test.dart
+++ b/pkg/analysis_server/test/src/edit/nnbd_migration/region_renderer_test.dart
@@ -59,34 +59,34 @@
     expect(response.line, equals(1));
   }
 
+  @FailingTest(reason: "Unmodified output reason doesn't contain detail")
   Future<void> test_unmodifiedOutput_containsDetail() async {
     await buildInfoForSingleTestFile('f(int a) => a.isEven;',
-        migratedContent: 'f(int a) => a.isEven;');
-    var response = renderRegion(2);
-    expect(response.details, hasLength(1));
-    var detail = response.details.single;
-    expect(
-        detail.description,
-        equals('This value is unconditionally used in a '
-            'non-nullable context'));
-    expect(detail.link.path, equals('test.dart'));
-    expect(detail.link.href, equals('test.dart?offset=12&line=1'));
+        migratedContent: 'f(int  a) => a.isEven;');
+    var response = renderRegion(5);
+    expect(response.details, isNotEmpty);
+    // TODO(paulberry): fix and re-enable.
+//    expect(response.details, hasLength(1));
+//    var detail = response.details.single;
+//    expect(
+//        detail.description,
+//        equals('This value is unconditionally used in a '
+//            'non-nullable context'));
+//    expect(detail.link.path, equals('test.dart'));
+//    expect(detail.link.href, equals('test.dart?offset=12&line=1'));
   }
 
   Future<void> test_unmodifiedOutput_containsExplanation() async {
     await buildInfoForSingleTestFile('f(int a) => a.isEven;',
-        migratedContent: 'f(int a) => a.isEven;');
-    var response = renderRegion(2);
-    expect(
-        response.explanation,
-        equals(
-            'This type is not changed; it is determined to be non-nullable'));
+        migratedContent: 'f(int  a) => a.isEven;');
+    var response = renderRegion(5);
+    expect(response.explanation, equals("Type 'int' was not made nullable"));
   }
 
   Future<void> test_unmodifiedOutput_containsPath() async {
     await buildInfoForSingleTestFile('f(int a) => a.isEven;',
-        migratedContent: 'f(int a) => a.isEven;');
-    var response = renderRegion(2);
+        migratedContent: 'f(int  a) => a.isEven;');
+    var response = renderRegion(5);
     expect(response.path, equals(convertPath('/project/bin/test.dart')));
     expect(response.line, equals(1));
   }
diff --git a/pkg/analysis_server/test/src/edit/nnbd_migration/unit_renderer_test.dart b/pkg/analysis_server/test/src/edit/nnbd_migration/unit_renderer_test.dart
index b719f79..c0ac125 100644
--- a/pkg/analysis_server/test/src/edit/nnbd_migration/unit_renderer_test.dart
+++ b/pkg/analysis_server/test/src/edit/nnbd_migration/unit_renderer_test.dart
@@ -41,7 +41,7 @@
 bool b = a.isEven;
 ''', migratedContent: '''
 int? a = null;
-bool b = a!.isEven;
+bool  b = a!.isEven;
 ''');
     var output = renderUnits()[0];
     var editList = output.edits;
@@ -54,7 +54,7 @@
 bool b = a.isEven;
 ''', migratedContent: '''
 int? a = null;
-bool b = a!.isEven;
+bool  b = a!.isEven;
 ''');
     var output = renderUnits()[0];
     expect(output.edits, hasLength(2));
@@ -63,7 +63,7 @@
     expect(output.edits[0].explanation,
         equals("Changed type 'int' to be nullable"));
     expect(output.edits[1].line, equals(2));
-    expect(output.edits[1].offset, equals(25));
+    expect(output.edits[1].offset, equals(26));
     expect(output.edits[1].explanation,
         equals('Added a non-null assertion to nullable expression'));
   }
@@ -82,7 +82,7 @@
 List<int> x = [null];
 ''', migratedContent: '''
 class C {
-  int hash(Iterable<int> elements) {
+  int  hash(Iterable<int >  elements) {
     if (elements == null) {
       return null.hashCode;
     }
@@ -90,7 +90,7 @@
   }
 }
 
-List<int?> x = [null];
+List<int?>  x = [null];
 ''', removeViaComments: false);
     renderUnits();
     // No assertions necessary; we are checking to make sure there is no crash.
@@ -110,7 +110,7 @@
 List<int> x = [null];
 ''', migratedContent: '''
 class C {
-  int hash(Iterable<int> elements) {
+  int  hash(Iterable<int >  elements) {
     if (elements == null) {
       return null.hashCode;
     }
@@ -118,7 +118,7 @@
   }
 }
 
-List<int?> x = [null];
+List<int?>  x = [null];
 ''', removeViaComments: false);
     var output = renderUnits()[0];
     // Strip out URLs and span IDs; they're not being tested here.
@@ -127,7 +127,7 @@
         .replaceAll(RegExp('id="[^"]*"'), 'id="..."');
     expect(navContent, '''
 class <span id="...">C</span> {
-  <a href="..." class="nav-link">int</a> <span id="...">hash</span>(<a href="..." class="nav-link">Iterable</a>&lt;<a href="..." class="nav-link">int</a>&gt; <span id="...">elements</span>) {
+  <a href="..." class="nav-link">int</a>  <span id="...">hash</span>(<a href="..." class="nav-link">Iterable</a>&lt;<a href="..." class="nav-link">int</a> &gt;  <span id="...">elements</span>) {
     if (<a href="..." class="nav-link">elements</a> <a href="..." class="nav-link">==</a> null) {
       return null.<a href="..." class="nav-link">hashCode</a>;
     }
@@ -135,13 +135,13 @@
   }
 }
 
-<a href="..." class="nav-link">List</a>&lt;<a href="..." class="nav-link">int</a>?&gt; <span id="...">x</span> = <span id="...">[null]</span>;
+<a href="..." class="nav-link">List</a>&lt;<a href="..." class="nav-link">int</a>?&gt;  <span id="...">x</span> = <span id="...">[null]</span>;
 ''');
   }
 
   Future<void> test_navContentContainsEscapedHtml() async {
     await buildInfoForSingleTestFile('List<String> a = null;',
-        migratedContent: 'List<String>? a = null;');
+        migratedContent: 'List<String >? a = null;');
     var output = renderUnits()[0];
     // Strip out URLs which will change; not being tested here.
     var navContent =
@@ -149,7 +149,7 @@
     expect(
         navContent,
         contains(r'<a href="..." class="nav-link">List</a>'
-            r'&lt;<a href="..." class="nav-link">String</a>&gt;? '
+            r'&lt;<a href="..." class="nav-link">String</a> &gt;? '
             r'<span id="o13">a</span> = <span id="o17">null</span>;'));
   }
 
@@ -193,7 +193,7 @@
 }
 ''', migratedContent: '''
 import 'dart:async';
-Future<int> f(Future<int> x) {
+Future<int >  f(Future<int >  x) {
   return x.whenComplete(() {});
 }
 ''');
@@ -203,31 +203,36 @@
 
   Future<void> test_regionsContainsEscapedHtml_ampersand() async {
     await buildInfoForSingleTestFile('bool a = true && false;',
-        migratedContent: 'bool a = true && false;');
+        migratedContent: 'bool  a = true && false;');
     var output = renderUnits()[0];
-    expect(output.regions, contains('bool a = true &amp;&amp; false;'));
+    expect(
+        output.regions,
+        contains('bool<span class="region informative-region" data-offset="4" '
+            'data-line="1"> </span> a = true &amp;&amp; false;'));
   }
 
   Future<void> test_regionsContainsEscapedHtml_betweenRegions() async {
     await buildInfoForSingleTestFile('List<String> a = null;',
-        migratedContent: 'List<String>? a = null;');
-    var output = renderUnits()[0];
-    var regions = _stripDataAttributes(output.regions);
-    expect(
-        regions,
-        contains('List&lt;String&gt;'
-            '<span class="region added-region">?</span> a = null;'));
-  }
-
-  Future<void> test_regionsContainsEscapedHtml_region() async {
-    await buildInfoForSingleTestFile('f(List<String> a) => a.join(",");',
-        migratedContent: 'f(List<String> a) => a.join(",");');
+        migratedContent: 'List<String >? a = null;');
     var output = renderUnits()[0];
     var regions = _stripDataAttributes(output.regions);
     expect(
         regions,
         contains(
-            '<span class="region unchanged-region">List&lt;String&gt;</span>'));
+            'List&lt;String<span class="region informative-region"> </span>&gt;'
+            '<span class="region added-region">?</span> a = null;'));
+  }
+
+  Future<void> test_regionsContainsEscapedHtml_region() async {
+    await buildInfoForSingleTestFile('f(List<String> a) => a.join(",");',
+        migratedContent: 'f(List<String >  a) => a.join(",");');
+    var output = renderUnits()[0];
+    var regions = _stripDataAttributes(output.regions);
+    expect(
+        regions,
+        contains(
+            'List&lt;String<span class="region informative-region"> </span>'
+            '&gt;<span class="region informative-region"> </span>'));
   }
 
   UnitInfo unit(String path, String content, {List<RegionInfo> regions}) {
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 13c325b..b315f25 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
@@ -65,6 +65,26 @@
 ''');
   }
 
+  Future<void> test_setterOnDirective() async {
+    addSource('/home/test/lib/a.dart', r'''
+void set setter(int i) {}
+''');
+    await resolveTestUnit('''
+import 'a.dart';
+
+main() {
+  setter = 42;
+}
+''');
+    await assertHasAssistAt('import ', '''
+import 'a.dart' show setter;
+
+main() {
+  setter = 42;
+}
+''');
+  }
+
   Future<void> test_onUri() async {
     await resolveTestUnit('''
 import 'dart:math';
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 f384b72..99c530f 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
@@ -12,6 +12,7 @@
 void main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AddConstTest);
+    defineReflectiveTests(AddConstToImmutableConstructorTest);
   });
 }
 
@@ -58,3 +59,54 @@
 ''');
   }
 }
+
+@reflectiveTest
+class AddConstToImmutableConstructorTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.ADD_CONST;
+
+  @override
+  String get lintCode => LintNames.prefer_const_constructors_in_immutables;
+
+  Future<void> test_constConstructor() async {
+    addMetaPackage();
+    await resolveTestUnit('''
+import 'package:meta/meta.dart';
+
+@immutable
+class A {
+  A();
+}
+''');
+    await assertHasFix('''
+import 'package:meta/meta.dart';
+
+@immutable
+class A {
+  const A();
+}
+''');
+  }
+
+  Future<void> test_constConstructorWithComment() async {
+    addMetaPackage();
+    await resolveTestUnit('''
+import 'package:meta/meta.dart';
+
+@immutable
+class A {
+  /// Comment.
+  A();
+}
+''');
+    await assertHasFix('''
+import 'package:meta/meta.dart';
+
+@immutable
+class A {
+  /// Comment.
+  const A();
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/tool/completion_metrics/metrics_util_test.dart b/pkg/analysis_server/test/tool/completion_metrics/metrics_util_test.dart
index fb4c0c5..2826928 100644
--- a/pkg/analysis_server/test/tool/completion_metrics/metrics_util_test.dart
+++ b/pkg/analysis_server/test/tool/completion_metrics/metrics_util_test.dart
@@ -79,20 +79,21 @@
   group('MeanReciprocalRankComputer', () {
     test('empty', () {
       var mrrc = MeanReciprocalRankComputer('');
-      expect(mrrc.rankCount, equals(0));
-      expect(mrrc.ranks, isEmpty);
-      expect(mrrc.getMRR(), equals(0));
+      expect(mrrc.count, equals(0));
+      expect(mrrc.mrr, equals(0));
     });
 
     test('clear', () {
       var mrrc = MeanReciprocalRankComputer('');
       mrrc.addRank(2);
-      expect(mrrc.rankCount, equals(1));
-      expect(mrrc.ranks, isNotEmpty);
+      expect(mrrc.count, equals(1));
+      expect(mrrc.mrr, equals(1 / 2));
+      expect(mrrc.mrr_5, equals(1 / 2));
 
       mrrc.clear();
-      expect(mrrc.rankCount, equals(0));
-      expect(mrrc.ranks, isEmpty);
+      expect(mrrc.count, equals(0));
+      expect(mrrc.mrr, equals(0));
+      expect(mrrc.mrr_5, equals(0));
     });
 
     test('mmr- single value', () {
@@ -102,9 +103,9 @@
       mrrc.addRank(3);
       mrrc.addRank(3);
       mrrc.addRank(3);
-      expect(mrrc.rankCount, equals(5));
-      expect(mrrc.ranks, equals([3, 3, 3, 3, 3]));
-      expect(mrrc.getMRR(), doubleEquals(1 / 3));
+      expect(mrrc.count, equals(5));
+      expect(mrrc.mrr, doubleEquals(1 / 3));
+      expect(mrrc.mrr_5, doubleEquals(1 / 3));
     });
 
     test('mmr- example', () {
@@ -112,19 +113,21 @@
       mrrc.addRank(3);
       mrrc.addRank(2);
       mrrc.addRank(1);
-      expect(mrrc.rankCount, equals(3));
-      expect(mrrc.ranks, equals([3, 2, 1]));
-      expect(mrrc.getMRR(), doubleEquals(11 / 18));
+      expect(mrrc.count, equals(3));
+      expect(mrrc.mrr, doubleEquals(11 / 18));
+      expect(mrrc.mrr_5, doubleEquals(11 / 18));
     });
 
     test('mmr- max rank', () {
       var mrrc = MeanReciprocalRankComputer('');
+      mrrc.addRank(6);
+      mrrc.addRank(5);
+      mrrc.addRank(4);
       mrrc.addRank(3);
       mrrc.addRank(2);
       mrrc.addRank(1);
-      expect(mrrc.rankCount, equals(3));
-      expect(mrrc.ranks, equals([3, 2, 1]));
-      expect(mrrc.getMRR(2), doubleEquals(1 / 2));
+      expect(mrrc.count, equals(6));
+      expect(mrrc.mrr, greaterThan(mrrc.mrr_5));
     });
   });
 
diff --git a/pkg/analysis_server/test/utils/package_root.dart b/pkg/analysis_server/test/utils/package_root.dart
index 1957a61..ab5cdac 100644
--- a/pkg/analysis_server/test/utils/package_root.dart
+++ b/pkg/analysis_server/test/utils/package_root.dart
@@ -11,7 +11,8 @@
 String get packageRoot {
   // If the package root directory is specified on the command line using
   // -DpkgRoot=..., use it.
-  String pkgRootVar = const String.fromEnvironment('pkgRoot');
+  const String pkgRootVar =
+      bool.hasEnvironment('pkgRoot') ? String.fromEnvironment('pkgRoot') : null;
   if (pkgRootVar != null) {
     String path = pathos.join(Directory.current.path, pkgRootVar);
     if (!path.endsWith(pathos.separator)) path += pathos.separator;
diff --git a/pkg/analysis_server/tool/completion_metrics/metrics_util.dart b/pkg/analysis_server/tool/completion_metrics/metrics_util.dart
index 2a75fee..b9bca81 100644
--- a/pkg/analysis_server/tool/completion_metrics/metrics_util.dart
+++ b/pkg/analysis_server/tool/completion_metrics/metrics_util.dart
@@ -84,49 +84,59 @@
   }
 }
 
-/// A computer for the mean reciprocal rank,
+/// A computer for the mean reciprocal rank. The MRR as well as the MRR only
+/// if the item was in the top 5 in the list see [MAX_RANK], is computed.
 /// https://en.wikipedia.org/wiki/Mean_reciprocal_rank.
 class MeanReciprocalRankComputer {
+  static final int MAX_RANK = 5;
   final String name;
-  final List<int> ranks = [];
-  MeanReciprocalRankComputer(this.name);
+  double _sum = 0;
+  double _sum_5 = 0;
+  int _count = 0;
 
-  int get rankCount => ranks.length;
+  MeanReciprocalRankComputer(
+    this.name,
+  );
+
+  int get count => _count;
 
   void addRank(int rank) {
-    ranks.add(rank);
+    if (rank != 0) {
+      _sum += 1 / rank;
+      if (rank <= MAX_RANK) {
+        _sum_5 += 1 / rank;
+      }
+    }
+    _count++;
   }
 
-  void clear() => ranks.clear();
+  void clear() {
+    _sum = 0;
+    _sum_5 = 0;
+    _count = 0;
+  }
 
-  double getMRR([int maxRank = 0]) {
-    if (ranks.isEmpty || maxRank < 0) {
+  double get mrr {
+    if (count == 0) {
       return 0;
     }
-    double sum = 0;
-    ranks.forEach((rank) {
-      if (maxRank == 0) {
-        if (rank != 0) {
-          sum += 1 / rank;
-        }
-      } else {
-        if (rank != 0 && rank <= maxRank) {
-          sum += 1 / rank;
-        }
-      }
-    });
-    return sum / rankCount;
+    return _sum / count;
+  }
+
+  double get mrr_5 {
+    if (count == 0) {
+      return 0;
+    }
+    return _sum_5 / count;
   }
 
   void printMean() {
-    var mrrVal = getMRR();
-    print('Mean Reciprocal Rank \'$name\' (total = $rankCount)');
-    print('mmr   = ${mrrVal.toStringAsFixed(6)} '
-        '(inverse = ${(1 / mrrVal).toStringAsFixed(3)})');
+    print('Mean Reciprocal Rank \'$name\' (total = $count)');
+    print('mmr   = ${mrr.toStringAsFixed(6)} '
+        '(inverse = ${(1 / mrr).toStringAsFixed(3)})');
 
-    var mrrVal5 = getMRR(5);
-    print('mmr_5 = ${mrrVal5.toStringAsFixed(6)} '
-        '(inverse = ${(1 / mrrVal5).toStringAsFixed(3)})');
+    print('mmr_5 = ${mrr_5.toStringAsFixed(6)} '
+        '(inverse = ${(1 / mrr_5).toStringAsFixed(3)})');
   }
 }
 
diff --git a/pkg/analysis_server_client/lib/server.dart b/pkg/analysis_server_client/lib/server.dart
index 7dde935..f02c204 100644
--- a/pkg/analysis_server_client/lib/server.dart
+++ b/pkg/analysis_server_client/lib/server.dart
@@ -6,39 +6,22 @@
 import 'dart:convert';
 import 'dart:io';
 
+import 'package:analysis_server_client/src/server_base.dart';
 import 'package:analysis_server_client/listener/server_listener.dart';
 import 'package:analysis_server_client/protocol.dart';
 import 'package:path/path.dart';
-
-/// Type of callbacks used to process notifications.
-typedef NotificationProcessor = void Function(Notification notification);
+export 'package:analysis_server_client/src/server_base.dart'
+    show NotificationProcessor;
 
 /// Instances of the class [Server] manage a server process,
 /// and facilitate communication to and from the server.
 ///
 /// Clients may not extend, implement or mix-in this class.
-class Server {
-  /// If not `null`, [_listener] will be sent information
-  /// about interactions with the server.
-  final ServerListener _listener;
-
+class Server extends ServerBase {
   /// Server process object, or `null` if server hasn't been started yet
   /// or if the server has already been stopped.
   Process _process;
 
-  /// Replicate all stdout/stderr data from the server process to stdout/stderr,
-  /// when true.
-  final bool _stdioPassthrough;
-
-  /// Commands that have been sent to the server but not yet acknowledged,
-  /// and the [Completer] objects which should be completed
-  /// when acknowledgement is received.
-  final _pendingCommands = <String, Completer<Map<String, dynamic>>>{};
-
-  /// Number which should be used to compute the 'id'
-  /// to send in the next command sent to the server.
-  int _nextId = 0;
-
   /// The stderr subscription or `null` if either
   /// [listenToOutput] has not been called or [stop] has been called.
   StreamSubscription<String> _stderrSubscription;
@@ -49,13 +32,13 @@
 
   Server(
       {ServerListener listener, Process process, bool stdioPassthrough = false})
-      : _listener = listener,
-        _process = process,
-        _stdioPassthrough = stdioPassthrough;
+      : _process = process,
+        super(listener: listener, stdioPassthrough: stdioPassthrough);
 
   /// Force kill the server. Returns exit code future.
+  @override
   Future<int> kill({String reason = 'none'}) {
-    _listener?.killingServerProcess(reason);
+    listener?.killingServerProcess(reason);
     final process = _process;
     _process = null;
     process.kill();
@@ -64,69 +47,16 @@
 
   /// Start listening to output from the server,
   /// and deliver notifications to [notificationProcessor].
+  @override
   void listenToOutput({NotificationProcessor notificationProcessor}) {
     _stdoutSubscription = _process.stdout
         .transform(utf8.decoder)
         .transform(LineSplitter())
-        .listen((String line) {
-      if (_stdioPassthrough) stdout.writeln(line);
-      String trimmedLine = line.trim();
-
-      // Guard against lines like:
-      //   {"event":"server.connected","params":{...}}Observatory listening on ...
-      const observatoryMessage = 'Observatory listening on ';
-      if (trimmedLine.contains(observatoryMessage)) {
-        trimmedLine = trimmedLine
-            .substring(0, trimmedLine.indexOf(observatoryMessage))
-            .trim();
-      }
-      if (trimmedLine.isEmpty) {
-        return;
-      }
-
-      _listener?.messageReceived(trimmedLine);
-      Map<String, dynamic> message;
-      try {
-        message = json.decoder.convert(trimmedLine);
-      } catch (exception) {
-        _listener?.badMessage(trimmedLine, exception);
-        return;
-      }
-
-      final id = message[Response.ID];
-      if (id != null) {
-        // Handle response
-        final completer = _pendingCommands.remove(id);
-        if (completer == null) {
-          _listener?.unexpectedResponse(message, id);
-        }
-        if (message.containsKey(Response.ERROR)) {
-          completer.completeError(RequestError.fromJson(
-              ResponseDecoder(null), '.error', message[Response.ERROR]));
-        } else {
-          completer.complete(message[Response.RESULT]);
-        }
-      } else {
-        // Handle notification
-        final String event = message[Notification.EVENT];
-        if (event != null) {
-          if (notificationProcessor != null) {
-            notificationProcessor(
-                Notification(event, message[Notification.PARAMS]));
-          }
-        } else {
-          _listener?.unexpectedMessage(message);
-        }
-      }
-    });
+        .listen((line) => outputProcessor(line, notificationProcessor));
     _stderrSubscription = _process.stderr
         .transform(utf8.decoder)
         .transform(LineSplitter())
-        .listen((String line) {
-      if (_stdioPassthrough) stderr.writeln(line);
-      String trimmedLine = line.trim();
-      _listener?.errorMessage(trimmedLine);
-    });
+        .listen((line) => errorProcessor(line, notificationProcessor));
   }
 
   /// Send a command to the server. An 'id' will be automatically assigned.
@@ -136,23 +66,10 @@
   /// the future will be completed with the 'result' field from the response.
   /// If the server acknowledges the command with an error response,
   /// the future will be completed with an error.
+  @override
   Future<Map<String, dynamic>> send(
-      String method, Map<String, dynamic> params) {
-    String id = '${_nextId++}';
-    Map<String, dynamic> command = <String, dynamic>{
-      Request.ID: id,
-      Request.METHOD: method
-    };
-    if (params != null) {
-      command[Request.PARAMS] = params;
-    }
-    final completer = Completer<Map<String, dynamic>>();
-    _pendingCommands[id] = completer;
-    String line = json.encode(command);
-    _listener?.requestSent(line);
-    _process.stdin.add(utf8.encoder.convert('$line\n'));
-    return completer.future;
-  }
+          String method, Map<String, dynamic> params) =>
+      sendCommandWith(method, params, _process.stdin.add);
 
   /// Start the server.
   ///
@@ -166,6 +83,7 @@
   /// If [enableAsserts] is specified, then asserts will be enabled in the new
   /// dart process for that server. This is typically just useful to enable
   /// locally for debugging.
+  @override
   Future start({
     String clientId,
     String clientVersion,
@@ -222,48 +140,30 @@
     // Add the server executable.
     //
     arguments.add(serverPath);
-    //
-    // Add server arguments.
-    //
-    // TODO(danrubel): Consider moving all cmdline argument consts
-    // out of analysis_server and into analysis_server_client
-    if (clientId != null) {
-      arguments.add('--client-id');
-      arguments.add(clientId);
-    }
-    if (clientVersion != null) {
-      arguments.add('--client-version');
-      arguments.add(clientVersion);
-    }
-    if (suppressAnalytics) {
-      arguments.add('--suppress-analytics');
-    }
-    if (diagnosticPort != null) {
-      arguments.add('--port');
-      arguments.add(diagnosticPort.toString());
-    }
-    if (instrumentationLogFile != null) {
-      arguments.add('--instrumentation-log-file=$instrumentationLogFile');
-    }
-    if (sdkPath != null) {
-      arguments.add('--sdk=$sdkPath');
-    }
-    if (useAnalysisHighlight2) {
-      arguments.add('--useAnalysisHighlight2');
-    }
-    _listener?.startingServer(dartBinary, arguments);
+
+    arguments.addAll(getServerArguments(
+        clientId: clientId,
+        clientVersion: clientVersion,
+        suppressAnalytics: suppressAnalytics,
+        diagnosticPort: diagnosticPort,
+        instrumentationLogFile: instrumentationLogFile,
+        sdkPath: sdkPath,
+        useAnalysisHighlight2: useAnalysisHighlight2));
+
+    listener?.startingServer(dartBinary, arguments);
     _process = await Process.start(dartBinary, arguments);
     // ignore: unawaited_futures
     _process.exitCode.then((int code) {
       if (code != 0 && _process != null) {
         // Report an error if server abruptly terminated
-        _listener?.unexpectedStop(code);
+        listener?.unexpectedStop(code);
       }
     });
   }
 
   /// Attempt to gracefully shutdown the server.
   /// If that fails, then kill the process.
+  @override
   Future<int> stop({Duration timeLimit}) async {
     timeLimit ??= const Duration(seconds: 5);
     if (_process == null) {
@@ -286,7 +186,7 @@
     return process.exitCode.timeout(
       timeLimit,
       onTimeout: () {
-        _listener?.killingServerProcess('server failed to exit');
+        listener?.killingServerProcess('server failed to exit');
         process.kill();
         return process.exitCode;
       },
diff --git a/pkg/analysis_server_client/lib/src/server_base.dart b/pkg/analysis_server_client/lib/src/server_base.dart
new file mode 100644
index 0000000..bb1e02e
--- /dev/null
+++ b/pkg/analysis_server_client/lib/src/server_base.dart
@@ -0,0 +1,207 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for 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:analysis_server_client/listener/server_listener.dart';
+import 'package:analysis_server_client/protocol.dart';
+
+/// Type of callbacks used to process notifications.
+typedef NotificationProcessor = void Function(Notification notification);
+
+/// A function via which data can be sent to a started server.
+typedef CommandSender = void Function(List<int> utf8bytes);
+
+///
+/// Add server arguments.
+///
+/// TODO(danrubel): Consider moving all cmdline argument consts
+/// out of analysis_server and into analysis_server_client.
+List<String> getServerArguments({
+  String clientId,
+  String clientVersion,
+  int diagnosticPort,
+  String instrumentationLogFile,
+  String sdkPath,
+  bool suppressAnalytics,
+  bool useAnalysisHighlight2 = false,
+}) {
+  List<String> arguments = [];
+
+  if (clientId != null) {
+    arguments.add('--client-id');
+    arguments.add(clientId);
+  }
+  if (clientVersion != null) {
+    arguments.add('--client-version');
+    arguments.add(clientVersion);
+  }
+  if (suppressAnalytics) {
+    arguments.add('--suppress-analytics');
+  }
+  if (diagnosticPort != null) {
+    arguments.add('--port');
+    arguments.add(diagnosticPort.toString());
+  }
+  if (instrumentationLogFile != null) {
+    arguments.add('--instrumentation-log-file=$instrumentationLogFile');
+  }
+  if (sdkPath != null) {
+    arguments.add('--sdk=$sdkPath');
+  }
+  if (useAnalysisHighlight2) {
+    arguments.add('--useAnalysisHighlight2');
+  }
+  return arguments;
+}
+
+/// Implementations of the class [ServerBase] manage an analysis server,
+/// and facilitate communication to and from the server.
+///
+/// Clients outside of this package may not extend or implement this class.
+abstract class ServerBase {
+  /// Replicate all data from the server process to stdout/stderr, when true.
+  final bool _stdioPassthrough;
+
+  /// Number which should be used to compute the 'id'
+  /// to send in the next command sent to the server.
+  int _nextId = 0;
+
+  /// If not `null`, [_listener] will be sent information
+  /// about interactions with the server.
+  final ServerListener _listener;
+
+  ServerListener get listener => _listener;
+
+  ServerBase({ServerListener listener, bool stdioPassthrough = false})
+      : _listener = listener,
+        _stdioPassthrough = stdioPassthrough;
+
+  /// Commands that have been sent to the server but not yet acknowledged,
+  /// and the [Completer] objects which should be completed
+  /// when acknowledgement is received.
+  final _pendingCommands = <String, Completer<Map<String, dynamic>>>{};
+
+  /// Force kill the server. Returns a future that completes when the server
+  /// stops.
+  Future kill({String reason = 'none'});
+
+  /// Start listening to output from the server,
+  /// and deliver notifications to [notificationProcessor].
+  void listenToOutput({NotificationProcessor notificationProcessor});
+
+  /// Send a command to the server. An 'id' will be automatically assigned.
+  /// The returned [Future] will be completed when the server acknowledges
+  /// the command with a response.
+  /// If the server acknowledges the command with a normal (non-error) response,
+  /// the future will be completed with the 'result' field from the response.
+  /// If the server acknowledges the command with an error response,
+  /// the future will be completed with an error.
+  Future<Map<String, dynamic>> send(String method, Map<String, dynamic> params);
+
+  /// Encodes a request for transmission and sends it as a utf8 encoded byte
+  /// string with [sendWith].
+  Future<Map<String, dynamic>> sendCommandWith(
+      String method, Map<String, dynamic> params, CommandSender sendWith) {
+    String id = '${_nextId++}';
+    Map<String, dynamic> command = <String, dynamic>{
+      Request.ID: id,
+      Request.METHOD: method
+    };
+    if (params != null) {
+      command[Request.PARAMS] = params;
+    }
+    final completer = Completer<Map<String, dynamic>>();
+    _pendingCommands[id] = completer;
+    String line = json.encode(command);
+    listener?.requestSent(line);
+    sendWith(utf8.encoder.convert('$line\n'));
+    return completer.future;
+  }
+
+  /// If the implementation of [ServerBase] captures an error stream,
+  /// it can use this to forward the errors to [listener] and [stderr] if
+  /// appropriate.
+  void errorProcessor(
+      String line, NotificationProcessor notificationProcessor) {
+    if (_stdioPassthrough) stderr.writeln(line);
+    String trimmedLine = line.trim();
+    listener?.errorMessage(trimmedLine);
+  }
+
+  /// Handle a (possibly) json encoded object, completing the [Completer] in
+  /// [_pendingCommands] corresponding to the response.  Reports problems in
+  /// decoding or message synchronization using [listener], and replicates
+  /// raw data to [stdout] as appropriate.
+  void outputProcessor(
+      String line, NotificationProcessor notificationProcessor) {
+    if (_stdioPassthrough) stdout.writeln(line);
+    String trimmedLine = line.trim();
+
+    // Guard against lines like:
+    //   {"event":"server.connected","params":{...}}Observatory listening on ...
+    const observatoryMessage = 'Observatory listening on ';
+    if (trimmedLine.contains(observatoryMessage)) {
+      trimmedLine = trimmedLine
+          .substring(0, trimmedLine.indexOf(observatoryMessage))
+          .trim();
+    }
+    if (trimmedLine.isEmpty) {
+      return;
+    }
+
+    listener?.messageReceived(trimmedLine);
+    Map<String, dynamic> message;
+    try {
+      message = json.decoder.convert(trimmedLine);
+    } catch (exception) {
+      listener?.badMessage(trimmedLine, exception);
+      return;
+    }
+
+    final id = message[Response.ID];
+    if (id != null) {
+      // Handle response
+      final completer = _pendingCommands.remove(id);
+      if (completer == null) {
+        listener?.unexpectedResponse(message, id);
+      }
+      if (message.containsKey(Response.ERROR)) {
+        completer.completeError(RequestError.fromJson(
+            ResponseDecoder(null), '.error', message[Response.ERROR]));
+      } else {
+        completer.complete(message[Response.RESULT]);
+      }
+    } else {
+      // Handle notification
+      final String event = message[Notification.EVENT];
+      if (event != null) {
+        if (notificationProcessor != null) {
+          notificationProcessor(
+              Notification(event, message[Notification.PARAMS]));
+        }
+      } else {
+        listener?.unexpectedMessage(message);
+      }
+    }
+  }
+
+  /// Start the server.  The returned future completes when the server
+  /// is started and it is valid to call [listenToOutput].
+  Future start({
+    String clientId,
+    String clientVersion,
+    int diagnosticPort,
+    String instrumentationLogFile,
+    String sdkPath,
+    bool suppressAnalytics,
+    bool useAnalysisHighlight2,
+  });
+
+  /// Attempt to gracefully shutdown the server.
+  /// If that fails, then force it to shut down.
+  Future stop({Duration timeLimit});
+}
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index bb65367..47f3f08 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -126,7 +126,7 @@
   CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR,
   CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT,
   CompileTimeErrorCode.CONTINUE_LABEL_ON_SWITCH,
-  CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR_MISMATCH,
+  CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR,
   CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER,
   CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR,
   CompileTimeErrorCode.DEFAULT_VALUE_ON_REQUIRED_PARAMETER,
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 6376a63..5a3f02a 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -91,7 +91,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 = 98;
+  static const int DATA_VERSION = 99;
 
   /// The length of the list returned by [_computeDeclaredVariablesSignature].
   static const int _declaredVariablesSignatureLength = 4;
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 7c6cc1c..4ab24f0 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -89,13 +89,6 @@
   final List<UsedImportedElements> _usedImportedElementsList = [];
   final List<UsedLocalElements> _usedLocalElementsList = [];
 
-  /**
-   * Constants in the current library.
-   *
-   * TODO(scheglov) Remove after https://github.com/dart-lang/sdk/issues/31925
-   */
-  final Set<ConstantEvaluationTarget> _libraryConstants = {};
-
   final Set<ConstantEvaluationTarget> _constants = {};
 
   LibraryAnalyzer(
@@ -158,7 +151,6 @@
 
     timerLibraryAnalyzerConst.start();
     units.values.forEach(_findConstants);
-    _clearConstantEvaluationResults();
     _computeConstants();
     timerLibraryAnalyzerConst.stop();
 
@@ -215,24 +207,6 @@
     return results;
   }
 
-  /**
-   * Clear evaluation results for all constants before computing them again.
-   * The reason is described in https://github.com/dart-lang/sdk/issues/35940
-   *
-   * Otherwise, we reuse results, including errors are recorded only when
-   * we evaluate constants resynthesized from summaries.
-   *
-   * TODO(scheglov) Remove after https://github.com/dart-lang/sdk/issues/31925
-   */
-  void _clearConstantEvaluationResults() {
-    for (var constant in _libraryConstants) {
-      if (constant is ConstFieldElementImpl_ofEnum) continue;
-      if (constant is ConstVariableElement) {
-        constant.evaluationResult = null;
-      }
-    }
-  }
-
   void _computeConstantErrors(
       ErrorReporter errorReporter, CompilationUnit unit) {
     ConstantVerifier constantVerifier = ConstantVerifier(
@@ -450,7 +424,6 @@
   void _findConstants(CompilationUnit unit) {
     ConstantFinder constantFinder = ConstantFinder();
     unit.accept(constantFinder);
-    _libraryConstants.addAll(constantFinder.constantsToCompute);
     _constants.addAll(constantFinder.constantsToCompute);
 
     var dependenciesFinder = ConstantExpressionsDependenciesFinder();
diff --git a/pkg/analyzer/lib/src/dart/analysis/session.dart b/pkg/analyzer/lib/src/dart/analysis/session.dart
index 47f0cde..148a0ab 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session.dart
@@ -14,6 +14,7 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart' as driver;
 import 'package:analyzer/src/dart/analysis/uri_converter.dart';
+import 'package:analyzer/src/dart/element/class_hierarchy.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
@@ -38,6 +39,7 @@
   /// The cache of libraries for URIs.
   final Map<String, LibraryElement> _uriToLibraryCache = {};
 
+  final ClassHierarchy classHierarchy = ClassHierarchy();
   final InheritanceManager3 inheritanceManager = InheritanceManager3();
 
   /// Initialize a newly created analysis session.
diff --git a/pkg/analyzer/lib/src/dart/element/class_hierarchy.dart b/pkg/analyzer/lib/src/dart/element/class_hierarchy.dart
new file mode 100644
index 0000000..a02599d
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/element/class_hierarchy.dart
@@ -0,0 +1,110 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for 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/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/type_algebra.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+
+class ClassHierarchy {
+  final Map<ClassElement, _Hierarchy> _map = {};
+
+  List<InterfaceType> implementedInterfaces(ClassElement element) {
+    var hierarchy = _map[element];
+
+    if (hierarchy != null) {
+      return hierarchy.interfaces;
+    }
+
+    hierarchy = _Hierarchy(
+      interfaces: const <InterfaceType>[],
+    );
+    _map[element] = hierarchy;
+
+    var library = element.library as LibraryElementImpl;
+    var typeSystem = library.typeSystem;
+    var map = <ClassElement, _ClassInterfaceType>{};
+
+    void appendOne(InterfaceType type) {
+      var element = type.element;
+      if (library.isNonNullableByDefault) {
+        var classResult = map[element];
+        if (classResult == null) {
+          classResult = _ClassInterfaceType(typeSystem);
+          map[element] = classResult;
+        }
+        classResult.update(type);
+      } else {
+        map[element] ??= _ClassInterfaceType(typeSystem)..update(type);
+      }
+    }
+
+    void append(InterfaceType type) {
+      if (type == null) {
+        return;
+      }
+
+      appendOne(type);
+
+      var substitution = Substitution.fromInterfaceType(type);
+      var rawInterfaces = implementedInterfaces(type.element);
+      for (var rawInterface in rawInterfaces) {
+        var newInterface = substitution.substituteType(rawInterface);
+        newInterface = library.toLegacyTypeIfOptOut(newInterface);
+        appendOne(newInterface);
+      }
+    }
+
+    append(element.supertype);
+    for (var type in element.superclassConstraints) {
+      append(type);
+    }
+    for (var type in element.interfaces) {
+      append(type);
+    }
+    for (var type in element.mixins) {
+      append(type);
+    }
+
+    var result = map.values.map((e) => e.type).toList(growable: false);
+    hierarchy.interfaces = result;
+    return result;
+  }
+}
+
+class _ClassInterfaceType {
+  final TypeSystemImpl _typeSystem;
+
+  InterfaceType _notNormalized;
+  InterfaceType _currentMerge;
+
+  _ClassInterfaceType(this._typeSystem);
+
+  InterfaceType get type => _currentMerge ?? _notNormalized;
+
+  void update(InterfaceType type) {
+    if (_currentMerge == null) {
+      if (_notNormalized == null) {
+        _notNormalized = type;
+        return;
+      } else {
+        _currentMerge = _typeSystem.normalize(_notNormalized);
+      }
+    }
+
+    var normType = _typeSystem.normalize(type);
+    try {
+      _currentMerge = _typeSystem.topMerge(_currentMerge, normType);
+    } catch (e) {
+      // ignored
+    }
+  }
+}
+
+class _Hierarchy {
+  List<InterfaceType> interfaces;
+
+  _Hierarchy({this.interfaces});
+}
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index ff2cdda..332fbe9 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -12,6 +12,7 @@
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/error.dart';
+import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/constant/compute.dart';
 import 'package:analyzer/src/dart/constant/evaluation.dart';
 import 'package:analyzer/src/dart/constant/value.dart';
@@ -519,9 +520,8 @@
 
   @override
   List<InterfaceType> get allSupertypes {
-    List<InterfaceType> list = <InterfaceType>[];
-    collectAllSupertypes(list, thisType, thisType);
-    return list;
+    var sessionImpl = library.session as AnalysisSessionImpl;
+    return sessionImpl.classHierarchy.implementedInterfaces(this);
   }
 
   @override
@@ -1164,7 +1164,13 @@
   bool _isInterfaceTypeClass(DartType type) {
     if (type is InterfaceType) {
       var element = type.element;
-      return !element.isEnum && !element.isMixin;
+      if (element.isEnum || element.isMixin) {
+        return false;
+      }
+      if (type.isDartCoreFunction) {
+        return false;
+      }
+      return true;
     }
     return false;
   }
@@ -1172,7 +1178,9 @@
   /// Return `true` if the given [type] is an [InterfaceType] that can be used
   /// as an interface or a mixin.
   bool _isInterfaceTypeInterface(DartType type) {
-    return type is InterfaceType && !type.element.isEnum;
+    return type is InterfaceType &&
+        !type.element.isEnum &&
+        !type.isDartCoreFunction;
   }
 
   bool _safeIsOrInheritsProxy(
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 6736d8d..9c45ee3 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -85,13 +85,6 @@
     String name = nameNode.name;
     _currentName = Name(_definingLibraryUri, name);
 
-    //
-    // Synthetic identifiers have been already reported during parsing.
-    //
-    if (nameNode.isSynthetic) {
-      return;
-    }
-
     Expression receiver = node.realTarget;
 
     if (receiver == null) {
@@ -670,11 +663,14 @@
     } else if (receiverType is FunctionType) {
       receiverClassName = 'Function';
     }
-    _resolver.errorReporter.reportErrorForNode(
-      StaticTypeWarningCode.UNDEFINED_METHOD,
-      nameNode,
-      [name, receiverClassName],
-    );
+
+    if (!nameNode.isSynthetic) {
+      _resolver.errorReporter.reportErrorForNode(
+        StaticTypeWarningCode.UNDEFINED_METHOD,
+        nameNode,
+        [name, receiverClassName],
+      );
+    }
   }
 
   void _resolveReceiverTypeLiteral(MethodInvocation node, ClassElement receiver,
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 6ec81e3..b857c95 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -1348,15 +1348,12 @@
           "A continue label resolves to switch, must be loop or switch member");
 
   /**
-   * It is an error to call the default List constructor with a length argument
-   * and a type argument which is potentially non-nullable.
+   * It is an error to call the default `List` constructor.
    */
-  static const CompileTimeErrorCode DEFAULT_LIST_CONSTRUCTOR_MISMATCH =
-      CompileTimeErrorCode(
-          'DEFAULT_LIST_CONSTRUCTOR_MISMATCH',
-          "A list whose values can't be 'null' can't be given an initial "
-              "length because the initial values would all be 'null'.",
-          correction: "Try removing the argument or using 'List.filled'.");
+  static const CompileTimeErrorCode DEFAULT_LIST_CONSTRUCTOR =
+      CompileTimeErrorCode('DEFAULT_LIST_CONSTRUCTOR',
+          "It is an error to call the default List constructor.",
+          correction: "Try using 'List.filled' or 'List.generate'.");
 
   /**
    * 6.2.1 Required Formals: By means of a function signature that names the
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 3242a16..a67b61e 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -1789,9 +1789,8 @@
     }
 
     if (extendsClause != null) {
-      InterfaceType superclassType = _enclosingClass.supertype;
-      ClassElement superclassElement = superclassType?.element;
-      if (superclassElement != null && superclassElement.name == "Function") {
+      Element superElement = extendsClause.superclass.name.staticElement;
+      if (superElement != null && superElement.name == "Function") {
         _errorReporter.reportErrorForNode(
             HintCode.DEPRECATED_EXTENDS_FUNCTION, extendsClause.superclass);
       }
@@ -3300,13 +3299,11 @@
       InstanceCreationExpression node, InterfaceType type) {
     if (!_isNonNullableByDefault) return;
 
-    if (node.constructorName.name == null &&
-        node.argumentList.arguments.length == 1 &&
-        type.isDartCoreList &&
-        _typeSystem.isPotentiallyNonNullable(type.typeArguments[0])) {
+    if (node.constructorName.name == null && type.isDartCoreList) {
       _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR_MISMATCH,
-          node.constructorName);
+        CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR,
+        node.constructorName,
+      );
     }
   }
 
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index 60443f8..3a57819 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -1285,7 +1285,19 @@
   TypeProvider get typeProvider;
 
   @override
-  DartType flatten(DartType type) {
+  TypeImpl flatten(DartType type) {
+    if (identical(type, UnknownInferredType.instance)) {
+      return type;
+    }
+
+    // if T is S? then flatten(T) = flatten(S)?
+    // if T is S* then flatten(T) = flatten(S)*
+    NullabilitySuffix nullabilitySuffix = type.nullabilitySuffix;
+    if (nullabilitySuffix != NullabilitySuffix.none) {
+      var S = (type as TypeImpl).withNullability(NullabilitySuffix.none);
+      return flatten(S).withNullability(nullabilitySuffix);
+    }
+
     if (type is InterfaceType) {
       // Implement the cases:
       //  - "If T = FutureOr<S> then flatten(T) = S."
@@ -2970,12 +2982,14 @@
     var T0 = _T0 as TypeImpl;
     var T1 = _T1 as TypeImpl;
 
+    var T1_nullability = T1.nullabilitySuffix;
+    var T0_nullability = T0.nullabilitySuffix;
+
     // Right Top: if `T1` is a top type (i.e. `dynamic`, or `void`, or
     // `Object?`) then `T0 <: T1`.
     if (identical(T1, DynamicTypeImpl.instance) ||
         identical(T1, VoidTypeImpl.instance) ||
-        T1.nullabilitySuffix == NullabilitySuffix.question &&
-            T1.isDartCoreObject) {
+        T1_nullability == NullabilitySuffix.question && T1.isDartCoreObject) {
       return true;
     }
 
@@ -2994,9 +3008,7 @@
     }
 
     // Right Object: if `T1` is `Object` then:
-    var T1_nullability = T1.nullabilitySuffix;
     if (T1_nullability == NullabilitySuffix.none && T1.isDartCoreObject) {
-      var T0_nullability = T0.nullabilitySuffix;
       // * if `T0` is an unpromoted type variable with bound `B`,
       //   then `T0 <: T1` iff `B <: Object`.
       // * if `T0` is a promoted type variable `X & S`,
@@ -3039,7 +3051,6 @@
     }
 
     // Left Null: if `T0` is `Null` then:
-    var T0_nullability = T0.nullabilitySuffix;
     if (T0_nullability == NullabilitySuffix.none && T0.isDartCoreNull) {
       // * If `T1` is `FutureOr<S>` for some `S`, then the query is true iff
       // `Null <: S`.
@@ -3073,6 +3084,9 @@
     // Right Legacy `T1` is `S1*` then:
     //   * `T0 <: T1` iff `T0 <: S1?`.
     if (T1_nullability == NullabilitySuffix.star) {
+      if (T1 is FunctionType && _isFunctionTypeWithNamedRequired(T0)) {
+        T1 = _functionTypeWithNamedRequired(T1 as FunctionType);
+      }
       var S1 = T1.withNullability(NullabilitySuffix.question);
       return isSubtypeOf2(T0, S1);
     }
@@ -3737,7 +3751,9 @@
         if (gParameter.isNamed) {
           var compareNames = fParameter.name.compareTo(gParameter.name);
           if (compareNames == 0) {
-            if (fParameter.isRequiredNamed && !gParameter.isRequiredNamed) {
+            var gIsRequiredOrLegacy = gParameter.isRequiredNamed ||
+                g.nullabilitySuffix == NullabilitySuffix.star;
+            if (fParameter.isRequiredNamed && !gIsRequiredOrLegacy) {
               return false;
             } else if (isSubtypeOf2(gParameter.type, fParameter.type)) {
               fIndex++;
@@ -3876,6 +3892,32 @@
     return Substitution.fromMap({element: typeProvider.objectType})
         .substituteType(type);
   }
+
+  static FunctionTypeImpl _functionTypeWithNamedRequired(FunctionType type) {
+    return FunctionTypeImpl(
+      typeFormals: type.typeFormals,
+      parameters: type.parameters.map((e) {
+        if (e.isNamed) {
+          return ParameterElementImpl.synthetic(
+            e.name,
+            e.type,
+            ParameterKind.NAMED_REQUIRED,
+          );
+        } else {
+          return e;
+        }
+      }).toList(growable: false),
+      returnType: type.returnType,
+      nullabilitySuffix: type.nullabilitySuffix,
+    );
+  }
+
+  static bool _isFunctionTypeWithNamedRequired(DartType type) {
+    if (type is FunctionType) {
+      return type.parameters.any((e) => e.isRequiredNamed);
+    }
+    return false;
+  }
 }
 
 /// A type that is being inferred but is not currently known.
diff --git a/pkg/analyzer/lib/src/test_utilities/find_node.dart b/pkg/analyzer/lib/src/test_utilities/find_node.dart
index c53961a..1b70ef0 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_node.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_node.dart
@@ -31,6 +31,10 @@
     return _node(search, (n) => n is AssignmentExpression);
   }
 
+  AwaitExpression awaitExpression(String search) {
+    return _node(search, (n) => n is AwaitExpression);
+  }
+
   BinaryExpression binary(String search) {
     return _node(search, (n) => n is BinaryExpression);
   }
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
index 9d1f9f9..4566120 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
@@ -222,6 +222,8 @@
 
 abstract class Converter<S, T> implements StreamTransformer {}
 
+abstract class Encoding {}
+
 class JsonDecoder extends Converter<String, Object> {}
 ''',
     )
@@ -840,6 +842,8 @@
       '''
 library dart.io;
 
+import 'dart:convert';
+
 abstract class Directory implements FileSystemEntity {
   factory Directory(String path) {
     throw 0;
@@ -882,11 +886,68 @@
   static FileSystemEntityType typeSync(
     String path, {bool followLinks: true}) => throw 0;
 }
+
+enum ProcessStartMode {
+  normal,
+}
+
+abstract class Process {
+  external static Future<Process> start(
+    String executable,
+    List<String> arguments, {
+    String? workingDirectory,
+    Map<String, String>? environment,
+    bool includeParentEnvironment: true,
+    bool runInShell: false,
+    ProcessStartMode mode: ProcessStartMode.normal,
+  });
+
+  external static Future<ProcessResult> run(
+    String executable,
+    List<String> arguments, {
+    String? workingDirectory,
+    Map<String, String>? environment,
+    bool includeParentEnvironment: true,
+    bool runInShell: false,
+    Encoding? stdoutEncoding,
+    Encoding? stderrEncoding,
+  });
+}
 ''',
     )
   ],
 );
 
+final MockSdkLibrary _LIB_ISOLATE = MockSdkLibrary([
+  MockSdkLibraryUnit(
+    'dart:isolate',
+    '$sdkRoot/lib/isolate/isolate.dart',
+    '''
+library dart.isolate;
+
+abstract class SendPort {}
+
+class Isolate {
+  external static Future<Isolate> spawnUri(
+    Uri uri,
+    List<String> args,
+    var message, {
+    bool paused = false,
+    SendPort? onExit,
+    SendPort? onError,
+    bool errorsAreFatal = true,
+    bool? checked,
+    Map<String, String>? environment,
+    @deprecated Uri? packageRoot,
+    Uri? packageConfig,
+    bool automaticPackageResolution = false,
+    String? debugName,
+  });
+}
+''',
+  )
+]);
+
 final MockSdkLibrary _LIB_MATH = MockSdkLibrary(
   [
     MockSdkLibraryUnit(
@@ -927,6 +988,7 @@
   _LIB_CONVERT,
   _LIB_FFI,
   _LIB_IO,
+  _LIB_ISOLATE,
   _LIB_MATH,
   _LIB_HTML_DART2JS,
   _LIB_INTERCEPTORS,
@@ -941,6 +1003,7 @@
   'ffi': 'const LibraryInfo("ffi/ffi.dart")',
   'html': 'const LibraryInfo("html/dart2js/html_dart2js.dart")',
   'io': 'const LibraryInfo("io/io.dart")',
+  'isolate': 'const LibraryInfo("io/isolate.dart")',
   'math': 'const LibraryInfo("math/math.dart")',
 };
 
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index 3486a85..2e0b1b2 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -52,53 +52,6 @@
 
 @reflectiveTest
 class ClassElementImplTest extends AbstractTypeTest {
-  void test_getAllSupertypes_interface() {
-    ClassElement classA = class_(name: 'A');
-    ClassElement classB =
-        ElementFactory.classElement("B", interfaceTypeStar(classA));
-    ClassElementImpl elementC = ElementFactory.classElement2("C");
-    InterfaceType typeObject = classA.supertype;
-    InterfaceType typeA = interfaceTypeStar(classA);
-    InterfaceType typeB = interfaceTypeStar(classB);
-    InterfaceType typeC = interfaceTypeStar(elementC);
-    elementC.interfaces = <InterfaceType>[typeB];
-    List<InterfaceType> supers = elementC.allSupertypes;
-    List<InterfaceType> types = <InterfaceType>[];
-    types.addAll(supers);
-    expect(types.contains(typeA), isTrue);
-    expect(types.contains(typeB), isTrue);
-    expect(types.contains(typeObject), isTrue);
-    expect(types.contains(typeC), isFalse);
-  }
-
-  void test_getAllSupertypes_mixins() {
-    ClassElement classA = class_(name: 'A');
-    ClassElement classB =
-        ElementFactory.classElement("B", interfaceTypeStar(classA));
-    var classC = ElementFactory.classElement2("C");
-    InterfaceType typeObject = classA.supertype;
-    InterfaceType typeA = interfaceTypeStar(classA);
-    InterfaceType typeB = interfaceTypeStar(classB);
-    InterfaceType typeC = interfaceTypeStar(classC);
-    classC.mixins = <InterfaceType>[typeB];
-    List<InterfaceType> supers = classC.allSupertypes;
-    List<InterfaceType> types = <InterfaceType>[];
-    types.addAll(supers);
-    expect(types.contains(typeA), isTrue);
-    expect(types.contains(typeB), isTrue);
-    expect(types.contains(typeObject), isTrue);
-    expect(types.contains(typeC), isFalse);
-  }
-
-  void test_getAllSupertypes_recursive() {
-    var classA = class_(name: 'A');
-    ClassElementImpl classB =
-        ElementFactory.classElement("B", interfaceTypeStar(classA));
-    classA.supertype = interfaceTypeStar(classB);
-    List<InterfaceType> supers = classB.allSupertypes;
-    expect(supers, hasLength(1));
-  }
-
   void test_getField() {
     var classA = class_(name: 'A');
     String fieldName = "f";
diff --git a/pkg/analyzer/test/src/dart/element/flatten_type_test.dart b/pkg/analyzer/test/src/dart/element/flatten_type_test.dart
new file mode 100644
index 0000000..a27da75
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/element/flatten_type_test.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.
+
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/dart/element/type_provider.dart';
+import 'package:analyzer/src/generated/resolver.dart' show TypeSystemImpl;
+import 'package:analyzer/src/generated/type_system.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';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FlattenTypeTest);
+  });
+}
+
+@reflectiveTest
+class FlattenTypeTest with ElementsTypesMixin {
+  @override
+  TypeProvider typeProvider;
+
+  TypeSystemImpl typeSystem;
+
+  FeatureSet get testFeatureSet {
+    return FeatureSet.forTesting(
+      additionalFeatures: [Feature.non_nullable],
+    );
+  }
+
+  void setUp() {
+    var analysisContext = TestAnalysisContext(
+      featureSet: testFeatureSet,
+    );
+    typeProvider = analysisContext.typeProviderNonNullableByDefault;
+    typeSystem = analysisContext.typeSystemNonNullableByDefault;
+  }
+
+  test_dynamic() {
+    _check(dynamicNone, 'dynamic');
+  }
+
+  test_interfaceType_none() {
+    _check(futureNone(intNone), 'int');
+    _check(futureNone(intQuestion), 'int?');
+    _check(futureNone(intStar), 'int*');
+
+    // otherwise if T is FutureOr<S> then flatten(T) = S
+    _check(futureOrNone(intNone), 'int');
+    _check(futureOrNone(intQuestion), 'int?');
+    _check(futureOrNone(intStar), 'int*');
+  }
+
+  test_interfaceType_question() {
+    _check(futureQuestion(intNone), 'int?');
+    _check(futureQuestion(intQuestion), 'int?');
+    _check(futureQuestion(intStar), 'int?');
+
+    _check(futureQuestion(listNone(intNone)), 'List<int>?');
+    _check(futureQuestion(listQuestion(intNone)), 'List<int>?');
+    _check(futureQuestion(listStar(intNone)), 'List<int>?');
+
+    _check(futureOrQuestion(intNone), 'int?');
+    _check(futureOrQuestion(intQuestion), 'int?');
+    _check(futureOrQuestion(intStar), 'int?');
+  }
+
+  test_interfaceType_star() {
+    _check(futureStar(intNone), 'int*');
+    _check(futureStar(intQuestion), 'int*');
+    _check(futureStar(intStar), 'int*');
+
+    _check(futureStar(listNone(intNone)), 'List<int>*');
+    _check(futureStar(listQuestion(intNone)), 'List<int>*');
+    _check(futureStar(listStar(intNone)), 'List<int>*');
+
+    _check(futureOrStar(intNone), 'int*');
+    _check(futureOrStar(intQuestion), 'int*');
+    _check(futureOrStar(intStar), 'int*');
+  }
+
+  test_unknownInferredType() {
+    var type = UnknownInferredType.instance;
+    expect(typeSystem.flatten(type), same(type));
+  }
+
+  void _check(DartType T, String expected) {
+    var result = typeSystem.flatten(T);
+    expect(
+      result.getDisplayString(withNullability: true),
+      expected,
+    );
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/element/subtype_test.dart b/pkg/analyzer/test/src/dart/element/subtype_test.dart
index 21a9c25..66d8fb5 100644
--- a/pkg/analyzer/test/src/dart/element/subtype_test.dart
+++ b/pkg/analyzer/test/src/dart/element/subtype_test.dart
@@ -2220,6 +2220,36 @@
     );
   }
 
+  test_functionType_requiredNamedParameter_03() {
+    var F0 = functionTypeStar(
+      returnType: voidNone,
+      parameters: [
+        namedParameter(name: 'a', type: intStar),
+      ],
+    );
+
+    var F1 = functionTypeNone(
+      returnType: voidNone,
+      parameters: [
+        namedRequiredParameter(name: 'a', type: intNone),
+      ],
+    );
+
+    isSubtype(
+      F0,
+      F1,
+      strT0: 'void Function({int* a})*',
+      strT1: 'void Function({required int a})',
+    );
+
+    isSubtype(
+      F1,
+      F0,
+      strT0: 'void Function({required int a})',
+      strT1: 'void Function({int* a})*',
+    );
+  }
+
   test_futureOr_01() {
     isSubtype(
       intStar,
diff --git a/pkg/analyzer/test/src/dart/element/test_all.dart b/pkg/analyzer/test/src/dart/element/test_all.dart
index 8a98bd6..43eab7c 100644
--- a/pkg/analyzer/test/src/dart/element/test_all.dart
+++ b/pkg/analyzer/test/src/dart/element/test_all.dart
@@ -6,6 +6,7 @@
 
 import 'element_test.dart' as element;
 import 'factor_type_test.dart' as factor_type;
+import 'flatten_type_test.dart' as flatten_type;
 import 'function_type_test.dart' as function_type;
 import 'inheritance_manager3_test.dart' as inheritance_manager3;
 import 'least_upper_bound_helper_test.dart' as least_upper_bound_helper;
@@ -25,6 +26,7 @@
   defineReflectiveSuite(() {
     element.main();
     factor_type.main();
+    flatten_type.main();
     function_type.main();
     inheritance_manager3.main();
     least_upper_bound_helper.main();
diff --git a/pkg/analyzer/test/src/dart/resolution/await_expression_test.dart b/pkg/analyzer/test/src/dart/resolution/await_expression_test.dart
new file mode 100644
index 0000000..74b5b02
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/await_expression_test.dart
@@ -0,0 +1,80 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for 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/dart/analysis/experiments.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AwaitExpressionResolutionTest);
+    defineReflectiveTests(AwaitExpressionResolutionWithNullSafetyTest);
+  });
+}
+
+@reflectiveTest
+class AwaitExpressionResolutionTest extends DriverResolutionTest {
+  test_future() async {
+    await assertNoErrorsInCode(r'''
+import 'dart:async';
+
+f(Future<int> a) async {
+  await a;
+}
+''');
+
+    assertType(findNode.awaitExpression('await a'), 'int');
+  }
+
+  test_futureOr() async {
+    await assertNoErrorsInCode(r'''
+import 'dart:async';
+
+f(FutureOr<int> a) async {
+  await a;
+}
+''');
+
+    assertType(findNode.awaitExpression('await a'), 'int');
+  }
+}
+
+@reflectiveTest
+class AwaitExpressionResolutionWithNullSafetyTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = FeatureSet.fromEnableFlags(
+      [EnableString.non_nullable],
+    );
+
+  @override
+  bool get typeToStringWithNullability => true;
+
+  test_futureOrQ() async {
+    await assertNoErrorsInCode(r'''
+import 'dart:async';
+
+f(FutureOr<int>? a) async {
+  await a;
+}
+''');
+
+    assertType(findNode.awaitExpression('await a'), 'int?');
+  }
+
+  test_futureQ() async {
+    await assertNoErrorsInCode(r'''
+import 'dart:async';
+
+f(Future<int>? a) async {
+  await a;
+}
+''');
+
+    assertType(findNode.awaitExpression('await a'), 'int?');
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/class_alias_test.dart b/pkg/analyzer/test/src/dart/resolution/class_alias_test.dart
index b077ff5..da98f88 100644
--- a/pkg/analyzer/test/src/dart/resolution/class_alias_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/class_alias_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../../generated/elements_types_mixin.dart';
 import 'driver_resolution.dart';
 
 main() {
@@ -13,7 +14,8 @@
 }
 
 @reflectiveTest
-class ClassAliasDriverResolutionTest extends DriverResolutionTest {
+class ClassAliasDriverResolutionTest extends DriverResolutionTest
+    with ElementsTypesMixin {
   test_defaultConstructor() async {
     await assertNoErrorsInCode(r'''
 class A {}
@@ -43,6 +45,51 @@
     assertElementTypeStrings(x.interfaces, ['C']);
   }
 
+  test_element_typeFunction_extends() async {
+    await assertNoErrorsInCode(r'''
+class A {}
+class X = Function with A;
+''');
+    var x = findElement.class_('X');
+    assertType(x.supertype, 'Object');
+  }
+
+  test_element_typeFunction_implements() async {
+    await assertNoErrorsInCode(r'''
+class A {}
+class B {}
+class X = Object with A implements A, Function, B;
+''');
+    var a = findElement.class_('A');
+    var b = findElement.class_('B');
+    var x = findElement.class_('X');
+    assertElementTypes(
+      x.interfaces,
+      [
+        interfaceTypeStar(a),
+        interfaceTypeStar(b),
+      ],
+    );
+  }
+
+  test_element_typeFunction_with() async {
+    await assertNoErrorsInCode(r'''
+class A {}
+class B {}
+class X = Object with A, Function, B;
+''');
+    var a = findElement.class_('A');
+    var b = findElement.class_('B');
+    var x = findElement.class_('X');
+    assertElementTypes(
+      x.mixins,
+      [
+        interfaceTypeStar(a),
+        interfaceTypeStar(b),
+      ],
+    );
+  }
+
   @failingTest
   test_implicitConstructors_const() async {
     await assertNoErrorsInCode(r'''
diff --git a/pkg/analyzer/test/src/dart/resolution/class_test.dart b/pkg/analyzer/test/src/dart/resolution/class_test.dart
index 953b08a..9d2f341 100644
--- a/pkg/analyzer/test/src/dart/resolution/class_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/class_test.dart
@@ -130,6 +130,54 @@
     );
   }
 
+  test_element_typeFunction_extends() async {
+    await assertErrorsInCode(r'''
+class A extends Function {}
+''', [
+      error(HintCode.DEPRECATED_EXTENDS_FUNCTION, 16, 8),
+    ]);
+    var a = findElement.class_('A');
+    assertType(a.supertype, 'Object');
+  }
+
+  test_element_typeFunction_implements() async {
+    await assertNoErrorsInCode(r'''
+class A {}
+class B {}
+class C implements A, Function, B {}
+''');
+    var a = findElement.class_('A');
+    var b = findElement.class_('B');
+    var c = findElement.class_('C');
+    assertElementTypes(
+      c.interfaces,
+      [
+        interfaceTypeStar(a),
+        interfaceTypeStar(b),
+      ],
+    );
+  }
+
+  test_element_typeFunction_with() async {
+    await assertErrorsInCode(r'''
+class A {}
+class B {}
+class C extends Object with A, Function, B {}
+''', [
+      error(HintCode.DEPRECATED_MIXIN_FUNCTION, 53, 8),
+    ]);
+    var a = findElement.class_('A');
+    var b = findElement.class_('B');
+    var c = findElement.class_('C');
+    assertElementTypes(
+      c.mixins,
+      [
+        interfaceTypeStar(a),
+        interfaceTypeStar(b),
+      ],
+    );
+  }
+
   test_error_conflictingConstructorAndStaticField_field() async {
     await assertErrorsInCode(r'''
 class C {
diff --git a/pkg/analyzer/test/src/dart/resolution/constant_test.dart b/pkg/analyzer/test/src/dart/resolution/constant_test.dart
index ecd3b1d..2ad2114 100644
--- a/pkg/analyzer/test/src/dart/resolution/constant_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/constant_test.dart
@@ -6,9 +6,11 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/dart/constant/value.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/test_utilities/find_element.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -191,6 +193,37 @@
     expect(a.computeConstantValue().toIntValue(), 42);
   }
 
+  test_imported_super_defaultFieldFormalParameter() async {
+    newFile('/test/lib/a.dart', content: r'''
+import 'test.dart';
+
+class A {
+  static const B b = const B();
+
+  final bool f1;
+  final bool f2;
+
+  const A({this.f1: false}) : this.f2 = f1 && true;
+}
+''');
+
+    await assertNoErrorsInCode(r'''
+import 'a.dart';
+
+class B extends A {
+  const B() : super();
+}
+''');
+
+    result = await resolveFile(convertPath('/test/lib/a.dart'));
+    assertErrorsInResolvedUnit(result, []);
+
+    var bElement = FindElement(result.unit).field('b') as ConstVariableElement;
+    var bValue = bElement.evaluationResult.value;
+    var superFields = bValue.getField(GenericState.SUPERCLASS_FIELD);
+    expect(superFields.getField('f1').toBoolValue(), false);
+  }
+
   test_local_prefixedIdentifier_staticField_extension() async {
     await assertNoErrorsInCode(r'''
 const a = E.f;
diff --git a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
index 9e13317..c6ce42f 100644
--- a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
@@ -6,6 +6,7 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/dart/error/syntactic_errors.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -1580,6 +1581,31 @@
     );
   }
 
+  test_syntheticName() async {
+    // This code is invalid, and the constructor initializer has a method
+    // invocation with a synthetic name. But we should still resolve the
+    // invocation, and resolve all its arguments.
+    await assertErrorsInCode(r'''
+class A {
+  A() : B(1 + 2, [0]);
+}
+''', [
+      error(ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER, 18, 1),
+      error(CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD, 18, 13),
+    ]);
+
+    assertMethodInvocation2(
+      findNode.methodInvocation(');'),
+      element: null,
+      typeArgumentTypes: [],
+      invokeType: 'dynamic',
+      type: 'dynamic',
+    );
+
+    assertType(findNode.binary('1 + 2'), 'int');
+    assertType(findNode.listLiteral('[0]'), 'List<int>');
+  }
+
   test_typeArgumentTypes_generic_inferred() async {
     await assertErrorsInCode(r'''
 U foo<T, U>(T a) => null;
@@ -1794,66 +1820,6 @@
     );
   }
 
-  test_nullShorting_cascade_firstMethodInvocation() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  int foo() => 0;
-  int bar() => 0;
-}
-
-main(A? a) {
-  a?..foo()..bar();
-}
-''');
-
-    assertMethodInvocation2(
-      findNode.methodInvocation('..foo()'),
-      element: findElement.method('foo'),
-      typeArgumentTypes: [],
-      invokeType: 'int Function()',
-      type: 'int',
-    );
-
-    assertMethodInvocation2(
-      findNode.methodInvocation('..bar()'),
-      element: findElement.method('bar'),
-      typeArgumentTypes: [],
-      invokeType: 'int Function()',
-      type: 'int',
-    );
-
-    assertType(findNode.cascade('a?'), 'A?');
-  }
-
-  test_nullShorting_cascade_firstPropertyAccess() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  int get foo => 0;
-  int bar() => 0;
-}
-
-main(A? a) {
-  a?..foo..bar();
-}
-''');
-
-    assertPropertyAccess2(
-      findNode.propertyAccess('..foo'),
-      element: findElement.getter('foo'),
-      type: 'int',
-    );
-
-    assertMethodInvocation2(
-      findNode.methodInvocation('..bar()'),
-      element: findElement.method('bar'),
-      typeArgumentTypes: [],
-      invokeType: 'int Function()',
-      type: 'int',
-    );
-
-    assertType(findNode.cascade('a?'), 'A?');
-  }
-
   test_hasReceiver_interfaceTypeQ_defined() async {
     await assertErrorsInCode(r'''
 class A {
@@ -2016,4 +1982,64 @@
       type: 'void',
     );
   }
+
+  test_nullShorting_cascade_firstMethodInvocation() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int foo() => 0;
+  int bar() => 0;
+}
+
+main(A? a) {
+  a?..foo()..bar();
+}
+''');
+
+    assertMethodInvocation2(
+      findNode.methodInvocation('..foo()'),
+      element: findElement.method('foo'),
+      typeArgumentTypes: [],
+      invokeType: 'int Function()',
+      type: 'int',
+    );
+
+    assertMethodInvocation2(
+      findNode.methodInvocation('..bar()'),
+      element: findElement.method('bar'),
+      typeArgumentTypes: [],
+      invokeType: 'int Function()',
+      type: 'int',
+    );
+
+    assertType(findNode.cascade('a?'), 'A?');
+  }
+
+  test_nullShorting_cascade_firstPropertyAccess() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int get foo => 0;
+  int bar() => 0;
+}
+
+main(A? a) {
+  a?..foo..bar();
+}
+''');
+
+    assertPropertyAccess2(
+      findNode.propertyAccess('..foo'),
+      element: findElement.getter('foo'),
+      type: 'int',
+    );
+
+    assertMethodInvocation2(
+      findNode.methodInvocation('..bar()'),
+      element: findElement.method('bar'),
+      typeArgumentTypes: [],
+      invokeType: 'int Function()',
+      type: 'int',
+    );
+
+    assertType(findNode.cascade('a?'), 'A?');
+  }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/test_all.dart b/pkg/analyzer/test/src/dart/resolution/test_all.dart
index 91f8c97..cc7c7b9 100644
--- a/pkg/analyzer/test/src/dart/resolution/test_all.dart
+++ b/pkg/analyzer/test/src/dart/resolution/test_all.dart
@@ -6,6 +6,7 @@
 
 import 'assignment_test.dart' as assignment;
 import 'ast_rewrite_test.dart' as ast_rewrite;
+import 'await_expression_test.dart' as await_expression;
 import 'binary_expression_test.dart' as binary_expression;
 import 'class_alias_test.dart' as class_alias;
 import 'class_test.dart' as class_resolution;
@@ -56,6 +57,7 @@
   defineReflectiveSuite(() {
     assignment.main();
     ast_rewrite.main();
+    await_expression.main();
     binary_expression.main();
     class_alias.main();
     class_resolution.main();
diff --git a/pkg/analyzer/test/src/diagnostics/default_list_constructor_mismatch_test.dart b/pkg/analyzer/test/src/diagnostics/default_list_constructor_test.dart
similarity index 79%
rename from pkg/analyzer/test/src/diagnostics/default_list_constructor_mismatch_test.dart
rename to pkg/analyzer/test/src/diagnostics/default_list_constructor_test.dart
index 64b11f1..5609204d 100644
--- a/pkg/analyzer/test/src/diagnostics/default_list_constructor_mismatch_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/default_list_constructor_test.dart
@@ -24,10 +24,9 @@
 
   test_inferredType() async {
     await assertErrorsInCode('''
-class C {}
-List<C> v = List(5);
+List<int> v = List(5);
 ''', [
-      error(CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR_MISMATCH, 23, 4),
+      error(CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR, 14, 4),
     ]);
   }
 
@@ -35,7 +34,7 @@
     await assertErrorsInCode('''
 var l = new List<int>(3);
 ''', [
-      error(CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR_MISMATCH, 12, 9),
+      error(CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR, 12, 9),
     ]);
   }
 
@@ -46,9 +45,11 @@
   }
 
   test_nullableType() async {
-    await assertNoErrorsInCode('''
-var l = new List<String?>(3);
-''');
+    await assertErrorsInCode('''
+var l = new List<int?>(3);
+''', [
+      error(CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR, 12, 10),
+    ]);
   }
 
   test_optOut() async {
@@ -64,7 +65,7 @@
   var l = new List<T>(3);
 }
 ''', [
-      error(CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR_MISMATCH, 27, 7),
+      error(CompileTimeErrorCode.DEFAULT_LIST_CONSTRUCTOR, 27, 7),
     ]);
   }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 523f762..67486e1 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -58,8 +58,7 @@
 import 'const_spread_expected_map_test.dart' as const_spread_expected_map;
 import 'dead_code_test.dart' as dead_code;
 import 'dead_null_aware_expression_test.dart' as dead_null_aware_expression;
-import 'default_list_constructor_mismatch_test.dart'
-    as default_list_constructor_mismatch;
+import 'default_list_constructor_test.dart' as default_list_constructor;
 import 'default_value_in_function_type_test.dart'
     as default_value_in_function_type;
 import 'default_value_in_function_typed_parameter_test.dart'
@@ -543,7 +542,7 @@
     const_spread_expected_map.main();
     dead_code.main();
     dead_null_aware_expression.main();
-    default_list_constructor_mismatch.main();
+    default_list_constructor.main();
     default_value_in_function_type.main();
     default_value_in_function_typed_parameter.main();
     default_value_in_redirecting_factory_constructor.main();
diff --git a/pkg/analyzer/test/utils/package_root.dart b/pkg/analyzer/test/utils/package_root.dart
index 1957a61..8055970 100644
--- a/pkg/analyzer/test/utils/package_root.dart
+++ b/pkg/analyzer/test/utils/package_root.dart
@@ -11,7 +11,9 @@
 String get packageRoot {
   // If the package root directory is specified on the command line using
   // -DpkgRoot=..., use it.
-  String pkgRootVar = const String.fromEnvironment('pkgRoot');
+  String pkgRootVar = const bool.hasEnvironment('pkgRoot')
+      ? const String.fromEnvironment('pkgRoot')
+      : null;
   if (pkgRootVar != null) {
     String path = pathos.join(Directory.current.path, pkgRootVar);
     if (!path.endsWith(pathos.separator)) path += pathos.separator;
diff --git a/pkg/analyzer_cli/analysis_options.yaml b/pkg/analyzer_cli/analysis_options.yaml
index 7a3c1f2..ff9fb29 100644
--- a/pkg/analyzer_cli/analysis_options.yaml
+++ b/pkg/analyzer_cli/analysis_options.yaml
@@ -31,7 +31,7 @@
     - library_prefixes
     - no_duplicate_case_values
     - null_closures
-    #- omit_local_variable_types # 273
+    - omit_local_variable_types
     - prefer_adjacent_string_concatenation
     - prefer_collection_literals
     - prefer_conditional_assignment
diff --git a/pkg/analyzer_cli/bin/analyzer.dart b/pkg/analyzer_cli/bin/analyzer.dart
index 3568e65..4381de7 100644
--- a/pkg/analyzer_cli/bin/analyzer.dart
+++ b/pkg/analyzer_cli/bin/analyzer.dart
@@ -12,7 +12,7 @@
 /// [sendPort] may be passed in when started in an isolate. If provided, it is
 /// used for bazel worker communication instead of stdin/stdout.
 void main(List<String> args, [SendPort sendPort]) async {
-  CommandLineStarter starter = CommandLineStarter();
+  var starter = CommandLineStarter();
 
   // Wait for the starter to complete.
   await starter.start(args, sendPort: sendPort);
diff --git a/pkg/analyzer_cli/lib/src/analyzer_impl.dart b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
index 0f45e9f..7bb46af 100644
--- a/pkg/analyzer_cli/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
@@ -63,7 +63,7 @@
     if (unit == null || !units.add(unit)) {
       return;
     }
-    Source source = unit.source;
+    var source = unit.source;
     if (source != null) {
       files.add(source.fullName);
     }
@@ -80,14 +80,14 @@
     }
     // Add compilation units.
     addCompilationUnitSource(library.definingCompilationUnit, units);
-    for (CompilationUnitElement child in library.parts) {
+    for (var child in library.parts) {
       addCompilationUnitSource(child, units);
     }
     // Add referenced libraries.
-    for (LibraryElement child in library.importedLibraries) {
+    for (var child in library.importedLibraries) {
       addLibrarySources(child, libraries, units);
     }
-    for (LibraryElement child in library.exportedLibraries) {
+    for (var child in library.exportedLibraries) {
       addLibrarySources(child, libraries, units);
     }
   }
@@ -107,9 +107,9 @@
 
   /// Returns the maximal [ErrorSeverity] of the recorded errors.
   ErrorSeverity computeMaxErrorSeverity() {
-    ErrorSeverity status = ErrorSeverity.NONE;
-    for (ErrorsResult result in errorsResults) {
-      for (AnalysisError error in result.errors) {
+    var status = ErrorSeverity.NONE;
+    for (var result in errorsResults) {
+      for (var error in result.errors) {
         if (_defaultSeverityProcessor(error) == null) {
           continue;
         }
@@ -123,10 +123,10 @@
   Future<void> prepareErrors() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    PerformanceTag previous = _prepareErrorsTag.makeCurrent();
+    var previous = _prepareErrorsTag.makeCurrent();
     try {
-      for (String path in files) {
-        ErrorsResult errorsResult = await analysisDriver.getErrors(path);
+      for (var path in files) {
+        var errorsResult = await analysisDriver.getErrors(path);
         errorsResults.add(errorsResult);
       }
     } finally {
@@ -145,7 +145,7 @@
   void setupForAnalysis() {
     files.clear();
     errorsResults.clear();
-    Uri libraryUri = libraryFile.uri;
+    var libraryUri = libraryFile.uri;
     if (libraryUri.scheme == 'package' && libraryUri.pathSegments.isNotEmpty) {
       _selfPackageName = libraryUri.pathSegments[0];
     }
@@ -157,13 +157,13 @@
     await null;
     // Don't try to analyze parts.
     if (libraryFile.isPart) {
-      String libraryPath = libraryFile.path;
+      var libraryPath = libraryFile.path;
       stderr.writeln('Only libraries can be analyzed.');
       stderr.writeln('$libraryPath is a part and cannot be analyzed.');
       return ErrorSeverity.ERROR;
     }
 
-    LibraryElement libraryElement = await _resolveLibrary();
+    var libraryElement = await _resolveLibrary();
     prepareSources(libraryElement);
     await prepareErrors();
 
@@ -183,7 +183,7 @@
 
   /// Returns true if we want to report diagnostics for this library.
   bool _isAnalyzedLibrary(LibraryElement library) {
-    Source source = library.source;
+    var source = library.source;
     switch (source.uriKind) {
       case UriKind.DART_URI:
         return options.showSdkWarnings;
@@ -202,7 +202,7 @@
     if (uri.scheme != 'package' || uri.pathSegments.isEmpty) {
       return false;
     }
-    String packageName = uri.pathSegments.first;
+    var packageName = uri.pathSegments.first;
     if (packageName == _selfPackageName) {
       return true;
     } else if (!options.showPackageWarnings) {
@@ -217,11 +217,11 @@
   // TODO(devoncarew): This is never called.
   void _printColdPerf() {
     // Print cold VM performance numbers.
-    int totalTime = currentTimeMillis - startTime;
-    int otherTime = totalTime;
-    for (PerformanceTag tag in PerformanceTag.all) {
+    var totalTime = currentTimeMillis - startTime;
+    var otherTime = totalTime;
+    for (var tag in PerformanceTag.all) {
       if (tag != PerformanceTag.unknown) {
-        int tagTime = tag.elapsedMs;
+        var tagTime = tag.elapsedMs;
         outSink.writeln('${tag.label}-cold:$tagTime');
         otherTime -= tagTime;
       }
@@ -233,12 +233,11 @@
   Future<LibraryElement> _resolveLibrary() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    PerformanceTag previous = _resolveLibraryTag.makeCurrent();
+    var previous = _resolveLibraryTag.makeCurrent();
     try {
-      String libraryPath = libraryFile.path;
+      var libraryPath = libraryFile.path;
       analysisDriver.priorityFiles = [libraryPath];
-      UnitElementResult elementResult =
-          await analysisDriver.getUnitElement(libraryPath);
+      var elementResult = await analysisDriver.getUnitElement(libraryPath);
       return elementResult.element.library;
     } finally {
       previous.makeCurrent();
@@ -247,11 +246,11 @@
 
   /// Return `true` if the given [pathName] is in the Pub cache.
   static bool _isPathInPubCache(String pathName) {
-    List<String> parts = path.split(pathName);
+    var parts = path.split(pathName);
     if (parts.contains('.pub-cache')) {
       return true;
     }
-    for (int i = 0; i < parts.length - 2; i++) {
+    for (var i = 0; i < parts.length - 2; i++) {
       if (parts[i] == 'Pub' && parts[i + 1] == 'Cache') {
         return true;
       }
diff --git a/pkg/analyzer_cli/lib/src/batch_mode.dart b/pkg/analyzer_cli/lib/src/batch_mode.dart
index e0c8731..f147d64 100644
--- a/pkg/analyzer_cli/lib/src/batch_mode.dart
+++ b/pkg/analyzer_cli/lib/src/batch_mode.dart
@@ -23,14 +23,13 @@
   /// use in unit testing.
   void runAsBatch(List<String> sharedArgs, BatchRunnerHandler handler) {
     outSink.writeln('>>> BATCH START');
-    Stopwatch stopwatch = Stopwatch();
+    var stopwatch = Stopwatch();
     stopwatch.start();
-    int testsFailed = 0;
-    int totalTests = 0;
-    ErrorSeverity batchResult = ErrorSeverity.NONE;
+    var testsFailed = 0;
+    var totalTests = 0;
+    var batchResult = ErrorSeverity.NONE;
     // Read line from stdin.
-    Stream<String> cmdLine =
-        stdin.transform(utf8.decoder).transform(LineSplitter());
+    var cmdLine = stdin.transform(utf8.decoder).transform(LineSplitter());
     cmdLine.listen((String line) async {
       // TODO(brianwilkerson) Determine whether this await is necessary.
       await null;
@@ -51,15 +50,15 @@
       // Analyze single set of arguments.
       try {
         totalTests++;
-        ErrorSeverity result = await handler(args);
-        bool resultPass = result != ErrorSeverity.ERROR;
+        var result = await handler(args);
+        var resultPass = result != ErrorSeverity.ERROR;
         if (!resultPass) {
           testsFailed++;
         }
         batchResult = batchResult.max(result);
         // Write stderr end token and flush.
         errorSink.writeln('>>> EOF STDERR');
-        String resultPassString = resultPass ? 'PASS' : 'FAIL';
+        var resultPassString = resultPass ? 'PASS' : 'FAIL';
         outSink.writeln(
             '>>> TEST $resultPassString ${stopwatch.elapsedMilliseconds}ms');
       } catch (e, stackTrace) {
diff --git a/pkg/analyzer_cli/lib/src/build_mode.dart b/pkg/analyzer_cli/lib/src/build_mode.dart
index 6ad947b..58e8c1a 100644
--- a/pkg/analyzer_cli/lib/src/build_mode.dart
+++ b/pkg/analyzer_cli/lib/src/build_mode.dart
@@ -26,7 +26,6 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/source/source_resource.dart';
-import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/summary/summarize_elements.dart';
@@ -98,7 +97,7 @@
       outBuffer.clear();
       try {
         // Prepare inputs with their digests.
-        Map<String, WorkerInput> inputs = {};
+        var inputs = <String, WorkerInput>{};
         for (var input in request.inputs) {
           inputs[input.path] = WorkerInput(input.path, input.digest);
         }
@@ -112,19 +111,19 @@
         }
 
         // Prepare options.
-        CommandLineOptions options =
+        var options =
             CommandLineOptions.parse(arguments, printAndFail: (String msg) {
           throw ArgumentError(msg);
         });
 
         // Analyze and respond.
         await analyze(options, inputs);
-        String msg = _getErrorOutputBuffersText();
+        var msg = _getErrorOutputBuffersText();
         return WorkResponse()
           ..exitCode = EXIT_CODE_OK
           ..output = msg;
       } catch (e, st) {
-        String msg = _getErrorOutputBuffersText();
+        var msg = _getErrorOutputBuffersText();
         msg += '$e\n$st';
         return WorkResponse()
           ..exitCode = EXIT_CODE_ERROR
@@ -145,7 +144,7 @@
   }
 
   String _getErrorOutputBuffersText() {
-    String msg = '';
+    var msg = '';
     if (errorBuffer.isNotEmpty) {
       msg += errorBuffer.toString() + '\n';
     }
@@ -235,8 +234,8 @@
       }
 
       // Add sources.
-      for (Uri uri in uriToFileMap.keys) {
-        File file = uriToFileMap[uri];
+      for (var uri in uriToFileMap.keys) {
+        var file = uriToFileMap[uri];
         if (!file.exists) {
           errorSink.writeln('File not found: ${file.path}');
           io.exitCode = ErrorSeverity.ERROR.ordinal;
@@ -261,15 +260,15 @@
           _computeLinkedLibraries2();
 
           // Write the whole package bundle.
-          PackageBundleBuilder bundle = assembler.assemble();
+          var bundle = assembler.assemble();
           if (options.buildSummaryOutput != null) {
-            io.File file = io.File(options.buildSummaryOutput);
+            var file = io.File(options.buildSummaryOutput);
             file.writeAsBytesSync(bundle.toBuffer(),
                 mode: io.FileMode.writeOnly);
           }
           if (options.buildSummaryOutputSemantic != null) {
             bundle.flushInformative();
-            io.File file = io.File(options.buildSummaryOutputSemantic);
+            var file = io.File(options.buildSummaryOutputSemantic);
             file.writeAsBytesSync(bundle.toBuffer(),
                 mode: io.FileMode.writeOnly);
           }
@@ -291,7 +290,7 @@
       }
 
       if (dependencyTracker != null) {
-        io.File file = io.File(dependencyTracker.outputPath);
+        var file = io.File(dependencyTracker.outputPath);
         file.writeAsStringSync(dependencyTracker.dependencies.join('\n'));
       }
 
@@ -365,12 +364,12 @@
   }
 
   Future<ErrorSeverity> _computeMaxSeverity() async {
-    ErrorSeverity maxSeverity = ErrorSeverity.NONE;
+    var maxSeverity = ErrorSeverity.NONE;
     if (!options.buildSuppressExitCode) {
-      for (Source source in explicitSources) {
-        ErrorsResult result = await analysisDriver.getErrors(source.fullName);
-        for (AnalysisError error in result.errors) {
-          ErrorSeverity processedSeverity = determineProcessedSeverity(
+      for (var source in explicitSources) {
+        var result = await analysisDriver.getErrors(source.fullName);
+        for (var error in result.errors) {
+          var processedSeverity = determineProcessedSeverity(
               error, options, analysisDriver.analysisOptions);
           if (processedSeverity != null) {
             maxSeverity = maxSeverity.max(processedSeverity);
@@ -387,30 +386,29 @@
 
     // Adds a bundle at `path` to `summaryDataStore`.
     PackageBundle addBundle(String path) {
-      PackageBundle bundle = packageBundleProvider.get(path);
+      var bundle = packageBundleProvider.get(path);
       summaryDataStore.addBundle(path, bundle);
       return bundle;
     }
 
-    int numInputs = options.buildSummaryInputs.length;
+    var numInputs = options.buildSummaryInputs.length;
     logger.run('Add $numInputs input summaries', () {
       for (var path in options.buildSummaryInputs) {
         addBundle(path);
       }
     });
 
-    String rootPath =
+    var rootPath =
         options.sourceFiles.isEmpty ? null : options.sourceFiles.first;
     DartSdk sdk;
     logger.run('Add SDK bundle', () {
       PackageBundle sdkBundle;
       if (options.dartSdkSummaryPath != null) {
-        SummaryBasedDartSdk summarySdk =
-            SummaryBasedDartSdk(options.dartSdkSummaryPath, true);
+        var summarySdk = SummaryBasedDartSdk(options.dartSdkSummaryPath, true);
         sdk = summarySdk;
         sdkBundle = summarySdk.bundle;
       } else {
-        FolderBasedDartSdk dartSdk = FolderBasedDartSdk(
+        var dartSdk = FolderBasedDartSdk(
             resourceProvider, resourceProvider.getFolder(options.dartSdkPath));
         dartSdk.analysisOptions =
             createAnalysisOptionsForCommandLineOptions(options, rootPath);
@@ -436,7 +434,7 @@
     analysisOptions =
         createAnalysisOptionsForCommandLineOptions(options, rootPath);
 
-    AnalysisDriverScheduler scheduler = AnalysisDriverScheduler(logger);
+    var scheduler = AnalysisDriverScheduler(logger);
     analysisDriver = AnalysisDriver(
       scheduler,
       logger,
@@ -481,17 +479,17 @@
   /// "$uri|$path") to a map from URI to path. If an error occurs, report the
   /// error and return null.
   Map<Uri, File> _createUriToFileMap(List<String> sourceEntities) {
-    Map<Uri, File> uriToFileMap = <Uri, File>{};
-    for (String sourceFile in sourceEntities) {
-      int pipeIndex = sourceFile.indexOf('|');
+    var uriToFileMap = <Uri, File>{};
+    for (var sourceFile in sourceEntities) {
+      var pipeIndex = sourceFile.indexOf('|');
       if (pipeIndex == -1) {
         // TODO(paulberry): add the ability to guess the URI from the path.
         errorSink.writeln(
             'Illegal input file (must be "\$uri|\$path"): $sourceFile');
         return null;
       }
-      Uri uri = Uri.parse(sourceFile.substring(0, pipeIndex));
-      String path = sourceFile.substring(pipeIndex + 1);
+      var uri = Uri.parse(sourceFile.substring(0, pipeIndex));
+      var path = sourceFile.substring(pipeIndex + 1);
       path = resourceProvider.pathContext.absolute(path);
       path = resourceProvider.pathContext.normalize(path);
       uriToFileMap[uri] = resourceProvider.getFile(path);
@@ -512,8 +510,8 @@
   /// If the unit is in the input [summaryDataStore], do nothing.
   Future<void> _prepareUnit(String absoluteUri) async {
     // Parse the source and serialize its AST.
-    Uri uri = Uri.parse(absoluteUri);
-    Source source = sourceFactory.forUri2(uri);
+    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.
@@ -527,15 +525,15 @@
   /// is sent to a new file at that path.
   Future<void> _printErrors({String outputPath}) async {
     await logger.runAsync('Compute and print analysis errors', () async {
-      StringBuffer buffer = StringBuffer();
+      var buffer = StringBuffer();
       var severityProcessor = (AnalysisError error) =>
           determineProcessedSeverity(error, options, analysisOptions);
-      ErrorFormatter formatter = options.machineFormat
+      var formatter = options.machineFormat
           ? MachineErrorFormatter(buffer, options, stats,
               severityProcessor: severityProcessor)
           : HumanErrorFormatter(buffer, options, stats,
               severityProcessor: severityProcessor);
-      for (Source source in explicitSources) {
+      for (var source in explicitSources) {
         var result = await analysisDriver.getErrors(source.fullName);
         formatter.formatErrors([result]);
       }
@@ -544,7 +542,7 @@
         stats.print(buffer);
       }
       if (outputPath == null) {
-        StringSink sink = options.machineFormat ? errorSink : outSink;
+        var sink = options.machineFormat ? errorSink : outSink;
         sink.write(buffer);
       } else {
         io.File(outputPath).writeAsStringSync(buffer.toString());
@@ -593,7 +591,7 @@
 
   @override
   Source resolveAbsolute(Uri uri, [Uri actualUri]) {
-    File file = uriToFileMap[uri];
+    var file = uriToFileMap[uri];
     actualUri ??= uri;
     if (file == null) {
       return null;
@@ -609,7 +607,7 @@
 
   /// Build the inverse mapping of [uriToSourceMap].
   static Map<String, Uri> _computePathToUriMap(Map<Uri, File> uriToSourceMap) {
-    Map<String, Uri> pathToUriMap = <String, Uri>{};
+    var pathToUriMap = <String, Uri>{};
     uriToSourceMap.forEach((Uri uri, File file) {
       pathToUriMap[file.path] = uri;
     });
@@ -695,7 +693,7 @@
   /// Get the [PackageBundle] from the file with the given [path] in the context
   /// of the given worker [inputs].
   PackageBundle get(Map<String, WorkerInput> inputs, String path) {
-    WorkerInput input = inputs[path];
+    var input = inputs[path];
 
     // The input must be not null, otherwise we're not expected to read
     // this file, but we check anyway to be safe.
diff --git a/pkg/analyzer_cli/lib/src/context_cache.dart b/pkg/analyzer_cli/lib/src/context_cache.dart
index ffe7752..b3af37d 100644
--- a/pkg/analyzer_cli/lib/src/context_cache.dart
+++ b/pkg/analyzer_cli/lib/src/context_cache.dart
@@ -102,8 +102,7 @@
   /// This should not be used except behind the getter which caches this result
   /// automatically.
   AnalysisOptionsImpl _getAnalysisOptions() {
-    AnalysisOptionsImpl contextOptions = builder.getAnalysisOptions(
-            requestedSourceDirectory,
+    var contextOptions = builder.getAnalysisOptions(requestedSourceDirectory,
             verbosePrint: clOptions.verbose ? verbosePrint : null)
         as AnalysisOptionsImpl;
 
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index e97abae..42342cf 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -31,7 +31,6 @@
 import 'package:analyzer/src/pubspec/pubspec_validator.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/source/path_filter.dart';
-import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/summary/summary_file_builder.dart';
 import 'package:analyzer/src/summary/summary_sdk.dart' show SummaryBasedDartSdk;
@@ -62,7 +61,7 @@
 
 /// Test this option map to see if it specifies lint rules.
 bool containsLintRuleEntry(YamlMap options) {
-  YamlNode linterNode = getValue(options, 'linter');
+  var linterNode = getValue(options, 'linter');
   return linterNode is YamlMap && getValue(linterNode, 'rules') != null;
 }
 
@@ -118,32 +117,32 @@
     if (analysisDriver != null) {
       throw StateError('start() can only be called once');
     }
-    int startTime = DateTime.now().millisecondsSinceEpoch;
+    var startTime = DateTime.now().millisecondsSinceEpoch;
 
     StringUtilities.INTERNER = MappedInterner();
 
     linter.registerLintRules();
 
     // Parse commandline options.
-    CommandLineOptions options = CommandLineOptions.parse(args);
+    var options = CommandLineOptions.parse(args);
 
     // Do analysis.
     if (options.buildMode) {
-      ErrorSeverity severity = await _buildModeAnalyze(options, sendPort);
+      var severity = await _buildModeAnalyze(options, sendPort);
       // Propagate issues to the exit code.
       if (_shouldBeFatal(severity, options)) {
         io.exitCode = severity.ordinal;
       }
     } else if (options.batchMode) {
-      BatchRunner batchRunner = BatchRunner(outSink, errorSink);
+      var batchRunner = BatchRunner(outSink, errorSink);
       batchRunner.runAsBatch(args, (List<String> args) async {
         // TODO(brianwilkerson) Determine whether this await is necessary.
         await null;
-        CommandLineOptions options = CommandLineOptions.parse(args);
+        var options = CommandLineOptions.parse(args);
         return await _analyzeAll(options);
       });
     } else {
-      ErrorSeverity severity = await _analyzeAll(options);
+      var severity = await _analyzeAll(options);
       // Propagate issues to the exit code.
       if (_shouldBeFatal(severity, options)) {
         io.exitCode = severity.ordinal;
@@ -157,7 +156,7 @@
       // representative of what we see internally; call into _buildModeAnalyze()
       // with some appropriate options.
       print('\nGenerating strong mode summary...');
-      final Stopwatch stopwatch = Stopwatch()..start();
+      final stopwatch = Stopwatch()..start();
 
       for (var i = 0; i < 3; i++) {
         var featureSet = FeatureSet.fromEnableFlags([]);
@@ -174,7 +173,7 @@
     }
 
     if (options.perfReport != null) {
-      String json = makePerfReport(
+      var json = makePerfReport(
           startTime, currentTimeMillis, options, _analyzedFileCount, stats);
       io.File(options.perfReport).writeAsStringSync(json);
     }
@@ -183,7 +182,7 @@
   Future<ErrorSeverity> _analyzeAll(CommandLineOptions options) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    PerformanceTag previous = _analyzeAllTag.makeCurrent();
+    var previous = _analyzeAllTag.makeCurrent();
     try {
       return await _analyzeAllImpl(options);
     } finally {
@@ -196,7 +195,7 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     if (!options.machineFormat) {
-      List<String> fileNames = options.sourceFiles.map((String file) {
+      var fileNames = options.sourceFiles.map((String file) {
         file = path.normalize(file);
         if (file == '.') {
           file = path.basename(path.current);
@@ -210,13 +209,13 @@
     }
 
     // These are used to do part file analysis across sources.
-    Set<String> dartFiles = <String>{};
-    Set<FileState> libraryFiles = <FileState>{};
-    Set<FileState> danglingParts = <FileState>{};
+    var dartFiles = <String>{};
+    var libraryFiles = <FileState>{};
+    var danglingParts = <FileState>{};
 
     // Note: This references analysisDriver via closure, so it will change over
     // time during the following analysis.
-    SeverityProcessor defaultSeverityProcessor = (AnalysisError error) {
+    var defaultSeverityProcessor = (AnalysisError error) {
       return determineProcessedSeverity(
           error, options, analysisDriver.analysisOptions);
     };
@@ -236,7 +235,7 @@
           severityProcessor: defaultSeverityProcessor);
     }
 
-    ErrorSeverity allResult = ErrorSeverity.NONE;
+    var allResult = ErrorSeverity.NONE;
 
     void reportPartError(String partPath) {
       errorSink.writeln('$partPath is a part and cannot be analyzed.');
@@ -245,7 +244,7 @@
       allResult = allResult.max(ErrorSeverity.ERROR);
     }
 
-    for (String sourcePath in options.sourceFiles) {
+    for (var sourcePath in options.sourceFiles) {
       sourcePath = normalizePath(sourcePath);
 
       // Create a context, or re-use the previous one.
@@ -259,39 +258,38 @@
       // Add all the files to be analyzed en masse to the context. Skip any
       // files that were added earlier (whether explicitly or implicitly) to
       // avoid causing those files to be unnecessarily re-read.
-      Set<String> filesToAnalyze = <String>{};
+      var filesToAnalyze = <String>{};
 
       // Collect files for analysis.
       // Note that these files will all be analyzed in the same context.
       // This should be updated when the ContextManager re-work is complete
       // (See: https://github.com/dart-lang/sdk/issues/24133)
-      Iterable<io.File> files =
-          _collectFiles(sourcePath, analysisDriver.analysisOptions);
+      var files = _collectFiles(sourcePath, analysisDriver.analysisOptions);
       if (files.isEmpty) {
         errorSink.writeln('No dart files found at: $sourcePath');
         io.exitCode = ErrorSeverity.ERROR.ordinal;
         return ErrorSeverity.ERROR;
       }
 
-      for (io.File file in files) {
+      for (var file in files) {
         filesToAnalyze.add(file.absolute.path);
       }
 
       // Analyze the libraries.
-      for (String path in filesToAnalyze) {
+      for (var path in filesToAnalyze) {
         var shortName = resourceProvider.pathContext.basename(path);
         if (shortName == AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE) {
-          File file = resourceProvider.getFile(path);
-          String content = file.readAsStringSync();
-          LineInfo lineInfo = LineInfo.fromContent(content);
-          List<AnalysisError> errors = analyzeAnalysisOptions(
+          var file = resourceProvider.getFile(path);
+          var content = file.readAsStringSync();
+          var lineInfo = LineInfo.fromContent(content);
+          var errors = analyzeAnalysisOptions(
               file.createSource(), content, analysisDriver.sourceFactory);
           formatter.formatErrors([
             ErrorsResultImpl(analysisDriver.currentSession, path, null,
                 lineInfo, false, errors)
           ]);
-          for (AnalysisError error in errors) {
-            ErrorSeverity severity = determineProcessedSeverity(
+          for (var error in errors) {
+            var severity = determineProcessedSeverity(
                 error, options, analysisDriver.analysisOptions);
             if (severity != null) {
               allResult = allResult.max(severity);
@@ -299,20 +297,20 @@
           }
         } else if (shortName == AnalysisEngine.PUBSPEC_YAML_FILE) {
           try {
-            File file = resourceProvider.getFile(path);
-            String content = file.readAsStringSync();
-            YamlNode node = loadYamlNode(content);
+            var file = resourceProvider.getFile(path);
+            var content = file.readAsStringSync();
+            var node = loadYamlNode(content);
             if (node is YamlMap) {
-              PubspecValidator validator =
+              var validator =
                   PubspecValidator(resourceProvider, file.createSource());
-              LineInfo lineInfo = LineInfo.fromContent(content);
-              List<AnalysisError> errors = validator.validate(node.nodes);
+              var lineInfo = LineInfo.fromContent(content);
+              var errors = validator.validate(node.nodes);
               formatter.formatErrors([
                 ErrorsResultImpl(analysisDriver.currentSession, path, null,
                     lineInfo, false, errors)
               ]);
-              for (AnalysisError error in errors) {
-                ErrorSeverity severity = determineProcessedSeverity(
+              for (var error in errors) {
+                var severity = determineProcessedSeverity(
                     error, options, analysisDriver.analysisOptions);
                 allResult = allResult.max(severity);
               }
@@ -322,19 +320,18 @@
           }
         } else if (shortName == AnalysisEngine.ANDROID_MANIFEST_FILE) {
           try {
-            File file = resourceProvider.getFile(path);
-            String content = file.readAsStringSync();
-            ManifestValidator validator =
-                ManifestValidator(file.createSource());
-            LineInfo lineInfo = LineInfo.fromContent(content);
-            List<AnalysisError> errors = validator.validate(
+            var file = resourceProvider.getFile(path);
+            var content = file.readAsStringSync();
+            var validator = ManifestValidator(file.createSource());
+            var lineInfo = LineInfo.fromContent(content);
+            var errors = validator.validate(
                 content, analysisDriver.analysisOptions.chromeOsManifestChecks);
             formatter.formatErrors([
               ErrorsResultImpl(analysisDriver.currentSession, path, null,
                   lineInfo, false, errors)
             ]);
-            for (AnalysisError error in errors) {
-              ErrorSeverity severity = determineProcessedSeverity(
+            for (var error in errors) {
+              var severity = determineProcessedSeverity(
                   error, options, analysisDriver.analysisOptions);
               allResult = allResult.max(severity);
             }
@@ -353,11 +350,11 @@
           }
           libraryFiles.add(file);
 
-          ErrorSeverity status = await _runAnalyzer(file, options, formatter);
+          var status = await _runAnalyzer(file, options, formatter);
           allResult = allResult.max(status);
 
           // Mark previously dangling parts as no longer dangling.
-          for (FileState part in file.partedFiles) {
+          for (var part in file.partedFiles) {
             danglingParts.remove(part);
           }
         }
@@ -372,7 +369,7 @@
     }
 
     // Any dangling parts still in this list were definitely dangling.
-    for (FileState partFile in danglingParts) {
+    for (var partFile in danglingParts) {
       reportPartError(partFile.path);
     }
 
@@ -393,7 +390,7 @@
       CommandLineOptions options, SendPort sendPort) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    PerformanceTag previous = _analyzeAllTag.makeCurrent();
+    var previous = _analyzeAllTag.makeCurrent();
     try {
       if (options.buildModePersistentWorker) {
         var workerLoop = sendPort == null
@@ -436,13 +433,13 @@
     }
 
     // Now, build our resolver list.
-    List<UriResolver> resolvers = [];
+    var resolvers = <UriResolver>[];
 
     // 'dart:' URIs come first.
 
     // Setup embedding.
     if (includeSdkResolver) {
-      EmbedderSdk embedderSdk = EmbedderSdk(resourceProvider, embedderMap);
+      var embedderSdk = EmbedderSdk(resourceProvider, embedderMap);
       if (embedderSdk.libraryMap.size() == 0) {
         // The embedder uri resolver has no mappings. Use the default Dart SDK
         // uri resolver.
@@ -472,16 +469,16 @@
   /// Collect all analyzable files at [filePath], recursively if it's a
   /// directory, ignoring links.
   Iterable<io.File> _collectFiles(String filePath, AnalysisOptions options) {
-    List<io.File> files = <io.File>[];
-    io.File file = io.File(filePath);
+    var files = <io.File>[];
+    var file = io.File(filePath);
     if (file.existsSync() && !pathFilter.ignored(filePath)) {
       files.add(file);
     } else {
-      io.Directory directory = io.Directory(filePath);
+      var directory = io.Directory(filePath);
       if (directory.existsSync()) {
-        for (io.FileSystemEntity entry
+        for (var entry
             in directory.listSync(recursive: true, followLinks: false)) {
-          String relative = path.relative(entry.path, from: directory.path);
+          var relative = path.relative(entry.path, from: directory.path);
           if ((AnalysisEngine.isDartFileName(entry.path) ||
                   AnalysisEngine.isManifestFileName(entry.path)) &&
               entry is io.File &&
@@ -505,7 +502,7 @@
       analysisDriver = null;
     }
 
-    AnalysisOptionsImpl analysisOptions =
+    var analysisOptions =
         createAnalysisOptionsForCommandLineOptions(options, source);
 
     // Store the [PathFilter] for this context to properly exclude files
@@ -532,45 +529,44 @@
     }
 
     // Find package info.
-    _PackageInfo packageInfo = _findPackages(options);
+    var packageInfo = _findPackages(options);
 
     // Process embedders.
-    Map<Folder, YamlMap> embedderMap = {};
+    var embedderMap = <Folder, YamlMap>{};
     if (packageInfo.packageMap != null) {
       var libFolder = packageInfo.packageMap['sky_engine']?.first;
       if (libFolder != null) {
-        EmbedderYamlLocator locator =
-            EmbedderYamlLocator.forLibFolder(libFolder);
+        var locator = EmbedderYamlLocator.forLibFolder(libFolder);
         embedderMap = locator.embedderYamls;
       }
     }
 
     // No summaries in the presence of embedders.
-    bool useSummaries = embedderMap.isEmpty;
+    var useSummaries = embedderMap.isEmpty;
 
     if (!useSummaries && options.buildSummaryInputs.isNotEmpty) {
       throw _DriverError('Summaries are not yet supported when using Flutter.');
     }
 
     // Read any input summaries.
-    SummaryDataStore summaryDataStore = SummaryDataStore(
+    var summaryDataStore = SummaryDataStore(
         useSummaries ? options.buildSummaryInputs : <String>[]);
 
     // Once options and embedders are processed, setup the SDK.
     _setupSdk(options, useSummaries, analysisOptions);
 
-    PackageBundle sdkBundle = sdk.getLinkedBundle();
+    var sdkBundle = sdk.getLinkedBundle();
     if (sdkBundle != null) {
       summaryDataStore.addBundle(null, sdkBundle);
     }
 
     // Choose a package resolution policy and a diet parsing policy based on
     // the command-line options.
-    SourceFactory sourceFactory = _chooseUriResolutionPolicy(options,
-        embedderMap, packageInfo, summaryDataStore, true, analysisOptions);
+    var sourceFactory = _chooseUriResolutionPolicy(options, embedderMap,
+        packageInfo, summaryDataStore, true, analysisOptions);
 
-    PerformanceLog log = PerformanceLog(null);
-    AnalysisDriverScheduler scheduler = AnalysisDriverScheduler(log);
+    var log = PerformanceLog(null);
+    var scheduler = AnalysisDriverScheduler(log);
 
     analysisDriver = AnalysisDriver(
         scheduler,
@@ -592,7 +588,7 @@
     Map<String, List<Folder>> packageMap;
 
     if (options.packageConfigPath != null) {
-      String path = normalizePath(options.packageConfigPath);
+      var path = normalizePath(options.packageConfigPath);
       try {
         packages = parsePackagesFile(
           resourceProvider,
@@ -606,7 +602,7 @@
       var path = normalizePath(options.packageRootPath);
       packageMap = _PackageRootPackageMapBuilder.buildPackageMap(path);
     } else {
-      Resource cwd = resourceProvider.getResource(path.current);
+      var cwd = resourceProvider.getResource(path.current);
       // Look for .packages.
       packages = findPackagesFrom(resourceProvider, cwd);
       packageMap = _getPackageMap(packages);
@@ -634,9 +630,9 @@
   /// Analyze a single source.
   Future<ErrorSeverity> _runAnalyzer(
       FileState file, CommandLineOptions options, ErrorFormatter formatter) {
-    int startTime = currentTimeMillis;
-    AnalyzerImpl analyzer = AnalyzerImpl(analysisDriver.analysisOptions,
-        analysisDriver, file, options, stats, startTime);
+    var startTime = currentTimeMillis;
+    var analyzer = AnalyzerImpl(analysisDriver.analysisOptions, analysisDriver,
+        file, options, stats, startTime);
     return analyzer.analyze(formatter);
   }
 
@@ -646,8 +642,8 @@
       if (options.dartSdkSummaryPath != null) {
         sdk = SummaryBasedDartSdk(options.dartSdkSummaryPath, true);
       } else {
-        String dartSdkPath = options.dartSdkPath;
-        FolderBasedDartSdk dartSdk = FolderBasedDartSdk(
+        var dartSdkPath = options.dartSdkPath;
+        var dartSdk = FolderBasedDartSdk(
             resourceProvider, resourceProvider.getFolder(dartSdkPath));
         dartSdk.useSummary = useSummaries &&
             options.sourceFiles.every((String sourcePath) {
@@ -705,7 +701,7 @@
     if (l1.length != l2.length) {
       return false;
     }
-    for (int i = 0; i < l1.length; i++) {
+    for (var i = 0; i < l1.length; i++) {
       if (l1[i] != l2[i]) {
         return false;
       }
@@ -718,7 +714,7 @@
     if (m1.length != m2.length) {
       return false;
     }
-    for (String key in m1.keys) {
+    for (var key in m1.keys) {
       if (!m2.containsKey(key) || m1[key] != m2[key]) {
         return false;
       }
diff --git a/pkg/analyzer_cli/lib/src/error_formatter.dart b/pkg/analyzer_cli/lib/src/error_formatter.dart
index 84e09b2..e7a39af 100644
--- a/pkg/analyzer_cli/lib/src/error_formatter.dart
+++ b/pkg/analyzer_cli/lib/src/error_formatter.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/error/error.dart';
-import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_cli/src/ansi.dart';
@@ -52,11 +51,11 @@
 
   /// Print statistics to [out].
   void print(StringSink out) {
-    bool hasErrors = errorCount != 0;
-    bool hasWarns = warnCount != 0;
-    bool hasHints = hintCount != 0;
-    bool hasLints = lintCount != 0;
-    bool hasContent = false;
+    var hasErrors = errorCount != 0;
+    var hasWarns = warnCount != 0;
+    var hasHints = hintCount != 0;
+    var hasLints = lintCount != 0;
+    var hasContent = false;
     if (hasErrors) {
       out.write(errorCount);
       out.write(' ');
@@ -150,7 +149,7 @@
   @override
   int compareTo(CLIError other) {
     // severity
-    int compare = _severityCompare[other.severity] - _severityCompare[severity];
+    var compare = _severityCompare[other.severity] - _severityCompare[severity];
     if (compare != 0) return compare;
 
     // path
@@ -195,10 +194,10 @@
   void formatErrors(List<ErrorsResult> results) {
     stats.unfilteredCount += results.length;
 
-    List<AnalysisError> errors = <AnalysisError>[];
-    Map<AnalysisError, ErrorsResult> errorToLine = {};
-    for (ErrorsResult result in results) {
-      for (AnalysisError error in result.errors) {
+    var errors = <AnalysisError>[];
+    var errorToLine = <AnalysisError, ErrorsResult>{};
+    for (var result in results) {
+      for (var error in result.errors) {
         if (_computeSeverity(error) != null) {
           errors.add(error);
           errorToLine[error] = result;
@@ -206,7 +205,7 @@
       }
     }
 
-    for (AnalysisError error in errors) {
+    for (var error in errors) {
       formatError(errorToLine, error);
     }
   }
@@ -233,10 +232,10 @@
   @override
   void flush() {
     // sort
-    List<CLIError> sortedErrors = batchedErrors.toList()..sort();
+    var sortedErrors = batchedErrors.toList()..sort();
 
     // print
-    for (CLIError error in sortedErrors) {
+    for (var error in sortedErrors) {
       if (error.isError) {
         stats.errorCount++;
       } else if (error.isWarning) {
@@ -248,7 +247,7 @@
       }
 
       // warning • 'foo' is not a bar. • lib/foo.dart:1:2 • foo_warning
-      String issueColor = (error.isError || error.isWarning) ? ansi.red : '';
+      var issueColor = (error.isError || error.isWarning) ? ansi.red : '';
       out.write('  $issueColor${error.severity}${ansi.none} '
           '${ansi.bullet} ${ansi.bold}${error.message}${ansi.none} ');
       out.write('${ansi.bullet} ${error.sourcePath}');
@@ -258,7 +257,7 @@
 
       // If verbose, also print any associated correction and URL.
       if (options.verbose) {
-        String padding = ' '.padLeft(error.severity.length + 2);
+        var padding = ' '.padLeft(error.severity.length + 2);
         for (var message in error.contextMessages) {
           out.write('$padding${message.message} ');
           out.write('at ${message.filePath}');
@@ -280,14 +279,14 @@
   @override
   void formatError(
       Map<AnalysisError, ErrorsResult> errorToLine, AnalysisError error) {
-    Source source = error.source;
+    var source = error.source;
     var result = errorToLine[error];
     var location = result.lineInfo.getLocation(error.offset);
 
-    ErrorSeverity severity = _severityProcessor(error);
+    var severity = _severityProcessor(error);
 
     // Get display name; translate INFOs into LINTS and HINTS.
-    String errorType = severity.displayName;
+    var errorType = severity.displayName;
     if (severity == ErrorSeverity.INFO) {
       if (error.errorCode.type == ErrorType.HINT ||
           error.errorCode.type == ErrorType.LINT) {
@@ -308,12 +307,11 @@
     } else {
       sourcePath = _relative(source.fullName);
     }
-    List<ContextMessage> contextMessages = [];
+    var contextMessages = <ContextMessage>[];
     for (var message in error.contextMessages) {
       var session = result.session.analysisContext;
       if (session is DriverBasedAnalysisContext) {
-        LineInfo lineInfo =
-            session.driver.getFileSync(message.filePath)?.lineInfo;
+        var lineInfo = session.driver.getFileSync(message.filePath)?.lineInfo;
         var location = lineInfo.getLocation(message.offset);
         contextMessages.add(ContextMessage(message.filePath, message.message,
             location.lineNumber, location.columnNumber));
@@ -357,11 +355,11 @@
     if (!_seenErrors.add(error)) {
       return;
     }
-    Source source = error.source;
+    var source = error.source;
     var location = errorToLine[error].lineInfo.getLocation(error.offset);
-    int length = error.length;
+    var length = error.length;
 
-    ErrorSeverity severity = _severityProcessor(error);
+    var severity = _severityProcessor(error);
 
     if (severity == ErrorSeverity.ERROR) {
       stats.errorCount++;
@@ -392,8 +390,8 @@
   }
 
   static String _escapeForMachineMode(String input) {
-    StringBuffer result = StringBuffer();
-    for (int c in input.codeUnits) {
+    var result = StringBuffer();
+    for (var c in input.codeUnits) {
       if (c == _newline) {
         result.write(r'\n');
       } else if (c == _return) {
diff --git a/pkg/analyzer_cli/lib/src/error_severity.dart b/pkg/analyzer_cli/lib/src/error_severity.dart
index 198ff9a..dc7e4ec 100644
--- a/pkg/analyzer_cli/lib/src/error_severity.dart
+++ b/pkg/analyzer_cli/lib/src/error_severity.dart
@@ -18,8 +18,7 @@
   AnalysisOptions analysisOptions,
 ) {
   if (analysisOptions != null) {
-    ErrorProcessor processor =
-        ErrorProcessor.getProcessor(analysisOptions, error);
+    var processor = ErrorProcessor.getProcessor(analysisOptions, error);
     // If there is a processor for this error, defer to it.
     if (processor != null) {
       return processor.severity;
@@ -37,8 +36,7 @@
 /// [error] (or `null` if it's to be suppressed).
 ErrorSeverity determineProcessedSeverity(AnalysisError error,
     CommandLineOptions commandLineOptions, AnalysisOptions analysisOptions) {
-  ErrorSeverity severity =
-      computeSeverity(error, commandLineOptions, analysisOptions);
+  var severity = computeSeverity(error, commandLineOptions, analysisOptions);
   // Skip TODOs categorically unless escalated to ERROR or HINT (#26215).
   if (error.errorCode.type == ErrorType.TODO &&
       severity == ErrorSeverity.INFO) {
diff --git a/pkg/analyzer_cli/lib/src/has_context_mixin.dart b/pkg/analyzer_cli/lib/src/has_context_mixin.dart
index 1159f56..554deca 100644
--- a/pkg/analyzer_cli/lib/src/has_context_mixin.dart
+++ b/pkg/analyzer_cli/lib/src/has_context_mixin.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/error/error.dart';
-import 'package:analyzer/file_system/file_system.dart' as file_system;
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer_cli/src/context_cache.dart';
@@ -18,8 +17,7 @@
   AnalysisOptionsImpl createAnalysisOptionsForCommandLineOptions(
       CommandLineOptions options, String source) {
     if (options.analysisOptionsFile != null) {
-      file_system.File file =
-          resourceProvider.getFile(options.analysisOptionsFile);
+      var file = resourceProvider.getFile(options.analysisOptionsFile);
       if (!file.exists) {
         printAndFail('Options file not found: ${options.analysisOptionsFile}',
             exitCode: ErrorSeverity.ERROR.ordinal);
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index fee0614..27bf56d 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -220,7 +220,7 @@
   /// by default prints an error message to stderr and exits.
   static CommandLineOptions parse(List<String> args,
       {Function(String msg) printAndFail = printAndFail}) {
-    CommandLineOptions options = _parse(args);
+    var options = _parse(args);
 
     /// Only happens in testing.
     if (options == null) {
@@ -232,7 +232,7 @@
       // Infer if unspecified.
       options.dartSdkPath ??= getSdkPath(args);
 
-      String sdkPath = options.dartSdkPath;
+      var sdkPath = options.dartSdkPath;
 
       // Check that SDK is specified.
       if (sdkPath == null) {
@@ -268,9 +268,8 @@
   static String _getVersion() {
     try {
       // This is relative to bin/snapshot, so ../..
-      String versionPath =
-          Platform.script.resolve('../../version').toFilePath();
-      File versionFile = File(versionPath);
+      var versionPath = Platform.script.resolve('../../version').toFilePath();
+      var versionFile = File(versionPath);
       return versionFile.readAsStringSync().trim();
     } catch (_) {
       // This happens when the script is not running in the context of an SDK.
@@ -281,10 +280,10 @@
   static CommandLineOptions _parse(List<String> args) {
     args = preprocessArgs(PhysicalResourceProvider.INSTANCE, args);
 
-    bool verbose = args.contains('-v') || args.contains('--verbose');
-    bool hide = !verbose;
+    var verbose = args.contains('-v') || args.contains('--verbose');
+    var hide = !verbose;
 
-    ArgParser parser = ArgParser(allowTrailingOptions: true);
+    var parser = ArgParser(allowTrailingOptions: true);
 
     if (!hide) {
       parser.addSeparator('General options:');
@@ -488,12 +487,12 @@
       if (args.contains('--$ignoreUnrecognizedFlagsFlag')) {
         args = filterUnknownArguments(args, parser);
       }
-      ArgResults results = parser.parse(args);
+      var results = parser.parse(args);
 
       // Persistent worker.
       if (args.contains('--persistent_worker')) {
-        bool hasBuildMode = args.contains('--build-mode');
-        bool onlyDartSdkArg = args.length == 2 ||
+        var hasBuildMode = args.contains('--build-mode');
+        var onlyDartSdkArg = args.length == 2 ||
             (args.length == 3 && args.any((a) => a.startsWith('--dart-sdk'))) ||
             (args.length == 4 && args.contains('--dart-sdk'));
         if (!(hasBuildMode && onlyDartSdkArg)) {
@@ -546,9 +545,9 @@
             'future release.\n');
       }
       if (results.wasParsed('enable-experiment')) {
-        List<String> names =
+        var names =
             (results['enable-experiment'] as List).cast<String>().toList();
-        bool errorFound = false;
+        var errorFound = false;
         for (var validationResult in validateFlags(names)) {
           if (validationResult.isError) {
             errorFound = true;
diff --git a/pkg/analyzer_cli/lib/src/perf_report.dart b/pkg/analyzer_cli/lib/src/perf_report.dart
index 287f68a..4c6aa87 100644
--- a/pkg/analyzer_cli/lib/src/perf_report.dart
+++ b/pkg/analyzer_cli/lib/src/perf_report.dart
@@ -28,8 +28,8 @@
 
 String makePerfReport(int startTime, int endTime, CommandLineOptions options,
     int analyzedFileCount, AnalysisStats stats) {
-  int totalTime = endTime - startTime;
-  int otherTime = totalTime;
+  var totalTime = endTime - startTime;
+  var otherTime = totalTime;
 
   var platformJson = <String, dynamic>{
     'osType': _osType,
@@ -50,9 +50,9 @@
 
   // Convert performance tags to JSON representation.
   var perfTagsJson = <String, dynamic>{};
-  for (PerformanceTag tag in PerformanceTag.all) {
+  for (var tag in PerformanceTag.all) {
     if (tag != PerformanceTag.unknown) {
-      int tagTime = tag.elapsedMs;
+      var tagTime = tag.elapsedMs;
       perfTagsJson[tag.label] = tagTime;
       otherTime -= tagTime;
     }
diff --git a/pkg/analyzer_cli/test/all.dart b/pkg/analyzer_cli/test/all.dart
index 329bd32..7ea963e 100644
--- a/pkg/analyzer_cli/test/all.dart
+++ b/pkg/analyzer_cli/test/all.dart
@@ -2,28 +2,30 @@
 // for 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 'analysis_options_test.dart' as analysis_options_test;
-import 'build_mode_test.dart' as build_mode_test;
-import 'driver_test.dart' as driver_test;
-import 'embedder_test.dart' as embedder_test;
-import 'errors_reported_once_test.dart' as errors_reported_once_test;
-import 'errors_upgrade_fails_cli_test.dart' as errors_upgrade_fails_cli_test;
-import 'options_test.dart' as options_test;
-import 'package_prefix_test.dart' as package_prefix_test;
-import 'perf_report_test.dart' as perf_report_test;
-import 'reporter_test.dart' as reporter_test;
-import 'strong_mode_test.dart' as strong_mode_test;
+import 'analysis_options_test.dart' as analysis_options;
+import 'build_mode_test.dart' as build_mode;
+import 'driver_test.dart' as driver;
+import 'embedder_test.dart' as embedder;
+import 'errors_reported_once_test.dart' as errors_reported_once;
+import 'errors_upgrade_fails_cli_test.dart' as errors_upgrade_fails_cli;
+import 'options_test.dart' as options;
+import 'package_prefix_test.dart' as package_prefix;
+import 'perf_report_test.dart' as perf_report;
+import 'reporter_test.dart' as reporter;
+import 'strong_mode_test.dart' as strong_mode;
+import 'verify_sorted_test.dart' as verify_sorted;
 
 void main() {
-  analysis_options_test.main();
-  build_mode_test.main();
-  driver_test.main();
-  embedder_test.main();
-  errors_reported_once_test.main();
-  errors_upgrade_fails_cli_test.main();
-  options_test.main();
-  package_prefix_test.main();
-  perf_report_test.main();
-  reporter_test.main();
-  strong_mode_test.main();
+  analysis_options.main();
+  build_mode.main();
+  driver.main();
+  embedder.main();
+  errors_reported_once.main();
+  errors_upgrade_fails_cli.main();
+  options.main();
+  package_prefix.main();
+  perf_report.main();
+  reporter.main();
+  strong_mode.main();
+  verify_sorted.main();
 }
diff --git a/pkg/analyzer_cli/test/build_mode_test.dart b/pkg/analyzer_cli/test/build_mode_test.dart
index fece8a0..c2db753 100644
--- a/pkg/analyzer_cli/test/build_mode_test.dart
+++ b/pkg/analyzer_cli/test/build_mode_test.dart
@@ -132,7 +132,7 @@
     var writer = CodedBufferWriter();
     writer.writeInt32NoTag(buffer.length);
 
-    List<int> result = [];
+    var result = <int>[];
     result.addAll(writer.toBuffer());
     result.addAll(buffer);
     return result;
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index 805f5d9..43e9d62 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -47,12 +47,12 @@
     var optionsFileName = AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE;
     var options = _p('data/options_tests_project/' + optionsFileName);
 
-    List<String> args = <String>[];
+    var args = <String>[];
     if (dartSdkSummaryPath != null) {
       args.add('--dart-sdk-summary');
       args.add(dartSdkSummaryPath);
     } else {
-      String sdkPath = _findSdkDirForSummaries();
+      var sdkPath = _findSdkDirForSummaries();
       args.add('--dart-sdk');
       args.add(sdkPath);
     }
@@ -61,7 +61,7 @@
     args.addAll(additionalArgs);
 
     uri ??= 'file:///test_file.dart';
-    String source = '$uri|$path';
+    var source = '$uri|$path';
 
     await drive(source, args: args, options: options);
   }
@@ -69,7 +69,7 @@
   /// Try to find a appropriate directory to pass to "--dart-sdk" that will
   /// allow summaries to be found.
   String _findSdkDirForSummaries() {
-    Set<String> triedDirectories = <String>{};
+    var triedDirectories = <String>{};
     bool isSuitable(String sdkDir) {
       triedDirectories.add(sdkDir);
       return File(path.join(sdkDir, 'lib', '_internal', 'strong.sum'))
@@ -84,8 +84,8 @@
 
     // Usually the sdk directory is the parent of the parent of the "dart"
     // executable.
-    Directory executableParent = File(Platform.executable).parent;
-    Directory executableGrandparent = executableParent.parent;
+    var executableParent = File(Platform.executable).parent;
+    var executableGrandparent = executableParent.parent;
     if (isSuitable(executableGrandparent.path)) {
       return makeAbsoluteAndNormalized(executableGrandparent.path);
     }
@@ -97,14 +97,14 @@
     // If neither of those are suitable, assume we are running locally within the
     // SDK project (e.g. within an IDE). Find the build output directory and
     // search all built configurations.
-    Directory sdkRootDir =
+    var sdkRootDir =
         File(Platform.script.toFilePath()).parent.parent.parent.parent;
-    for (String outDirName in ['out', 'xcodebuild']) {
-      Directory outDir = Directory(path.join(sdkRootDir.path, outDirName));
+    for (var outDirName in ['out', 'xcodebuild']) {
+      var outDir = Directory(path.join(sdkRootDir.path, outDirName));
       if (outDir.existsSync()) {
-        for (FileSystemEntity subdir in outDir.listSync()) {
+        for (var subdir in outDir.listSync()) {
           if (subdir is Directory) {
-            String candidateSdkDir = path.join(subdir.path, 'dart-sdk');
+            var candidateSdkDir = path.join(subdir.path, 'dart-sdk');
             if (isSuitable(candidateSdkDir)) {
               return makeAbsoluteAndNormalized(candidateSdkDir);
             }
@@ -191,9 +191,9 @@
   /// Convert a file specification from a relative path to an absolute path.
   /// Handles the case where the file specification is of the form "$uri|$path".
   String _adjustFileSpec(String fileSpec) {
-    int uriPrefixLength = fileSpec.indexOf('|') + 1;
-    String uriPrefix = fileSpec.substring(0, uriPrefixLength);
-    String relativePath = fileSpec.substring(uriPrefixLength);
+    var uriPrefixLength = fileSpec.indexOf('|') + 1;
+    var uriPrefix = fileSpec.substring(0, uriPrefixLength);
+    var relativePath = fileSpec.substring(uriPrefixLength);
     return '$uriPrefix${path.join(testDirectory, relativePath)}';
   }
 
@@ -483,8 +483,7 @@
       ]);
       var output = File(outputPath);
       expect(output.existsSync(), isTrue);
-      PackageBundle bundle =
-          PackageBundle.fromBuffer(await output.readAsBytes());
+      var bundle = PackageBundle.fromBuffer(await output.readAsBytes());
       var testFileUri = 'file:///test_file.dart';
 
       var bundle2 = bundle.bundle2;
@@ -602,8 +601,8 @@
 
   Future<void> test_dartSdkSummaryPath_strong() async {
     await withTempDirAsync((tempDir) async {
-      String sdkPath = _findSdkDirForSummaries();
-      String strongSummaryPath =
+      var sdkPath = _findSdkDirForSummaries();
+      var strongSummaryPath =
           path.join(sdkPath, 'lib', '_internal', 'strong.sum');
 
       var testDart = path.join(tempDir, 'test.dart');
@@ -694,13 +693,13 @@
     // Copy to temp dir so that existing analysis options
     // in the test directory hierarchy do not interfere
     await withTempDirAsync((String tempDirPath) async {
-      String dartSdkPath = path.absolute(getSdkPath());
+      var dartSdkPath = path.absolute(getSdkPath());
       await recursiveCopy(
           Directory(path.join(testDirectory, 'data', 'bazel')), tempDirPath);
-      Directory origWorkingDir = Directory.current;
+      var origWorkingDir = Directory.current;
       try {
         Directory.current = path.join(tempDirPath, 'proj');
-        Driver driver = Driver(isTesting: true);
+        var driver = Driver(isTesting: true);
         try {
           await driver.start([
             path.join('lib', 'file.dart'),
@@ -776,7 +775,7 @@
   }
 
   Future<void> test_partFile_reversed() async {
-    Driver driver = Driver(isTesting: true);
+    var driver = Driver(isTesting: true);
     await driver.start([
       path.join(testDirectory, 'data/library_and_parts/part1.dart'),
       path.join(testDirectory, 'data/library_and_parts/lib.dart')
@@ -796,7 +795,7 @@
   String get optionsFileName => AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE;
 
   Future<void> test_containsLintRuleEntry() async {
-    YamlMap options = _parseOptions('''
+    var options = _parseOptions('''
 linter:
   rules:
     - foo
@@ -897,7 +896,7 @@
 class NonDartFilesTest extends BaseTest {
   Future<void> test_analysisOptionsYaml() async {
     await withTempDirAsync((tempDir) async {
-      String filePath =
+      var filePath =
           path.join(tempDir, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
       File(filePath).writeAsStringSync('''
 analyzer:
@@ -914,14 +913,14 @@
 
   Future<void> test_manifestFileChecks() async {
     await withTempDirAsync((tempDir) async {
-      String filePath =
+      var filePath =
           path.join(tempDir, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
       File(filePath).writeAsStringSync('''
 analyzer:
   optional-checks:
     chrome-os-manifest-checks: true
 ''');
-      String manifestPath =
+      var manifestPath =
           path.join(tempDir, AnalysisEngine.ANDROID_MANIFEST_FILE);
       File(manifestPath).writeAsStringSync('''
 <manifest
@@ -941,7 +940,7 @@
 
   Future<void> test_pubspecYaml() async {
     await withTempDirAsync((tempDir) async {
-      String filePath = path.join(tempDir, AnalysisEngine.PUBSPEC_YAML_FILE);
+      var filePath = path.join(tempDir, AnalysisEngine.PUBSPEC_YAML_FILE);
       File(filePath).writeAsStringSync('''
 name: foo
 flutter:
@@ -1029,7 +1028,7 @@
   }
 
   Future<void> test_includeDirective() async {
-    String testDir = path.join(
+    var testDir = path.join(
         testDirectory, 'data', 'options_include_directive_tests_project');
     await drive(
       path.join(testDir, 'lib', 'test_file.dart'),
diff --git a/pkg/analyzer_cli/test/embedder_test.dart b/pkg/analyzer_cli/test/embedder_test.dart
index a088c8e..c855d21 100644
--- a/pkg/analyzer_cli/test/embedder_test.dart
+++ b/pkg/analyzer_cli/test/embedder_test.dart
@@ -5,7 +5,6 @@
 import 'dart:io';
 
 import 'package:analyzer/src/dart/sdk/sdk.dart';
-import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer_cli/src/driver.dart' show Driver, errorSink, outSink;
 import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
@@ -45,14 +44,14 @@
 
     test('sdk setup', wrap(() async {
       var testDir = path.join(testDirectory, 'data', 'embedder_client');
-      Driver driver = Driver(isTesting: true);
+      var driver = Driver(isTesting: true);
       await driver.start([
         '--packages',
         path.join(testDir, '_packages'),
         path.join(testDir, 'embedder_yaml_user.dart')
       ]);
 
-      DartSdk sdk = driver.sdk;
+      var sdk = driver.sdk;
       expect(sdk, const TypeMatcher<FolderBasedDartSdk>());
       expect((sdk as FolderBasedDartSdk).useSummary, isFalse);
     }));
diff --git a/pkg/analyzer_cli/test/errors_reported_once_test.dart b/pkg/analyzer_cli/test/errors_reported_once_test.dart
index d110077..cb5ba53 100644
--- a/pkg/analyzer_cli/test/errors_reported_once_test.dart
+++ b/pkg/analyzer_cli/test/errors_reported_once_test.dart
@@ -40,23 +40,23 @@
   }
 
   Future<void> test_once() async {
-    String testDir = path.join(testDirectory, 'data', 'errors_reported_once');
-    Driver driver = Driver(isTesting: true);
+    var testDir = path.join(testDirectory, 'data', 'errors_reported_once');
+    var driver = Driver(isTesting: true);
     await driver.start(
         [path.join(testDir, 'foo.dart'), path.join(testDir, 'bar.dart')]);
 
     expect(exitCode, 0);
 
     // Ensure that we only have one copy of the error.
-    final String unusedWarning = 'Unused import';
-    String output = outSink.toString();
+    final unusedWarning = 'Unused import';
+    var output = outSink.toString();
     expect(output, contains(unusedWarning));
     expect(unusedWarning.allMatches(output).toList(), hasLength(1));
   }
 
   Future<void> test_once_machine() async {
-    String testDir = path.join(testDirectory, 'data', 'errors_reported_once');
-    Driver driver = Driver(isTesting: true);
+    var testDir = path.join(testDirectory, 'data', 'errors_reported_once');
+    var driver = Driver(isTesting: true);
     await driver.start([
       '--format',
       'machine',
@@ -67,8 +67,8 @@
     expect(exitCode, 0);
 
     // Ensure that we only have one copy of the error.
-    final String unusedWarning = 'Unused import';
-    String output = errorSink.toString();
+    final unusedWarning = 'Unused import';
+    var output = errorSink.toString();
     expect(output, contains(unusedWarning));
     expect(unusedWarning.allMatches(output).toList(), hasLength(1));
   }
diff --git a/pkg/analyzer_cli/test/errors_upgrade_fails_cli_test.dart b/pkg/analyzer_cli/test/errors_upgrade_fails_cli_test.dart
index 1be1384..81e671d 100644
--- a/pkg/analyzer_cli/test/errors_upgrade_fails_cli_test.dart
+++ b/pkg/analyzer_cli/test/errors_upgrade_fails_cli_test.dart
@@ -40,9 +40,8 @@
   }
 
   Future<void> test_once() async {
-    String testDir =
-        path.join(testDirectory, 'data', 'error_upgrade_fails_cli');
-    Driver driver = Driver(isTesting: true);
+    var testDir = path.join(testDirectory, 'data', 'error_upgrade_fails_cli');
+    var driver = Driver(isTesting: true);
     await driver.start([path.join(testDir, 'foo.dart')]);
 
     expect(exitCode, 3);
diff --git a/pkg/analyzer_cli/test/options_test.dart b/pkg/analyzer_cli/test/options_test.dart
index 807b70f..8e5ce94 100644
--- a/pkg/analyzer_cli/test/options_test.dart
+++ b/pkg/analyzer_cli/test/options_test.dart
@@ -15,8 +15,8 @@
 void main() {
   group('CommandLineOptions', () {
     group('parse', () {
-      StringBuffer outStringBuffer = StringBuffer();
-      StringBuffer errorStringBuffer = StringBuffer();
+      var outStringBuffer = StringBuffer();
+      var errorStringBuffer = StringBuffer();
 
       StringSink savedOutSink, savedErrorSink;
       int savedExitCode;
@@ -40,8 +40,7 @@
       });
 
       test('defaults', () {
-        CommandLineOptions options =
-            CommandLineOptions.parse(['--dart-sdk', '.', 'foo.dart']);
+        var options = CommandLineOptions.parse(['--dart-sdk', '.', 'foo.dart']);
         expect(options, isNotNull);
         expect(options.buildMode, isFalse);
         expect(options.buildAnalysisOutput, isNull);
@@ -72,20 +71,19 @@
       });
 
       test('batch', () {
-        CommandLineOptions options =
-            CommandLineOptions.parse(['--dart-sdk', '.', '--batch']);
+        var options = CommandLineOptions.parse(['--dart-sdk', '.', '--batch']);
         expect(options.batchMode, isTrue);
       });
 
       test('defined variables', () {
-        CommandLineOptions options = CommandLineOptions.parse(
+        var options = CommandLineOptions.parse(
             ['--dart-sdk', '.', '-Dfoo=bar', 'foo.dart']);
         expect(options.definedVariables['foo'], equals('bar'));
         expect(options.definedVariables['bar'], isNull);
       });
 
       test('disable cache flushing', () {
-        CommandLineOptions options = CommandLineOptions.parse(
+        var options = CommandLineOptions.parse(
             ['--dart-sdk', '.', '--disable-cache-flushing', 'foo.dart']);
         expect(options.disableCacheFlushing, isTrue);
       });
@@ -98,13 +96,13 @@
         };
 
         test('no values', () {
-          CommandLineOptions options = overrideKnownFeatures(
+          var options = overrideKnownFeatures(
               knownFeatures, () => CommandLineOptions.parse(['foo.dart']));
           expect(options.enabledExperiments, isEmpty);
         });
 
         test('single value', () {
-          CommandLineOptions options = overrideKnownFeatures(
+          var options = overrideKnownFeatures(
               knownFeatures,
               () => CommandLineOptions.parse(
                   ['--enable-experiment', 'a', 'foo.dart']));
@@ -113,7 +111,7 @@
 
         group('multiple values', () {
           test('single flag', () {
-            CommandLineOptions options = overrideKnownFeatures(
+            var options = overrideKnownFeatures(
                 knownFeatures,
                 () => CommandLineOptions.parse(
                     ['--enable-experiment', 'a,b', 'foo.dart']));
@@ -121,7 +119,7 @@
           });
 
           test('mixed single and multiple flags', () {
-            CommandLineOptions options = overrideKnownFeatures(
+            var options = overrideKnownFeatures(
                 knownFeatures,
                 () => CommandLineOptions.parse([
                       '--enable-experiment',
@@ -134,7 +132,7 @@
           });
 
           test('multiple flags', () {
-            CommandLineOptions options = overrideKnownFeatures(
+            var options = overrideKnownFeatures(
                 knownFeatures,
                 () => CommandLineOptions.parse([
                       '--enable-experiment',
@@ -149,80 +147,80 @@
       });
 
       test('hintsAreFatal', () {
-        CommandLineOptions options = CommandLineOptions.parse(
+        var options = CommandLineOptions.parse(
             ['--dart-sdk', '.', '--fatal-hints', 'foo.dart']);
         expect(options.infosAreFatal, isTrue);
       });
 
       test('infosAreFatal', () {
-        CommandLineOptions options = CommandLineOptions.parse(
+        var options = CommandLineOptions.parse(
             ['--dart-sdk', '.', '--fatal-infos', 'foo.dart']);
         expect(options.infosAreFatal, isTrue);
       });
 
       test('log', () {
-        CommandLineOptions options =
+        var options =
             CommandLineOptions.parse(['--dart-sdk', '.', '--log', 'foo.dart']);
         expect(options.log, isTrue);
       });
 
       test('machine format', () {
-        CommandLineOptions options = CommandLineOptions.parse(
+        var options = CommandLineOptions.parse(
             ['--dart-sdk', '.', '--format=machine', 'foo.dart']);
         expect(options.machineFormat, isTrue);
       });
 
       test('no-hints', () {
-        CommandLineOptions options = CommandLineOptions.parse(
+        var options = CommandLineOptions.parse(
             ['--dart-sdk', '.', '--no-hints', 'foo.dart']);
         expect(options.disableHints, isTrue);
       });
 
       test('options', () {
-        CommandLineOptions options = CommandLineOptions.parse(
+        var options = CommandLineOptions.parse(
             ['--dart-sdk', '.', '--options', 'options.yaml', 'foo.dart']);
         expect(options.analysisOptionsFile, equals('options.yaml'));
       });
 
       test('lints', () {
-        CommandLineOptions options = CommandLineOptions.parse(
+        var options = CommandLineOptions.parse(
             ['--dart-sdk', '.', '--lints', 'foo.dart']);
         expect(options.lints, isTrue);
       });
 
       test('package root', () {
-        CommandLineOptions options = CommandLineOptions.parse(
+        var options = CommandLineOptions.parse(
             ['--dart-sdk', '.', '--package-root', 'bar', 'foo.dart']);
         expect(options.packageRootPath, equals('bar'));
       });
 
       test('package warnings', () {
-        CommandLineOptions options = CommandLineOptions.parse(
+        var options = CommandLineOptions.parse(
             ['--dart-sdk', '.', '--package-warnings', 'foo.dart']);
         expect(options.showPackageWarnings, isTrue);
       });
 
       test('sdk warnings', () {
-        CommandLineOptions options = CommandLineOptions.parse(
+        var options = CommandLineOptions.parse(
             ['--dart-sdk', '.', '--sdk-warnings', 'foo.dart']);
         expect(options.showSdkWarnings, isTrue);
       });
 
       test('sourceFiles', () {
-        CommandLineOptions options = CommandLineOptions.parse(
+        var options = CommandLineOptions.parse(
             ['--dart-sdk', '.', '--log', 'foo.dart', 'foo2.dart', 'foo3.dart']);
         expect(options.sourceFiles,
             equals(['foo.dart', 'foo2.dart', 'foo3.dart']));
       });
 
       test('warningsAreFatal', () {
-        CommandLineOptions options = CommandLineOptions.parse(
+        var options = CommandLineOptions.parse(
             ['--dart-sdk', '.', '--fatal-warnings', 'foo.dart']);
         expect(options.warningsAreFatal, isTrue);
       });
 
       test('ignore unrecognized flags', () {
-        CommandLineOptions options = CommandLineOptions.parse([
+        var options = CommandLineOptions.parse([
           '--ignore-unrecognized-flags',
           '--bar',
           '--baz',
@@ -235,7 +233,7 @@
       });
 
       test('hintsAreFatal', () {
-        CommandLineOptions options = CommandLineOptions.parse(
+        var options = CommandLineOptions.parse(
             ['--dart-sdk', '.', '--fatal-lints', 'foo.dart']);
         expect(options.lintsAreFatal, isTrue);
       });
@@ -257,13 +255,13 @@
       });
 
       test('--use-fasta-parser', () {
-        CommandLineOptions options =
+        var options =
             CommandLineOptions.parse(['--use-fasta-parser', 'foo.dart']);
         expect(options.useFastaParser, isTrue);
       });
 
       test('--train-snapshot', () {
-        CommandLineOptions options =
+        var options =
             CommandLineOptions.parse(['--train-snapshot', 'foo.dart']);
         expect(options.trainSnapshot, isTrue);
       });
diff --git a/pkg/analyzer_cli/test/reporter_test.dart b/pkg/analyzer_cli/test/reporter_test.dart
index 6976b5f..de8e15c 100644
--- a/pkg/analyzer_cli/test/reporter_test.dart
+++ b/pkg/analyzer_cli/test/reporter_test.dart
@@ -39,8 +39,7 @@
     });
 
     test('error', () {
-      ErrorsResultImpl error =
-          mockResult(ErrorType.SYNTACTIC_ERROR, ErrorSeverity.ERROR);
+      var error = mockResult(ErrorType.SYNTACTIC_ERROR, ErrorSeverity.ERROR);
       reporter.formatErrors([error]);
       reporter.flush();
 
@@ -49,7 +48,7 @@
     });
 
     test('hint', () {
-      ErrorsResultImpl error = mockResult(ErrorType.HINT, ErrorSeverity.INFO);
+      var error = mockResult(ErrorType.HINT, ErrorSeverity.INFO);
       reporter.formatErrors([error]);
       reporter.flush();
 
@@ -58,7 +57,7 @@
     });
 
     test('stats', () {
-      ErrorsResultImpl error = mockResult(ErrorType.HINT, ErrorSeverity.INFO);
+      var error = mockResult(ErrorType.HINT, ErrorSeverity.INFO);
       reporter.formatErrors([error]);
       reporter.flush();
       stats.print(out);
diff --git a/pkg/analyzer_cli/test/utils.dart b/pkg/analyzer_cli/test/utils.dart
index 08ad8bd..778e42f 100644
--- a/pkg/analyzer_cli/test/utils.dart
+++ b/pkg/analyzer_cli/test/utils.dart
@@ -13,12 +13,33 @@
 final String testDirectory = pathos.dirname(
     pathos.fromUri((reflectClass(_TestUtils).owner as LibraryMirror).uri));
 
+/// Returns a path to the directory containing source code for packages such as
+/// kernel, front_end, and analyzer.
+String get packageRoot {
+  // If the package root directory is specified on the command line using
+  // -DpkgRoot=..., use it.
+  var pkgRootVar = const String.fromEnvironment('pkgRoot');
+  if (pkgRootVar != null) {
+    var path = pathos.join(Directory.current.path, pkgRootVar);
+    if (!path.endsWith(pathos.separator)) path += pathos.separator;
+    return path;
+  }
+  // Otherwise try to guess based on the script path.
+  var scriptPath = pathos.fromUri(Platform.script);
+  var parts = pathos.split(scriptPath);
+  var pkgIndex = parts.indexOf('pkg');
+  if (pkgIndex != -1) {
+    return pathos.joinAll(parts.sublist(0, pkgIndex + 1)) + pathos.separator;
+  }
+  throw StateError('Unable to find sdk/pkg/ in $scriptPath');
+}
+
 /// Recursively copy the specified [src] directory (or file)
 /// to the specified destination path.
 Future<void> recursiveCopy(FileSystemEntity src, String dstPath) async {
   if (src is Directory) {
     await (Directory(dstPath)).create(recursive: true);
-    for (FileSystemEntity entity in src.listSync()) {
+    for (var entity in src.listSync()) {
       await recursiveCopy(
           entity, pathos.join(dstPath, pathos.basename(entity.path)));
     }
diff --git a/pkg/analyzer_cli/test/verify_sorted_test.dart b/pkg/analyzer_cli/test/verify_sorted_test.dart
new file mode 100644
index 0000000..57030b6
--- /dev/null
+++ b/pkg/analyzer_cli/test/verify_sorted_test.dart
@@ -0,0 +1,68 @@
+// 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:analysis_server/src/services/correction/sort_members.dart';
+import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:test/test.dart';
+
+import 'utils.dart';
+
+void main() {
+  var provider = PhysicalResourceProvider.INSTANCE;
+  var normalizedRoot = provider.pathContext.normalize(packageRoot);
+  var packagePath = provider.pathContext.join(normalizedRoot, 'analyzer_cli');
+  var testDataPath = provider.pathContext.join(packagePath, 'test', 'data');
+
+  var collection = AnalysisContextCollection(
+      includedPaths: <String>[packagePath],
+      excludedPaths: [testDataPath],
+      resourceProvider: provider);
+  var contexts = collection.contexts;
+  if (contexts.length != 1) {
+    fail('The directory $packagePath contains multiple analysis contexts.');
+  }
+
+  buildTestsIn(contexts[0].currentSession, packagePath, testDataPath,
+      provider.getFolder(packagePath));
+}
+
+void buildTestsIn(AnalysisSession session, String testDirPath,
+    String testDataPath, Folder directory) {
+  var pathContext = session.resourceProvider.pathContext;
+  var children = directory.getChildren();
+  children.sort((first, second) => first.shortName.compareTo(second.shortName));
+  for (var child in children) {
+    if (child is Folder) {
+      if (child.path != testDataPath) {
+        buildTestsIn(session, testDirPath, testDataPath, child);
+      }
+    } else if (child is File && child.shortName.endsWith('.dart')) {
+      var path = child.path;
+      var relativePath = pathContext.relative(path, from: testDirPath);
+      test(relativePath, () {
+        var result = session.getParsedUnit(path);
+        if (result.state != ResultState.VALID) {
+          fail('Could not parse $path');
+        }
+        var code = result.content;
+        var unit = result.unit;
+        var errors = result.errors;
+        if (errors.isNotEmpty) {
+          fail('Errors found when parsing $path');
+        }
+        var sorter = MemberSorter(code, unit);
+        var edits = sorter.sort();
+        if (edits.isNotEmpty) {
+          fail('Unsorted file $path');
+        }
+      });
+    }
+  }
+}
diff --git a/pkg/analyzer_cli/tool/perf.dart b/pkg/analyzer_cli/tool/perf.dart
index a480e85..5685be8 100644
--- a/pkg/analyzer_cli/tool/perf.dart
+++ b/pkg/analyzer_cli/tool/perf.dart
@@ -38,15 +38,15 @@
   await setup(args[1]);
 
   if (bench == 'scan') {
-    Set<Source> files = scanReachableFiles(entryUri);
+    var files = scanReachableFiles(entryUri);
     // TODO(sigmund): consider replacing the warmup with instrumented snapshots.
-    for (int i = 0; i < 10; i++) {
+    for (var i = 0; i < 10; i++) {
       scanFiles(files);
     }
   } else if (bench == 'parse') {
-    Set<Source> files = scanReachableFiles(entryUri);
+    var files = scanReachableFiles(entryUri);
     // TODO(sigmund): consider replacing the warmup with instrumented snapshots.
-    for (int i = 0; i < 10; i++) {
+    for (var i = 0; i < 10; i++) {
       parseFiles(files);
     }
   } else {
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/relevance.dart b/pkg/analyzer_plugin/lib/utilities/completion/relevance.dart
index eca6b97..0c585f9 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/relevance.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/relevance.dart
@@ -35,3 +35,18 @@
 const int DART_RELEVANCE_NAMED_PARAMETER_REQUIRED = 1065;
 const int DART_RELEVANCE_PARAMETER = 1059;
 const int DART_RELEVANCE_TYPE_PARAMETER = 1058;
+
+/// A name scope for constants that are related to the relevance of completion
+/// suggestions. The values are required to be in the range [0, 1000].
+abstract class Relevance {
+  /// The relevance used when suggesting a `call` method that is implied by a
+  /// type but isn't explicitly implemented in the type hierarchy.
+  static const int callFunction = 200;
+
+  /// The relevance used when suggesting a member of a class or extension and
+  /// there are no features that can be used to provide a relevance score.
+  static const int member = 500;
+
+  /// The relevance used when suggesting an override of an inherited member.
+  static const int override = 750;
+}
diff --git a/pkg/analyzer_plugin/test/utils/package_root.dart b/pkg/analyzer_plugin/test/utils/package_root.dart
index 47d0e31..98c24ba 100644
--- a/pkg/analyzer_plugin/test/utils/package_root.dart
+++ b/pkg/analyzer_plugin/test/utils/package_root.dart
@@ -11,7 +11,9 @@
 String get packageRoot {
   // If the package root directory is specified on the command line using
   // -DpkgRoot=..., use it.
-  String pkgRootVar = const String.fromEnvironment('pkgRoot');
+  String pkgRootVar = bool.hasEnvironment('pkgRoot')
+      ? const String.fromEnvironment('pkgRoot')
+      : null;
   if (pkgRootVar != null) {
     String path = pathos.join(Directory.current.path, pkgRootVar);
     if (!path.endsWith(pathos.separator)) path += pathos.separator;
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index 8d56df5..80362a4 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -55,6 +55,8 @@
   static const String omitImplicitChecks = '--omit-implicit-checks';
   static const String omitAsCasts = '--omit-as-casts';
   static const String laxRuntimeTypeToString = '--lax-runtime-type-to-string';
+  static const String legacyJavaScript = '--legacy-javascript';
+  static const String noLegacyJavaScript = '--no-legacy-javascript';
 
   static const String platformBinaries = '--platform-binaries=.+';
 
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index 65ac11c..980e484 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -499,7 +499,6 @@
   FunctionEntity get typeLiteralMaker;
   FunctionEntity get checkTypeBound;
   FieldEntity get rtiAsField;
-  FieldEntity get rtiCheckField;
   FieldEntity get rtiIsField;
   FieldEntity get rtiRestField;
   FieldEntity get rtiPrecomputed1Field;
@@ -511,27 +510,20 @@
 
   FunctionEntity get generalIsTestImplementation;
   FunctionEntity get generalAsCheckImplementation;
-  FunctionEntity get generalTypeCheckImplementation;
 
   FunctionEntity get specializedIsObject;
   FunctionEntity get specializedAsObject;
-  FunctionEntity get specializedCheckObject;
   FunctionEntity get specializedIsTop;
   FunctionEntity get specializedAsTop;
   FunctionEntity get specializedIsBool;
   FunctionEntity get specializedAsBoolNullable;
-  FunctionEntity get specializedCheckBoolNullable;
   FunctionEntity get specializedAsDoubleNullable;
-  FunctionEntity get specializedCheckDoubleNullable;
   FunctionEntity get specializedIsInt;
   FunctionEntity get specializedAsIntNullable;
-  FunctionEntity get specializedCheckIntNullable;
   FunctionEntity get specializedIsNum;
   FunctionEntity get specializedAsNumNullable;
-  FunctionEntity get specializedCheckNumNullable;
   FunctionEntity get specializedIsString;
   FunctionEntity get specializedAsStringNullable;
-  FunctionEntity get specializedCheckStringNullable;
 
   FunctionEntity get instantiatedGenericFunctionTypeNewRti;
   FunctionEntity get closureFunctionType;
@@ -1921,11 +1913,6 @@
   @override
   FieldEntity get rtiIsField => _rtiIsField ??= _findRtiClassField('_is');
 
-  FieldEntity _rtiCheckField;
-  @override
-  FieldEntity get rtiCheckField =>
-      _rtiCheckField ??= _findRtiClassField('_check');
-
   FieldEntity _rtiRestField;
   @override
   FieldEntity get rtiRestField => _rtiRestField ??= _findRtiClassField('_rest');
@@ -1973,12 +1960,6 @@
       _generalAsCheckImplementation ??=
           _findRtiFunction('_generalAsCheckImplementation');
 
-  FunctionEntity _generalTypeCheckImplementation;
-  @override
-  FunctionEntity get generalTypeCheckImplementation =>
-      _generalTypeCheckImplementation ??=
-          _findRtiFunction('_generalTypeCheckImplementation');
-
   FunctionEntity _specializedIsObject;
   @override
   FunctionEntity get specializedIsObject =>
@@ -1989,11 +1970,6 @@
   FunctionEntity get specializedAsObject =>
       _specializedAsObject ??= _findRtiFunction('_asObject');
 
-  FunctionEntity _specializedCheckObject;
-  @override
-  FunctionEntity get specializedCheckObject =>
-      _specializedCheckObject ??= _findRtiFunction('_checkObject');
-
   @override
   FunctionEntity get specializedIsTop => _findRtiFunction('_isTop');
 
@@ -2008,18 +1984,10 @@
       _findRtiFunction('_asBoolNullable');
 
   @override
-  FunctionEntity get specializedCheckBoolNullable =>
-      _findRtiFunction('_checkBoolNullable');
-
-  @override
   FunctionEntity get specializedAsDoubleNullable =>
       _findRtiFunction('_asDoubleNullable');
 
   @override
-  FunctionEntity get specializedCheckDoubleNullable =>
-      _findRtiFunction('_checkDoubleNullable');
-
-  @override
   FunctionEntity get specializedIsInt => _findRtiFunction('_isInt');
 
   @override
@@ -2027,10 +1995,6 @@
       _findRtiFunction('_asIntNullable');
 
   @override
-  FunctionEntity get specializedCheckIntNullable =>
-      _findRtiFunction('_checkIntNullable');
-
-  @override
   FunctionEntity get specializedIsNum => _findRtiFunction('_isNum');
 
   @override
@@ -2038,10 +2002,6 @@
       _findRtiFunction('_asNumNullable');
 
   @override
-  FunctionEntity get specializedCheckNumNullable =>
-      _findRtiFunction('_checkNumNullable');
-
-  @override
   FunctionEntity get specializedIsString => _findRtiFunction('_isString');
 
   @override
@@ -2049,10 +2009,6 @@
       _findRtiFunction('_asStringNullable');
 
   @override
-  FunctionEntity get specializedCheckStringNullable =>
-      _findRtiFunction('_checkStringNullable');
-
-  @override
   FunctionEntity get instantiatedGenericFunctionTypeNewRti =>
       _findRtiFunction('instantiatedGenericFunctionType');
 
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index 0fab620..e4953b3 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -463,6 +463,8 @@
     new OptionHandler(Flags.omitImplicitChecks, passThrough),
     new OptionHandler(Flags.omitAsCasts, passThrough),
     new OptionHandler(Flags.laxRuntimeTypeToString, passThrough),
+    new OptionHandler(Flags.legacyJavaScript, passThrough),
+    new OptionHandler(Flags.noLegacyJavaScript, passThrough),
     new OptionHandler(Flags.benchmarkingProduction, passThrough),
     new OptionHandler(Flags.benchmarkingExperiment, passThrough),
     new OptionHandler(Flags.nullSafety, setNullSafetyMode),
diff --git a/pkg/compiler/lib/src/elements/types.dart b/pkg/compiler/lib/src/elements/types.dart
index 6e0ebab..9cf992b 100644
--- a/pkg/compiler/lib/src/elements/types.dart
+++ b/pkg/compiler/lib/src/elements/types.dart
@@ -5,7 +5,7 @@
 import '../common/names.dart';
 import '../common_elements.dart';
 import '../serialization/serialization.dart';
-import '../util/util.dart' show equalElements;
+import '../util/util.dart' show equalElements, identicalElements;
 import 'entities.dart';
 
 /// Hierarchy to describe types in Dart.
@@ -987,6 +987,115 @@
       visitType(type, argument);
 }
 
+class _LegacyErasureVisitor extends DartTypeVisitor<DartType, Null> {
+  final DartTypes _dartTypes;
+
+  _LegacyErasureVisitor(this._dartTypes);
+
+  DartType erase(DartType type) => visit(type, null);
+
+  List<DartType> eraseList(List<DartType> types) {
+    List<DartType> erasedTypes = types.map(erase).toList();
+    return identicalElements(erasedTypes, types) ? types : erasedTypes;
+  }
+
+  @override
+  DartType visit(DartType type, Null _) => type.accept(this, _);
+
+  @override
+  DartType visitLegacyType(LegacyType type, Null _) => erase(type.baseType);
+
+  @override
+  DartType visitNullableType(NullableType type, Null _) {
+    var baseType = erase(type.baseType);
+    if (identical(baseType, type.baseType)) return type;
+    return _dartTypes.nullableType(baseType);
+  }
+
+  @override
+  NeverType visitNeverType(NeverType type, Null _) => type;
+
+  @override
+  VoidType visitVoidType(VoidType type, Null _) => type;
+
+  @override
+  TypeVariableType visitTypeVariableType(TypeVariableType type, Null _) => type;
+
+  @override
+  FunctionTypeVariable visitFunctionTypeVariable(
+          FunctionTypeVariable type, Null _) =>
+      type;
+
+  @override
+  FunctionType visitFunctionType(FunctionType type, Null _) {
+    var returnType = erase(type.returnType);
+    var parameterTypes = eraseList(type.parameterTypes);
+    var optionalParameterTypes = eraseList(type.optionalParameterTypes);
+    var namedParameterTypes = eraseList(type.namedParameterTypes);
+
+    var oldTypeVariables = type.typeVariables;
+    var length = oldTypeVariables.length;
+
+    List<FunctionTypeVariable> typeVariables =
+        List<FunctionTypeVariable>(length);
+    List<FunctionTypeVariable> erasableTypeVariables = [];
+    List<FunctionTypeVariable> erasedTypeVariables = [];
+    for (int i = 0; i < length; i++) {
+      var oldTypeVariable = oldTypeVariables[i];
+      var oldBound = oldTypeVariable.bound;
+      var bound = erase(oldBound);
+      if (identical(bound, oldBound)) {
+        typeVariables[i] = oldTypeVariable;
+      } else {
+        var typeVariable = _dartTypes.functionTypeVariable(i)..bound = bound;
+        typeVariables[i] = typeVariable;
+        erasableTypeVariables.add(oldTypeVariable);
+        erasedTypeVariables.add(typeVariable);
+      }
+    }
+
+    if (identical(returnType, type.returnType) &&
+        identical(parameterTypes, type.parameterTypes) &&
+        identical(optionalParameterTypes, type.optionalParameterTypes) &&
+        identical(namedParameterTypes, type.namedParameterTypes) &&
+        erasableTypeVariables.isEmpty) return type;
+
+    return _dartTypes.subst(
+        erasedTypeVariables,
+        erasableTypeVariables,
+        _dartTypes.functionType(
+            returnType,
+            parameterTypes,
+            optionalParameterTypes,
+            type.namedParameters,
+            namedParameterTypes,
+            typeVariables));
+  }
+
+  @override
+  InterfaceType visitInterfaceType(InterfaceType type, Null _) {
+    var typeArguments = eraseList(type.typeArguments);
+    if (identical(typeArguments, type.typeArguments)) return type;
+    return _dartTypes.interfaceType(type.element, typeArguments);
+  }
+
+  @override
+  DynamicType visitDynamicType(DynamicType type, Null _) => type;
+
+  @override
+  ErasedType visitErasedType(ErasedType type, Null _) => type;
+
+  @override
+  AnyType visitAnyType(AnyType type, Null _) => type;
+
+  @override
+  DartType visitFutureOrType(FutureOrType type, Null _) {
+    var typeArgument = erase(type.typeArgument);
+    if (identical(typeArgument, type.typeArgument)) return type;
+    return _dartTypes.futureOrType(typeArgument);
+  }
+}
+
 abstract class DartTypeSubstitutionVisitor<A>
     extends DartTypeVisitor<DartType, A> {
   DartTypes get dartTypes;
@@ -1649,10 +1758,10 @@
         t is NullableType ||
         t is LegacyType && _isNullable(t.baseType) ||
         t is FutureOrType && _isNullable(t.typeArgument) ||
-        _isStrongTopType(t);
+        isStrongTopType(t);
 
     DartType result;
-    if (_isStrongTopType(baseType) ||
+    if (isStrongTopType(baseType) ||
         baseType.isNull ||
         baseType is NullableType ||
         baseType is FutureOrType && _isNullable(baseType.typeArgument)) {
@@ -1665,7 +1774,7 @@
         result = commonElements.nullType;
       } else if (legacyBaseType is FutureOrType &&
           _isNullable(legacyBaseType.typeArgument)) {
-        result = legacyBaseType.typeArgument;
+        result = legacyBaseType;
       } else {
         result = nullableType(legacyBaseType);
       }
@@ -1675,7 +1784,8 @@
     return result;
   }
 
-  DartType interfaceType(ClassEntity element, List<DartType> typeArguments) =>
+  InterfaceType interfaceType(
+          ClassEntity element, List<DartType> typeArguments) =>
       InterfaceType._(element, typeArguments);
 
   // TODO(fishythefish): Normalize `T extends Never` to `Never`.
@@ -1683,9 +1793,10 @@
       TypeVariableType._(element);
 
   // See [functionType] for normalization.
-  DartType functionTypeVariable(int index) => FunctionTypeVariable._(index);
+  FunctionTypeVariable functionTypeVariable(int index) =>
+      FunctionTypeVariable._(index);
 
-  DartType neverType() => const NeverType._();
+  NeverType neverType() => const NeverType._();
 
   VoidType voidType() => const VoidType._();
 
@@ -1736,6 +1847,9 @@
     return result;
   }
 
+  DartType eraseLegacy(DartType type) =>
+      _LegacyErasureVisitor(this).erase(type);
+
   /// Performs the substitution `[arguments[i]/parameters[i]]t`.
   ///
   /// The notation is known from this lambda calculus rule:
@@ -1775,7 +1889,7 @@
   /// Returns `true` if [t] is a top type, that is, a supertype of every type.
   bool isTopType(DartType t) => t._isTop(useNullSafety);
 
-  bool _isStrongTopType(DartType t) => t._isStrongTop(useNullSafety);
+  bool isStrongTopType(DartType t) => t._isStrongTop(useNullSafety);
 
   /// Returns `true` if [s] is a subtype of [t].
   bool isSubtype(DartType s, DartType t) => _subtypeHelper(s, t);
@@ -1818,7 +1932,7 @@
       if (isTopType(t)) return true;
 
       // Left Top:
-      if (_isStrongTopType(s)) return false;
+      if (isStrongTopType(s)) return false;
 
       // Left Bottom:
       if (useLegacySubtyping) {
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
index fdfb99e..c3683c5 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
@@ -273,6 +273,13 @@
           nullable ? value : value.nonNullable(), isPrecise);
     }
 
+    if (type is NullableType) {
+      return createFromStaticType(type.baseType,
+          classRelation: classRelation, nullable: true);
+    }
+
+    // TODO(sra): Handle LegacyType more precisely.
+
     bool isPrecise = true;
     while (type is TypeVariableType) {
       TypeVariableType typeVariable = type;
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index dbe085e..75ec907 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -184,8 +184,7 @@
   /// If this is not the case the raw type of [superclass] is returned.
   ///
   /// This method is derived from `ir.Expression.getStaticTypeAsInstanceOf`.
-  ir.InterfaceType getTypeAsInstanceOf(
-      ir.DartType type, ir.Class superclass, ir.Library clientLibrary) {
+  ir.InterfaceType getTypeAsInstanceOf(ir.DartType type, ir.Class superclass) {
     // This method assumes the program is correctly typed, so if the superclass
     // is not generic, we can just return its raw type without computing the
     // type of this expression.  It also ensures that all types are considered
@@ -193,25 +192,26 @@
     // considered subtypes of Function.
     if (superclass.typeParameters.isEmpty) {
       return typeEnvironment.coreTypes
-          .rawType(superclass, ir.Nullability.legacy);
+          .rawType(superclass, currentLibrary.nonNullable);
     }
     while (type is ir.TypeParameterType) {
       type = (type as ir.TypeParameterType).parameter.bound;
     }
     if (type == typeEnvironment.nullType) {
       return typeEnvironment.coreTypes
-          .bottomInterfaceType(superclass, clientLibrary.nullable);
+          .bottomInterfaceType(superclass, currentLibrary.nullable);
     }
     if (type is ir.InterfaceType) {
       ir.InterfaceType upcastType = typeEnvironment.getTypeAsInstanceOf(
-          type, superclass, clientLibrary, typeEnvironment.coreTypes);
+          type, superclass, currentLibrary, typeEnvironment.coreTypes);
       if (upcastType != null) return upcastType;
     } else if (type is ir.BottomType) {
       return typeEnvironment.coreTypes
-          .bottomInterfaceType(superclass, clientLibrary.nonNullable);
+          .bottomInterfaceType(superclass, currentLibrary.nonNullable);
     }
     // TODO(johnniwinther): Should we assert that this doesn't happen?
-    return typeEnvironment.coreTypes.rawType(superclass, type.nullability);
+    return typeEnvironment.coreTypes
+        .rawType(superclass, currentLibrary.nonNullable);
   }
 
   /// Computes the result type of the property access [node] on a receiver of
@@ -228,8 +228,7 @@
     }
     if (interfaceTarget != null) {
       ir.Class superclass = interfaceTarget.enclosingClass;
-      receiverType =
-          getTypeAsInstanceOf(receiverType, superclass, currentLibrary);
+      receiverType = getTypeAsInstanceOf(receiverType, superclass);
       return ir.Substitution.fromInterfaceType(receiverType)
           .substituteType(interfaceTarget.getterType);
     }
@@ -299,7 +298,7 @@
         ir.Class superclass = interfaceTarget.enclosingClass;
         ir.Substitution receiverSubstitution =
             ir.Substitution.fromInterfaceType(
-                getTypeAsInstanceOf(receiverType, superclass, currentLibrary));
+                getTypeAsInstanceOf(receiverType, superclass));
         ir.DartType setterType =
             receiverSubstitution.substituteType(interfaceTarget.setterType);
         if (!typeEnvironment.isSubtypeOf(
@@ -332,8 +331,7 @@
   ir.DartType visitDirectPropertyGet(ir.DirectPropertyGet node) {
     ir.DartType receiverType = visitNode(node.receiver);
     ir.Class superclass = node.target.enclosingClass;
-    receiverType =
-        getTypeAsInstanceOf(receiverType, superclass, currentLibrary);
+    receiverType = getTypeAsInstanceOf(receiverType, superclass);
     ir.DartType resultType = ir.Substitution.fromInterfaceType(receiverType)
         .substituteType(node.target.getterType);
     _expressionTypeCache[node] = resultType;
@@ -358,8 +356,7 @@
           receiverType, argumentType);
     } else {
       ir.Class superclass = node.target.enclosingClass;
-      receiverType =
-          getTypeAsInstanceOf(receiverType, superclass, currentLibrary);
+      receiverType = getTypeAsInstanceOf(receiverType, superclass);
       ir.DartType returnType = ir.Substitution.fromInterfaceType(receiverType)
           .substituteType(node.target.function.returnType);
       returnType = ir.Substitution.fromPairs(
@@ -618,7 +615,7 @@
     if (interfaceTarget != null) {
       ir.Class superclass = interfaceTarget.enclosingClass;
       ir.Substitution receiverSubstitution = ir.Substitution.fromInterfaceType(
-          getTypeAsInstanceOf(receiverType, superclass, currentLibrary));
+          getTypeAsInstanceOf(receiverType, superclass));
       ir.DartType getterType =
           receiverSubstitution.substituteType(interfaceTarget.getterType);
       if (getterType is ir.FunctionType) {
diff --git a/pkg/compiler/lib/src/ir/visitors.dart b/pkg/compiler/lib/src/ir/visitors.dart
index c3afdfa..cd46b51 100644
--- a/pkg/compiler/lib/src/ir/visitors.dart
+++ b/pkg/compiler/lib/src/ir/visitors.dart
@@ -186,6 +186,8 @@
 
   ConstantValuefier(this.elementMap);
 
+  DartTypes get _dartTypes => elementMap.commonElements.dartTypes;
+
   @override
   ConstantValue defaultConstant(ir.Constant node) {
     throw new UnsupportedError(
@@ -199,7 +201,7 @@
 
   @override
   ConstantValue visitTypeLiteralConstant(ir.TypeLiteralConstant node) {
-    DartType type = elementMap.getDartType(node.type);
+    DartType type = _dartTypes.eraseLegacy(elementMap.getDartType(node.type));
     return constant_system.createType(elementMap.commonElements, type);
   }
 
diff --git a/pkg/compiler/lib/src/js_backend/backend_impact.dart b/pkg/compiler/lib/src/js_backend/backend_impact.dart
index 42fea65..ffa56a2 100644
--- a/pkg/compiler/lib/src/js_backend/backend_impact.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_impact.dart
@@ -812,29 +812,21 @@
           _commonElements.rtiBindMethod,
           _commonElements.generalIsTestImplementation,
           _commonElements.generalAsCheckImplementation,
-          _commonElements.generalTypeCheckImplementation,
           // Specialized checks.
           _commonElements.specializedIsBool,
           _commonElements.specializedAsBoolNullable,
-          _commonElements.specializedCheckBoolNullable,
           // no specializedIsDouble.
           _commonElements.specializedAsDoubleNullable,
-          _commonElements.specializedCheckDoubleNullable,
           _commonElements.specializedIsInt,
           _commonElements.specializedAsIntNullable,
-          _commonElements.specializedCheckIntNullable,
           _commonElements.specializedIsNum,
           _commonElements.specializedAsNumNullable,
-          _commonElements.specializedCheckNumNullable,
           _commonElements.specializedIsString,
           _commonElements.specializedAsStringNullable,
-          _commonElements.specializedCheckStringNullable,
           _commonElements.specializedIsTop,
           _commonElements.specializedAsTop,
-          // no specializedCheckTop
           _commonElements.specializedIsObject,
           _commonElements.specializedAsObject,
-          _commonElements.specializedCheckObject,
         ], globalClasses: [
           _commonElements.closureClass, // instanceOrFunctionType uses this.
         ])
diff --git a/pkg/compiler/lib/src/js_backend/specialized_checks.dart b/pkg/compiler/lib/src/js_backend/specialized_checks.dart
index afb4661..9df9562 100644
--- a/pkg/compiler/lib/src/js_backend/specialized_checks.dart
+++ b/pkg/compiler/lib/src/js_backend/specialized_checks.dart
@@ -85,24 +85,21 @@
   }
 
   static MemberEntity findAsCheck(
-      DartType dartType, bool isTypeError, JCommonElements commonElements) {
+      DartType dartType, JCommonElements commonElements) {
     if (dartType is InterfaceType) {
       if (dartType.typeArguments.isNotEmpty) return null;
-      return _findAsCheck(dartType.element, commonElements,
-          isTypeError: isTypeError, isNullable: true);
+      return _findAsCheck(dartType.element, commonElements, isNullable: true);
     }
     return null;
   }
 
   static MemberEntity _findAsCheck(
       ClassEntity element, JCommonElements commonElements,
-      {bool isTypeError, bool isNullable}) {
+      {bool isNullable}) {
     if (element == commonElements.jsStringClass ||
         element == commonElements.stringClass) {
       if (isNullable) {
-        return isTypeError
-            ? commonElements.specializedCheckStringNullable
-            : commonElements.specializedAsStringNullable;
+        return commonElements.specializedAsStringNullable;
       }
       return null;
     }
@@ -110,9 +107,7 @@
     if (element == commonElements.jsBoolClass ||
         element == commonElements.boolClass) {
       if (isNullable) {
-        return isTypeError
-            ? commonElements.specializedCheckBoolNullable
-            : commonElements.specializedAsBoolNullable;
+        return commonElements.specializedAsBoolNullable;
       }
       return null;
     }
@@ -120,9 +115,7 @@
     if (element == commonElements.jsDoubleClass ||
         element == commonElements.doubleClass) {
       if (isNullable) {
-        return isTypeError
-            ? commonElements.specializedCheckDoubleNullable
-            : commonElements.specializedAsDoubleNullable;
+        return commonElements.specializedAsDoubleNullable;
       }
       return null;
     }
@@ -130,9 +123,7 @@
     if (element == commonElements.jsNumberClass ||
         element == commonElements.numClass) {
       if (isNullable) {
-        return isTypeError
-            ? commonElements.specializedCheckNumNullable
-            : commonElements.specializedAsNumNullable;
+        return commonElements.specializedAsNumNullable;
       }
       return null;
     }
@@ -143,9 +134,7 @@
         element == commonElements.jsUInt31Class ||
         element == commonElements.jsPositiveIntClass) {
       if (isNullable) {
-        return isTypeError
-            ? commonElements.specializedCheckIntNullable
-            : commonElements.specializedAsIntNullable;
+        return commonElements.specializedAsIntNullable;
       }
       return null;
     }
diff --git a/pkg/compiler/lib/src/js_backend/type_reference.dart b/pkg/compiler/lib/src/js_backend/type_reference.dart
index ac15b8e..e6b39a4 100644
--- a/pkg/compiler/lib/src/js_backend/type_reference.dart
+++ b/pkg/compiler/lib/src/js_backend/type_reference.dart
@@ -744,7 +744,7 @@
     if (arguments.isEmpty) return;
     if (arguments.length == 1) {
       // e.g. "List_of_int_Function"
-      if (arguments.first is FunctionType) {
+      if (arguments.first.withoutNullability is FunctionType) {
         _add('of');
       }
       // e.g. "List_int"
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
index c0c4dff..b8767b2 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
@@ -1944,9 +1944,12 @@
 
     globals.add(js.Property(
         js.string(ARRAY_RTI_PROPERTY),
-        js.js(r'typeof Symbol == "function" && typeof Symbol() == "symbol"'
-            r'    ? Symbol("$ti")'
-            r'    : "$ti"')));
+        _options.legacyJavaScript
+            ? js.js(
+                r'typeof Symbol == "function" && typeof Symbol() == "symbol"'
+                r'    ? Symbol("$ti")'
+                r'    : "$ti"')
+            : js.js(r'Symbol("$ti")')));
 
     js.ObjectInitializer globalsObject = js.ObjectInitializer(globals);
 
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 5e5fdd6..78e93d5 100644
--- a/pkg/compiler/lib/src/js_model/element_map_impl.dart
+++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart
@@ -682,7 +682,9 @@
         data.instantiationToBounds = data.thisType;
       } else {
         data.instantiationToBounds = getInterfaceType(ir.instantiateToBounds(
-            coreTypes.legacyRawType(node), coreTypes.objectClass));
+            coreTypes.legacyRawType(node),
+            coreTypes.objectClass,
+            node.enclosingLibrary));
       }
     }
   }
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index ce1b97f..b0c227b 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -302,7 +302,9 @@
         data.instantiationToBounds = data.thisType;
       } else {
         data.instantiationToBounds = getInterfaceType(ir.instantiateToBounds(
-            coreTypes.legacyRawType(node), coreTypes.objectClass));
+            coreTypes.legacyRawType(node),
+            coreTypes.objectClass,
+            node.enclosingLibrary));
       }
     }
   }
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 7355060..aa2af76 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -264,6 +264,14 @@
   /// `Object.runtimeType`.
   bool laxRuntimeTypeToString = false;
 
+  /// Whether to restrict the generated JavaScript to features that work on the
+  /// oldest supported versions of JavaScript. This currently means IE11. If
+  /// `true`, the generated code runs on the legacy JavaScript platform. If
+  /// `false`, the code will fail on the legacy JavaScript platform.
+  bool legacyJavaScript = true; // default value.
+  bool _legacyJavaScript = false;
+  bool _noLegacyJavaScript = false;
+
   /// What should the compiler do with parameter type assertions.
   ///
   /// This is an internal configuration option derived from other flags.
@@ -446,6 +454,8 @@
       ..omitAsCasts = _hasOption(options, Flags.omitAsCasts)
       ..laxRuntimeTypeToString =
           _hasOption(options, Flags.laxRuntimeTypeToString)
+      .._legacyJavaScript = _hasOption(options, Flags.legacyJavaScript)
+      .._noLegacyJavaScript = _hasOption(options, Flags.noLegacyJavaScript)
       ..testMode = _hasOption(options, Flags.testMode)
       ..trustJSInteropTypeAnnotations =
           _hasOption(options, Flags.trustJSInteropTypeAnnotations)
@@ -493,6 +503,10 @@
         equalMaps(languageExperiments, fe.defaultExperimentalFlags)) {
       throw new ArgumentError("Missing required ${Flags.platformBinaries}");
     }
+    if (_legacyJavaScript && _noLegacyJavaScript) {
+      throw ArgumentError("'${Flags.legacyJavaScript}' incompatible with "
+          "'${Flags.noLegacyJavaScript}'");
+    }
   }
 
   void deriveOptions() {
@@ -508,6 +522,9 @@
       useNewRti = false;
     }
 
+    if (_noLegacyJavaScript) legacyJavaScript = false;
+    if (_legacyJavaScript) legacyJavaScript = true;
+
     if (optimizationLevel != null) {
       if (optimizationLevel == 0) {
         disableInlining = true;
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index f3c8578..ffc588d 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -391,6 +391,8 @@
         return options.useNullSafety;
       case 'LEGACY':
         return options.useLegacySubtyping;
+      case 'LEGACY_JAVASCRIPT':
+        return options.legacyJavaScript;
       case 'PRINT_LEGACY_STARS':
         return options.printLegacyStars;
       default:
@@ -3104,14 +3106,14 @@
   /// Set the runtime type information if necessary.
   HInstruction _setListRuntimeTypeInfoIfNeeded(HInstruction object,
       InterfaceType type, SourceInformation sourceInformation) {
+    // [type] could be `List<T>`, so ensure it is `JSArray<T>`.
+    InterfaceType arrayType = dartTypes.interfaceType(
+        _commonElements.jsArrayClass, type.typeArguments);
     if (!_rtiNeed.classNeedsTypeArguments(type.element) ||
-        dartTypes.treatAsRawType(type)) {
+        _equivalentToMissingRti(arrayType)) {
       return object;
     }
     if (options.useNewRti) {
-      // [type] could be `List<T>`, so ensure it is `JSArray<T>`.
-      InterfaceType arrayType = dartTypes.interfaceType(
-          _commonElements.jsArrayClass, type.typeArguments);
       HInstruction rti =
           _typeBuilder.analyzeTypeArgumentNewRti(arrayType, sourceElement);
 
@@ -4729,6 +4731,15 @@
     push(rti);
   }
 
+  bool _equivalentToMissingRti(InterfaceType type) {
+    assert(type.element == _commonElements.jsArrayClass);
+    if (dartTypes.useNullSafety) {
+      return dartTypes.isStrongTopType(type.typeArguments.single);
+    } else {
+      return dartTypes.treatAsRawType(type);
+    }
+  }
+
   void _handleForeignJs(ir.StaticInvocation invocation) {
     if (_unexpectedForeignArguments(invocation,
         minPositional: 2, maxPositional: null, typeArgumentCount: 1)) {
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index 6727238..b5848269 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -3535,9 +3535,7 @@
 
     _registry.registerTypeUse(TypeUse.isCheck(node.checkedTypeExpression));
 
-    FieldEntity field = node.isTypeError
-        ? _commonElements.rtiCheckField
-        : _commonElements.rtiAsField;
+    FieldEntity field = _commonElements.rtiAsField;
     js.Name name = _namer.instanceFieldPropertyName(field);
 
     push(js.js('#.#(#)', [first, name, second]).withSourceInformation(
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index 5c12d0b..4f2dfa8 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -2133,8 +2133,8 @@
     if (typeInput is HLoadType) {
       TypeExpressionRecipe recipe = typeInput.typeExpression;
       DartType dartType = recipe.type;
-      MemberEntity specializedCheck = SpecializedChecks.findAsCheck(
-          dartType, node.isTypeError, _closedWorld.commonElements);
+      MemberEntity specializedCheck =
+          SpecializedChecks.findAsCheck(dartType, _closedWorld.commonElements);
       if (specializedCheck != null) {
         AbstractValueWithPrecision checkedType =
             _abstractValueDomain.createFromStaticType(dartType, nullable: true);
diff --git a/pkg/compiler/lib/src/tracer.dart b/pkg/compiler/lib/src/tracer.dart
index e42352b..66564af 100644
--- a/pkg/compiler/lib/src/tracer.dart
+++ b/pkg/compiler/lib/src/tracer.dart
@@ -17,8 +17,7 @@
     : TRACE_FILTER_PATTERN_FOR_TEST;
 
 const String TRACE_FILTER_PATTERN_FROM_ENVIRONMENT =
-    // TODO(sigmund): remove `?? ''` once #40678 is backported.
-    const String.fromEnvironment("DUMP_IR") ?? '';
+    String.fromEnvironment("DUMP_IR", defaultValue: "");
 String TRACE_FILTER_PATTERN_FOR_TEST;
 
 /// Dumps the intermediate representation after each phase in a format
diff --git a/pkg/compiler/lib/src/util/util.dart b/pkg/compiler/lib/src/util/util.dart
index 1174c10..a4e0f16 100644
--- a/pkg/compiler/lib/src/util/util.dart
+++ b/pkg/compiler/lib/src/util/util.dart
@@ -103,6 +103,18 @@
   }
 }
 
+bool identicalElements<E>(List<E> a, List<E> b) {
+  if (identical(a, b)) return true;
+  if (a == null || b == null) return false;
+  if (a.length != b.length) return false;
+  for (int index = 0; index < a.length; index++) {
+    if (!identical(a[index], b[index])) {
+      return false;
+    }
+  }
+  return true;
+}
+
 bool equalElements<E>(List<E> a, List<E> b) {
   if (identical(a, b)) return true;
   if (a == null || b == null) return false;
diff --git a/pkg/dartdev/lib/src/commands/pub.dart b/pkg/dartdev/lib/src/commands/pub.dart
index acc8e39..1b24c65 100644
--- a/pkg/dartdev/lib/src/commands/pub.dart
+++ b/pkg/dartdev/lib/src/commands/pub.dart
@@ -15,6 +15,25 @@
 
   final ArgParser argParser = ArgParser.allowAnything();
 
+  /// Override [printUsage] for invocations of 'dart help pub' which won't
+  /// execute [run] below.  Without this, the 'dart help pub' reports the
+  /// command pub with no commands or flags.
+  @override
+  void printUsage() {
+    final command = sdk.pub;
+    final args = ['help'];
+
+    log.trace('$command ${args.first}');
+
+    // Call 'pub help'
+    // Process.runSync(..) is used since [printUsage] is not an async method,
+    // and we want to guarantee that the result (the help text for the console)
+    // is printed before command exits.
+    final result = Process.runSync(command, args);
+    stderr.write(result.stderr);
+    stdout.write(result.stdout);
+  }
+
   @override
   FutureOr<int> run() async {
     final command = sdk.pub;
diff --git a/pkg/dartdev/test/commands/help_test.dart b/pkg/dartdev/test/commands/help_test.dart
new file mode 100644
index 0000000..cfc6e77
--- /dev/null
+++ b/pkg/dartdev/test/commands/help_test.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.
+
+import 'package:args/command_runner.dart';
+import 'package:dartdev/dartdev.dart';
+import 'package:test/test.dart';
+
+import '../utils.dart';
+
+void main() {
+  group('help', help);
+}
+
+void help() {
+  TestProject p;
+
+  tearDown(() => p?.dispose());
+
+  /// Commands not tested by the following loop.
+  List<String> _commandsNotTested = <String>[
+    'help', // `dart help help` is redundant
+    'test' // TODO(jwren) not yet implemented, dartbug.com/41041
+  ];
+  DartdevRunner([]).commands.forEach((String commandKey, Command command) {
+    if (!_commandsNotTested.contains(commandKey)) {
+      test('(help $commandKey == $commandKey --help)', () {
+        p = project();
+        var result = p.runSync('help', [commandKey]);
+
+        var verbHelpResult = p.runSync(commandKey, ['--help']);
+        expect(result.stdout, contains(verbHelpResult.stdout));
+        expect(result.stderr, contains(verbHelpResult.stderr));
+      });
+    }
+  });
+
+  test('(help pub == pub help)', () {
+    p = project();
+    var result = p.runSync('help', ['pub']);
+
+    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([]).commands.forEach((String commandKey, Command command) {
+      var helpOption = command.argParser.options['help'];
+      // Some commands (like pub which use
+      // "argParser = ArgParser.allowAnything()") may not have the help Option
+      // accessible with the API used above:
+      if (helpOption != null) {
+        expect(helpOption.abbr, 'h', reason: '');
+      }
+    });
+  });
+}
diff --git a/pkg/dartdev/test/test_all.dart b/pkg/dartdev/test/test_all.dart
index 552691c..4b9ccaa 100644
--- a/pkg/dartdev/test/test_all.dart
+++ b/pkg/dartdev/test/test_all.dart
@@ -8,6 +8,7 @@
 import 'commands/create_test.dart' as create;
 import 'commands/flag_test.dart' as flag;
 import 'commands/format_test.dart' as format;
+import 'commands/help_test.dart' as help;
 import 'commands/migrate_test.dart' as migrate;
 import 'commands/pub_test.dart' as pub;
 import 'commands/test_test.dart' as test;
@@ -16,11 +17,12 @@
 import 'utils_test.dart' as utils;
 
 main() {
-  group('dartdev', () {
+  group('dart', () {
     analyze.main();
     create.main();
     flag.main();
     format.main();
+    help.main();
     migrate.main();
     pub.main();
     test.main();
diff --git a/pkg/dds/.gitignore b/pkg/dds/.gitignore
new file mode 100644
index 0000000..e308da7
--- /dev/null
+++ b/pkg/dds/.gitignore
@@ -0,0 +1,5 @@
+# See https://dart.dev/guides/libraries/private-files
+.dart_tool/
+.packages
+build/
+pubspec.lock
diff --git a/pkg/dds/CHANGELOG.md b/pkg/dds/CHANGELOG.md
new file mode 100644
index 0000000..1f3d60f
--- /dev/null
+++ b/pkg/dds/CHANGELOG.md
@@ -0,0 +1,3 @@
+# 0.1.0-dev
+
+- Initial release.
diff --git a/pkg/dds/LICENSE b/pkg/dds/LICENSE
new file mode 100644
index 0000000..18daf2b
--- /dev/null
+++ b/pkg/dds/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2020, 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.
diff --git a/pkg/dds/README.md b/pkg/dds/README.md
new file mode 100644
index 0000000..ab9067c
--- /dev/null
+++ b/pkg/dds/README.md
@@ -0,0 +1,10 @@
+_This package is a work in-progress and the API may not be stable. Stay tuned for updates._
+
+A package used to spawn the Dart Developer Service (DDS), which is used to communicate with a Dart VM Service instance and provide extended functionality to the core VM Service Protocol.
+
+# Functionality
+
+Existing VM Service clients can issue both HTTP and websocket requests to a running DDS instance as if it were an instance of the VM Service itself. If a request corresponds to an RPC defined in the [VM Service Protocol][service-protocol], DDS will forward the request and return the response from the VM Service. Requests corresponding to an RPC defined in the [DDS Protocol][dds-protocol] will be handled directly by the DDS instance.
+
+[dds-protocol]: dds_protocol.md
+[service-protocol]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md
diff --git a/pkg/dds/analysis_options.yaml b/pkg/dds/analysis_options.yaml
new file mode 100644
index 0000000..b5e3320
--- /dev/null
+++ b/pkg/dds/analysis_options.yaml
@@ -0,0 +1,6 @@
+include: package:pedantic/analysis_options.1.7.0.yaml
+
+linter:
+  rules:
+    - directives_ordering
+    - prefer_generic_function_type_aliases
diff --git a/pkg/dds/dds_protocol.md b/pkg/dds/dds_protocol.md
new file mode 100644
index 0000000..fb6fd82
--- /dev/null
+++ b/pkg/dds/dds_protocol.md
@@ -0,0 +1,56 @@
+# Dart Development Service Protocol 0.x
+
+This document describes _version 0.x_ of the Dart Development Service Protocol.
+This protocol is an extension of the Dart VM Service Protocol and implements it
+in it's entirety. For details on the VM Service Protocol, see the [Dart VM Service Protocol Specification][service-protocol].
+
+The Service Protocol uses [JSON-RPC 2.0][].
+
+[JSON-RPC 2.0]: http://www.jsonrpc.org/specification
+
+
+**Table of Contents**
+
+- [RPCs, Requests, and Responses](#rpcs-requests-and-responses)
+- [Events](#events)
+- [Types](#types)
+- [IDs and Names](#ids-and-names)
+- [Revision History](#revision-history)
+
+## RPCs, Requests, and Responses
+
+See the corresponding section in the VM Service protocol [here][service-protocol-rpcs-requests-and-responses].
+
+## Events
+
+See the corresponding section in the VM Service protocol [here][service-protocol-events].
+
+## Binary Events
+
+See the corresponding section in the VM Service protocol [here][service-protocol-binary-events].
+
+## Types
+
+See the corresponding section in the VM Service protocol [here][service-protocol-types].
+
+## IDs and Names
+
+See the corresponding section in the VM Service protocol [here][service-protocol-ids-and-names].
+
+## Public RPCs
+
+The DDS Protocol supports all [public RPCs defined in the VM Service protocol][service-protocol-public-rpcs].
+
+## Revision History
+
+version | comments
+------- | --------
+0.x | Initial revision
+
+[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-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
+[service-protocol-public-rpcs]: https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md#public-rpcs
\ No newline at end of file
diff --git a/pkg/dds/lib/dds.dart b/pkg/dds/lib/dds.dart
new file mode 100644
index 0000000..d2bb5ea
--- /dev/null
+++ b/pkg/dds/lib/dds.dart
@@ -0,0 +1,87 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for 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 library used to spawn the Dart Developer Service, used to communicate
+/// with a Dart VM Service instance.
+library dds;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:shelf/shelf.dart';
+import 'package:shelf/shelf_io.dart' as io;
+import 'package:shelf_proxy/shelf_proxy.dart';
+import 'package:shelf_web_socket/shelf_web_socket.dart';
+import 'package:web_socket_channel/web_socket_channel.dart';
+
+part 'src/dds_impl.dart';
+
+/// An intermediary between a Dart VM service and its clients that offers
+/// additional functionality on top of the standard VM service protocol.
+///
+/// See the [Dart Development Service Protocol](https://github.com/dart-lang/sdk/blob/master/pkg/dds/dds_protocol.md)
+/// for details.
+abstract class DartDevelopmentService {
+  /// Creates a [DartDevelopmentService] instance which will communicate with a
+  /// VM service.
+  ///
+  /// [remoteVmServiceUri] is the address of the VM service that this
+  /// development service will communicate with.
+  ///
+  /// If provided, [serviceUri] will determine the address and port of the
+  /// spawned Dart Development Service.
+  static Future<DartDevelopmentService> startDartDevelopmentService(
+    Uri remoteVmServiceUri, {
+    Uri serviceUri,
+  }) async {
+    if (remoteVmServiceUri == null) {
+      throw ArgumentError.notNull('remoteVmServiceUri');
+    }
+    if (remoteVmServiceUri.scheme != 'http') {
+      throw ArgumentError(
+        'remoteVmServiceUri must have an HTTP scheme. Actual: ${remoteVmServiceUri.scheme}',
+      );
+    }
+    if (serviceUri != null && serviceUri.scheme != 'http') {
+      throw ArgumentError(
+        'serviceUri must have an HTTP scheme. Actual: ${serviceUri.scheme}',
+      );
+    }
+
+    final service = _DartDevelopmentService(remoteVmServiceUri, serviceUri);
+    await service.startService();
+    return service;
+  }
+
+  DartDevelopmentService._();
+
+  /// Stop accepting requests after gracefully handling existing requests.
+  Future<void> shutdown();
+
+  /// The HTTP [Uri] of the remote VM service instance that this service will
+  /// forward requests to.
+  Uri get remoteVmServiceUri;
+
+  /// The web socket [Uri] of the remote VM service instance that this service
+  /// will forward requests to.
+  ///
+  /// Can be used with [WebSocket] to communicate directly with the VM service.
+  Uri get remoteVmServiceWsUri;
+
+  /// The [Uri] VM service clients can use to communicate with this
+  /// [DartDevelopmentService] via HTTP.
+  ///
+  /// Returns `null` if the service is not running.
+  Uri get uri;
+
+  /// The [Uri] VM service clients can use to communicate with this
+  /// [DartDevelopmentService] via a [WebSocket].
+  ///
+  /// Returns `null` if the service is not running.
+  Uri get wsUri;
+
+  /// Set to `true` if this instance of [DartDevelopmentService] is accepting
+  /// requests.
+  bool get isRunning;
+}
diff --git a/pkg/dds/lib/src/dds_impl.dart b/pkg/dds/lib/src/dds_impl.dart
new file mode 100644
index 0000000..37f019a
--- /dev/null
+++ b/pkg/dds/lib/src/dds_impl.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.
+
+part of dds;
+
+class _DartDevelopmentService implements DartDevelopmentService {
+  _DartDevelopmentService(this._remoteVmServiceUri, this._uri);
+
+  Future<void> startService() async {
+    // Establish the connection to the VM service.
+    _vmServiceSocket = await WebSocket.connect(remoteVmServiceWsUri.toString());
+    _vmServiceStream = _vmServiceSocket.asBroadcastStream();
+    // Once we have a connection to the VM service, we're ready to spawn the intermediary.
+    await _startDDSServer();
+  }
+
+  Future<void> _startDDSServer() async {
+    // No provided address, bind to an available port on localhost.
+    // TODO(bkonyi): handle case where there's no IPv4 loopback.
+    final host = uri?.host ?? InternetAddress.loopbackIPv4.host;
+    final port = uri?.port ?? 0;
+
+    // Start the DDS server.
+    _server = await io.serve(_handlers().handler, host, port);
+    _uri = Uri(scheme: 'http', host: host, port: _server.port);
+  }
+
+  /// Stop accepting requests after gracefully handling existing requests.
+  Future<void> shutdown() async {
+    await _server.close();
+    await _vmServiceSocket.close();
+  }
+
+  // Attempt to upgrade HTTP requests to a websocket before processing them as
+  // standard HTTP requests. The websocket handler will fail quickly if the
+  // request doesn't appear to be a websocket upgrade request.
+  Cascade _handlers() => Cascade().add(_webSocketHandler()).add(_httpHandler());
+
+  Handler _webSocketHandler() => webSocketHandler((WebSocketChannel ws) {
+        // TODO(bkonyi): actually process requests instead of blindly forwarding them.
+        _vmServiceStream.listen(
+          (event) => ws.sink.add(event),
+          onDone: () => ws.sink.close(),
+        );
+        ws.stream.listen((event) => _vmServiceSocket.add(event));
+      });
+
+  Handler _httpHandler() {
+    // TODO(bkonyi): actually process requests instead of blindly forwarding them.
+    final cascade = Cascade().add(proxyHandler(remoteVmServiceUri));
+    return cascade.handler;
+  }
+
+  Uri _toWebSocket(Uri uri) {
+    if (uri == null) {
+      return null;
+    }
+    final pathSegments = <String>[];
+    if (uri.pathSegments.isNotEmpty) {
+      pathSegments.addAll(uri.pathSegments.where(
+        // Strip out the empty string that appears at the end of path segments.
+        // Empty string elements will result in an extra '/' being added to the
+        // URI.
+        (s) => s.isNotEmpty,
+      ));
+    }
+    pathSegments.add('ws');
+    return uri.replace(scheme: 'ws', pathSegments: pathSegments);
+  }
+
+  Uri get remoteVmServiceUri => _remoteVmServiceUri;
+  Uri get remoteVmServiceWsUri => _toWebSocket(_remoteVmServiceUri);
+  Uri _remoteVmServiceUri;
+
+  Uri get uri => _uri;
+  Uri get wsUri => _toWebSocket(_uri);
+  Uri _uri;
+
+  bool get isRunning => _uri != null;
+
+  WebSocket _vmServiceSocket;
+  Stream _vmServiceStream;
+  HttpServer _server;
+}
diff --git a/pkg/dds/pubspec.yaml b/pkg/dds/pubspec.yaml
new file mode 100644
index 0000000..8734df5
--- /dev/null
+++ b/pkg/dds/pubspec.yaml
@@ -0,0 +1,23 @@
+name: dds
+description: >-
+  A library used to spawn the Dart Developer Service, used to communicate with
+  a Dart VM Service instance.
+
+version: 0.1.0-dev
+
+homepage: https://github.com/dart-lang/sdk/tree/master/pkg/dds
+
+environment:
+  sdk: '>=2.6.0 <3.0.0'
+
+dependencies:
+  json_rpc_2: ^2.1.0
+  shelf: ^0.7.5
+  shelf_proxy: ^0.1.0+7
+  shelf_web_socket: ^0.2.3
+  web_socket_channel: ^1.1.0
+
+dev_dependencies:
+  pedantic: ^1.7.0
+  test: ^1.0.0
+  vm_service: ^4.0.0
diff --git a/pkg/dds/test/smoke.dart b/pkg/dds/test/smoke.dart
new file mode 100644
index 0000000..f4c4774
--- /dev/null
+++ b/pkg/dds/test/smoke.dart
@@ -0,0 +1,3 @@
+void main() {
+  print('Hello world!');
+}
diff --git a/pkg/dds/test/smoke_test.dart b/pkg/dds/test/smoke_test.dart
new file mode 100644
index 0000000..cc266fc
--- /dev/null
+++ b/pkg/dds/test/smoke_test.dart
@@ -0,0 +1,90 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for 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:dds/dds.dart';
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service_io.dart';
+
+Uri remoteVmServiceUri;
+
+Future<Process> spawnDartProcess(String script) async {
+  final executable = Platform.executable;
+  final tmpDir = await Directory.systemTemp.createTemp('dart_service');
+  final serviceInfoUri = tmpDir.uri.resolve('service_info.json');
+  final serviceInfoFile = await File.fromUri(serviceInfoUri).create();
+
+  final arguments = [
+    '--observe=0',
+    '--pause-isolates-on-start',
+    '--write-service-info=$serviceInfoUri',
+    script,
+  ];
+  final process = await Process.start(executable, arguments);
+  while ((await serviceInfoFile.length()) <= 5) {
+    await Future.delayed(const Duration(milliseconds: 50));
+  }
+  final content = await serviceInfoFile.readAsString();
+  final infoJson = json.decode(content);
+  remoteVmServiceUri = Uri.parse(infoJson['uri']);
+  return process;
+}
+
+void main() {
+  test('DDS Smoke Test', () async {
+    final process = await spawnDartProcess('smoke.dart');
+    final dds = await DartDevelopmentService.startDartDevelopmentService(
+      remoteVmServiceUri,
+    );
+    expect(dds.isRunning, true);
+
+    // Ensure basic websocket requests are forwarded correctly to the VM service.
+    final service = await vmServiceConnectUri(dds.wsUri.toString());
+    final version = await service.getVersion();
+    expect(version.major > 0, true);
+    expect(version.minor > 0, true);
+
+    // Ensure we can still make requests of the VM service via HTTP.
+    HttpClient client = HttpClient();
+    final request = await client.getUrl(remoteVmServiceUri.replace(
+      pathSegments: [
+        remoteVmServiceUri.pathSegments.first,
+        'getVersion',
+      ],
+    ));
+    final response = await request.close();
+    final Map<String, dynamic> jsonResponse =
+        (await response.transform(utf8.decoder).transform(json.decoder).single);
+    expect(jsonResponse['result']['type'], 'Version');
+    expect(jsonResponse['result']['major'] > 0, true);
+    expect(jsonResponse['result']['minor'] > 0, true);
+    await dds.shutdown();
+    process.kill();
+  });
+
+  test('Invalid args test', () async {
+    // null VM Service URI
+    expect(
+        () async =>
+            await DartDevelopmentService.startDartDevelopmentService(null),
+        throwsA(TypeMatcher<ArgumentError>()));
+
+    // Non-HTTP VM Service URI scheme
+    expect(
+        () async => await DartDevelopmentService.startDartDevelopmentService(
+              Uri.parse('dart-lang://localhost:1234'),
+            ),
+        throwsA(TypeMatcher<ArgumentError>()));
+
+    // Non-HTTP VM Service URI scheme
+    expect(
+        () async => await DartDevelopmentService.startDartDevelopmentService(
+              Uri.parse('http://localhost:1234'),
+              serviceUri: Uri.parse('dart-lang://localhost:2345'),
+            ),
+        throwsA(TypeMatcher<ArgumentError>()));
+  });
+}
diff --git a/pkg/dev_compiler/lib/src/compiler/module_builder.dart b/pkg/dev_compiler/lib/src/compiler/module_builder.dart
index 41c74b3..842287d 100644
--- a/pkg/dev_compiler/lib/src/compiler/module_builder.dart
+++ b/pkg/dev_compiler/lib/src/compiler/module_builder.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:args/args.dart' show ArgParser, ArgResults;
+import 'package:dev_compiler/src/compiler/shared_compiler.dart';
 import 'package:path/path.dart' as p;
 
 import '../js_ast/js_ast.dart';
@@ -71,6 +72,7 @@
 Program transformModuleFormat(ModuleFormat format, Program module) {
   switch (format) {
     case ModuleFormat.ddc:
+      // Legacy format always generates output compatible with single file mode.
       return DdcModuleBuilder().build(module);
     case ModuleFormat.common:
       return CommonJSModuleBuilder().build(module);
@@ -185,12 +187,13 @@
         js.fun("function(#) { 'use strict'; #; }", [parameters, statements]),
         true);
 
-    var moduleDef = js.statement('dart_library.library(#, #, #, #)', [
+    var moduleDef = js.statement('dart_library.library(#, #, #, #, #)', [
       js.string(module.name, "'"),
       LiteralNull(),
       js.commentExpression(
           'Imports', ArrayInitializer(importNames, multiline: true)),
-      resultModule
+      resultModule,
+      SharedCompiler.metricsLocationID
     ]);
     return Program(<ModuleItem>[moduleDef]);
   }
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
index b0f5da7..542552a 100644
--- a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
+++ b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
@@ -594,13 +594,17 @@
   @protected
   js_ast.LiteralString propertyName(String name) => js.string(name, "'");
 
-  /// Unique identifier indicating the location to inline the source map.
+  /// Unique identifiers indicating the locations to inline the corresponding
+  /// information.
   ///
   /// We cannot generate the source map before the script it is for is
   /// generated so we have generate the script including this identifier in the
-  /// JS AST, and then replace it once the source map is generated.
+  /// JS AST, and then replace it once the source map is generated.  Similarly,
+  /// metrics include the size of the source map.
   static const String sourceMapLocationID =
       'SourceMap3G5a8h6JVhHfdGuDxZr1EF9GQC8y0e6u';
+  static const String metricsLocationID =
+      'MetricsJ7xFWBfSv6ZjrW9yLb21GNzisZr3anSf5h';
 }
 
 /// Whether a variable with [name] is referenced in the [node].
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index 04b3e86..fd7c675 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -415,7 +415,8 @@
         jsUrl: p.toUri(output).toString(),
         mapUrl: p.toUri(output + '.map').toString(),
         customScheme: multiRootScheme,
-        multiRootOutputPath: multiRootOutputPath);
+        multiRootOutputPath: multiRootOutputPath,
+        component: compiledLibraries);
 
     outFiles.add(file.writeAsString(jsCode.code));
     if (jsCode.sourceMap != null) {
@@ -514,7 +515,8 @@
         jsUrl: p.toUri(output).toString(),
         mapUrl: p.toUri(output + '.map').toString(),
         customScheme: multiRootScheme,
-        multiRootOutputPath: multiRootOutputPath);
+        multiRootOutputPath: multiRootOutputPath,
+        component: component);
 
     outFiles.add(file.writeAsString(jsCode.code));
     if (jsCode.sourceMap != null) {
@@ -525,6 +527,33 @@
   return CompilerResult(0);
 }
 
+// Compute code size to embed in the generated JavaScript
+// for this module.  Return `null` to indicate when size could not be properly
+// computed for this module.
+int _computeDartSize(Component component) {
+  var dartSize = 0;
+  var uriToSource = component.uriToSource;
+  for (var lib in component.libraries) {
+    var libUri = lib.fileUri;
+    var importUri = lib.importUri;
+    var source = uriToSource[libUri];
+    if (source == null) return null;
+    dartSize += source.source.length;
+    for (var part in lib.parts) {
+      var partUri = part.partUri;
+      if (partUri.startsWith(importUri.scheme)) {
+        // Convert to a relative-to-library uri in order to compute a file uri.
+        partUri = p.relative(partUri, from: p.dirname('${lib.importUri}'));
+      }
+      var fileUri = libUri.resolve(partUri);
+      var partSource = uriToSource[fileUri];
+      if (partSource == null) return null;
+      dartSize += partSource.source.length;
+    }
+  }
+  return dartSize;
+}
+
 /// The output of compiling a JavaScript module in a particular format.
 /// This was copied from module_compiler.dart class "JSModuleCode".
 class JSCode {
@@ -554,7 +583,8 @@
     String mapUrl,
     String sourceMapBase,
     String customScheme,
-    String multiRootOutputPath}) {
+    String multiRootOutputPath,
+    Component component}) {
   var opts = js_ast.JavaScriptPrintingOptions(
       allowKeywordsInProperties: true, allowSingleLineIfStatements: true);
   js_ast.SimpleJavaScriptPrintingContext printer;
@@ -585,11 +615,28 @@
   }
 
   var text = printer.getText();
-  var rawSourceMap = inlineSourceMap
-      ? js.escapedString(json.encode(builtMap), "'").value
-      : 'null';
+  var encodedMap = json.encode(builtMap);
+  var rawSourceMap =
+      inlineSourceMap ? js.escapedString(encodedMap, "'").value : 'null';
   text = text.replaceFirst(SharedCompiler.sourceMapLocationID, rawSourceMap);
 
+  // This is intended to be used by our build/debug tools to gather metrics.
+  // See pkg/dev_compiler/lib/js/legacy/dart_library.js for runtime code that
+  // reads this.
+  //
+  // These keys (see corresponding logic in dart_library.js) include:
+  // - dartSize: <size of Dart input code in bytes>
+  // - sourceMapSize: <size of JS source map in bytes>
+  //
+  // TODO(vsm): Ideally, this information is never sent to the browser.  I.e.,
+  // our runtime metrics gathering would obtain this information from the
+  // compilation server, not the browser.  We don't yet have the infra for that.
+  var compileTimeStatistics = {
+    'dartSize': component != null ? _computeDartSize(component) : null,
+    'sourceMapSize': encodedMap.length
+  };
+  text = text.replaceFirst(
+      SharedCompiler.metricsLocationID, '$compileTimeStatistics');
   return JSCode(text, builtMap);
 }
 
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 7317c59..99d4bc6 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -1055,13 +1055,7 @@
         body.add(js.statement('''
             #.as = function as_FutureOr(o) {
               if (#.is(o) || #.is(o)) return o;
-              return #.as(o, this, false);
-            }
-            ''', [className, typeT, futureOfT, runtimeModule]));
-        body.add(js.statement('''
-            #._check = function check_FutureOr(o) {
-              if (#.is(o) || #.is(o)) return o;
-              return #.as(o, this, true);
+              return #.as(o, this);
             }
             ''', [className, typeT, futureOfT, runtimeModule]));
         return null;
@@ -1079,13 +1073,7 @@
         body.add(js.statement('''
             #.as = function as_FutureOr(o) {
               if (o == null || #.is(o) || #.is(o)) return o;
-              #.castError(o, this, false);
-            }
-            ''', [className, typeT, futureOfT, runtimeModule]));
-        body.add(js.statement('''
-            #._check = function check_FutureOr(o) {
-              if (o == null || #.is(o) || #.is(o)) return o;
-              #.castError(o, this, true);
+              #.castError(o, this);
             }
             ''', [className, typeT, futureOfT, runtimeModule]));
         return null;
@@ -2296,8 +2284,6 @@
     switch (name) {
       // Reserved for the compiler to do `x as T`.
       case 'as':
-      // Reserved for the compiler to do implicit cast `T x = y`.
-      case '_check':
       // Reserved for the SDK to compute `Type.toString()`.
       case 'name':
       // Reserved by JS, not a valid static member name.
@@ -5258,8 +5244,7 @@
         from.withNullability(Nullability.nonNullable) == to &&
         _mustBeNonNullable(to)) {
       // If the underlying type is the same, we only need a null check.
-      return runtimeCall('nullCast(#, #, #)',
-          [jsFrom, _emitType(to), js.boolean(isTypeError)]);
+      return runtimeCall('nullCast(#, #)', [jsFrom, _emitType(to)]);
     }
 
     // All Dart number types map to a JS double.  We can specialize these
@@ -5278,8 +5263,7 @@
         if (from.nullability == Nullability.nonNullable) {
           return jsFrom;
         }
-        return runtimeCall('nullCast(#, #, #)',
-            [jsFrom, _emitType(to), js.boolean(isTypeError)]);
+        return runtimeCall('nullCast(#, #)', [jsFrom, _emitType(to)]);
       }
 
       // * -> int : asInt check
@@ -5294,16 +5278,11 @@
       }
     }
 
-    return _emitCast(jsFrom, to, implicit: isTypeError);
+    return _emitCast(jsFrom, to);
   }
 
-  js_ast.Expression _emitCast(js_ast.Expression expr, DartType type,
-      {bool implicit = true}) {
-    if (_types.isTop(type)) return expr;
-
-    var code = implicit ? '#._check(#)' : '#.as(#)';
-    return js.call(code, [_emitType(type), expr]);
-  }
+  js_ast.Expression _emitCast(js_ast.Expression expr, DartType type) =>
+      _types.isTop(type) ? expr : js.call('#.as(#)', [_emitType(type), expr]);
 
   @override
   js_ast.Expression visitSymbolLiteral(SymbolLiteral node) =>
diff --git a/pkg/dev_compiler/test/nullable_inference_test.dart b/pkg/dev_compiler/test/nullable_inference_test.dart
index 683a872..67f259f 100644
--- a/pkg/dev_compiler/test/nullable_inference_test.dart
+++ b/pkg/dev_compiler/test/nullable_inference_test.dart
@@ -507,7 +507,7 @@
           }
           return c.toString();
         }
-        return e.toString();
+        return e.leakingDebugToString();
       })
       // Filter out our own NotNull annotations.  The library prefix changes
       // per test, so just filter on the suffix.
diff --git a/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt b/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt
index 1a63f96..93731df 100644
--- a/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt
+++ b/pkg/dev_compiler/tool/dart2js_nnbd_sdk_error_golden.txt
@@ -1,19 +1,8 @@
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_runtime/lib/js_helper.dart|2689|17|17|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_runtime/lib/js_helper.dart|3629|5|11|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_runtime/lib/js_helper.dart|3657|5|6|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
 ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1637|7|5|Superinterfaces don't have a valid override for '&': int.& (int Function(int)), JSNumber.& (num Function(num)).
 ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1637|7|5|Superinterfaces don't have a valid override for '<<': int.<< (int Function(int)), JSNumber.<< (num Function(num)).
 ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1637|7|5|Superinterfaces don't have a valid override for '>>': int.>> (int Function(int)), JSNumber.>> (num Function(num)).
 ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1637|7|5|Superinterfaces don't have a valid override for '\|': int.\| (int Function(int)), JSNumber.\| (num Function(num)).
 ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1637|7|5|Superinterfaces don't have a valid override for '^': int.^ (int Function(int)), JSNumber.^ (num Function(num)).
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|1004|10|5|Non-nullable instance field 'value' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|1030|8|6|Non-nullable instance field 'secure' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|1036|8|8|Non-nullable instance field 'httpOnly' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|1493|12|11|Non-nullable instance field 'idleTimeout' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|1543|8|14|Non-nullable instance field 'autoUncompress' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|172|8|12|Non-nullable instance field 'autoCompress' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|991|10|4|Non-nullable instance field 'name' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/io/io.dart|5589|12|8|Non-nullable instance field 'encoding' must be initialized.
 ERROR|STATIC_TYPE_WARNING|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1654|28|1|The operator '&' isn't defined for the type 'JSInt'.
 ERROR|STATIC_TYPE_WARNING|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1656|27|1|The operator '&' isn't defined for the type 'JSInt'.
 ERROR|STATIC_TYPE_WARNING|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1659|17|1|The operator '&' isn't defined for the type 'JSInt'.
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 6dad26d..8b13789 100644
--- a/pkg/dev_compiler/tool/dartdevc_nnbd_sdk_error_golden.txt
+++ b/pkg/dev_compiler/tool/dartdevc_nnbd_sdk_error_golden.txt
@@ -1,25 +1 @@
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|109|3|2|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|162|8|21|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|167|8|21|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|170|8|20|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|173|8|18|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|176|8|22|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|182|8|26|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|185|8|17|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|188|8|14|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|191|8|20|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|197|8|32|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|203|8|32|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|209|8|40|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|215|8|40|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|221|8|37|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|224|8|11|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|BODY_MIGHT_COMPLETE_NORMALLY|lib/_internal/js_dev_runtime/private/foreign_helper.dart|228|6|11|The body might complete normally, which would cause 'null' to be returned, but the return type is a potentially non-nullable type.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|1004|10|5|Non-nullable instance field 'value' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|1030|8|6|Non-nullable instance field 'secure' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|1036|8|8|Non-nullable instance field 'httpOnly' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|1493|12|11|Non-nullable instance field 'idleTimeout' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|1543|8|14|Non-nullable instance field 'autoUncompress' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|172|8|12|Non-nullable instance field 'autoCompress' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/_http/http.dart|991|10|4|Non-nullable instance field 'name' must be initialized.
-ERROR|COMPILE_TIME_ERROR|NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD|lib/io/io.dart|5589|12|8|Non-nullable instance field 'encoding' must be initialized.
+
diff --git a/pkg/dev_compiler/tool/kernel_sdk.dart b/pkg/dev_compiler/tool/kernel_sdk.dart
index 3708675..dda7022 100755
--- a/pkg/dev_compiler/tool/kernel_sdk.dart
+++ b/pkg/dev_compiler/tool/kernel_sdk.dart
@@ -116,7 +116,8 @@
         jsUrl: jsPath,
         mapUrl: mapPath,
         buildSourceMap: true,
-        customScheme: customScheme);
+        customScheme: customScheme,
+        component: component);
     await File(jsPath).writeAsString(jsCode.code);
     await File(mapPath).writeAsString(json.encode(jsCode.sourceMap));
   }
diff --git a/pkg/front_end/lib/src/base/instrumentation.dart b/pkg/front_end/lib/src/base/instrumentation.dart
index 7846749..a1e2443 100644
--- a/pkg/front_end/lib/src/base/instrumentation.dart
+++ b/pkg/front_end/lib/src/base/instrumentation.dart
@@ -52,7 +52,8 @@
   InstrumentationValueForType(this.type);
 
   @override
-  String toString() => _shortenInstrumentationString(type.toString());
+  String toString() =>
+      _shortenInstrumentationString(type.leakingDebugToString());
 }
 
 /// Instance of [InstrumentationValue] describing a list of [DartType]s.
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 263bfc1..f591155 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -21,6 +21,7 @@
         Member,
         MethodInvocation,
         Name,
+        NeverType,
         Nullability,
         Procedure,
         ProcedureKind,
@@ -55,8 +56,6 @@
 import 'package:kernel/type_environment.dart'
     show SubtypeCheckMode, TypeEnvironment;
 
-import '../../base/nnbd_mode.dart';
-
 import '../dill/dill_member_builder.dart' show DillMemberBuilder;
 
 import '../fasta_codes.dart';
@@ -110,10 +109,10 @@
   ///
   /// Currently this also holds the synthesized super class for a mixin
   /// declaration.
-  TypeBuilder supertype;
+  TypeBuilder supertypeBuilder;
 
   /// The type in the `implements` clause of a class or mixin declaration.
-  List<TypeBuilder> interfaces;
+  List<TypeBuilder> interfaceBuilders;
 
   /// The types in the `on` clause of an extension or mixin declaration.
   List<TypeBuilder> onTypes;
@@ -138,9 +137,9 @@
 
   bool get isAnonymousMixinApplication;
 
-  TypeBuilder get mixedInType;
+  TypeBuilder get mixedInTypeBuilder;
 
-  void set mixedInType(TypeBuilder mixin);
+  void set mixedInTypeBuilder(TypeBuilder mixin);
 
   List<ConstructorReferenceBuilder> get constructorReferences;
 
@@ -307,10 +306,10 @@
   List<TypeVariableBuilder> typeVariables;
 
   @override
-  TypeBuilder supertype;
+  TypeBuilder supertypeBuilder;
 
   @override
-  List<TypeBuilder> interfaces;
+  List<TypeBuilder> interfaceBuilders;
 
   @override
   List<TypeBuilder> onTypes;
@@ -344,8 +343,8 @@
       int modifiers,
       String name,
       this.typeVariables,
-      this.supertype,
-      this.interfaces,
+      this.supertypeBuilder,
+      this.interfaceBuilders,
       this.onTypes,
       Scope scope,
       this.constructors,
@@ -363,7 +362,7 @@
   bool get isMixin => (modifiers & mixinDeclarationMask) != 0;
 
   @override
-  bool get isMixinApplication => mixedInType != null;
+  bool get isMixinApplication => mixedInTypeBuilder != null;
 
   @override
   bool get isNamedMixinApplication {
@@ -675,7 +674,7 @@
 
     // Extract and check superclass (if it exists).
     ClassBuilder superClass;
-    TypeBuilder superClassType = supertype;
+    TypeBuilder superClassType = supertypeBuilder;
     if (superClassType is NamedTypeBuilder) {
       TypeDeclarationBuilder decl = superClassType.declaration;
       if (decl is TypeAliasBuilder) {
@@ -695,13 +694,13 @@
         superClass = decl;
       }
     }
-    if (interfaces == null) return;
+    if (interfaceBuilders == null) return;
 
     // Validate interfaces.
     Map<ClassBuilder, int> problems;
     Map<ClassBuilder, int> problemsOffsets;
     Set<ClassBuilder> implemented = new Set<ClassBuilder>();
-    for (TypeBuilder type in interfaces) {
+    for (TypeBuilder type in interfaceBuilders) {
       if (type is NamedTypeBuilder) {
         int charOffset = -1; // TODO(ahe): Get offset from type.
         TypeDeclarationBuilder typeDeclaration = type.declaration;
@@ -753,88 +752,72 @@
   void checkBoundsInSupertype(
       Supertype supertype, TypeEnvironment typeEnvironment) {
     SourceLibraryBuilder library = this.library;
+    final DartType bottomType = library.isNonNullableByDefault
+        ? const NeverType(Nullability.nonNullable)
+        : typeEnvironment.nullType;
 
-    Set<TypeArgumentIssue> legacyIssues = findTypeArgumentIssues(
+    Set<TypeArgumentIssue> issues = {};
+    issues.addAll(findTypeArgumentIssues(
             new InterfaceType(supertype.classNode, library.nonNullable,
                 supertype.typeArguments),
             typeEnvironment,
             SubtypeCheckMode.ignoringNullabilities,
-            allowSuperBounded: false)
-        ?.toSet();
-    Set<TypeArgumentIssue> nnbdIssues = library.isNonNullableByDefault
-        ? findTypeArgumentIssues(
-                new InterfaceType(supertype.classNode, library.nonNullable,
-                    supertype.typeArguments),
-                typeEnvironment,
-                SubtypeCheckMode.withNullabilities,
-                allowSuperBounded: false)
-            ?.toSet()
-        : null;
-    if (legacyIssues != null || nnbdIssues != null) {
-      Set<TypeArgumentIssue> mergedIssues = legacyIssues ?? {};
-      if (nnbdIssues != null) {
-        nnbdIssues = nnbdIssues
-            .where((issue) =>
-                legacyIssues == null || !legacyIssues.contains(issue))
-            .toSet();
-        mergedIssues.addAll(nnbdIssues);
-      }
-      for (TypeArgumentIssue issue in mergedIssues) {
-        DartType argument = issue.argument;
-        TypeParameter typeParameter = issue.typeParameter;
-        bool inferred = library.inferredTypes.contains(argument);
-        if (argument is FunctionType && argument.typeParameters.length > 0) {
-          if (inferred) {
-            library.reportTypeArgumentIssue(
-                templateGenericFunctionTypeInferredAsActualTypeArgument
-                    .withArguments(argument, library.isNonNullableByDefault),
-                fileUri,
-                charOffset,
-                null);
-          } else {
-            library.reportTypeArgumentIssue(
-                messageGenericFunctionTypeUsedAsActualTypeArgument,
-                fileUri,
-                charOffset,
-                null);
-          }
+            bottomType,
+            allowSuperBounded: false) ??
+        const []);
+    if (library.isNonNullableByDefault) {
+      issues.addAll(findTypeArgumentIssues(
+              new InterfaceType(supertype.classNode, library.nonNullable,
+                  supertype.typeArguments),
+              typeEnvironment,
+              SubtypeCheckMode.withNullabilities,
+              bottomType,
+              allowSuperBounded: false) ??
+          const []);
+    }
+    for (TypeArgumentIssue issue in issues) {
+      DartType argument = issue.argument;
+      TypeParameter typeParameter = issue.typeParameter;
+      bool inferred = library.inferredTypes.contains(argument);
+      if (argument is FunctionType && argument.typeParameters.length > 0) {
+        if (inferred) {
+          library.reportTypeArgumentIssue(
+              templateGenericFunctionTypeInferredAsActualTypeArgument
+                  .withArguments(argument, library.isNonNullableByDefault),
+              fileUri,
+              charOffset,
+              null);
         } else {
-          void reportProblem(
-              Template<
-                      Message Function(DartType, DartType, String, String,
-                          String, String, bool)>
-                  template) {
-            library.reportTypeArgumentIssue(
-                template.withArguments(
-                    argument,
-                    typeParameter.bound,
-                    typeParameter.name,
-                    getGenericTypeName(issue.enclosingType),
-                    supertype.classNode.name,
-                    name,
-                    library.isNonNullableByDefault),
-                fileUri,
-                charOffset,
-                typeParameter);
-          }
+          library.reportTypeArgumentIssue(
+              messageGenericFunctionTypeUsedAsActualTypeArgument,
+              fileUri,
+              charOffset,
+              null);
+        }
+      } else {
+        void reportProblem(
+            Template<
+                    Message Function(DartType, DartType, String, String, String,
+                        String, bool)>
+                template) {
+          library.reportTypeArgumentIssue(
+              template.withArguments(
+                  argument,
+                  typeParameter.bound,
+                  typeParameter.name,
+                  getGenericTypeName(issue.enclosingType),
+                  supertype.classNode.name,
+                  name,
+                  library.isNonNullableByDefault),
+              fileUri,
+              charOffset,
+              typeParameter);
+        }
 
-          nnbdIssues ??= const {};
-          if (inferred) {
-            if (nnbdIssues.contains(issue) &&
-                library.loader.nnbdMode == NnbdMode.Weak) {
-              reportProblem(
-                  templateIncorrectTypeArgumentInSupertypeInferredWarning);
-            } else {
-              reportProblem(templateIncorrectTypeArgumentInSupertypeInferred);
-            }
-          } else {
-            if (nnbdIssues.contains(issue) &&
-                library.loader.nnbdMode == NnbdMode.Weak) {
-              reportProblem(templateIncorrectTypeArgumentInSupertypeWarning);
-            } else {
-              reportProblem(templateIncorrectTypeArgumentInSupertype);
-            }
-          }
+        if (inferred) {
+          reportProblem(templateIncorrectTypeArgumentInSupertypeInferred);
+        } else {
+          reportProblem(templateIncorrectTypeArgumentInSupertype);
         }
       }
     }
@@ -843,74 +826,52 @@
   @override
   void checkTypesInOutline(TypeEnvironment typeEnvironment) {
     SourceLibraryBuilder library = this.library;
+    final DartType bottomType = library.isNonNullableByDefault
+        ? const NeverType(Nullability.nonNullable)
+        : typeEnvironment.nullType;
 
     // Check in bounds of own type variables.
     for (TypeParameter parameter in cls.typeParameters) {
-      Set<TypeArgumentIssue> legacyIssues = findTypeArgumentIssues(
-              parameter.bound,
-              typeEnvironment,
-              SubtypeCheckMode.ignoringNullabilities,
-              allowSuperBounded: true)
-          ?.toSet();
-      Set<TypeArgumentIssue> nnbdIssues = library.isNonNullableByDefault
-          ? findTypeArgumentIssues(parameter.bound, typeEnvironment,
-                  SubtypeCheckMode.withNullabilities,
-                  allowSuperBounded: true)
-              ?.toSet()
-          : null;
-      if (legacyIssues != null || nnbdIssues != null) {
-        Set<TypeArgumentIssue> mergedIssues = legacyIssues ?? {};
-        if (nnbdIssues != null) {
-          nnbdIssues = nnbdIssues
-              .where((issue) =>
-                  legacyIssues == null || !legacyIssues.contains(issue))
-              .toSet();
-          mergedIssues.addAll(nnbdIssues);
+      Set<TypeArgumentIssue> issues = {};
+      issues.addAll(findTypeArgumentIssues(parameter.bound, typeEnvironment,
+              SubtypeCheckMode.ignoringNullabilities, bottomType,
+              allowSuperBounded: true) ??
+          const []);
+      if (library.isNonNullableByDefault) {
+        issues.addAll(findTypeArgumentIssues(parameter.bound, typeEnvironment,
+                SubtypeCheckMode.withNullabilities, bottomType,
+                allowSuperBounded: true) ??
+            const []);
+      }
+      for (TypeArgumentIssue issue in issues) {
+        DartType argument = issue.argument;
+        TypeParameter typeParameter = issue.typeParameter;
+        if (library.inferredTypes.contains(argument)) {
+          // Inference in type expressions in the supertypes boils down to
+          // instantiate-to-bound which shouldn't produce anything that breaks
+          // the bounds after the non-simplicity checks are done.  So, any
+          // violation here is the result of non-simple bounds, and the error
+          // is reported elsewhere.
+          continue;
         }
-        for (TypeArgumentIssue issue in mergedIssues) {
-          DartType argument = issue.argument;
-          TypeParameter typeParameter = issue.typeParameter;
-          if (library.inferredTypes.contains(argument)) {
-            // Inference in type expressions in the supertypes boils down to
-            // instantiate-to-bound which shouldn't produce anything that breaks
-            // the bounds after the non-simplicity checks are done.  So, any
-            // violation here is the result of non-simple bounds, and the error
-            // is reported elsewhere.
-            continue;
-          }
 
-          if (argument is FunctionType && argument.typeParameters.length > 0) {
-            library.reportTypeArgumentIssue(
-                messageGenericFunctionTypeUsedAsActualTypeArgument,
-                fileUri,
-                parameter.fileOffset,
-                null);
-          } else {
-            void reportProblem(
-                Template<
-                        Message Function(
-                            DartType, DartType, String, String, bool)>
-                    template) {
-              library.reportTypeArgumentIssue(
-                  template.withArguments(
-                      argument,
-                      typeParameter.bound,
-                      typeParameter.name,
-                      getGenericTypeName(issue.enclosingType),
-                      library.isNonNullableByDefault),
-                  fileUri,
-                  parameter.fileOffset,
-                  typeParameter);
-            }
-
-            nnbdIssues ??= const {};
-            if (nnbdIssues.contains(issue) &&
-                library.loader.nnbdMode == NnbdMode.Weak) {
-              reportProblem(templateIncorrectTypeArgumentWarning);
-            } else {
-              reportProblem(templateIncorrectTypeArgument);
-            }
-          }
+        if (argument is FunctionType && argument.typeParameters.length > 0) {
+          library.reportTypeArgumentIssue(
+              messageGenericFunctionTypeUsedAsActualTypeArgument,
+              fileUri,
+              parameter.fileOffset,
+              null);
+        } else {
+          library.reportTypeArgumentIssue(
+              templateIncorrectTypeArgument.withArguments(
+                  argument,
+                  typeParameter.bound,
+                  typeParameter.name,
+                  getGenericTypeName(issue.enclosingType),
+                  library.isNonNullableByDefault),
+              fileUri,
+              parameter.fileOffset,
+              typeParameter);
         }
       }
     }
@@ -1333,16 +1294,7 @@
           (!isCovariant ||
               !types.isSubtypeOfKernel(
                   supertype, subtype, SubtypeCheckMode.ignoringNullabilities));
-      Loader loader = library.loader;
-      bool nnbdWeakMode =
-          loader is SourceLoader && loader.nnbdMode == NnbdMode.Weak;
-      bool isError = isErrorInNnbdOptedOutMode || !nnbdWeakMode;
-      bool isWarning = !isErrorInNnbdOptedOutMode && nnbdWeakMode;
-      assert(
-          !isError || !isWarning,
-          "A compile-time problem can't be an error and a warning "
-          "at the same time.");
-      if (isError || isWarning) {
+      if (isErrorInNnbdOptedOutMode || library.isNonNullableByDefault) {
         String declaredMemberName = '${declaredMember.enclosingClass.name}'
             '.${declaredMember.name.name}';
         String interfaceMemberName = '${interfaceMember.enclosingClass.name}'
@@ -1352,22 +1304,14 @@
         if (declaredParameter == null) {
           if (asIfDeclaredParameter) {
             // Setter overridden by field
-            Template<Message Function(String, DartType, DartType, String, bool)>
-                template = isError
-                    ? templateOverrideTypeMismatchSetter
-                    : templateOverrideTypeMismatchSetterWarning;
-            message = template.withArguments(
+            message = templateOverrideTypeMismatchSetter.withArguments(
                 declaredMemberName,
                 declaredType,
                 interfaceType,
                 interfaceMemberName,
                 library.isNonNullableByDefault);
           } else {
-            Template<Message Function(String, DartType, DartType, String, bool)>
-                template = isError
-                    ? templateOverrideTypeMismatchReturnType
-                    : templateOverrideTypeMismatchReturnTypeWarning;
-            message = template.withArguments(
+            message = templateOverrideTypeMismatchReturnType.withArguments(
                 declaredMemberName,
                 declaredType,
                 interfaceType,
@@ -1376,13 +1320,7 @@
           }
           fileOffset = declaredMember.fileOffset;
         } else {
-          Template<
-                  Message Function(
-                      String, String, DartType, DartType, String, bool)>
-              template = isError
-                  ? templateOverrideTypeMismatchParameter
-                  : templateOverrideTypeMismatchParameterWarning;
-          message = template.withArguments(
+          message = templateOverrideTypeMismatchParameter.withArguments(
               declaredParameter.name,
               declaredMemberName,
               declaredType,
@@ -1568,6 +1506,26 @@
           declaredParameter.isCovariant,
           declaredParameter,
           isInterfaceCheck);
+      if (declaredParameter.isRequired &&
+          !interfaceNamedParameters.current.isRequired) {
+        reportInvalidOverride(
+            isInterfaceCheck,
+            declaredMember,
+            templateOverrideMismatchRequiredNamedParameter.withArguments(
+                declaredParameter.name,
+                "${declaredMember.enclosingClass.name}."
+                    "${declaredMember.name.name}",
+                "${interfaceMember.enclosingClass.name}."
+                    "${interfaceMember.name.name}"),
+            declaredParameter.fileOffset,
+            noLength,
+            context: [
+              templateOverriddenMethodCause
+                  .withArguments(interfaceMember.name.name)
+                  .withLocation(_getMemberUri(interfaceMember),
+                      interfaceMember.fileOffset, noLength)
+            ]);
+      }
       if (declaredParameter.isCovariant) seenCovariant = true;
     }
     return seenCovariant;
@@ -1679,7 +1637,8 @@
   @override
   String get fullNameForErrors {
     return isMixinApplication && !isNamedMixinApplication
-        ? "${supertype.fullNameForErrors} with ${mixedInType.fullNameForErrors}"
+        ? "${supertypeBuilder.fullNameForErrors} with "
+            "${mixedInTypeBuilder.fullNameForErrors}"
         : name;
   }
 
@@ -1832,23 +1791,13 @@
         } else if (library.isNonNullableByDefault && loader is SourceLoader) {
           if (!typeEnvironment.isSubtypeOf(typeArgument, typeParameterBound,
               SubtypeCheckMode.withNullabilities)) {
-            if (loader.nnbdMode == NnbdMode.Weak) {
-              addProblem(
-                  templateRedirectingFactoryIncompatibleTypeArgumentWarning
-                      .withArguments(typeArgument, typeParameterBound,
-                          library.isNonNullableByDefault),
-                  redirectionTarget.charOffset,
-                  noLength);
-              hasProblem = false;
-            } else {
-              addProblem(
-                  templateRedirectingFactoryIncompatibleTypeArgument
-                      .withArguments(typeArgument, typeParameterBound,
-                          library.isNonNullableByDefault),
-                  redirectionTarget.charOffset,
-                  noLength);
-              hasProblem = true;
-            }
+            addProblem(
+                templateRedirectingFactoryIncompatibleTypeArgument
+                    .withArguments(typeArgument, typeParameterBound,
+                        library.isNonNullableByDefault),
+                redirectionTarget.charOffset,
+                noLength);
+            hasProblem = true;
           }
         }
       }
@@ -1915,19 +1864,11 @@
     } else if (library.isNonNullableByDefault && loader is SourceLoader) {
       if (!typeEnvironment.isSubtypeOf(
           redirecteeType, factoryType, SubtypeCheckMode.withNullabilities)) {
-        if (loader.nnbdMode == NnbdMode.Weak) {
-          addProblem(
-              templateIncompatibleRedirecteeFunctionTypeWarning.withArguments(
-                  redirecteeType, factoryType, library.isNonNullableByDefault),
-              factory.redirectionTarget.charOffset,
-              noLength);
-        } else {
-          addProblem(
-              templateIncompatibleRedirecteeFunctionType.withArguments(
-                  redirecteeType, factoryType, library.isNonNullableByDefault),
-              factory.redirectionTarget.charOffset,
-              noLength);
-        }
+        addProblem(
+            templateIncompatibleRedirecteeFunctionType.withArguments(
+                redirecteeType, factoryType, library.isNonNullableByDefault),
+            factory.redirectionTarget.charOffset,
+            noLength);
       }
     }
   }
@@ -2042,7 +1983,7 @@
       ClassBuilder getSuperclass(ClassBuilder builder) {
         // This way of computing the superclass is slower than using the kernel
         // objects directly.
-        Object supertype = builder.supertype;
+        Object supertype = builder.supertypeBuilder;
         if (supertype is NamedTypeBuilder) {
           Object builder = supertype.declaration;
           if (builder is ClassBuilder) return builder;
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 ae18cd7..bc32b18d 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -334,7 +334,7 @@
     return enumBuilder;
   }
 
-  TypeBuilder get mixedInType => null;
+  TypeBuilder get mixedInTypeBuilder => null;
 
   InterfaceType buildType(LibraryBuilder library,
       NullabilityBuilder nullabilityBuilder, List<TypeBuilder> arguments,
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 7211b30..9a69677 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -49,8 +49,6 @@
 
   Token get constInitializerToken;
 
-  bool hadTypesInferred;
-
   bool get isCovariant;
 
   bool get isLate;
@@ -645,20 +643,6 @@
 
   @override
   bool get isFunction => false;
-
-  TypeBuilder get type => memberBuilder.type;
-
-  bool get hadTypesInferred => memberBuilder.hadTypesInferred;
-
-  void set hadTypesInferred(bool value) {
-    memberBuilder.hadTypesInferred = value;
-  }
-
-  DartType get fieldType => memberBuilder.fieldType;
-
-  void set fieldType(DartType value) {
-    memberBuilder.fieldType = value;
-  }
 }
 
 abstract class AbstractLateFieldEncoding implements FieldEncoding {
@@ -1221,19 +1205,6 @@
   bool get isAbstract => _member.isAbstract;
 
   @override
-  bool get hasExplicitReturnType {
-    // The return type of the getter is explicit if the field type is explicit.
-    return fieldBuilder.type != null;
-  }
-
-  @override
-  bool hasExplicitlyTypedFormalParameter(int index) {
-    // The type of the setter parameter is explicit if the field type is
-    // explicit.
-    return fieldBuilder.type != null;
-  }
-
-  @override
   bool get needsComputation => false;
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/builder/function_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_builder.dart
index ece6278..9aed09d 100644
--- a/pkg/front_end/lib/src/fasta/builder/function_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/function_builder.dart
@@ -11,8 +11,6 @@
 
 import 'package:kernel/type_algebra.dart' show containsTypeVariable, substitute;
 
-import '../../base/nnbd_mode.dart';
-
 import '../identifiers.dart';
 import '../scope.dart';
 
@@ -28,8 +26,7 @@
         messagePatchDeclarationOrigin,
         messagePatchNonExternal,
         noLength,
-        templateRequiredNamedParameterHasDefaultValueError,
-        templateRequiredNamedParameterHasDefaultValueWarning;
+        templateRequiredNamedParameterHasDefaultValueError;
 
 import '../modifier.dart';
 
@@ -393,21 +390,12 @@
         if (library.isNonNullableByDefault) {
           // Required named parameters can't have default values.
           if (formal.isNamedRequired && formal.initializerToken != null) {
-            if (library.loader.nnbdMode == NnbdMode.Weak) {
-              library.addProblem(
-                  templateRequiredNamedParameterHasDefaultValueWarning
-                      .withArguments(formal.name),
-                  formal.charOffset,
-                  formal.name.length,
-                  formal.fileUri);
-            } else {
-              library.addProblem(
-                  templateRequiredNamedParameterHasDefaultValueError
-                      .withArguments(formal.name),
-                  formal.charOffset,
-                  formal.name.length,
-                  formal.fileUri);
-            }
+            library.addProblem(
+                templateRequiredNamedParameterHasDefaultValueError
+                    .withArguments(formal.name),
+                formal.charOffset,
+                formal.name.length,
+                formal.fileUri);
           }
         }
       }
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 995d801..a9c325a 100644
--- a/pkg/front_end/lib/src/fasta/builder/library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
@@ -148,8 +148,8 @@
   /// where they were omitted by the programmer and not provided by the type
   /// inference.  The method returns the number of distinct type variables
   /// that were instantiated in this library.
-  int computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder bottomType,
-      ClassBuilder objectClass);
+  int computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder nullType,
+      TypeBuilder bottomType, ClassBuilder objectClass);
 
   void becomeCoreLibrary();
 
@@ -368,8 +368,8 @@
   int computeVariances() => 0;
 
   @override
-  int computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder bottomType,
-      ClassBuilder objectClass) {
+  int computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder nullType,
+      TypeBuilder bottomType, ClassBuilder objectClass) {
     return 0;
   }
 
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 6761a6d..edeb46b 100644
--- a/pkg/front_end/lib/src/fasta/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
@@ -243,17 +243,6 @@
   bool get isAbstract => memberBuilder.member.isAbstract;
 
   @override
-  bool get hasExplicitReturnType {
-    throw new UnsupportedError("${runtimeType}.hasExplicitReturnType");
-  }
-
-  @override
-  bool hasExplicitlyTypedFormalParameter(int index) {
-    throw new UnsupportedError(
-        "${runtimeType}.hasExplicitlyTypedFormalParameter");
-  }
-
-  @override
   bool get needsComputation => false;
 
   @override
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 f2ad0cd..765aebb 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -565,23 +565,6 @@
   List<ClassMember> get localSetters => isSetter
       ? <ClassMember>[new SourceProcedureMember(this)]
       : const <ClassMember>[];
-
-  static const int inferredTypesFromMethod = 3;
-  static const int inferredTypesFromField = 3;
-  static const int inferredTypesFromGetter = 1;
-  static const int inferredTypesFromSetter = 2;
-
-  /// Bit mask showing where types have been inferred from.
-  ///
-  /// The mask uses the values [inferredTypesFromMethod],
-  /// [inferredTypesFromField], [inferredTypesFromGetter],
-  /// [inferredTypesFromSetter].
-  ///
-  /// It is used to detect whether types have already been inferred and in
-  /// getter type inference to favor types from getters over types from
-  /// setters, and in setter type inference to favor types from setters over
-  /// types from getters.
-  int hadTypesInferredFrom = 0;
 }
 
 class SourceProcedureMember extends BuilderClassMember {
@@ -593,12 +576,6 @@
   @override
   bool get isSourceDeclaration => true;
 
-  int get hadTypesInferredFrom => memberBuilder.hadTypesInferredFrom;
-
-  void set hadTypesInferredFrom(int value) {
-    memberBuilder.hadTypesInferredFrom = value;
-  }
-
   @override
   void inferType(ClassHierarchyBuilder hierarchy) {
     memberBuilder._ensureTypes(hierarchy);
@@ -625,20 +602,6 @@
 
   @override
   bool get isFunction => !isProperty;
-
-  List<FormalParameterBuilder> get formals => memberBuilder.formals;
-
-  TypeBuilder get returnType => memberBuilder.returnType;
-
-  @override
-  bool get hasExplicitReturnType {
-    return memberBuilder.returnType != null;
-  }
-
-  @override
-  bool hasExplicitlyTypedFormalParameter(int index) {
-    return memberBuilder.formals[index].type != null;
-  }
 }
 
 class RedirectingFactoryBuilder extends ProcedureBuilderImpl {
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 23ca352..73003a2 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
@@ -57,12 +57,12 @@
 
   Uri get fileUri => cls.fileUri;
 
-  TypeBuilder get supertype {
-    TypeBuilder supertype = super.supertype;
+  TypeBuilder get supertypeBuilder {
+    TypeBuilder supertype = super.supertypeBuilder;
     if (supertype == null) {
       Supertype targetSupertype = cls.supertype;
       if (targetSupertype == null) return null;
-      super.supertype =
+      super.supertypeBuilder =
           supertype = computeTypeBuilder(library, targetSupertype);
     }
     return supertype;
@@ -119,30 +119,30 @@
   @override
   bool get declaresConstConstructor => cls.hasConstConstructor;
 
-  TypeBuilder get mixedInType {
+  TypeBuilder get mixedInTypeBuilder {
     return computeTypeBuilder(library, cls.mixedInType);
   }
 
-  List<TypeBuilder> get interfaces {
+  List<TypeBuilder> get interfaceBuilders {
     if (cls.implementedTypes.isEmpty) return null;
-    if (super.interfaces == null) {
+    if (super.interfaceBuilders == null) {
       List<TypeBuilder> result =
           new List<TypeBuilder>(cls.implementedTypes.length);
       for (int i = 0; i < result.length; i++) {
         result[i] = computeTypeBuilder(library, cls.implementedTypes[i]);
       }
-      super.interfaces = result;
+      super.interfaceBuilders = result;
     }
-    return super.interfaces;
+    return super.interfaceBuilders;
   }
 
-  void set mixedInType(TypeBuilder mixin) {
+  void set mixedInTypeBuilder(TypeBuilder mixin) {
     unimplemented("mixedInType=", -1, null);
   }
 
   void clearCachedValues() {
-    supertype = null;
-    interfaces = null;
+    supertypeBuilder = null;
+    interfaceBuilders = null;
   }
 }
 
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 bd23030..8afca33 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
@@ -165,12 +165,6 @@
   bool get isFunction => !isProperty;
 
   @override
-  bool get hasExplicitReturnType => true;
-
-  @override
-  bool hasExplicitlyTypedFormalParameter(int index) => true;
-
-  @override
   void inferType(ClassHierarchyBuilder hierarchy) {
     // Do nothing; this is only for source members.
   }
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 9e88644..b4d3941 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
@@ -13,6 +13,126 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
+    Message Function(
+        String name,
+        DartType _type,
+        bool
+            isNonNullableByDefault)> templateAmbiguousExtensionMethod = const Template<
+        Message Function(
+            String name, DartType _type, bool isNonNullableByDefault)>(
+    messageTemplate:
+        r"""The method '#name' is defined in multiple extensions for '#type' and neither is more specific.""",
+    tipTemplate:
+        r"""Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.""",
+    withArguments: _withArgumentsAmbiguousExtensionMethod);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+    Message Function(String name, DartType _type,
+        bool isNonNullableByDefault)> codeAmbiguousExtensionMethod = const Code<
+    Message Function(String name, DartType _type, bool isNonNullableByDefault)>(
+  "AmbiguousExtensionMethod",
+  templateAmbiguousExtensionMethod,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsAmbiguousExtensionMethod(
+    String name, DartType _type, bool isNonNullableByDefault) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  String type = typeParts.join();
+  return new Message(codeAmbiguousExtensionMethod,
+      message:
+          """The method '${name}' is defined in multiple extensions for '${type}' and neither is more specific.""" +
+              labeler.originMessages,
+      tip: """Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.""",
+      arguments: {'name': name, 'type': _type});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(
+            String name, DartType _type, bool isNonNullableByDefault)>
+    templateAmbiguousExtensionOperator = const Template<
+            Message Function(
+                String name, DartType _type, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""The operator '#name' is defined in multiple extensions for '#type' and neither is more specific.""",
+        tipTemplate:
+            r"""Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.""",
+        withArguments: _withArgumentsAmbiguousExtensionOperator);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            String name, DartType _type, bool isNonNullableByDefault)>
+    codeAmbiguousExtensionOperator = const Code<
+        Message Function(
+            String name, DartType _type, bool isNonNullableByDefault)>(
+  "AmbiguousExtensionOperator",
+  templateAmbiguousExtensionOperator,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsAmbiguousExtensionOperator(
+    String name, DartType _type, bool isNonNullableByDefault) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  String type = typeParts.join();
+  return new Message(codeAmbiguousExtensionOperator,
+      message:
+          """The operator '${name}' is defined in multiple extensions for '${type}' and neither is more specific.""" +
+              labeler.originMessages,
+      tip: """Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.""",
+      arguments: {'name': name, 'type': _type});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+        Message Function(
+            String name, DartType _type, bool isNonNullableByDefault)>
+    templateAmbiguousExtensionProperty = const Template<
+            Message Function(
+                String name, DartType _type, bool isNonNullableByDefault)>(
+        messageTemplate:
+            r"""The property '#name' is defined in multiple extensions for '#type' and neither is more specific.""",
+        tipTemplate:
+            r"""Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.""",
+        withArguments: _withArgumentsAmbiguousExtensionProperty);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            String name, DartType _type, bool isNonNullableByDefault)>
+    codeAmbiguousExtensionProperty = const Code<
+        Message Function(
+            String name, DartType _type, bool isNonNullableByDefault)>(
+  "AmbiguousExtensionProperty",
+  templateAmbiguousExtensionProperty,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsAmbiguousExtensionProperty(
+    String name, DartType _type, bool isNonNullableByDefault) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  String type = typeParts.join();
+  return new Message(codeAmbiguousExtensionProperty,
+      message:
+          """The property '${name}' is defined in multiple extensions for '${type}' and neither is more specific.""" +
+              labeler.originMessages,
+      tip: """Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.""",
+      arguments: {'name': name, 'type': _type});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
         Message Function(String name, DartType _type, DartType _type2,
             bool isNonNullableByDefault)> templateAmbiguousSupertypes =
     const Template<
@@ -771,44 +891,6 @@
 const Template<
         Message Function(
             String name, DartType _type, bool isNonNullableByDefault)>
-    templateFieldNonNullableNotInitializedByConstructorWarning = const Template<
-            Message Function(
-                String name, DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
-            r"""This constructor doesn't initialize field '#name' and its type '#type' doesn't allow null.""",
-        withArguments:
-            _withArgumentsFieldNonNullableNotInitializedByConstructorWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
-        Message Function(
-            String name, DartType _type, bool isNonNullableByDefault)>
-    codeFieldNonNullableNotInitializedByConstructorWarning = const Code<
-            Message Function(
-                String name, DartType _type, bool isNonNullableByDefault)>(
-        "FieldNonNullableNotInitializedByConstructorWarning",
-        templateFieldNonNullableNotInitializedByConstructorWarning,
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsFieldNonNullableNotInitializedByConstructorWarning(
-    String name, DartType _type, bool isNonNullableByDefault) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
-  List<Object> typeParts = labeler.labelType(_type);
-  String type = typeParts.join();
-  return new Message(codeFieldNonNullableNotInitializedByConstructorWarning,
-      message:
-          """This constructor doesn't initialize field '${name}' and its type '${type}' doesn't allow null.""" +
-              labeler.originMessages,
-      arguments: {'name': name, 'type': _type});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-        Message Function(
-            String name, DartType _type, bool isNonNullableByDefault)>
     templateFieldNonNullableWithoutInitializerError = const Template<
             Message Function(
                 String name, DartType _type, bool isNonNullableByDefault)>(
@@ -845,43 +927,6 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
         Message Function(
-            String name, DartType _type, bool isNonNullableByDefault)>
-    templateFieldNonNullableWithoutInitializerWarning = const Template<
-            Message Function(
-                String name, DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
-            r"""Field '#name' isn't initialized and its type '#type' doesn't allow null.""",
-        withArguments: _withArgumentsFieldNonNullableWithoutInitializerWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
-        Message Function(
-            String name, DartType _type, bool isNonNullableByDefault)>
-    codeFieldNonNullableWithoutInitializerWarning = const Code<
-            Message Function(
-                String name, DartType _type, bool isNonNullableByDefault)>(
-        "FieldNonNullableWithoutInitializerWarning",
-        templateFieldNonNullableWithoutInitializerWarning,
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsFieldNonNullableWithoutInitializerWarning(
-    String name, DartType _type, bool isNonNullableByDefault) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
-  List<Object> typeParts = labeler.labelType(_type);
-  String type = typeParts.join();
-  return new Message(codeFieldNonNullableWithoutInitializerWarning,
-      message:
-          """Field '${name}' isn't initialized and its type '${type}' doesn't allow null.""" +
-              labeler.originMessages,
-      arguments: {'name': name, 'type': _type});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-        Message Function(
             DartType _type, DartType _type2, bool isNonNullableByDefault)>
     templateForInLoopElementTypeNotAssignable = const Template<
             Message Function(
@@ -1046,6 +1091,38 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
+    Message Function(
+        DartType _type,
+        bool
+            isNonNullableByDefault)> templateImplicitReturnNull = const Template<
+        Message Function(DartType _type, bool isNonNullableByDefault)>(
+    messageTemplate:
+        r"""A non-null value must be returned since the return type '#type' doesn't allow null.""",
+    withArguments: _withArgumentsImplicitReturnNull);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(DartType _type, bool isNonNullableByDefault)>
+    codeImplicitReturnNull =
+    const Code<Message Function(DartType _type, bool isNonNullableByDefault)>(
+  "ImplicitReturnNull",
+  templateImplicitReturnNull,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsImplicitReturnNull(
+    DartType _type, bool isNonNullableByDefault) {
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  String type = typeParts.join();
+  return new Message(codeImplicitReturnNull,
+      message:
+          """A non-null value must be returned since the return type '${type}' doesn't allow null.""" +
+              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)>
     templateIncompatibleRedirecteeFunctionType = const Template<
@@ -1083,44 +1160,6 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
-        Message Function(
-            DartType _type, DartType _type2, bool isNonNullableByDefault)>
-    templateIncompatibleRedirecteeFunctionTypeWarning = const Template<
-            Message Function(
-                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
-            r"""The constructor function type '#type' isn't a subtype of '#type2'.""",
-        withArguments: _withArgumentsIncompatibleRedirecteeFunctionTypeWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
-        Message Function(
-            DartType _type, DartType _type2, bool isNonNullableByDefault)>
-    codeIncompatibleRedirecteeFunctionTypeWarning = const Code<
-            Message Function(
-                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        "IncompatibleRedirecteeFunctionTypeWarning",
-        templateIncompatibleRedirecteeFunctionTypeWarning,
-        analyzerCodes: <String>["REDIRECT_TO_INVALID_TYPE"],
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIncompatibleRedirecteeFunctionTypeWarning(
-    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(codeIncompatibleRedirecteeFunctionTypeWarning,
-      message:
-          """The constructor function type '${type}' isn't a subtype of '${type2}'.""" +
-              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, String name,
             String name2, bool isNonNullableByDefault)>
     templateIncorrectTypeArgument = const Template<
@@ -1218,56 +1257,6 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
-        Message Function(DartType _type, DartType _type2, String name,
-            String name2, bool isNonNullableByDefault)>
-    templateIncorrectTypeArgumentInReturnTypeWarning = const Template<
-            Message Function(DartType _type, DartType _type2, String name,
-                String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
-            r"""Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the return type.""",
-        tipTemplate:
-            r"""Try changing type arguments so that they conform to the bounds.""",
-        withArguments: _withArgumentsIncorrectTypeArgumentInReturnTypeWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
-        Message Function(DartType _type, DartType _type2, String name,
-            String name2, bool isNonNullableByDefault)>
-    codeIncorrectTypeArgumentInReturnTypeWarning = const Code<
-            Message Function(DartType _type, DartType _type2, String name,
-                String name2, bool isNonNullableByDefault)>(
-        "IncorrectTypeArgumentInReturnTypeWarning",
-        templateIncorrectTypeArgumentInReturnTypeWarning,
-        analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"],
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIncorrectTypeArgumentInReturnTypeWarning(DartType _type,
-    DartType _type2, String name, String name2, bool isNonNullableByDefault) {
-  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
-  List<Object> typeParts = labeler.labelType(_type);
-  List<Object> type2Parts = labeler.labelType(_type2);
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  if (name2.isEmpty) throw 'No name provided';
-  name2 = demangleMixinApplicationName(name2);
-  String type = typeParts.join();
-  String type2 = type2Parts.join();
-  return new Message(codeIncorrectTypeArgumentInReturnTypeWarning,
-      message:
-          """Type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}' in the return type.""" +
-              labeler.originMessages,
-      tip: """Try changing type arguments so that they conform to the bounds.""",
-      arguments: {
-        'type': _type,
-        'type2': _type2,
-        'name': name,
-        'name2': name2
-      });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
         Message Function(
             DartType _type,
             DartType _type2,
@@ -1438,181 +1427,6 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
-        Message Function(
-            DartType _type,
-            DartType _type2,
-            String name,
-            String name2,
-            String name3,
-            String name4,
-            bool isNonNullableByDefault)>
-    templateIncorrectTypeArgumentInSupertypeInferredWarning = const Template<
-            Message Function(
-                DartType _type,
-                DartType _type2,
-                String name,
-                String name2,
-                String name3,
-                String name4,
-                bool isNonNullableByDefault)>(
-        messageTemplate:
-            r"""Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the supertype '#name3' of class '#name4'.""",
-        tipTemplate:
-            r"""Try specifying type arguments explicitly so that they conform to the bounds.""",
-        withArguments:
-            _withArgumentsIncorrectTypeArgumentInSupertypeInferredWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
-        Message Function(
-            DartType _type,
-            DartType _type2,
-            String name,
-            String name2,
-            String name3,
-            String name4,
-            bool isNonNullableByDefault)>
-    codeIncorrectTypeArgumentInSupertypeInferredWarning = const Code<
-            Message Function(
-                DartType _type,
-                DartType _type2,
-                String name,
-                String name2,
-                String name3,
-                String name4,
-                bool isNonNullableByDefault)>(
-        "IncorrectTypeArgumentInSupertypeInferredWarning",
-        templateIncorrectTypeArgumentInSupertypeInferredWarning,
-        analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"],
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIncorrectTypeArgumentInSupertypeInferredWarning(
-    DartType _type,
-    DartType _type2,
-    String name,
-    String name2,
-    String name3,
-    String name4,
-    bool isNonNullableByDefault) {
-  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
-  List<Object> typeParts = labeler.labelType(_type);
-  List<Object> type2Parts = labeler.labelType(_type2);
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  if (name2.isEmpty) throw 'No name provided';
-  name2 = demangleMixinApplicationName(name2);
-  if (name3.isEmpty) throw 'No name provided';
-  name3 = demangleMixinApplicationName(name3);
-  if (name4.isEmpty) throw 'No name provided';
-  name4 = demangleMixinApplicationName(name4);
-  String type = typeParts.join();
-  String type2 = type2Parts.join();
-  return new Message(codeIncorrectTypeArgumentInSupertypeInferredWarning,
-      message:
-          """Inferred type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}' in the supertype '${name3}' of class '${name4}'.""" +
-              labeler.originMessages,
-      tip:
-          """Try specifying type arguments explicitly so that they conform to the bounds.""",
-      arguments: {
-        'type': _type,
-        'type2': _type2,
-        'name': name,
-        'name2': name2,
-        'name3': name3,
-        'name4': name4
-      });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-        Message Function(
-            DartType _type,
-            DartType _type2,
-            String name,
-            String name2,
-            String name3,
-            String name4,
-            bool isNonNullableByDefault)>
-    templateIncorrectTypeArgumentInSupertypeWarning = const Template<
-            Message Function(
-                DartType _type,
-                DartType _type2,
-                String name,
-                String name2,
-                String name3,
-                String name4,
-                bool isNonNullableByDefault)>(
-        messageTemplate:
-            r"""Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the supertype '#name3' of class '#name4'.""",
-        tipTemplate:
-            r"""Try changing type arguments so that they conform to the bounds.""",
-        withArguments: _withArgumentsIncorrectTypeArgumentInSupertypeWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
-        Message Function(
-            DartType _type,
-            DartType _type2,
-            String name,
-            String name2,
-            String name3,
-            String name4,
-            bool isNonNullableByDefault)>
-    codeIncorrectTypeArgumentInSupertypeWarning = const Code<
-            Message Function(
-                DartType _type,
-                DartType _type2,
-                String name,
-                String name2,
-                String name3,
-                String name4,
-                bool isNonNullableByDefault)>(
-        "IncorrectTypeArgumentInSupertypeWarning",
-        templateIncorrectTypeArgumentInSupertypeWarning,
-        analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"],
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIncorrectTypeArgumentInSupertypeWarning(
-    DartType _type,
-    DartType _type2,
-    String name,
-    String name2,
-    String name3,
-    String name4,
-    bool isNonNullableByDefault) {
-  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
-  List<Object> typeParts = labeler.labelType(_type);
-  List<Object> type2Parts = labeler.labelType(_type2);
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  if (name2.isEmpty) throw 'No name provided';
-  name2 = demangleMixinApplicationName(name2);
-  if (name3.isEmpty) throw 'No name provided';
-  name3 = demangleMixinApplicationName(name3);
-  if (name4.isEmpty) throw 'No name provided';
-  name4 = demangleMixinApplicationName(name4);
-  String type = typeParts.join();
-  String type2 = type2Parts.join();
-  return new Message(codeIncorrectTypeArgumentInSupertypeWarning,
-      message:
-          """Type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}' in the supertype '${name3}' of class '${name4}'.""" +
-              labeler.originMessages,
-      tip:
-          """Try changing type arguments so that they conform to the bounds.""",
-      arguments: {
-        'type': _type,
-        'type2': _type2,
-        'name': name,
-        'name2': name2,
-        'name3': name3,
-        'name4': name4
-      });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
         Message Function(DartType _type, DartType _type2, String name,
             String name2, bool isNonNullableByDefault)>
     templateIncorrectTypeArgumentInferred = const Template<
@@ -1662,56 +1476,6 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
         Message Function(DartType _type, DartType _type2, String name,
-            String name2, bool isNonNullableByDefault)>
-    templateIncorrectTypeArgumentInferredWarning = const Template<
-            Message Function(DartType _type, DartType _type2, String name,
-                String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
-            r"""Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2'.""",
-        tipTemplate:
-            r"""Try specifying type arguments explicitly so that they conform to the bounds.""",
-        withArguments: _withArgumentsIncorrectTypeArgumentInferredWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
-        Message Function(DartType _type, DartType _type2, String name,
-            String name2, bool isNonNullableByDefault)>
-    codeIncorrectTypeArgumentInferredWarning = const Code<
-            Message Function(DartType _type, DartType _type2, String name,
-                String name2, bool isNonNullableByDefault)>(
-        "IncorrectTypeArgumentInferredWarning",
-        templateIncorrectTypeArgumentInferredWarning,
-        analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"],
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIncorrectTypeArgumentInferredWarning(DartType _type,
-    DartType _type2, String name, String name2, bool isNonNullableByDefault) {
-  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
-  List<Object> typeParts = labeler.labelType(_type);
-  List<Object> type2Parts = labeler.labelType(_type2);
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  if (name2.isEmpty) throw 'No name provided';
-  name2 = demangleMixinApplicationName(name2);
-  String type = typeParts.join();
-  String type2 = type2Parts.join();
-  return new Message(codeIncorrectTypeArgumentInferredWarning,
-      message:
-          """Inferred type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}'.""" +
-              labeler.originMessages,
-      tip: """Try specifying type arguments explicitly so that they conform to the bounds.""",
-      arguments: {
-        'type': _type,
-        'type2': _type2,
-        'name': name,
-        'name2': name2
-      });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-        Message Function(DartType _type, DartType _type2, String name,
             DartType _type3, String name2, bool isNonNullableByDefault)>
     templateIncorrectTypeArgumentQualified = const Template<
             Message Function(DartType _type, DartType _type2, String name,
@@ -1824,172 +1588,6 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
-        Message Function(DartType _type, DartType _type2, String name,
-            DartType _type3, String name2, bool isNonNullableByDefault)>
-    templateIncorrectTypeArgumentQualifiedInferredWarning = const Template<
-            Message Function(DartType _type, DartType _type2, String name,
-                DartType _type3, String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
-            r"""Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#type3.#name2'.""",
-        tipTemplate:
-            r"""Try specifying type arguments explicitly so that they conform to the bounds.""",
-        withArguments:
-            _withArgumentsIncorrectTypeArgumentQualifiedInferredWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
-        Message Function(DartType _type, DartType _type2, String name,
-            DartType _type3, String name2, bool isNonNullableByDefault)>
-    codeIncorrectTypeArgumentQualifiedInferredWarning = const Code<
-            Message Function(DartType _type, DartType _type2, String name,
-                DartType _type3, String name2, bool isNonNullableByDefault)>(
-        "IncorrectTypeArgumentQualifiedInferredWarning",
-        templateIncorrectTypeArgumentQualifiedInferredWarning,
-        analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"],
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIncorrectTypeArgumentQualifiedInferredWarning(
-    DartType _type,
-    DartType _type2,
-    String name,
-    DartType _type3,
-    String name2,
-    bool isNonNullableByDefault) {
-  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
-  List<Object> typeParts = labeler.labelType(_type);
-  List<Object> type2Parts = labeler.labelType(_type2);
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  List<Object> type3Parts = labeler.labelType(_type3);
-  if (name2.isEmpty) throw 'No name provided';
-  name2 = demangleMixinApplicationName(name2);
-  String type = typeParts.join();
-  String type2 = type2Parts.join();
-  String type3 = type3Parts.join();
-  return new Message(codeIncorrectTypeArgumentQualifiedInferredWarning,
-      message:
-          """Inferred type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${type3}.${name2}'.""" +
-              labeler.originMessages,
-      tip: """Try specifying type arguments explicitly so that they conform to the bounds.""",
-      arguments: {
-        'type': _type,
-        'type2': _type2,
-        'name': name,
-        'type3': _type3,
-        'name2': name2
-      });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-        Message Function(DartType _type, DartType _type2, String name,
-            DartType _type3, String name2, bool isNonNullableByDefault)>
-    templateIncorrectTypeArgumentQualifiedWarning = const Template<
-            Message Function(DartType _type, DartType _type2, String name,
-                DartType _type3, String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
-            r"""Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#type3.#name2'.""",
-        tipTemplate:
-            r"""Try changing type arguments so that they conform to the bounds.""",
-        withArguments: _withArgumentsIncorrectTypeArgumentQualifiedWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
-        Message Function(DartType _type, DartType _type2, String name,
-            DartType _type3, String name2, bool isNonNullableByDefault)>
-    codeIncorrectTypeArgumentQualifiedWarning = const Code<
-            Message Function(DartType _type, DartType _type2, String name,
-                DartType _type3, String name2, bool isNonNullableByDefault)>(
-        "IncorrectTypeArgumentQualifiedWarning",
-        templateIncorrectTypeArgumentQualifiedWarning,
-        analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"],
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIncorrectTypeArgumentQualifiedWarning(
-    DartType _type,
-    DartType _type2,
-    String name,
-    DartType _type3,
-    String name2,
-    bool isNonNullableByDefault) {
-  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
-  List<Object> typeParts = labeler.labelType(_type);
-  List<Object> type2Parts = labeler.labelType(_type2);
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  List<Object> type3Parts = labeler.labelType(_type3);
-  if (name2.isEmpty) throw 'No name provided';
-  name2 = demangleMixinApplicationName(name2);
-  String type = typeParts.join();
-  String type2 = type2Parts.join();
-  String type3 = type3Parts.join();
-  return new Message(codeIncorrectTypeArgumentQualifiedWarning,
-      message:
-          """Type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${type3}.${name2}'.""" +
-              labeler.originMessages,
-      tip: """Try changing type arguments so that they conform to the bounds.""",
-      arguments: {
-        'type': _type,
-        'type2': _type2,
-        'name': name,
-        'type3': _type3,
-        'name2': name2
-      });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-        Message Function(DartType _type, DartType _type2, String name,
-            String name2, bool isNonNullableByDefault)>
-    templateIncorrectTypeArgumentWarning = const Template<
-            Message Function(DartType _type, DartType _type2, String name,
-                String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
-            r"""Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2'.""",
-        tipTemplate:
-            r"""Try changing type arguments so that they conform to the bounds.""",
-        withArguments: _withArgumentsIncorrectTypeArgumentWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
-        Message Function(DartType _type, DartType _type2, String name,
-            String name2, bool isNonNullableByDefault)>
-    codeIncorrectTypeArgumentWarning = const Code<
-            Message Function(DartType _type, DartType _type2, String name,
-                String name2, bool isNonNullableByDefault)>(
-        "IncorrectTypeArgumentWarning", templateIncorrectTypeArgumentWarning,
-        analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"],
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIncorrectTypeArgumentWarning(DartType _type,
-    DartType _type2, String name, String name2, bool isNonNullableByDefault) {
-  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
-  List<Object> typeParts = labeler.labelType(_type);
-  List<Object> type2Parts = labeler.labelType(_type2);
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  if (name2.isEmpty) throw 'No name provided';
-  name2 = demangleMixinApplicationName(name2);
-  String type = typeParts.join();
-  String type2 = type2Parts.join();
-  return new Message(codeIncorrectTypeArgumentWarning,
-      message:
-          """Type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}'.""" +
-              labeler.originMessages,
-      tip: """Try changing type arguments so that they conform to the bounds.""",
-      arguments: {
-        'type': _type,
-        'type2': _type2,
-        'name': name,
-        'name2': name2
-      });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
         Message Function(String name, DartType _type, DartType _type2,
             bool isNonNullableByDefault)>
     templateInitializingFormalTypeMismatch = const Template<
@@ -2103,42 +1701,6 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
-        Message Function(
-            DartType _type, DartType _type2, bool isNonNullableByDefault)>
-    templateInvalidAssignmentWarning = const Template<
-            Message Function(
-                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate:
-            r"""Assigning value of type '#type' to a variable of type '#type2'.""",
-        withArguments: _withArgumentsInvalidAssignmentWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
-        Message Function(
-            DartType _type, DartType _type2, bool isNonNullableByDefault)>
-    codeInvalidAssignmentWarning = const Code<
-            Message Function(
-                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        "InvalidAssignmentWarning", templateInvalidAssignmentWarning,
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsInvalidAssignmentWarning(
-    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(codeInvalidAssignmentWarning,
-      message:
-          """Assigning value of type '${type}' to a variable of type '${type2}'.""" +
-              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,
@@ -2624,36 +2186,6 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
-    templateNullableExpressionCallWarning = const Template<
-            Message Function(DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
-            r"""Expression of type '#type' is used as a function, but it's potentially null.""",
-        tipTemplate: r"""Try calling using ?.call instead.""",
-        withArguments: _withArgumentsNullableExpressionCallWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(DartType _type, bool isNonNullableByDefault)>
-    codeNullableExpressionCallWarning =
-    const Code<Message Function(DartType _type, bool isNonNullableByDefault)>(
-        "NullableExpressionCallWarning", templateNullableExpressionCallWarning,
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsNullableExpressionCallWarning(
-    DartType _type, bool isNonNullableByDefault) {
-  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
-  List<Object> typeParts = labeler.labelType(_type);
-  String type = typeParts.join();
-  return new Message(codeNullableExpressionCallWarning,
-      message:
-          """Expression of type '${type}' is used as a function, but it's potentially null.""" +
-              labeler.originMessages,
-      tip: """Try calling using ?.call instead.""",
-      arguments: {'type': _type});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
         Message Function(
             String name, DartType _type, bool isNonNullableByDefault)>
@@ -2694,44 +2226,6 @@
 const Template<
         Message Function(
             String name, DartType _type, bool isNonNullableByDefault)>
-    templateNullableMethodCallWarning = const Template<
-            Message Function(
-                String name, DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
-            r"""Method '#name' is called on '#type' which is potentially null.""",
-        tipTemplate: r"""Try calling using ?. instead.""",
-        withArguments: _withArgumentsNullableMethodCallWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
-        Message Function(
-            String name, DartType _type, bool isNonNullableByDefault)>
-    codeNullableMethodCallWarning = const Code<
-            Message Function(
-                String name, DartType _type, bool isNonNullableByDefault)>(
-        "NullableMethodCallWarning", templateNullableMethodCallWarning,
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsNullableMethodCallWarning(
-    String name, DartType _type, bool isNonNullableByDefault) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
-  List<Object> typeParts = labeler.labelType(_type);
-  String type = typeParts.join();
-  return new Message(codeNullableMethodCallWarning,
-      message:
-          """Method '${name}' is called on '${type}' which is potentially null.""" +
-              labeler.originMessages,
-      tip: """Try calling using ?. instead.""",
-      arguments: {'name': name, 'type': _type});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-        Message Function(
-            String name, DartType _type, bool isNonNullableByDefault)>
     templateNullableOperatorCallError = const Template<
             Message Function(
                 String name, DartType _type, bool isNonNullableByDefault)>(
@@ -2769,42 +2263,6 @@
 const Template<
         Message Function(
             String name, DartType _type, bool isNonNullableByDefault)>
-    templateNullableOperatorCallWarning = const Template<
-            Message Function(
-                String name, DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
-            r"""Operator '#name' is called on '#type' which is potentially null.""",
-        withArguments: _withArgumentsNullableOperatorCallWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
-        Message Function(
-            String name, DartType _type, bool isNonNullableByDefault)>
-    codeNullableOperatorCallWarning = const Code<
-            Message Function(
-                String name, DartType _type, bool isNonNullableByDefault)>(
-        "NullableOperatorCallWarning", templateNullableOperatorCallWarning,
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsNullableOperatorCallWarning(
-    String name, DartType _type, bool isNonNullableByDefault) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
-  List<Object> typeParts = labeler.labelType(_type);
-  String type = typeParts.join();
-  return new Message(codeNullableOperatorCallWarning,
-      message:
-          """Operator '${name}' is called on '${type}' which is potentially null.""" +
-              labeler.originMessages,
-      arguments: {'name': name, 'type': _type});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-        Message Function(
-            String name, DartType _type, bool isNonNullableByDefault)>
     templateNullablePropertyAccessError = const Template<
             Message Function(
                 String name, DartType _type, bool isNonNullableByDefault)>(
@@ -2844,44 +2302,6 @@
 const Template<
         Message Function(
             String name, DartType _type, bool isNonNullableByDefault)>
-    templateNullablePropertyAccessWarning = const Template<
-            Message Function(
-                String name, DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
-            r"""Property '#name' is accessed on '#type' which is potentially null.""",
-        tipTemplate: r"""Try accessing using ?. instead.""",
-        withArguments: _withArgumentsNullablePropertyAccessWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
-        Message Function(
-            String name, DartType _type, bool isNonNullableByDefault)>
-    codeNullablePropertyAccessWarning = const Code<
-            Message Function(
-                String name, DartType _type, bool isNonNullableByDefault)>(
-        "NullablePropertyAccessWarning", templateNullablePropertyAccessWarning,
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsNullablePropertyAccessWarning(
-    String name, DartType _type, bool isNonNullableByDefault) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
-  List<Object> typeParts = labeler.labelType(_type);
-  String type = typeParts.join();
-  return new Message(codeNullablePropertyAccessWarning,
-      message:
-          """Property '${name}' is accessed on '${type}' which is potentially null.""" +
-              labeler.originMessages,
-      tip: """Try accessing using ?. instead.""",
-      arguments: {'name': name, 'type': _type});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-        Message Function(
-            String name, DartType _type, bool isNonNullableByDefault)>
     templateOptionalNonNullableWithoutInitializerError = const Template<
             Message Function(
                 String name, DartType _type, bool isNonNullableByDefault)>(
@@ -2918,44 +2338,6 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
-        Message Function(
-            String name, DartType _type, bool isNonNullableByDefault)>
-    templateOptionalNonNullableWithoutInitializerWarning = const Template<
-            Message Function(
-                String name, DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
-            r"""Optional parameter '#name' doesn't have a default value and its type '#type' doesn't allow null.""",
-        withArguments:
-            _withArgumentsOptionalNonNullableWithoutInitializerWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
-        Message Function(
-            String name, DartType _type, bool isNonNullableByDefault)>
-    codeOptionalNonNullableWithoutInitializerWarning = const Code<
-            Message Function(
-                String name, DartType _type, bool isNonNullableByDefault)>(
-        "OptionalNonNullableWithoutInitializerWarning",
-        templateOptionalNonNullableWithoutInitializerWarning,
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsOptionalNonNullableWithoutInitializerWarning(
-    String name, DartType _type, bool isNonNullableByDefault) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
-  List<Object> typeParts = labeler.labelType(_type);
-  String type = typeParts.join();
-  return new Message(codeOptionalNonNullableWithoutInitializerWarning,
-      message:
-          """Optional parameter '${name}' doesn't have a default value and its type '${type}' doesn't allow null.""" +
-              labeler.originMessages,
-      arguments: {'name': name, 'type': _type});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
         Message Function(String name, String name2, DartType _type,
             DartType _type2, String name3, bool isNonNullableByDefault)>
     templateOverrideTypeMismatchParameter = const Template<
@@ -3012,64 +2394,6 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
-        Message Function(String name, String name2, DartType _type,
-            DartType _type2, String name3, bool isNonNullableByDefault)>
-    templateOverrideTypeMismatchParameterWarning = const Template<
-            Message Function(String name, String name2, DartType _type,
-                DartType _type2, String name3, bool isNonNullableByDefault)>(
-        messageTemplate:
-            r"""The parameter '#name' of the method '#name2' has type '#type', which does not match the corresponding type, '#type2', in the overridden method, '#name3'.""",
-        tipTemplate:
-            r"""Change to a supertype of '#type2', or, for a covariant parameter, a subtype.""",
-        withArguments: _withArgumentsOverrideTypeMismatchParameterWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
-        Message Function(String name, String name2, DartType _type,
-            DartType _type2, String name3, bool isNonNullableByDefault)>
-    codeOverrideTypeMismatchParameterWarning = const Code<
-            Message Function(String name, String name2, DartType _type,
-                DartType _type2, String name3, bool isNonNullableByDefault)>(
-        "OverrideTypeMismatchParameterWarning",
-        templateOverrideTypeMismatchParameterWarning,
-        analyzerCodes: <String>["INVALID_METHOD_OVERRIDE"],
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsOverrideTypeMismatchParameterWarning(
-    String name,
-    String name2,
-    DartType _type,
-    DartType _type2,
-    String name3,
-    bool isNonNullableByDefault) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  if (name2.isEmpty) throw 'No name provided';
-  name2 = demangleMixinApplicationName(name2);
-  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
-  List<Object> typeParts = labeler.labelType(_type);
-  List<Object> type2Parts = labeler.labelType(_type2);
-  if (name3.isEmpty) throw 'No name provided';
-  name3 = demangleMixinApplicationName(name3);
-  String type = typeParts.join();
-  String type2 = type2Parts.join();
-  return new Message(codeOverrideTypeMismatchParameterWarning,
-      message:
-          """The parameter '${name}' of the method '${name2}' has type '${type}', which does not match the corresponding type, '${type2}', in the overridden method, '${name3}'.""" +
-              labeler.originMessages,
-      tip: """Change to a supertype of '${type2}', or, for a covariant parameter, a subtype.""",
-      arguments: {
-        'name': name,
-        'name2': name2,
-        'type': _type,
-        'type2': _type2,
-        'name3': name3
-      });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
         Message Function(String name, DartType _type, DartType _type2,
             String name2, bool isNonNullableByDefault)>
     templateOverrideTypeMismatchReturnType = const Template<
@@ -3124,59 +2448,6 @@
 const Template<
         Message Function(String name, DartType _type, DartType _type2,
             String name2, bool isNonNullableByDefault)>
-    templateOverrideTypeMismatchReturnTypeWarning = const Template<
-            Message Function(String name, DartType _type, DartType _type2,
-                String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
-            r"""The return type of the method '#name' is '#type', which does not match the return type, '#type2', of the overridden method, '#name2'.""",
-        tipTemplate: r"""Change to a subtype of '#type2'.""",
-        withArguments: _withArgumentsOverrideTypeMismatchReturnTypeWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
-        Message Function(String name, DartType _type, DartType _type2,
-            String name2, bool isNonNullableByDefault)>
-    codeOverrideTypeMismatchReturnTypeWarning = const Code<
-            Message Function(String name, DartType _type, DartType _type2,
-                String name2, bool isNonNullableByDefault)>(
-        "OverrideTypeMismatchReturnTypeWarning",
-        templateOverrideTypeMismatchReturnTypeWarning,
-        analyzerCodes: <String>["INVALID_METHOD_OVERRIDE"],
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsOverrideTypeMismatchReturnTypeWarning(
-    String name,
-    DartType _type,
-    DartType _type2,
-    String name2,
-    bool isNonNullableByDefault) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
-  List<Object> typeParts = labeler.labelType(_type);
-  List<Object> type2Parts = labeler.labelType(_type2);
-  if (name2.isEmpty) throw 'No name provided';
-  name2 = demangleMixinApplicationName(name2);
-  String type = typeParts.join();
-  String type2 = type2Parts.join();
-  return new Message(codeOverrideTypeMismatchReturnTypeWarning,
-      message:
-          """The return type of the method '${name}' is '${type}', which does not match the return type, '${type2}', of the overridden method, '${name2}'.""" +
-              labeler.originMessages,
-      tip: """Change to a subtype of '${type2}'.""",
-      arguments: {
-        'name': name,
-        'type': _type,
-        'type2': _type2,
-        'name2': name2
-      });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-        Message Function(String name, DartType _type, DartType _type2,
-            String name2, bool isNonNullableByDefault)>
     templateOverrideTypeMismatchSetter = const Template<
             Message Function(String name, DartType _type, DartType _type2,
                 String name2, bool isNonNullableByDefault)>(
@@ -3220,57 +2491,6 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
-        Message Function(String name, DartType _type, DartType _type2,
-            String name2, bool isNonNullableByDefault)>
-    templateOverrideTypeMismatchSetterWarning = const Template<
-            Message Function(String name, DartType _type, DartType _type2,
-                String name2, bool isNonNullableByDefault)>(
-        messageTemplate:
-            r"""The field '#name' has type '#type', which does not match the corresponding type, '#type2', in the overridden setter, '#name2'.""",
-        withArguments: _withArgumentsOverrideTypeMismatchSetterWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
-        Message Function(String name, DartType _type, DartType _type2,
-            String name2, bool isNonNullableByDefault)>
-    codeOverrideTypeMismatchSetterWarning = const Code<
-            Message Function(String name, DartType _type, DartType _type2,
-                String name2, bool isNonNullableByDefault)>(
-        "OverrideTypeMismatchSetterWarning",
-        templateOverrideTypeMismatchSetterWarning,
-        analyzerCodes: <String>["INVALID_METHOD_OVERRIDE"],
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsOverrideTypeMismatchSetterWarning(
-    String name,
-    DartType _type,
-    DartType _type2,
-    String name2,
-    bool isNonNullableByDefault) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
-  List<Object> typeParts = labeler.labelType(_type);
-  List<Object> type2Parts = labeler.labelType(_type2);
-  if (name2.isEmpty) throw 'No name provided';
-  name2 = demangleMixinApplicationName(name2);
-  String type = typeParts.join();
-  String type2 = type2Parts.join();
-  return new Message(codeOverrideTypeMismatchSetterWarning,
-      message:
-          """The field '${name}' has type '${type}', which does not match the corresponding type, '${type2}', in the overridden setter, '${name2}'.""" +
-              labeler.originMessages,
-      arguments: {
-        'name': name,
-        'type': _type,
-        'type2': _type2,
-        'name2': name2
-      });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
         Message Function(DartType _type, String name, String name2,
             DartType _type2, String name3, bool isNonNullableByDefault)>
     templateOverrideTypeVariablesBoundMismatch = const Template<
@@ -3365,45 +2585,6 @@
 const Template<
         Message Function(
             DartType _type, DartType _type2, bool isNonNullableByDefault)>
-    templateRedirectingFactoryIncompatibleTypeArgumentWarning = const Template<
-            Message Function(
-                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        messageTemplate: r"""The type '#type' doesn't extend '#type2'.""",
-        tipTemplate: r"""Try using a different type as argument.""",
-        withArguments:
-            _withArgumentsRedirectingFactoryIncompatibleTypeArgumentWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<
-        Message Function(
-            DartType _type, DartType _type2, bool isNonNullableByDefault)>
-    codeRedirectingFactoryIncompatibleTypeArgumentWarning = const Code<
-            Message Function(
-                DartType _type, DartType _type2, bool isNonNullableByDefault)>(
-        "RedirectingFactoryIncompatibleTypeArgumentWarning",
-        templateRedirectingFactoryIncompatibleTypeArgumentWarning,
-        analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"],
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsRedirectingFactoryIncompatibleTypeArgumentWarning(
-    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(codeRedirectingFactoryIncompatibleTypeArgumentWarning,
-      message: """The type '${type}' doesn't extend '${type2}'.""" +
-          labeler.originMessages,
-      tip: """Try using a different type as argument.""",
-      arguments: {'type': _type, 'type2': _type2});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-        Message Function(
-            DartType _type, DartType _type2, bool isNonNullableByDefault)>
     templateSpreadElementTypeMismatch = const Template<
             Message Function(
                 DartType _type, DartType _type2, bool isNonNullableByDefault)>(
@@ -3674,35 +2855,6 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(DartType _type, bool isNonNullableByDefault)>
-    templateThrowingNotAssignableToObjectWarning = const Template<
-            Message Function(DartType _type, bool isNonNullableByDefault)>(
-        messageTemplate:
-            r"""Throwing a value of '#type' that is neither dynamic nor non-nullable.""",
-        withArguments: _withArgumentsThrowingNotAssignableToObjectWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(DartType _type, bool isNonNullableByDefault)>
-    codeThrowingNotAssignableToObjectWarning =
-    const Code<Message Function(DartType _type, bool isNonNullableByDefault)>(
-        "ThrowingNotAssignableToObjectWarning",
-        templateThrowingNotAssignableToObjectWarning,
-        severity: Severity.warning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsThrowingNotAssignableToObjectWarning(
-    DartType _type, bool isNonNullableByDefault) {
-  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
-  List<Object> typeParts = labeler.labelType(_type);
-  String type = typeParts.join();
-  return new Message(codeThrowingNotAssignableToObjectWarning,
-      message:
-          """Throwing a value of '${type}' that is neither dynamic nor non-nullable.""" +
-              labeler.originMessages,
-      arguments: {'type': _type});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         String name,
@@ -3792,6 +2944,48 @@
         String name,
         DartType _type,
         bool
+            isNonNullableByDefault)> templateUndefinedOperator = const Template<
+        Message Function(String name, DartType _type,
+            bool isNonNullableByDefault)>(
+    messageTemplate:
+        r"""The operator '#name' isn't defined for the class '#type'.""",
+    tipTemplate:
+        r"""Try correcting the operator to an existing operator, or defining a '#name' operator.""",
+    withArguments: _withArgumentsUndefinedOperator);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            String name, DartType _type, bool isNonNullableByDefault)>
+    codeUndefinedOperator = const Code<
+            Message Function(
+                String name, DartType _type, bool isNonNullableByDefault)>(
+        "UndefinedOperator", templateUndefinedOperator,
+        analyzerCodes: <String>["UNDEFINED_METHOD"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsUndefinedOperator(
+    String name, DartType _type, bool isNonNullableByDefault) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  TypeLabeler labeler = new TypeLabeler(isNonNullableByDefault);
+  List<Object> typeParts = labeler.labelType(_type);
+  String type = typeParts.join();
+  return new Message(codeUndefinedOperator,
+      message:
+          """The operator '${name}' isn't defined for the class '${type}'.""" +
+              labeler.originMessages,
+      tip:
+          """Try correcting the operator to an existing operator, or defining a '${name}' operator.""",
+      arguments: {'name': name, 'type': _type});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        String name,
+        DartType _type,
+        bool
             isNonNullableByDefault)> templateUndefinedSetter = const Template<
         Message Function(
             String name, DartType _type, bool isNonNullableByDefault)>(
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 074cc5b..e0a4b57 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -640,10 +640,10 @@
           while (iterator.moveNext()) {
             Builder childBuilder = iterator.current;
             if (childBuilder is SourceClassBuilder) {
-              TypeBuilder typeBuilder = childBuilder.supertype;
+              TypeBuilder typeBuilder = childBuilder.supertypeBuilder;
               replaceTypeBuilder(
                   replacementMap, replacementSettersMap, typeBuilder);
-              typeBuilder = childBuilder.mixedInType;
+              typeBuilder = childBuilder.mixedInTypeBuilder;
               replaceTypeBuilder(
                   replacementMap, replacementSettersMap, typeBuilder);
               if (childBuilder.onTypes != null) {
@@ -652,8 +652,8 @@
                       replacementMap, replacementSettersMap, typeBuilder);
                 }
               }
-              if (childBuilder.interfaces != null) {
-                for (typeBuilder in childBuilder.interfaces) {
+              if (childBuilder.interfaceBuilders != null) {
+                for (typeBuilder in childBuilder.interfaceBuilders) {
                   replaceTypeBuilder(
                       replacementMap, replacementSettersMap, typeBuilder);
                 }
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 ec3c6e9..580753b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -43,8 +43,6 @@
 import 'package:kernel/ast.dart';
 import 'package:kernel/type_environment.dart';
 
-import '../../base/nnbd_mode.dart';
-
 import '../builder/builder.dart';
 import '../builder/class_builder.dart';
 import '../builder/constructor_builder.dart';
@@ -955,8 +953,8 @@
     }
 
     if (body != null) {
-      body = typeInferrer?.inferFunctionBody(
-          this, _computeReturnTypeContext(member), asyncModifier, body);
+      body = typeInferrer?.inferFunctionBody(this, member.charOffset,
+          _computeReturnTypeContext(member), asyncModifier, body);
       libraryBuilder.loader.transformPostInference(body, transformSetLiterals,
           transformCollections, libraryBuilder.library);
     }
@@ -1290,6 +1288,7 @@
   @override
   Expression parseSingleExpression(
       Parser parser, Token token, FunctionNode parameters) {
+    int fileOffset = offsetForToken(token);
     List<TypeVariableBuilder> typeParameterBuilders;
     for (TypeParameter typeParameter in parameters.typeParameters) {
       typeParameterBuilders ??= <TypeVariableBuilder>[];
@@ -1311,7 +1310,7 @@
     }
     enterLocalScope(
         null,
-        new FormalParameters(formals, offsetForToken(token), noLength, uri)
+        new FormalParameters(formals, fileOffset, noLength, uri)
             .computeFormalParameterScope(scope, member, this));
 
     token = parser.parseExpression(parser.syntheticPreviousToken(token));
@@ -1329,7 +1328,7 @@
     ReturnStatementImpl fakeReturn = new ReturnStatementImpl(true, expression);
 
     typeInferrer?.inferFunctionBody(
-        this, const DynamicType(), AsyncMarker.Sync, fakeReturn);
+        this, fileOffset, const DynamicType(), AsyncMarker.Sync, fakeReturn);
 
     return fakeReturn.expression;
   }
@@ -1402,7 +1401,7 @@
           checkArgumentsForFunction(superTarget.function, arguments,
                   builder.charOffset, const <TypeParameter>[]) !=
               null) {
-        String superclass = classBuilder.supertype.fullNameForErrors;
+        String superclass = classBuilder.supertypeBuilder.fullNameForErrors;
         int length = constructor.name.name.length;
         if (length == 0) {
           length = (constructor.parent as Class).name.length;
@@ -2820,7 +2819,8 @@
         typeArgument = const InvalidType();
       } else {
         typeArgument = buildDartType(typeArguments.single);
-        typeArgument = instantiateToBounds(typeArgument, coreTypes.objectClass);
+        typeArgument = instantiateToBounds(
+            typeArgument, coreTypes.objectClass, libraryBuilder.library);
       }
     } else {
       typeArgument = implicitTypeArgument;
@@ -2843,7 +2843,8 @@
     DartType typeArgument;
     if (typeArguments != null) {
       typeArgument = buildDartType(typeArguments.single);
-      typeArgument = instantiateToBounds(typeArgument, coreTypes.objectClass);
+      typeArgument = instantiateToBounds(
+          typeArgument, coreTypes.objectClass, libraryBuilder.library);
     } else {
       typeArgument = implicitTypeArgument;
     }
@@ -2978,8 +2979,10 @@
       } else {
         keyType = buildDartType(typeArguments[0]);
         valueType = buildDartType(typeArguments[1]);
-        keyType = instantiateToBounds(keyType, coreTypes.objectClass);
-        valueType = instantiateToBounds(valueType, coreTypes.objectClass);
+        keyType = instantiateToBounds(
+            keyType, coreTypes.objectClass, libraryBuilder.library);
+        valueType = instantiateToBounds(
+            valueType, coreTypes.objectClass, libraryBuilder.library);
       }
     } else {
       DartType implicitTypeArgument = this.implicitTypeArgument;
@@ -3924,17 +3927,9 @@
         Set<String> argumentNames = new Set.from(named.map((a) => a.name));
         for (VariableDeclaration parameter in function.namedParameters) {
           if (parameter.isRequired && !argumentNames.contains(parameter.name)) {
-            if (libraryBuilder.loader.nnbdMode == NnbdMode.Weak) {
-              addProblem(
-                  fasta.templateValueForRequiredParameterNotProvidedWarning
-                      .withArguments(parameter.name),
-                  arguments.fileOffset,
-                  fasta.noLength);
-            } else {
-              return fasta.templateValueForRequiredParameterNotProvidedError
-                  .withArguments(parameter.name)
-                  .withLocation(uri, arguments.fileOffset, fasta.noLength);
-            }
+            return fasta.templateValueForRequiredParameterNotProvidedError
+                .withArguments(parameter.name)
+                .withLocation(uri, arguments.fileOffset, fasta.noLength);
           }
         }
       }
@@ -3991,17 +3986,9 @@
         Set<String> argumentNames = new Set.from(named.map((a) => a.name));
         for (NamedType parameter in function.namedParameters) {
           if (parameter.isRequired && !argumentNames.contains(parameter.name)) {
-            if (libraryBuilder.loader.nnbdMode == NnbdMode.Weak) {
-              addProblem(
-                  fasta.templateValueForRequiredParameterNotProvidedWarning
-                      .withArguments(parameter.name),
-                  arguments.fileOffset,
-                  fasta.noLength);
-            } else {
-              return fasta.templateValueForRequiredParameterNotProvidedError
-                  .withArguments(parameter.name)
-                  .withLocation(uri, arguments.fileOffset, fasta.noLength);
-            }
+            return fasta.templateValueForRequiredParameterNotProvidedError
+                .withArguments(parameter.name)
+                .withLocation(uri, arguments.fileOffset, fasta.noLength);
           }
         }
       }
@@ -5369,7 +5356,7 @@
     List<TypeBuilder> calculatedBounds = calculateBounds(
         typeVariables,
         libraryBuilder.loader.target.dynamicType,
-        libraryBuilder.loader.target.bottomType,
+        libraryBuilder.loader.target.nullType,
         libraryBuilder.loader.target.objectClassBuilder);
     for (int i = 0; i < typeVariables.length; ++i) {
       typeVariables[i].defaultType = calculatedBounds[i];
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 773fff0..a3df7ab 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
@@ -41,6 +41,7 @@
         Message,
         messageDeclaredMemberConflictsWithInheritedMember,
         messageDeclaredMemberConflictsWithInheritedMemberCause,
+        messageDeclaredMemberConflictsWithInheritedMembersCause,
         messageInheritedMembersConflict,
         messageInheritedMembersConflictCause1,
         messageInheritedMembersConflictCause2,
@@ -218,8 +219,6 @@
   Uri get fileUri;
   int get charOffset;
   bool get isAbstract;
-  bool get hasExplicitReturnType;
-  bool hasExplicitlyTypedFormalParameter(int index);
 
   bool get needsComputation;
   bool get isSynthesized;
@@ -671,61 +670,68 @@
       SourceProcedureBuilder declaredMember,
       Iterable<ClassMember> overriddenMembers) {
     assert(!declaredMember.isGetter && !declaredMember.isSetter);
-    Procedure declaredProcedure = declaredMember.member;
-    FunctionNode declaredFunction = declaredProcedure.function;
-    List<TypeParameter> declaredTypeParameters =
-        declaredFunction.typeParameters;
-    List<VariableDeclaration> declaredPositional =
-        declaredFunction.positionalParameters;
-    List<VariableDeclaration> declaredNamed = declaredFunction.namedParameters;
     if (declaredMember.classBuilder == classBuilder &&
         (declaredMember.returnType == null ||
             declaredMember.formals != null &&
                 declaredMember.formals
                     .any((parameter) => parameter.type == null))) {
-      for (ClassMember overriddenMember
+      Procedure declaredProcedure = declaredMember.member;
+      FunctionNode declaredFunction = declaredProcedure.function;
+      List<TypeParameter> declaredTypeParameters =
+          declaredFunction.typeParameters;
+      List<VariableDeclaration> declaredPositional =
+          declaredFunction.positionalParameters;
+      List<VariableDeclaration> declaredNamed =
+          declaredFunction.namedParameters;
+      declaredNamed = declaredNamed.toList()..sort(compareNamedParameters);
+
+      DartType inferredReturnType;
+      Map<FormalParameterBuilder, DartType> inferredParameterTypes = {};
+
+      for (ClassMember classMember
           in toSet(declaredMember.classBuilder, overriddenMembers)) {
-        assert(useConsolidated || !overriddenMember.hasDeclarations);
-        int hadTypesInferredFrom = declaredMember.hadTypesInferredFrom;
-        Member bMember = overriddenMember.getMember(hierarchy);
-        Substitution bSubstitution;
-        if (classBuilder.cls != bMember.enclosingClass) {
+        assert(useConsolidated || !classMember.hasDeclarations);
+        Member overriddenMember = classMember.getMember(hierarchy);
+        Substitution classSubstitution;
+        if (classBuilder.cls != overriddenMember.enclosingClass) {
           assert(
-              substitutions.containsKey(bMember.enclosingClass),
+              substitutions.containsKey(overriddenMember.enclosingClass),
               "No substitution found for '${classBuilder.fullNameForErrors}' "
-              "as instance of '${bMember.enclosingClass.name}'. Substitutions "
-              "available for: ${substitutions.keys}");
-          bSubstitution = substitutions[bMember.enclosingClass];
+              "as instance of '${overriddenMember.enclosingClass.name}'. "
+              "Substitutions available for: ${substitutions.keys}");
+          classSubstitution = substitutions[overriddenMember.enclosingClass];
           debug?.log("${classBuilder.fullNameForErrors} -> "
-              "${bMember.enclosingClass.name} $bSubstitution");
+              "${overriddenMember.enclosingClass.name} $classSubstitution");
         }
-        if (bMember is! Procedure) {
+        if (overriddenMember is! Procedure) {
           debug?.log("Giving up 1");
           continue;
         }
-        Procedure bProcedure = bMember;
-        FunctionNode bFunction = bProcedure.function;
+        Procedure overriddenProcedure = overriddenMember;
+        FunctionNode overriddenFunction = overriddenProcedure.function;
 
-        List<TypeParameter> bTypeParameters = bFunction.typeParameters;
+        List<TypeParameter> overriddenTypeParameters =
+            overriddenFunction.typeParameters;
         int typeParameterCount = declaredTypeParameters.length;
-        if (typeParameterCount != bTypeParameters.length) {
+        if (typeParameterCount != overriddenTypeParameters.length) {
           debug?.log("Giving up 2");
           continue;
         }
-        Substitution substitution;
+        Substitution methodSubstitution;
         if (typeParameterCount != 0) {
           List<DartType> types = new List<DartType>(typeParameterCount);
           for (int i = 0; i < typeParameterCount; i++) {
             types[i] = new TypeParameterType.forAlphaRenaming(
-                bTypeParameters[i], declaredTypeParameters[i]);
+                overriddenTypeParameters[i], declaredTypeParameters[i]);
           }
-          substitution = Substitution.fromPairs(bTypeParameters, types);
+          methodSubstitution =
+              Substitution.fromPairs(overriddenTypeParameters, types);
           for (int i = 0; i < typeParameterCount; i++) {
-            DartType aBound = declaredTypeParameters[i].bound;
-            DartType bBound =
-                substitution.substituteType(bTypeParameters[i].bound);
+            DartType declaredBound = declaredTypeParameters[i].bound;
+            DartType overriddenBound = methodSubstitution
+                .substituteType(overriddenTypeParameters[i].bound);
             if (!hierarchy.types
-                .isSameTypeKernel(aBound, bBound)
+                .isSameTypeKernel(declaredBound, overriddenBound)
                 .isSubtypeWhenUsingNullabilities()) {
               debug?.log("Giving up 3");
               continue;
@@ -733,126 +739,149 @@
           }
         }
 
-        DartType bReturnType = bFunction.returnType;
-        if (bSubstitution != null) {
-          bReturnType = bSubstitution.substituteType(bReturnType);
+        DartType inheritedReturnType = overriddenFunction.returnType;
+        if (classSubstitution != null) {
+          inheritedReturnType =
+              classSubstitution.substituteType(inheritedReturnType);
         }
-        if (substitution != null) {
-          bReturnType = substitution.substituteType(bReturnType);
+        if (methodSubstitution != null) {
+          inheritedReturnType =
+              methodSubstitution.substituteType(inheritedReturnType);
+        }
+        if (declaredMember.returnType == null &&
+            inferredReturnType is! InvalidType) {
+          inferredReturnType = mergeTypeInLibrary(
+              hierarchy, classBuilder, inferredReturnType, inheritedReturnType);
+          if (inferredReturnType == null) {
+            // A different type has already been inferred.
+            inferredReturnType = const InvalidType();
+            reportCantInferReturnType(
+                classBuilder, declaredMember, hierarchy, overriddenMembers);
+          }
         }
         if (declaredFunction.requiredParameterCount >
-            bFunction.requiredParameterCount) {
+            overriddenFunction.requiredParameterCount) {
           debug?.log("Giving up 4");
           continue;
         }
-        List<VariableDeclaration> bPositional = bFunction.positionalParameters;
-        if (declaredPositional.length < bPositional.length) {
+        List<VariableDeclaration> overriddenPositional =
+            overriddenFunction.positionalParameters;
+        if (declaredPositional.length < overriddenPositional.length) {
           debug?.log("Giving up 5");
           continue;
         }
 
-        if (declaredMember.classBuilder == classBuilder &&
-            declaredMember.returnType == null) {
-          inferReturnType(
-              classBuilder,
-              declaredMember,
-              declaredMember.member.function,
-              bReturnType,
-              hadTypesInferredFrom,
-              SourceProcedureBuilder.inferredTypesFromMethod,
-              hierarchy);
-        } else {
-          debug?.log("Giving up 6");
-        }
+        for (int i = 0; i < overriddenPositional.length; i++) {
+          FormalParameterBuilder declaredParameter = declaredMember.formals[i];
+          if (declaredParameter.type != null) continue;
 
-        for (int i = 0; i < bPositional.length; i++) {
-          VariableDeclaration bParameter = bPositional[i];
-          if (declaredMember.classBuilder == classBuilder &&
-              declaredMember.formals[i].type == null) {
-            DartType bType = bParameter.type;
-            if (bSubstitution != null) {
-              bType = bSubstitution.substituteType(bType);
-            }
-            if (substitution != null) {
-              bType = substitution.substituteType(bType);
-            }
-            if (hierarchy.coreTypes.objectClass.enclosingLibrary
-                    .isNonNullableByDefault &&
-                !declaredMember.classBuilder.library.isNonNullableByDefault &&
-                bProcedure == hierarchy.coreTypes.objectEquals) {
-              // In legacy code we special case `Object.==` to infer `dynamic`
-              // instead `Object!`.
-              bType = const DynamicType();
-            }
-            inferParameterType(
-                classBuilder,
-                declaredMember,
-                declaredMember.formals[i],
-                bType,
-                hadTypesInferredFrom,
-                SourceProcedureBuilder.inferredTypesFromMethod,
-                hierarchy);
-          } else {
-            debug?.log("Giving up 8");
+          VariableDeclaration overriddenParameter = overriddenPositional[i];
+          DartType inheritedParameterType = overriddenParameter.type;
+          if (classSubstitution != null) {
+            inheritedParameterType =
+                classSubstitution.substituteType(inheritedParameterType);
           }
+          if (methodSubstitution != null) {
+            inheritedParameterType =
+                methodSubstitution.substituteType(inheritedParameterType);
+          }
+          if (hierarchy.coreTypes.objectClass.enclosingLibrary
+                  .isNonNullableByDefault &&
+              !declaredMember.classBuilder.library.isNonNullableByDefault &&
+              overriddenProcedure == hierarchy.coreTypes.objectEquals) {
+            // In legacy code we special case `Object.==` to infer `dynamic`
+            // instead `Object!`.
+            inheritedParameterType = const DynamicType();
+          }
+          DartType inferredParameterType =
+              inferredParameterTypes[declaredParameter];
+          inferredParameterType = mergeTypeInLibrary(hierarchy, classBuilder,
+              inferredParameterType, inheritedParameterType);
+          if (inferredParameterType == null) {
+            // A different type has already been inferred.
+            inferredParameterType = const InvalidType();
+            reportCantInferParameterType(
+                classBuilder, declaredParameter, hierarchy, overriddenMembers);
+          }
+          inferredParameterTypes[declaredParameter] = inferredParameterType;
         }
 
-        List<VariableDeclaration> bNamed = bFunction.namedParameters;
+        List<VariableDeclaration> overriddenNamed =
+            overriddenFunction.namedParameters;
         named:
-        if (declaredNamed.isNotEmpty || bNamed.isNotEmpty) {
-          if (declaredPositional.length != bPositional.length) {
+        if (declaredNamed.isNotEmpty || overriddenNamed.isNotEmpty) {
+          if (declaredPositional.length != overriddenPositional.length) {
             debug?.log("Giving up 9");
             break named;
           }
           if (declaredFunction.requiredParameterCount !=
-              bFunction.requiredParameterCount) {
+              overriddenFunction.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;
+          overriddenNamed = overriddenNamed.toList()
+            ..sort(compareNamedParameters);
+          int declaredIndex = 0;
+          for (int overriddenIndex = 0;
+              overriddenIndex < overriddenNamed.length;
+              overriddenIndex++) {
+            String name = overriddenNamed[overriddenIndex].name;
+            for (; declaredIndex < declaredNamed.length; declaredIndex++) {
+              if (declaredNamed[declaredIndex].name == name) break;
             }
-            if (aCount == declaredNamed.length) {
+            if (declaredIndex == declaredNamed.length) {
               debug?.log("Giving up 11");
               break named;
             }
-            FormalParameterBuilder parameter;
+            FormalParameterBuilder declaredParameter;
             for (int i = declaredPositional.length;
                 i < declaredMember.formals.length;
                 ++i) {
               if (declaredMember.formals[i].name == name) {
-                parameter = declaredMember.formals[i];
+                declaredParameter = declaredMember.formals[i];
                 break;
               }
             }
-            VariableDeclaration bParameter = bNamed[bCount];
+            if (declaredParameter.type != null) continue;
+            VariableDeclaration overriddenParameter =
+                overriddenNamed[overriddenIndex];
 
-            if (declaredMember.classBuilder == classBuilder &&
-                parameter.type == null) {
-              DartType bType = bParameter.type;
-              if (bSubstitution != null) {
-                bType = bSubstitution.substituteType(bType);
-              }
-              if (substitution != null) {
-                bType = substitution.substituteType(bType);
-              }
-              inferParameterType(
-                  classBuilder,
-                  declaredMember,
-                  parameter,
-                  bType,
-                  hadTypesInferredFrom,
-                  SourceProcedureBuilder.inferredTypesFromMethod,
-                  hierarchy);
-            } else {
-              debug?.log("Giving up 12");
+            DartType inheritedParameterType = overriddenParameter.type;
+            if (classSubstitution != null) {
+              inheritedParameterType =
+                  classSubstitution.substituteType(inheritedParameterType);
             }
+            if (methodSubstitution != null) {
+              inheritedParameterType =
+                  methodSubstitution.substituteType(inheritedParameterType);
+            }
+            DartType inferredParameterType =
+                inferredParameterTypes[declaredParameter];
+            inferredParameterType = mergeTypeInLibrary(hierarchy, classBuilder,
+                inferredParameterType, inheritedParameterType);
+            if (inferredParameterType == null) {
+              // A different type has already been inferred.
+              inferredParameterType = const InvalidType();
+              reportCantInferParameterType(classBuilder, declaredParameter,
+                  hierarchy, overriddenMembers);
+            }
+            inferredParameterTypes[declaredParameter] = inferredParameterType;
+          }
+        }
+      }
+      if (declaredMember.returnType == null) {
+        inferredReturnType ??= const DynamicType();
+        declaredFunction.returnType = inferredReturnType;
+      }
+      if (declaredMember.formals != null) {
+        for (FormalParameterBuilder declaredParameter
+            in declaredMember.formals) {
+          if (declaredParameter.type == null) {
+            DartType inferredParameterType =
+                inferredParameterTypes[declaredParameter] ??
+                    const DynamicType();
+            declaredParameter.variable.type = inferredParameterType;
           }
         }
       }
@@ -995,54 +1024,74 @@
     assert(declaredMember.isGetter);
     if (declaredMember.classBuilder == classBuilder &&
         declaredMember.returnType == null) {
-      for (ClassMember overriddenMember
-          in toSet(declaredMember.classBuilder, overriddenMembers)) {
-        int hadTypesInferredFrom = declaredMember.hadTypesInferredFrom;
-        Member bTarget = overriddenMember.getMember(hierarchy);
-        Substitution bSubstitution;
-        if (classBuilder.cls != bTarget.enclosingClass) {
+      DartType inferredType;
+
+      void inferFrom(ClassMember classMember) {
+        if (inferredType is InvalidType) return;
+
+        Member overriddenMember = classMember.getMember(hierarchy);
+        Substitution substitution;
+        if (classBuilder.cls != overriddenMember.enclosingClass) {
           assert(
-              substitutions.containsKey(bTarget.enclosingClass),
+              substitutions.containsKey(overriddenMember.enclosingClass),
               "No substitution found for '${classBuilder.fullNameForErrors}' "
-              "as instance of '${bTarget.enclosingClass.name}'. Substitutions "
-              "available for: ${substitutions.keys}");
-          bSubstitution = substitutions[bTarget.enclosingClass];
+              "as instance of '${overriddenMember.enclosingClass.name}'. "
+              "Substitutions available for: ${substitutions.keys}");
+          substitution = substitutions[overriddenMember.enclosingClass];
         }
-        DartType bType;
-        int inferTypesFrom;
-        if (bTarget is Field) {
-          bType = bTarget.type;
-          assert(bType is! ImplicitFieldType);
-          inferTypesFrom = SourceProcedureBuilder.inferredTypesFromField;
-        } else if (bTarget is Procedure) {
-          if (bTarget.kind == ProcedureKind.Setter) {
+        DartType inheritedType;
+        if (overriddenMember is Field) {
+          inheritedType = overriddenMember.type;
+          assert(inheritedType is! ImplicitFieldType);
+        } else if (overriddenMember is Procedure) {
+          if (overriddenMember.kind == ProcedureKind.Setter) {
             VariableDeclaration bParameter =
-                bTarget.function.positionalParameters.single;
-            bType = bParameter.type;
-            inferTypesFrom = SourceProcedureBuilder.inferredTypesFromSetter;
-          } else if (bTarget.kind == ProcedureKind.Getter) {
-            bType = bTarget.function.returnType;
-            inferTypesFrom = SourceProcedureBuilder.inferredTypesFromGetter;
+                overriddenMember.function.positionalParameters.single;
+            inheritedType = bParameter.type;
+          } else if (overriddenMember.kind == ProcedureKind.Getter) {
+            inheritedType = overriddenMember.function.returnType;
           } else {
-            debug?.log("Giving up (not accessor: ${bTarget.kind})");
-            continue;
+            debug?.log("Giving up (not accessor: ${overriddenMember.kind})");
+            return;
           }
         } else {
-          debug?.log("Giving up (not field/procedure: ${bTarget.runtimeType})");
-          continue;
+          debug?.log(
+              "Giving up (not field/procedure: ${overriddenMember.runtimeType})");
+          return;
         }
-        if (bSubstitution != null) {
-          bType = bSubstitution.substituteType(bType);
+        if (substitution != null) {
+          inheritedType = substitution.substituteType(inheritedType);
         }
-        inferReturnType(
-            classBuilder,
-            declaredMember,
-            declaredMember.member.function,
-            bType,
-            hadTypesInferredFrom,
-            inferTypesFrom,
-            hierarchy);
+        inferredType = mergeTypeInLibrary(
+            hierarchy, classBuilder, inferredType, inheritedType);
+
+        if (inferredType == null) {
+          // A different type has already been inferred.
+          inferredType = const InvalidType();
+          reportCantInferReturnType(
+              classBuilder, declaredMember, hierarchy, overriddenMembers);
+        }
       }
+
+      overriddenMembers = toSet(classBuilder, overriddenMembers);
+      // The getter type must be inferred from getters first.
+      for (ClassMember overriddenMember in overriddenMembers) {
+        if (!overriddenMember.forSetter) {
+          inferFrom(overriddenMember);
+        }
+      }
+      if (inferredType == null) {
+        // The getter type must be inferred from setters if no type was
+        // inferred from getters.
+        for (ClassMember overriddenMember in overriddenMembers) {
+          if (overriddenMember.forSetter) {
+            inferFrom(overriddenMember);
+          }
+        }
+      }
+
+      inferredType ??= const DynamicType();
+      declaredMember.procedure.function.returnType = inferredType;
     }
   }
 
@@ -1055,47 +1104,110 @@
     assert(declaredMember.isSetter);
     FormalParameterBuilder parameter = declaredMember.formals.first;
     if (declaredMember.classBuilder == classBuilder && parameter.type == null) {
-      for (ClassMember overriddenMember
-          in toSet(declaredMember.classBuilder, overriddenMembers)) {
-        int hadTypesInferredFrom = declaredMember.hadTypesInferredFrom;
-        Member bTarget = overriddenMember.getMember(hierarchy);
-        Substitution bSubstitution;
-        if (classBuilder.cls != bTarget.enclosingClass) {
+      DartType inferredType;
+
+      void inferFrom(ClassMember classMember) {
+        if (inferredType is InvalidType) return;
+
+        Member overriddenMember = classMember.getMember(hierarchy);
+        Substitution substitution;
+        if (classBuilder.cls != overriddenMember.enclosingClass) {
           assert(
-              substitutions.containsKey(bTarget.enclosingClass),
+              substitutions.containsKey(overriddenMember.enclosingClass),
               "No substitution found for '${classBuilder.fullNameForErrors}' "
-              "as instance of '${bTarget.enclosingClass.name}'. Substitutions "
-              "available for: ${substitutions.keys}");
-          bSubstitution = substitutions[bTarget.enclosingClass];
+              "as instance of '${overriddenMember.enclosingClass.name}'. "
+              "Substitutions available for: ${substitutions.keys}");
+          substitution = substitutions[overriddenMember.enclosingClass];
         }
-        DartType bType;
-        int inferTypesFrom;
-        if (bTarget is Field) {
-          bType = bTarget.type;
-          assert(bType is! ImplicitFieldType);
-          inferTypesFrom = SourceProcedureBuilder.inferredTypesFromField;
-        } else if (bTarget is Procedure) {
-          if (overriddenMember.isSetter) {
+        DartType inheritedType;
+        if (overriddenMember is Field) {
+          inheritedType = overriddenMember.type;
+          assert(inheritedType is! ImplicitFieldType);
+        } else if (overriddenMember is Procedure) {
+          if (classMember.isSetter) {
             VariableDeclaration bParameter =
-                bTarget.function.positionalParameters.single;
-            bType = bParameter.type;
-            inferTypesFrom = SourceProcedureBuilder.inferredTypesFromSetter;
-          } else if (overriddenMember.isGetter) {
-            bType = bTarget.function.returnType;
-            inferTypesFrom = SourceProcedureBuilder.inferredTypesFromGetter;
+                overriddenMember.function.positionalParameters.single;
+            inheritedType = bParameter.type;
+          } else if (classMember.isGetter) {
+            inheritedType = overriddenMember.function.returnType;
           } else {
-            debug?.log("Giving up (not accessor: ${bTarget.kind})");
-            continue;
+            debug?.log("Giving up (not accessor: ${overriddenMember.kind})");
+            return;
           }
         } else {
-          debug?.log("Giving up (not field/procedure: ${bTarget.runtimeType})");
-          continue;
+          debug?.log(
+              "Giving up (not field/procedure: ${overriddenMember.runtimeType})");
+          return;
         }
-        if (bSubstitution != null) {
-          bType = bSubstitution.substituteType(bType);
+        if (substitution != null) {
+          inheritedType = substitution.substituteType(inheritedType);
         }
-        inferParameterType(classBuilder, declaredMember, parameter, bType,
-            hadTypesInferredFrom, inferTypesFrom, hierarchy);
+        inferredType = mergeTypeInLibrary(
+            hierarchy, classBuilder, inferredType, inheritedType);
+        if (inferredType == null) {
+          // A different type has already been inferred.
+          inferredType = const InvalidType();
+          reportCantInferParameterType(
+              classBuilder, parameter, hierarchy, overriddenMembers);
+        }
+      }
+
+      overriddenMembers = toSet(classBuilder, overriddenMembers);
+      // The setter type must be inferred from setters first.
+      for (ClassMember overriddenMember in overriddenMembers) {
+        if (overriddenMember.forSetter) {
+          inferFrom(overriddenMember);
+        }
+      }
+      if (inferredType == null) {
+        // The setter type must be inferred from getters if no type was
+        // inferred from setters.
+        for (ClassMember overriddenMember in overriddenMembers) {
+          if (!overriddenMember.forSetter) {
+            inferFrom(overriddenMember);
+          }
+        }
+      }
+
+      inferredType ??= const DynamicType();
+      parameter.variable.type = inferredType;
+    }
+  }
+
+  /// Merge the [inheritedType] with the currently [inferredType] using
+  /// nnbd-top-merge or legacy-top-merge depending on whether [classBuilder] is
+  /// defined in an opt-in or opt-out library. If the types could not be merged
+  /// `null` is returned and an error should be reported by the caller.
+  static DartType mergeTypeInLibrary(
+      ClassHierarchyBuilder hierarchy,
+      ClassBuilder classBuilder,
+      DartType inferredType,
+      DartType inheritedType) {
+    if (classBuilder.library.isNonNullableByDefault) {
+      if (inferredType == null) {
+        return inheritedType;
+      } else {
+        return nnbdTopMerge(
+            hierarchy.coreTypes,
+            norm(hierarchy.coreTypes, inferredType),
+            norm(hierarchy.coreTypes, inheritedType));
+      }
+    } else {
+      inheritedType = legacyErasure(hierarchy.coreTypes, inheritedType);
+      if (inferredType == null) {
+        return inheritedType;
+      } else {
+        if (inferredType is DynamicType &&
+            inheritedType == hierarchy.coreTypes.objectLegacyRawType) {
+          return inferredType;
+        } else if (inheritedType is DynamicType &&
+            inferredType == hierarchy.coreTypes.objectLegacyRawType) {
+          return inheritedType;
+        }
+        if (inferredType != inheritedType) {
+          return null;
+        }
+        return inferredType;
       }
     }
   }
@@ -1111,62 +1223,49 @@
         fieldBuilder.type == null) {
       DartType inferredType;
 
-      void inferFrom(ClassMember overriddenMember) {
+      void inferFrom(ClassMember classMember) {
         if (inferredType is InvalidType) return;
 
-        assert(useConsolidated || !overriddenMember.hasDeclarations);
-        Member bTarget = overriddenMember.getMember(hierarchy);
+        assert(useConsolidated || !classMember.hasDeclarations);
+        Member overriddenMember = classMember.getMember(hierarchy);
         DartType inheritedType;
-        if (bTarget is Procedure) {
-          if (bTarget.isSetter) {
+        if (overriddenMember is Procedure) {
+          if (overriddenMember.isSetter) {
             VariableDeclaration parameter =
-                bTarget.function.positionalParameters.single;
+                overriddenMember.function.positionalParameters.single;
             inheritedType = parameter.type;
-          } else if (bTarget.isGetter) {
-            inheritedType = bTarget.function.returnType;
+          } else if (overriddenMember.isGetter) {
+            inheritedType = overriddenMember.function.returnType;
           }
-        } else if (bTarget is Field) {
-          inheritedType = bTarget.type;
+        } else if (overriddenMember is Field) {
+          inheritedType = overriddenMember.type;
         }
         if (inheritedType == null) {
           debug
               ?.log("Giving up (inheritedType == null)\n${StackTrace.current}");
           return;
         }
-        Substitution bSubstitution;
-        if (classBuilder.cls != bTarget.enclosingClass) {
+        Substitution substitution;
+        if (classBuilder.cls != overriddenMember.enclosingClass) {
           assert(
-              substitutions.containsKey(bTarget.enclosingClass),
+              substitutions.containsKey(overriddenMember.enclosingClass),
               "${classBuilder.fullNameForErrors} "
-              "${bTarget.enclosingClass.name}");
-          bSubstitution = substitutions[bTarget.enclosingClass];
+              "${overriddenMember.enclosingClass.name}");
+          substitution = substitutions[overriddenMember.enclosingClass];
           debug?.log("${classBuilder.fullNameForErrors} -> "
-              "${bTarget.enclosingClass.name} $bSubstitution");
+              "${overriddenMember.enclosingClass.name} $substitution");
         }
         assert(inheritedType is! ImplicitFieldType);
-        if (bSubstitution != null) {
-          inheritedType = bSubstitution.substituteType(inheritedType);
+        if (substitution != null) {
+          inheritedType = substitution.substituteType(inheritedType);
         }
-        if (!classBuilder.library.isNonNullableByDefault) {
-          inheritedType = legacyErasure(hierarchy.coreTypes, inheritedType);
-        }
-
+        inferredType = mergeTypeInLibrary(
+            hierarchy, classBuilder, inferredType, inheritedType);
         if (inferredType == null) {
-          inferredType = inheritedType;
-        } else {
-          if (classBuilder.library.isNonNullableByDefault) {
-            DartType topMerge =
-                nnbdTopMerge(hierarchy.coreTypes, inferredType, inheritedType);
-            if (topMerge != null) {
-              inferredType = topMerge;
-              return;
-            }
-          }
-          if (inferredType != inheritedType) {
-            inferredType = const InvalidType();
-            // A different type has already been inferred.
-            reportCantInferFieldType(classBuilder, fieldBuilder);
-          }
+          // A different type has already been inferred.
+          inferredType = const InvalidType();
+          reportCantInferFieldType(
+              classBuilder, fieldBuilder, overriddenMembers);
         }
       }
 
@@ -1353,7 +1452,8 @@
     assert(!classBuilder.isPatch);
     ClassHierarchyNode supernode;
     if (objectClass != classBuilder.origin) {
-      supernode = hierarchy.getNodeFromTypeBuilder(classBuilder.supertype);
+      supernode =
+          hierarchy.getNodeFromTypeBuilder(classBuilder.supertypeBuilder);
       if (supernode == null) {
         supernode = hierarchy.getNodeFromClassBuilder(objectClass);
       }
@@ -1362,13 +1462,12 @@
 
     Scope scope = classBuilder.scope;
     if (classBuilder.isMixinApplication) {
-      TypeDeclarationBuilder mixin = classBuilder.mixedInType.declaration;
+      TypeDeclarationBuilder mixin =
+          classBuilder.mixedInTypeBuilder.declaration;
       inferMixinApplication();
-      // recordSupertype(cls.mixedInType);
       while (mixin.isNamedMixinApplication) {
         ClassBuilder named = mixin;
-        // recordSupertype(named.mixedInType);
-        mixin = named.mixedInType.declaration;
+        mixin = named.mixedInTypeBuilder.declaration;
       }
       if (mixin is TypeAliasBuilder) {
         TypeAliasBuilder aliasBuilder = mixin;
@@ -1481,7 +1580,7 @@
       maxInheritancePath = supernode.maxInheritancePath + 1;
 
       superclasses = new List<Supertype>(supernode.superclasses.length + 1);
-      Supertype supertype = classBuilder.supertype.buildSupertype(
+      Supertype supertype = classBuilder.supertypeBuilder.buildSupertype(
           classBuilder.library, classBuilder.charOffset, classBuilder.fileUri);
       if (supertype == null) {
         // If the superclass is not an interface type we use Object instead.
@@ -1491,27 +1590,29 @@
       }
       superclasses.setRange(0, superclasses.length - 1,
           substSupertypes(supertype, supernode.superclasses));
-      superclasses[superclasses.length - 1] = recordSupertype(supertype);
+      superclasses[superclasses.length - 1] = supertype;
+      if (!classBuilder.library.isNonNullableByDefault &&
+          supernode.classBuilder.library.isNonNullableByDefault) {
+        for (int i = 0; i < superclasses.length; i++) {
+          superclasses[i] =
+              legacyErasureSupertype(hierarchy.coreTypes, superclasses[i]);
+        }
+      }
 
       List<TypeBuilder> directInterfaceBuilders =
-          ignoreFunction(classBuilder.interfaces);
+          ignoreFunction(classBuilder.interfaceBuilders);
       if (classBuilder.isMixinApplication) {
         if (directInterfaceBuilders == null) {
-          directInterfaceBuilders = <TypeBuilder>[classBuilder.mixedInType];
+          directInterfaceBuilders = <TypeBuilder>[
+            classBuilder.mixedInTypeBuilder
+          ];
         } else {
-          directInterfaceBuilders = <TypeBuilder>[classBuilder.mixedInType]
-            ..addAll(directInterfaceBuilders);
+          directInterfaceBuilders = <TypeBuilder>[
+            classBuilder.mixedInTypeBuilder
+          ]..addAll(directInterfaceBuilders);
         }
       }
-      if (directInterfaceBuilders != null) {
-        for (int i = 0; i < directInterfaceBuilders.length; i++) {
-          Supertype interface = directInterfaceBuilders[i].buildSupertype(
-              classBuilder.library,
-              classBuilder.charOffset,
-              classBuilder.fileUri);
-          if (interface != null) recordSupertype(interface);
-        }
-      }
+
       List<Supertype> superclassInterfaces = supernode.interfaces;
       if (superclassInterfaces != null) {
         superclassInterfaces = substSupertypes(supertype, superclassInterfaces);
@@ -1578,11 +1679,27 @@
             }
           }
         }
+      } else if (superclassInterfaces != null &&
+          !classBuilder.library.isNonNullableByDefault &&
+          supernode.classBuilder.library.isNonNullableByDefault) {
+        interfaces = <Supertype>[];
+        for (int i = 0; i < superclassInterfaces.length; i++) {
+          addInterface(interfaces, superclasses, superclassInterfaces[i]);
+        }
       } else {
         interfaces = superclassInterfaces;
       }
     }
 
+    for (Supertype superclass in superclasses) {
+      recordSupertype(superclass);
+    }
+    if (interfaces != null) {
+      for (Supertype superinterface in interfaces) {
+        recordSupertype(superinterface);
+      }
+    }
+
     /// Members (excluding setters) declared in [cls] or its superclasses. This
     /// includes static methods of [cls], but not its superclasses.
     Map<Name, ClassMember> classMemberMap = {};
@@ -1967,20 +2084,16 @@
     debug?.log("In ${this.classBuilder.fullNameForErrors} "
         "recordSupertype(${supertype})");
     Class cls = supertype.classNode;
-    if (cls.isMixinApplication) {
-      recordSupertype(cls.mixedInType);
-    }
-    List<TypeParameter> typeVariableBuilders = cls.typeParameters;
-    if (typeVariableBuilders == null) {
+    List<TypeParameter> supertypeTypeParameters = cls.typeParameters;
+    if (supertypeTypeParameters.isEmpty) {
       substitutions[cls] = Substitution.empty;
-      assert(cls.typeParameters.isEmpty);
     } else {
       List<DartType> arguments = supertype.typeArguments;
       List<DartType> typeArguments = new List<DartType>(arguments.length);
       List<TypeParameter> typeParameters =
           new List<TypeParameter>(arguments.length);
       for (int i = 0; i < arguments.length; i++) {
-        typeParameters[i] = typeVariableBuilders[i];
+        typeParameters[i] = supertypeTypeParameters[i];
         typeArguments[i] = arguments[i];
       }
       substitutions[cls] =
@@ -1995,9 +2108,6 @@
     if (typeVariables.isEmpty) {
       debug?.log("In ${this.classBuilder.fullNameForErrors} "
           "$supertypes aren't substed");
-      for (int i = 0; i < supertypes.length; i++) {
-        recordSupertype(supertypes[i]);
-      }
       return supertypes;
     }
     Map<TypeParameter, DartType> map = <TypeParameter, DartType>{};
@@ -2009,8 +2119,7 @@
     List<Supertype> result;
     for (int i = 0; i < supertypes.length; i++) {
       Supertype supertype = supertypes[i];
-      Supertype substituted =
-          recordSupertype(substitution.substituteSupertype(supertype));
+      Supertype substituted = substitution.substituteSupertype(supertype);
       if (supertype != substituted) {
         debug?.log("In ${this.classBuilder.fullNameForErrors} $supertype"
             " -> $substituted");
@@ -2045,8 +2154,8 @@
     }
   }
 
-  Supertype addInterface(List<Supertype> interfaces,
-      List<Supertype> superclasses, Supertype type) {
+  void addInterface(List<Supertype> interfaces, List<Supertype> superclasses,
+      Supertype type) {
     if (type == null) return null;
     if (!classBuilder.library.isNonNullableByDefault) {
       type = legacyErasureSupertype(hierarchy.coreTypes, type);
@@ -2072,7 +2181,7 @@
           superclasses[depth] = superclass;
         }
       }
-      return superclass;
+      return;
     } else {
       for (int i = 0; i < interfaces.length; i++) {
         // This is a quadratic algorithm, but normally, the number of
@@ -2094,12 +2203,11 @@
               interfaces[i] = interface;
             }
           }
-          return interface;
+          return;
         }
       }
     }
     interfaces.add(type);
-    return null;
   }
 
   void reportMissingMembers() {
@@ -2153,7 +2261,7 @@
       inferredArguments[i] =
           hierarchy.loader.computeTypeBuilder(typeArguments[i]);
     }
-    NamedTypeBuilder mixedInTypeBuilder = classBuilder.mixedInType;
+    NamedTypeBuilder mixedInTypeBuilder = classBuilder.mixedInTypeBuilder;
     mixedInTypeBuilder.arguments = inferredArguments;
   }
 
@@ -2473,10 +2581,11 @@
 
 class DelayedOverrideCheck {
   final ClassBuilder classBuilder;
-  final ClassMember a;
-  final ClassMember b;
+  final ClassMember declaredMember;
+  final ClassMember overriddenMember;
 
-  const DelayedOverrideCheck(this.classBuilder, this.a, this.b);
+  const DelayedOverrideCheck(
+      this.classBuilder, this.declaredMember, this.overriddenMember);
 
   void check(ClassHierarchyBuilder hierarchy) {
     void callback(
@@ -2486,75 +2595,10 @@
           isInterfaceCheck: !classBuilder.isMixinApplication);
     }
 
-    ClassMember a = this.a;
-    debug?.log("Delayed override check of ${a.fullName} "
-        "${b.fullName} wrt. ${classBuilder.fullNameForErrors}");
-    Member bMember = b.getMember(hierarchy);
-    if (classBuilder == a.classBuilder) {
-      if (a is SourceProcedureMember) {
-        if (a.isGetter && !a.hasExplicitReturnType) {
-          int inferTypesFrom;
-          DartType type;
-          if (bMember is Field) {
-            type = bMember.type;
-            inferTypesFrom = SourceProcedureBuilder.inferredTypesFromField;
-          } else if (bMember is Procedure) {
-            if (bMember.kind == ProcedureKind.Getter) {
-              type = bMember.function.returnType;
-              inferTypesFrom = SourceProcedureBuilder.inferredTypesFromGetter;
-            } else if (bMember.kind == ProcedureKind.Setter) {
-              type = bMember.function.positionalParameters.single.type;
-              inferTypesFrom = SourceProcedureBuilder.inferredTypesFromSetter;
-            }
-          }
-          if (type != null) {
-            type = Substitution.fromInterfaceType(
-                    hierarchy.getKernelTypeAsInstanceOf(
-                        hierarchy.coreTypes.thisInterfaceType(
-                            classBuilder.cls, classBuilder.library.nonNullable),
-                        bMember.enclosingClass,
-                        classBuilder.library.library))
-                .substituteType(type);
-            inferReturnType(
-                classBuilder,
-                a.memberBuilder,
-                a.memberBuilder.member.function,
-                type,
-                a.hadTypesInferredFrom,
-                inferTypesFrom,
-                hierarchy);
-          }
-        } else if (a.isSetter && !a.hasExplicitlyTypedFormalParameter(0)) {
-          int inferTypesFrom;
-          DartType type;
-          if (bMember is Field) {
-            type = bMember.type;
-            inferTypesFrom = SourceProcedureBuilder.inferredTypesFromField;
-          } else if (bMember is Procedure) {
-            if (bMember.kind == ProcedureKind.Getter) {
-              type = bMember.function.returnType;
-              inferTypesFrom = SourceProcedureBuilder.inferredTypesFromGetter;
-            } else if (bMember.kind == ProcedureKind.Setter) {
-              type = bMember.function.positionalParameters.single.type;
-              inferTypesFrom = SourceProcedureBuilder.inferredTypesFromSetter;
-            }
-          }
-          if (type != null) {
-            type = Substitution.fromInterfaceType(
-                    hierarchy.getKernelTypeAsInstanceOf(
-                        hierarchy.coreTypes.thisInterfaceType(
-                            classBuilder.cls, classBuilder.library.nonNullable),
-                        bMember.enclosingClass,
-                        classBuilder.library.library))
-                .substituteType(type);
-            inferParameterType(classBuilder, a.memberBuilder, a.formals.single,
-                type, a.hadTypesInferredFrom, inferTypesFrom, hierarchy);
-          }
-        }
-      }
-    }
-
-    callback(a.getMember(hierarchy), bMember, a.isSetter);
+    debug?.log("Delayed override check of ${declaredMember.fullName} "
+        "${overriddenMember.fullName} wrt. ${classBuilder.fullNameForErrors}");
+    callback(declaredMember.getMember(hierarchy),
+        overriddenMember.getMember(hierarchy), declaredMember.isSetter);
   }
 }
 
@@ -2667,16 +2711,6 @@
   }
 
   @override
-  bool get hasExplicitReturnType {
-    return true;
-  }
-
-  @override
-  bool hasExplicitlyTypedFormalParameter(int index) {
-    return true;
-  }
-
-  @override
   void inferType(ClassHierarchyBuilder hierarchy) {
     // Do nothing; this is only for declared members.
   }
@@ -3000,7 +3034,7 @@
       String name = classBuilder.fullNameForErrors;
       int length = classBuilder.isAnonymousMixinApplication ? 1 : name.length;
       List<LocatedMessage> context = declarations.map((ClassMember d) {
-        return messageDeclaredMemberConflictsWithInheritedMemberCause
+        return messageDeclaredMemberConflictsWithInheritedMembersCause
             .withLocation(d.fileUri, d.charOffset, d.fullNameForErrors.length);
       }).toList();
 
@@ -3209,135 +3243,43 @@
   return a.name.compareTo(b.name);
 }
 
-bool inferParameterType(
-    ClassBuilder classBuilder,
-    SourceProcedureBuilder memberBuilder,
-    FormalParameterBuilder parameterBuilder,
-    DartType type,
-    int hadTypesInferredFrom,
-    int inferTypesFrom,
-    ClassHierarchyBuilder hierarchy) {
-  if ((hadTypesInferredFrom & SourceProcedureBuilder.inferredTypesFromSetter) !=
-          0 &&
-      (inferTypesFrom & SourceProcedureBuilder.inferredTypesFromSetter) == 0) {
-    // Parameter type already inferred from setter; disregard getters.
-    return false;
-  }
-
-  debug?.log("Inferred type ${type} for ${parameterBuilder}");
-
-  if (classBuilder.library.isNonNullableByDefault) {
-    if ((hadTypesInferredFrom & inferTypesFrom) != 0) {
-      type = nnbdTopMerge(
-          hierarchy.coreTypes,
-          norm(hierarchy.coreTypes, parameterBuilder.variable.type),
-          norm(hierarchy.coreTypes, type));
-      if (type != null) {
-        // The nnbd top merge exists so [type] is the inferred type.
-        parameterBuilder.variable.type = type;
-        return false;
-      }
-      // The nnbd top merge doesn't exist. An error will be reported below.
-    }
-  } else {
-    type = legacyErasure(hierarchy.coreTypes, type);
-    if ((hadTypesInferredFrom & inferTypesFrom) != 0) {
-      if (parameterBuilder.variable.type is DynamicType &&
-          type == hierarchy.coreTypes.objectLegacyRawType) {
-        return false;
-      } else if (type is DynamicType &&
-          parameterBuilder.variable.type ==
-              hierarchy.coreTypes.objectLegacyRawType) {
-        parameterBuilder.variable.type = const DynamicType();
-        return false;
-      }
-    }
-  }
-
-  if ((hadTypesInferredFrom & inferTypesFrom) != 0) {
-    if (type == parameterBuilder.variable.type) {
-      return true;
-    }
-    reportCantInferParameterType(classBuilder, parameterBuilder, hierarchy);
-    parameterBuilder.variable.type = const InvalidType();
-    return false;
-  } else {
-    parameterBuilder.variable.type = type;
-    memberBuilder.hadTypesInferredFrom |= inferTypesFrom;
-    return true;
-  }
-}
-
-void reportCantInferParameterType(ClassBuilder cls,
-    FormalParameterBuilder parameter, ClassHierarchyBuilder hierarchy) {
+void reportCantInferParameterType(
+    ClassBuilder cls,
+    FormalParameterBuilder parameter,
+    ClassHierarchyBuilder hierarchy,
+    Iterable<ClassMember> overriddenMembers) {
   String name = parameter.name;
+  List<LocatedMessage> context = overriddenMembers
+      .map((ClassMember overriddenMember) {
+        return messageDeclaredMemberConflictsWithInheritedMembersCause
+            .withLocation(overriddenMember.fileUri, overriddenMember.charOffset,
+                overriddenMember.fullNameForErrors.length);
+      })
+      // Call toSet to avoid duplicate context for instance of fields that are
+      // overridden both as getters and setters.
+      .toSet()
+      .toList();
   cls.addProblem(
       templateCantInferTypeDueToInconsistentOverrides.withArguments(name),
       parameter.charOffset,
       name.length,
-      wasHandled: true);
-}
-
-bool inferReturnType(
-    ClassBuilder classBuilder,
-    SourceProcedureBuilder procedureBuilder,
-    FunctionNode function,
-    DartType type,
-    int hadTypesInferredFrom,
-    int inferTypesFrom,
-    ClassHierarchyBuilder hierarchy) {
-  if ((hadTypesInferredFrom & SourceProcedureBuilder.inferredTypesFromGetter) !=
-          0 &&
-      (inferTypesFrom & SourceProcedureBuilder.inferredTypesFromGetter) == 0) {
-    // Return type already inferred from getter; disregard setters.
-    return false;
-  }
-
-  if (classBuilder.library.isNonNullableByDefault) {
-    if ((hadTypesInferredFrom & inferTypesFrom) != 0) {
-      type = nnbdTopMerge(
-          hierarchy.coreTypes,
-          norm(hierarchy.coreTypes, function.returnType),
-          norm(hierarchy.coreTypes, type));
-      if (type != null) {
-        // The nnbd top merge exists so [type] is the inferred type.
-        function.returnType = type;
-        return false;
-      }
-      // The nnbd top merge doesn't exist. An error will be reported below.
-    }
-  } else {
-    type = legacyErasure(hierarchy.coreTypes, type);
-    if ((hadTypesInferredFrom & inferTypesFrom) != 0) {
-      if (function.returnType is DynamicType &&
-          type == hierarchy.coreTypes.objectLegacyRawType) {
-        return false;
-      } else if (type is DynamicType &&
-          function.returnType == hierarchy.coreTypes.objectLegacyRawType) {
-        function.returnType = const DynamicType();
-        return false;
-      }
-    }
-  }
-
-  if ((hadTypesInferredFrom & inferTypesFrom) != 0) {
-    if (type == function.returnType) {
-      return true;
-    }
-    reportCantInferReturnType(classBuilder, procedureBuilder, hierarchy);
-    function.returnType = const InvalidType();
-    return false;
-  } else {
-    procedureBuilder.hadTypesInferredFrom |= inferTypesFrom;
-    function.returnType = type;
-    return true;
-  }
+      wasHandled: true,
+      context: context);
 }
 
 void reportCantInferReturnType(ClassBuilder cls, SourceProcedureBuilder member,
-    ClassHierarchyBuilder hierarchy) {
+    ClassHierarchyBuilder hierarchy, Iterable<ClassMember> overriddenMembers) {
   String name = member.fullNameForErrors;
-  List<LocatedMessage> context;
+  List<LocatedMessage> context = overriddenMembers
+      .map((ClassMember overriddenMember) {
+        return messageDeclaredMemberConflictsWithInheritedMembersCause
+            .withLocation(overriddenMember.fileUri, overriddenMember.charOffset,
+                overriddenMember.fullNameForErrors.length);
+      })
+      // Call toSet to avoid duplicate context for instance of fields that are
+      // overridden both as getters and setters.
+      .toSet()
+      .toList();
   // // TODO(ahe): The following is for debugging, but could be cleaned up and
   // // used to improve this error message in general.
   //
@@ -3393,13 +3335,25 @@
       context: context);
 }
 
-void reportCantInferFieldType(ClassBuilder cls, SourceFieldBuilder member) {
+void reportCantInferFieldType(ClassBuilder cls, SourceFieldBuilder member,
+    Iterable<ClassMember> overriddenMembers) {
+  List<LocatedMessage> context = overriddenMembers
+      .map((ClassMember overriddenMember) {
+        return messageDeclaredMemberConflictsWithInheritedMembersCause
+            .withLocation(overriddenMember.fileUri, overriddenMember.charOffset,
+                overriddenMember.fullNameForErrors.length);
+      })
+      // Call toSet to avoid duplicate context for instance of fields that are
+      // overridden both as getters and setters.
+      .toSet()
+      .toList();
   String name = member.fullNameForErrors;
   cls.addProblem(
       templateCantInferTypeDueToInconsistentOverrides.withArguments(name),
       member.charOffset,
       name.length,
-      wasHandled: true);
+      wasHandled: true,
+      context: context);
 }
 
 ClassBuilder getClass(TypeBuilder type) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/collections.dart b/pkg/front_end/lib/src/fasta/kernel/collections.dart
index 6c4f9ca..5f142ad 100644
--- a/pkg/front_end/lib/src/fasta/kernel/collections.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/collections.dart
@@ -99,6 +99,11 @@
       void onConvertForElement(TreeNode from, TreeNode to)) {
     return new SpreadMapEntry(expression, isNullAware)..fileOffset = fileOffset;
   }
+
+  @override
+  String toString() {
+    return "SpreadElement()";
+  }
 }
 
 /// An 'if' element in a list or set literal.
@@ -155,6 +160,11 @@
     return new IfMapEntry(condition, thenEntry, otherwiseEntry)
       ..fileOffset = fileOffset;
   }
+
+  @override
+  String toString() {
+    return "IfElement()";
+  }
 }
 
 /// A 'for' element in a list or set literal.
@@ -207,6 +217,11 @@
     onConvertForElement(this, result);
     return result;
   }
+
+  @override
+  String toString() {
+    return "ForElement()";
+  }
 }
 
 /// A 'for-in' element in a list or set literal.
@@ -286,6 +301,11 @@
     onConvertForElement(this, result);
     return result;
   }
+
+  @override
+  String toString() {
+    return "ForInElement()";
+  }
 }
 
 mixin ControlFlowMapEntry implements MapEntry {
@@ -340,6 +360,11 @@
       expression?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "SpreadMapEntry()";
+  }
 }
 
 /// An 'if' element in a map literal.
@@ -376,6 +401,11 @@
       otherwise?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "IfMapEntry()";
+  }
 }
 
 /// A 'for' element in a map literal.
@@ -413,6 +443,11 @@
       body?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "ForMapEntry()";
+  }
 }
 
 /// A 'for-in' element in a map literal.
@@ -477,6 +512,11 @@
       problem?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "ForInMapEntry()";
+  }
 }
 
 /// Convert [entry] to an [Expression], if possible. If [entry] cannot be
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index c1104f7..51a5f21 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -754,4 +754,9 @@
   transformChildren(v) {
     throw unsupported("transformChildren", fileOffset, uri);
   }
+
+  @override
+  String toString() {
+    return "_VariablesDeclaration()";
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/implicit_type_argument.dart b/pkg/front_end/lib/src/fasta/kernel/implicit_type_argument.dart
index 36edb1b..1f0d6cc 100644
--- a/pkg/front_end/lib/src/fasta/kernel/implicit_type_argument.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/implicit_type_argument.dart
@@ -43,4 +43,9 @@
 
   @override
   bool equals(Object other, Assumptions assumptions) => this == other;
+
+  @override
+  String toString() {
+    return "ImplicitTypeArgument()";
+  }
 }
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 5082f41..b053237 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -20,8 +20,6 @@
         InstrumentationValueForType,
         InstrumentationValueForTypeArgs;
 
-import '../../base/nnbd_mode.dart';
-
 import '../fasta_codes.dart';
 
 import '../names.dart';
@@ -734,13 +732,8 @@
             node, inferrer.typeSchemaEnvironment, inferrer.helper.uri,
             inferred: true);
       }
-    }
-    if (inferrer.isNonNullableByDefault) {
-      if (node.target == inferrer.coreTypes.listDefaultConstructor) {
-        if (inferrer.nnbdMode == NnbdMode.Weak) {
-          inferrer.library.addProblem(messageDefaultListConstructorWarning,
-              node.fileOffset, noLength, inferrer.helper.uri);
-        } else {
+      if (inferrer.isNonNullableByDefault) {
+        if (node.target == inferrer.coreTypes.listDefaultConstructor) {
           resultNode = inferrer.helper.wrapInProblem(node,
               messageDefaultListConstructorError, node.fileOffset, noLength);
         }
@@ -2317,7 +2310,7 @@
     }
     return inferrer.inferMethodInvocation(node.fileOffset, nullAwareGuards,
         receiver, receiverType, node.name, node.arguments, typeContext,
-        isExpressionInvocation: false);
+        isExpressionInvocation: false, isImplicitCall: false);
   }
 
   ExpressionInferenceResult visitExpressionInvocation(
@@ -2335,39 +2328,9 @@
       receiver = result.expression;
       receiverType = result.inferredType;
     }
-    ExpressionInferenceResult invocationResult = inferrer.inferMethodInvocation(
-        node.fileOffset,
-        nullAwareGuards,
-        receiver,
-        receiverType,
-        callName,
-        node.arguments,
-        typeContext,
-        isExpressionInvocation: true);
-    if (inferrer.isNonNullableByDefault) {
-      if (receiverType is! DynamicType &&
-          receiverType is! InvalidType &&
-          isPotentiallyNullable(
-              receiverType, inferrer.coreTypes.futureOrClass)) {
-        if (inferrer.nnbdMode == NnbdMode.Weak) {
-          inferrer.helper.addProblem(
-              templateNullableExpressionCallWarning.withArguments(
-                  receiverType, inferrer.isNonNullableByDefault),
-              node.fileOffset,
-              noLength);
-        } else {
-          return new ExpressionInferenceResult(
-              invocationResult.inferredType,
-              inferrer.helper.wrapInProblem(
-                  invocationResult.expression..fileOffset = node.fileOffset,
-                  templateNullableExpressionCallError.withArguments(
-                      receiverType, inferrer.isNonNullableByDefault),
-                  node.fileOffset,
-                  noLength));
-        }
-      }
-    }
-    return invocationResult;
+    return inferrer.inferMethodInvocation(node.fileOffset, nullAwareGuards,
+        receiver, receiverType, callName, node.arguments, typeContext,
+        isExpressionInvocation: true, isImplicitCall: true);
   }
 
   ExpressionInferenceResult visitNamedFunctionExpressionJudgment(
@@ -3539,76 +3502,82 @@
     }
 
     Expression binary;
-    if (binaryTarget.isMissing) {
-      binary = inferrer.createMissingBinary(
-          fileOffset, left, leftType, binaryName, right);
-    } else if (binaryTarget.isExtensionMember) {
-      assert(binaryTarget.extensionMethodKind != ProcedureKind.Setter);
-      binary = new StaticInvocation(
-          binaryTarget.member,
-          new Arguments(<Expression>[
-            left,
-            right,
-          ], types: binaryTarget.inferredExtensionTypeArguments)
-            ..fileOffset = fileOffset)
-        ..fileOffset = fileOffset;
-    } else {
-      if (binaryTarget.isInstanceMember &&
-          inferrer.instrumentation != null &&
-          leftType == const DynamicType()) {
-        inferrer.instrumentation.record(
-            inferrer.uriForInstrumentation,
-            fileOffset,
-            'target',
-            new InstrumentationValueForMember(binaryTarget.member));
-      }
-
-      binary = new MethodInvocation(
-          left,
-          binaryName,
-          new Arguments(<Expression>[
-            right,
-          ])
-            ..fileOffset = fileOffset,
-          binaryTarget.member)
-        ..fileOffset = fileOffset;
-
-      if (binaryCheckKind == MethodContravarianceCheckKind.checkMethodReturn) {
-        if (inferrer.instrumentation != null) {
+    switch (binaryTarget.kind) {
+      case ObjectAccessTargetKind.missing:
+        binary = inferrer.createMissingBinary(
+            fileOffset, left, leftType, binaryName, right);
+        break;
+      case ObjectAccessTargetKind.ambiguous:
+        binary = inferrer.createMissingBinary(
+            fileOffset, left, leftType, binaryName, right,
+            extensionAccessCandidates: binaryTarget.candidates);
+        break;
+      case ObjectAccessTargetKind.extensionMember:
+        assert(binaryTarget.extensionMethodKind != ProcedureKind.Setter);
+        binary = new StaticInvocation(
+            binaryTarget.member,
+            new Arguments(<Expression>[
+              left,
+              right,
+            ], types: binaryTarget.inferredExtensionTypeArguments)
+              ..fileOffset = fileOffset)
+          ..fileOffset = fileOffset;
+        break;
+      case ObjectAccessTargetKind.instanceMember:
+      case ObjectAccessTargetKind.invalid:
+      case ObjectAccessTargetKind.unresolved:
+      case ObjectAccessTargetKind.callFunction:
+      case ObjectAccessTargetKind.dynamic:
+      case ObjectAccessTargetKind.never:
+        if (binaryTarget.isInstanceMember &&
+            inferrer.instrumentation != null &&
+            leftType == const DynamicType()) {
           inferrer.instrumentation.record(
               inferrer.uriForInstrumentation,
               fileOffset,
-              'checkReturn',
-              new InstrumentationValueForType(binaryType));
+              'target',
+              new InstrumentationValueForMember(binaryTarget.member));
         }
-        binary = new AsExpression(binary, binaryType)
-          ..isTypeError = true
-          ..isCovarianceCheck = true
-          ..isForNonNullableByDefault = inferrer.isNonNullableByDefault
+
+        binary = new MethodInvocation(
+            left,
+            binaryName,
+            new Arguments(<Expression>[
+              right,
+            ])
+              ..fileOffset = fileOffset,
+            binaryTarget.member)
           ..fileOffset = fileOffset;
-      }
-    }
-    if (inferrer.isNonNullableByDefault) {
-      if (leftType is! DynamicType &&
-          isPotentiallyNullable(leftType, inferrer.coreTypes.futureOrClass)) {
-        if (inferrer.nnbdMode == NnbdMode.Weak) {
-          inferrer.helper.addProblem(
-              templateNullableOperatorCallWarning.withArguments(
-                  binaryName.name, leftType, inferrer.isNonNullableByDefault),
-              binary.fileOffset,
-              binaryName.name.length);
-        } else {
-          return new ExpressionInferenceResult(
-              binaryType,
-              inferrer.helper.wrapInProblem(
-                  binary,
-                  templateNullableOperatorCallError.withArguments(
-                      binaryName.name,
-                      leftType,
-                      inferrer.isNonNullableByDefault),
-                  binary.fileOffset,
-                  binaryName.name.length));
+
+        if (binaryCheckKind ==
+            MethodContravarianceCheckKind.checkMethodReturn) {
+          if (inferrer.instrumentation != null) {
+            inferrer.instrumentation.record(
+                inferrer.uriForInstrumentation,
+                fileOffset,
+                'checkReturn',
+                new InstrumentationValueForType(binaryType));
+          }
+          binary = new AsExpression(binary, binaryType)
+            ..isTypeError = true
+            ..isCovarianceCheck = true
+            ..isForNonNullableByDefault = inferrer.isNonNullableByDefault
+            ..fileOffset = fileOffset;
         }
+        break;
+    }
+    if (!inferrer.isTopLevel && inferrer.isNonNullableByDefault) {
+      if (leftType is! InvalidType &&
+          leftType is! DynamicType &&
+          isPotentiallyNullable(leftType, inferrer.coreTypes.futureOrClass)) {
+        return new ExpressionInferenceResult(
+            binaryType,
+            inferrer.helper.wrapInProblem(
+                binary,
+                templateNullableOperatorCallError.withArguments(
+                    binaryName.name, leftType, inferrer.isNonNullableByDefault),
+                binary.fileOffset,
+                binaryName.name.length));
       }
     }
     return new ExpressionInferenceResult(binaryType, binary);
@@ -3632,75 +3601,80 @@
     DartType unaryType = inferrer.getReturnType(unaryTarget, expressionType);
 
     Expression unary;
-    if (unaryTarget.isMissing) {
-      unary = inferrer.createMissingUnary(
-          fileOffset, expression, expressionType, unaryName);
-    } else if (unaryTarget.isExtensionMember) {
-      assert(unaryTarget.extensionMethodKind != ProcedureKind.Setter);
-      unary = new StaticInvocation(
-          unaryTarget.member,
-          new Arguments(<Expression>[
-            expression,
-          ], types: unaryTarget.inferredExtensionTypeArguments)
-            ..fileOffset = fileOffset)
-        ..fileOffset = fileOffset;
-    } else {
-      if (unaryTarget.isInstanceMember &&
-          inferrer.instrumentation != null &&
-          expressionType == const DynamicType()) {
-        inferrer.instrumentation.record(
-            inferrer.uriForInstrumentation,
-            fileOffset,
-            'target',
-            new InstrumentationValueForMember(unaryTarget.member));
-      }
-
-      unary = new MethodInvocation(
-          expression,
-          unaryName,
-          new Arguments(<Expression>[])..fileOffset = fileOffset,
-          unaryTarget.member)
-        ..fileOffset = fileOffset;
-
-      if (unaryCheckKind == MethodContravarianceCheckKind.checkMethodReturn) {
-        if (inferrer.instrumentation != null) {
+    switch (unaryTarget.kind) {
+      case ObjectAccessTargetKind.missing:
+        unary = inferrer.createMissingUnary(
+            fileOffset, expression, expressionType, unaryName);
+        break;
+      case ObjectAccessTargetKind.ambiguous:
+        unary = inferrer.createMissingUnary(
+            fileOffset, expression, expressionType, unaryName,
+            extensionAccessCandidates: unaryTarget.candidates);
+        break;
+      case ObjectAccessTargetKind.extensionMember:
+        assert(unaryTarget.extensionMethodKind != ProcedureKind.Setter);
+        unary = new StaticInvocation(
+            unaryTarget.member,
+            new Arguments(<Expression>[
+              expression,
+            ], types: unaryTarget.inferredExtensionTypeArguments)
+              ..fileOffset = fileOffset)
+          ..fileOffset = fileOffset;
+        break;
+      case ObjectAccessTargetKind.instanceMember:
+      case ObjectAccessTargetKind.invalid:
+      case ObjectAccessTargetKind.unresolved:
+      case ObjectAccessTargetKind.callFunction:
+      case ObjectAccessTargetKind.dynamic:
+      case ObjectAccessTargetKind.never:
+        if (unaryTarget.isInstanceMember &&
+            inferrer.instrumentation != null &&
+            expressionType == const DynamicType()) {
           inferrer.instrumentation.record(
               inferrer.uriForInstrumentation,
               fileOffset,
-              'checkReturn',
-              new InstrumentationValueForType(expressionType));
+              'target',
+              new InstrumentationValueForMember(unaryTarget.member));
         }
-        unary = new AsExpression(unary, unaryType)
-          ..isTypeError = true
-          ..isCovarianceCheck = true
-          ..isForNonNullableByDefault = inferrer.isNonNullableByDefault
+
+        unary = new MethodInvocation(
+            expression,
+            unaryName,
+            new Arguments(<Expression>[])..fileOffset = fileOffset,
+            unaryTarget.member)
           ..fileOffset = fileOffset;
-      }
+
+        if (unaryCheckKind == MethodContravarianceCheckKind.checkMethodReturn) {
+          if (inferrer.instrumentation != null) {
+            inferrer.instrumentation.record(
+                inferrer.uriForInstrumentation,
+                fileOffset,
+                'checkReturn',
+                new InstrumentationValueForType(expressionType));
+          }
+          unary = new AsExpression(unary, unaryType)
+            ..isTypeError = true
+            ..isCovarianceCheck = true
+            ..isForNonNullableByDefault = inferrer.isNonNullableByDefault
+            ..fileOffset = fileOffset;
+        }
+        break;
     }
-    if (inferrer.isNonNullableByDefault) {
-      if (expressionType is! DynamicType &&
+    if (!inferrer.isTopLevel && inferrer.isNonNullableByDefault) {
+      if (expressionType is! InvalidType &&
+          expressionType is! DynamicType &&
           isPotentiallyNullable(
               expressionType, inferrer.coreTypes.futureOrClass)) {
         // TODO(johnniwinther): Special case 'unary-' in messages. It should
         // probably be referred to as "Unary operator '-' ...".
-        if (inferrer.nnbdMode == NnbdMode.Weak) {
-          inferrer.helper.addProblem(
-              templateNullableOperatorCallWarning.withArguments(unaryName.name,
-                  expressionType, inferrer.isNonNullableByDefault),
-              unary.fileOffset,
-              unaryName == unaryMinusName ? 1 : unaryName.name.length);
-        } else {
-          return new ExpressionInferenceResult(
-              unaryType,
-              inferrer.helper.wrapInProblem(
-                  unary,
-                  templateNullableOperatorCallError.withArguments(
-                      unaryName.name,
-                      expressionType,
-                      inferrer.isNonNullableByDefault),
-                  unary.fileOffset,
-                  unaryName == unaryMinusName ? 1 : unaryName.name.length));
-        }
+        return new ExpressionInferenceResult(
+            unaryType,
+            inferrer.helper.wrapInProblem(
+                unary,
+                templateNullableOperatorCallError.withArguments(unaryName.name,
+                    expressionType, inferrer.isNonNullableByDefault),
+                unary.fileOffset,
+                unaryName == unaryMinusName ? 1 : unaryName.name.length));
       }
     }
     return new ExpressionInferenceResult(unaryType, unary);
@@ -3721,68 +3695,72 @@
       MethodContravarianceCheckKind readCheckKind) {
     Expression read;
     DartType readType = inferrer.getReturnType(readTarget, receiverType);
-    if (readTarget.isMissing) {
-      read = inferrer.createMissingIndexGet(
-          fileOffset, readReceiver, receiverType, readIndex);
-    } else if (readTarget.isExtensionMember) {
-      read = new StaticInvocation(
-          readTarget.member,
-          new Arguments(<Expression>[
-            readReceiver,
-            readIndex,
-          ], types: readTarget.inferredExtensionTypeArguments)
-            ..fileOffset = fileOffset)
-        ..fileOffset = fileOffset;
-    } else {
-      read = new MethodInvocation(
-          readReceiver,
-          indexGetName,
-          new Arguments(<Expression>[
-            readIndex,
-          ])
-            ..fileOffset = fileOffset,
-          readTarget.member)
-        ..fileOffset = fileOffset;
-      if (readCheckKind == MethodContravarianceCheckKind.checkMethodReturn) {
-        if (inferrer.instrumentation != null) {
-          inferrer.instrumentation.record(
-              inferrer.uriForInstrumentation,
-              fileOffset,
-              'checkReturn',
-              new InstrumentationValueForType(readType));
-        }
-        read = new AsExpression(read, readType)
-          ..isTypeError = true
-          ..isCovarianceCheck = true
-          ..isForNonNullableByDefault = inferrer.isNonNullableByDefault
+    switch (readTarget.kind) {
+      case ObjectAccessTargetKind.missing:
+        read = inferrer.createMissingIndexGet(
+            fileOffset, readReceiver, receiverType, readIndex);
+        break;
+      case ObjectAccessTargetKind.ambiguous:
+        read = inferrer.createMissingIndexGet(
+            fileOffset, readReceiver, receiverType, readIndex,
+            extensionAccessCandidates: readTarget.candidates);
+        break;
+      case ObjectAccessTargetKind.extensionMember:
+        read = new StaticInvocation(
+            readTarget.member,
+            new Arguments(<Expression>[
+              readReceiver,
+              readIndex,
+            ], types: readTarget.inferredExtensionTypeArguments)
+              ..fileOffset = fileOffset)
           ..fileOffset = fileOffset;
-      }
+        break;
+      case ObjectAccessTargetKind.instanceMember:
+      case ObjectAccessTargetKind.invalid:
+      case ObjectAccessTargetKind.unresolved:
+      case ObjectAccessTargetKind.callFunction:
+      case ObjectAccessTargetKind.dynamic:
+      case ObjectAccessTargetKind.never:
+        read = new MethodInvocation(
+            readReceiver,
+            indexGetName,
+            new Arguments(<Expression>[
+              readIndex,
+            ])
+              ..fileOffset = fileOffset,
+            readTarget.member)
+          ..fileOffset = fileOffset;
+        if (readCheckKind == MethodContravarianceCheckKind.checkMethodReturn) {
+          if (inferrer.instrumentation != null) {
+            inferrer.instrumentation.record(
+                inferrer.uriForInstrumentation,
+                fileOffset,
+                'checkReturn',
+                new InstrumentationValueForType(readType));
+          }
+          read = new AsExpression(read, readType)
+            ..isTypeError = true
+            ..isCovarianceCheck = true
+            ..isForNonNullableByDefault = inferrer.isNonNullableByDefault
+            ..fileOffset = fileOffset;
+        }
+        break;
     }
-    if (inferrer.isNonNullableByDefault) {
+    if (!inferrer.isTopLevel && inferrer.isNonNullableByDefault) {
       if (receiverType is! DynamicType &&
           receiverType is! InvalidType &&
           isPotentiallyNullable(
               receiverType, inferrer.coreTypes.futureOrClass)) {
-        if (inferrer.nnbdMode == NnbdMode.Weak) {
-          inferrer.helper.addProblem(
-              templateNullableOperatorCallWarning.withArguments(
-                  indexGetName.name,
-                  receiverType,
-                  inferrer.isNonNullableByDefault),
-              read.fileOffset,
-              noLength);
-        } else {
-          return new ExpressionInferenceResult(
-              readType,
-              inferrer.helper.wrapInProblem(
-                  read,
-                  templateNullableOperatorCallError.withArguments(
-                      indexGetName.name,
-                      receiverType,
-                      inferrer.isNonNullableByDefault),
-                  read.fileOffset,
-                  noLength));
-        }
+        return new ExpressionInferenceResult(
+            readType,
+            inferrer.helper.wrapInProblem(
+                read,
+                templateNullableOperatorCallError.withArguments(
+                    indexGetName.name,
+                    receiverType,
+                    inferrer.isNonNullableByDefault),
+                read.fileOffset,
+                noLength));
       }
     }
     return new ExpressionInferenceResult(readType, read);
@@ -3802,46 +3780,53 @@
       Expression index,
       Expression value) {
     Expression write;
-    if (writeTarget.isMissing) {
-      write = inferrer.createMissingIndexSet(
-          fileOffset, receiver, receiverType, index, value,
-          forEffect: true, readOnlyReceiver: true);
-    } else if (writeTarget.isExtensionMember) {
-      assert(writeTarget.extensionMethodKind != ProcedureKind.Setter);
-      write = new StaticInvocation(
-          writeTarget.member,
-          new Arguments(<Expression>[receiver, index, value],
-              types: writeTarget.inferredExtensionTypeArguments)
-            ..fileOffset = fileOffset)
-        ..fileOffset = fileOffset;
-    } else {
-      write = new MethodInvocation(
-          receiver,
-          indexSetName,
-          new Arguments(<Expression>[index, value])..fileOffset = fileOffset,
-          writeTarget.member)
-        ..fileOffset = fileOffset;
+    switch (writeTarget.kind) {
+      case ObjectAccessTargetKind.missing:
+        write = inferrer.createMissingIndexSet(
+            fileOffset, receiver, receiverType, index, value,
+            forEffect: true, readOnlyReceiver: true);
+        break;
+      case ObjectAccessTargetKind.ambiguous:
+        write = inferrer.createMissingIndexSet(
+            fileOffset, receiver, receiverType, index, value,
+            forEffect: true,
+            readOnlyReceiver: true,
+            extensionAccessCandidates: writeTarget.candidates);
+        break;
+      case ObjectAccessTargetKind.extensionMember:
+        assert(writeTarget.extensionMethodKind != ProcedureKind.Setter);
+        write = new StaticInvocation(
+            writeTarget.member,
+            new Arguments(<Expression>[receiver, index, value],
+                types: writeTarget.inferredExtensionTypeArguments)
+              ..fileOffset = fileOffset)
+          ..fileOffset = fileOffset;
+        break;
+      case ObjectAccessTargetKind.instanceMember:
+      case ObjectAccessTargetKind.invalid:
+      case ObjectAccessTargetKind.unresolved:
+      case ObjectAccessTargetKind.callFunction:
+      case ObjectAccessTargetKind.dynamic:
+      case ObjectAccessTargetKind.never:
+        write = new MethodInvocation(
+            receiver,
+            indexSetName,
+            new Arguments(<Expression>[index, value])..fileOffset = fileOffset,
+            writeTarget.member)
+          ..fileOffset = fileOffset;
+        break;
     }
-    if (inferrer.isNonNullableByDefault) {
-      if (receiverType is! DynamicType &&
+    if (!inferrer.isTopLevel && inferrer.isNonNullableByDefault) {
+      if (receiverType is! InvalidType &&
+          receiverType is! DynamicType &&
           isPotentiallyNullable(
               receiverType, inferrer.coreTypes.futureOrClass)) {
-        if (inferrer.nnbdMode == NnbdMode.Weak) {
-          inferrer.helper.addProblem(
-              templateNullableOperatorCallWarning.withArguments(
-                  indexSetName.name,
-                  receiverType,
-                  inferrer.isNonNullableByDefault),
-              write.fileOffset,
-              noLength);
-        } else {
-          return inferrer.helper.wrapInProblem(
-              write,
-              templateNullableOperatorCallError.withArguments(indexSetName.name,
-                  receiverType, inferrer.isNonNullableByDefault),
-              write.fileOffset,
-              noLength);
-        }
+        return inferrer.helper.wrapInProblem(
+            write,
+            templateNullableOperatorCallError.withArguments(indexSetName.name,
+                receiverType, inferrer.isNonNullableByDefault),
+            write.fileOffset,
+            noLength);
       }
     }
     return write;
@@ -3871,107 +3856,111 @@
     DartType readType = inferrer.getGetterType(readTarget, receiverType);
 
     Expression read;
-    if (readTarget.isMissing) {
-      read = inferrer.createMissingPropertyGet(
-          fileOffset, receiver, receiverType, propertyName);
-    } else if (readTarget.isExtensionMember) {
-      switch (readTarget.extensionMethodKind) {
-        case ProcedureKind.Getter:
-          read = new StaticInvocation(
-              readTarget.member,
-              new Arguments(<Expression>[
-                receiver,
-              ], types: readTarget.inferredExtensionTypeArguments)
-                ..fileOffset = fileOffset)
-            ..fileOffset = fileOffset;
-          break;
-        case ProcedureKind.Method:
-          read = new StaticInvocation(
-              readTarget.tearoffTarget,
-              new Arguments(<Expression>[
-                receiver,
-              ], types: readTarget.inferredExtensionTypeArguments)
-                ..fileOffset = fileOffset)
-            ..fileOffset = fileOffset;
-          return inferrer.instantiateTearOff(readType, typeContext, read);
-        case ProcedureKind.Setter:
-        case ProcedureKind.Factory:
-        case ProcedureKind.Operator:
-          unhandled('$readTarget', "inferPropertyGet", null, null);
-          break;
-      }
-    } else {
-      if (readTarget.isInstanceMember &&
-          inferrer.instrumentation != null &&
-          receiverType == const DynamicType()) {
-        inferrer.instrumentation.record(
-            inferrer.uriForInstrumentation,
-            fileOffset,
-            'target',
-            new InstrumentationValueForMember(readTarget.member));
-      }
-      read = new PropertyGet(receiver, propertyName, readTarget.member)
-        ..fileOffset = fileOffset;
-      bool checkReturn = false;
-      if (readTarget.isInstanceMember && !isThisReceiver) {
-        Member interfaceMember = readTarget.member;
-        if (interfaceMember is Procedure) {
-          checkReturn =
-              TypeInferrerImpl.returnedTypeParametersOccurNonCovariantly(
-                  interfaceMember.enclosingClass,
-                  interfaceMember.function.returnType);
-        } else if (interfaceMember is Field) {
-          checkReturn =
-              TypeInferrerImpl.returnedTypeParametersOccurNonCovariantly(
-                  interfaceMember.enclosingClass, interfaceMember.type);
+    switch (readTarget.kind) {
+      case ObjectAccessTargetKind.missing:
+        read = inferrer.createMissingPropertyGet(
+            fileOffset, receiver, receiverType, propertyName);
+        break;
+      case ObjectAccessTargetKind.ambiguous:
+        read = inferrer.createMissingPropertyGet(
+            fileOffset, receiver, receiverType, propertyName,
+            extensionAccessCandidates: readTarget.candidates);
+        break;
+      case ObjectAccessTargetKind.extensionMember:
+        switch (readTarget.extensionMethodKind) {
+          case ProcedureKind.Getter:
+            read = new StaticInvocation(
+                readTarget.member,
+                new Arguments(<Expression>[
+                  receiver,
+                ], types: readTarget.inferredExtensionTypeArguments)
+                  ..fileOffset = fileOffset)
+              ..fileOffset = fileOffset;
+            break;
+          case ProcedureKind.Method:
+            read = new StaticInvocation(
+                readTarget.tearoffTarget,
+                new Arguments(<Expression>[
+                  receiver,
+                ], types: readTarget.inferredExtensionTypeArguments)
+                  ..fileOffset = fileOffset)
+              ..fileOffset = fileOffset;
+            return inferrer.instantiateTearOff(readType, typeContext, read);
+          case ProcedureKind.Setter:
+          case ProcedureKind.Factory:
+          case ProcedureKind.Operator:
+            unhandled('$readTarget', "inferPropertyGet", null, null);
+            break;
         }
-      }
-      if (checkReturn) {
-        if (inferrer.instrumentation != null) {
+        break;
+      case ObjectAccessTargetKind.instanceMember:
+      case ObjectAccessTargetKind.invalid:
+      case ObjectAccessTargetKind.unresolved:
+      case ObjectAccessTargetKind.callFunction:
+      case ObjectAccessTargetKind.dynamic:
+      case ObjectAccessTargetKind.never:
+        if (readTarget.isInstanceMember &&
+            inferrer.instrumentation != null &&
+            receiverType == const DynamicType()) {
           inferrer.instrumentation.record(
               inferrer.uriForInstrumentation,
               fileOffset,
-              'checkReturn',
-              new InstrumentationValueForType(readType));
+              'target',
+              new InstrumentationValueForMember(readTarget.member));
         }
-        read = new AsExpression(read, readType)
-          ..isTypeError = true
-          ..isCovarianceCheck = true
-          ..isForNonNullableByDefault = inferrer.isNonNullableByDefault
+        read = new PropertyGet(receiver, propertyName, readTarget.member)
           ..fileOffset = fileOffset;
-      }
-      Member member = readTarget.member;
-      if (member is Procedure && member.kind == ProcedureKind.Method) {
-        return inferrer.instantiateTearOff(readType, typeContext, read);
-      }
+        bool checkReturn = false;
+        if (readTarget.isInstanceMember && !isThisReceiver) {
+          Member interfaceMember = readTarget.member;
+          if (interfaceMember is Procedure) {
+            checkReturn =
+                TypeInferrerImpl.returnedTypeParametersOccurNonCovariantly(
+                    interfaceMember.enclosingClass,
+                    interfaceMember.function.returnType);
+          } else if (interfaceMember is Field) {
+            checkReturn =
+                TypeInferrerImpl.returnedTypeParametersOccurNonCovariantly(
+                    interfaceMember.enclosingClass, interfaceMember.type);
+          }
+        }
+        if (checkReturn) {
+          if (inferrer.instrumentation != null) {
+            inferrer.instrumentation.record(
+                inferrer.uriForInstrumentation,
+                fileOffset,
+                'checkReturn',
+                new InstrumentationValueForType(readType));
+          }
+          read = new AsExpression(read, readType)
+            ..isTypeError = true
+            ..isCovarianceCheck = true
+            ..isForNonNullableByDefault = inferrer.isNonNullableByDefault
+            ..fileOffset = fileOffset;
+        }
+        Member member = readTarget.member;
+        if (member is Procedure && member.kind == ProcedureKind.Method) {
+          return inferrer.instantiateTearOff(readType, typeContext, read);
+        }
+        break;
     }
-    if (inferrer.isNonNullableByDefault) {
+    if (!inferrer.isTopLevel && inferrer.isNonNullableByDefault) {
       if (receiverType is! DynamicType &&
           receiverType is! InvalidType &&
           isPotentiallyNullable(
               receiverType, inferrer.coreTypes.futureOrClass) &&
           !inferrer.matchesObjectMemberCall(
               propertyName, const [], const [], const [])) {
-        if (inferrer.nnbdMode == NnbdMode.Weak) {
-          inferrer.helper.addProblem(
-              templateNullablePropertyAccessWarning.withArguments(
-                  propertyName.name,
-                  receiverType,
-                  inferrer.isNonNullableByDefault),
-              read.fileOffset,
-              propertyName.name.length);
-        } else {
-          return new ExpressionInferenceResult(
-              readType,
-              inferrer.helper.wrapInProblem(
-                  read,
-                  templateNullablePropertyAccessError.withArguments(
-                      propertyName.name,
-                      receiverType,
-                      inferrer.isNonNullableByDefault),
-                  read.fileOffset,
-                  propertyName.name.length));
-        }
+        return new ExpressionInferenceResult(
+            readType,
+            inferrer.helper.wrapInProblem(
+                read,
+                templateNullablePropertyAccessError.withArguments(
+                    propertyName.name,
+                    receiverType,
+                    inferrer.isNonNullableByDefault),
+                read.fileOffset,
+                propertyName.name.length));
       }
     }
     return new ExpressionInferenceResult(readType, read);
@@ -4001,59 +3990,63 @@
     assert(forEffect || valueType != null,
         "No value type provided for property set needed for value.");
     Expression write;
-    if (writeTarget.isMissing) {
-      write = inferrer.createMissingPropertySet(
-          fileOffset, receiver, receiverType, propertyName, value,
-          forEffect: forEffect);
-    } else if (writeTarget.isExtensionMember) {
-      if (forEffect) {
-        write = new StaticInvocation(
-            writeTarget.member,
-            new Arguments(<Expression>[receiver, value],
-                types: writeTarget.inferredExtensionTypeArguments)
-              ..fileOffset = fileOffset)
-          ..fileOffset = fileOffset;
-      } else {
-        VariableDeclaration valueVariable = createVariable(value, valueType);
-        VariableDeclaration assignmentVariable = createVariable(
-            new StaticInvocation(
-                writeTarget.member,
-                new Arguments(
-                    <Expression>[receiver, createVariableGet(valueVariable)],
-                    types: writeTarget.inferredExtensionTypeArguments)
-                  ..fileOffset = fileOffset)
-              ..fileOffset = fileOffset,
-            const VoidType());
-        write = createLet(valueVariable,
-            createLet(assignmentVariable, createVariableGet(valueVariable)))
-          ..fileOffset = fileOffset;
-      }
-    } else {
-      write = new PropertySet(receiver, propertyName, value, writeTarget.member)
-        ..fileOffset = fileOffset;
+    switch (writeTarget.kind) {
+      case ObjectAccessTargetKind.missing:
+        write = inferrer.createMissingPropertySet(
+            fileOffset, receiver, receiverType, propertyName, value,
+            forEffect: forEffect);
+        break;
+      case ObjectAccessTargetKind.ambiguous:
+        write = inferrer.createMissingPropertySet(
+            fileOffset, receiver, receiverType, propertyName, value,
+            forEffect: forEffect,
+            extensionAccessCandidates: writeTarget.candidates);
+        break;
+      case ObjectAccessTargetKind.extensionMember:
+        if (forEffect) {
+          write = new StaticInvocation(
+              writeTarget.member,
+              new Arguments(<Expression>[receiver, value],
+                  types: writeTarget.inferredExtensionTypeArguments)
+                ..fileOffset = fileOffset)
+            ..fileOffset = fileOffset;
+        } else {
+          VariableDeclaration valueVariable = createVariable(value, valueType);
+          VariableDeclaration assignmentVariable = createVariable(
+              new StaticInvocation(
+                  writeTarget.member,
+                  new Arguments(
+                      <Expression>[receiver, createVariableGet(valueVariable)],
+                      types: writeTarget.inferredExtensionTypeArguments)
+                    ..fileOffset = fileOffset)
+                ..fileOffset = fileOffset,
+              const VoidType());
+          write = createLet(valueVariable,
+              createLet(assignmentVariable, createVariableGet(valueVariable)))
+            ..fileOffset = fileOffset;
+        }
+        break;
+      case ObjectAccessTargetKind.instanceMember:
+      case ObjectAccessTargetKind.invalid:
+      case ObjectAccessTargetKind.unresolved:
+      case ObjectAccessTargetKind.callFunction:
+      case ObjectAccessTargetKind.dynamic:
+      case ObjectAccessTargetKind.never:
+        write =
+            new PropertySet(receiver, propertyName, value, writeTarget.member)
+              ..fileOffset = fileOffset;
+        break;
     }
-    if (inferrer.isNonNullableByDefault) {
+    if (!inferrer.isTopLevel && inferrer.isNonNullableByDefault) {
       if (receiverType is! DynamicType &&
           isPotentiallyNullable(
               receiverType, inferrer.coreTypes.futureOrClass)) {
-        if (inferrer.nnbdMode == NnbdMode.Weak) {
-          inferrer.helper.addProblem(
-              templateNullablePropertyAccessWarning.withArguments(
-                  propertyName.name,
-                  receiverType,
-                  inferrer.isNonNullableByDefault),
-              write.fileOffset,
-              propertyName.name.length);
-        } else {
-          return inferrer.helper.wrapInProblem(
-              write,
-              templateNullablePropertyAccessError.withArguments(
-                  propertyName.name,
-                  receiverType,
-                  inferrer.isNonNullableByDefault),
-              write.fileOffset,
-              propertyName.name.length);
-        }
+        return inferrer.helper.wrapInProblem(
+            write,
+            templateNullablePropertyAccessError.withArguments(propertyName.name,
+                receiverType, inferrer.isNonNullableByDefault),
+            write.fileOffset,
+            propertyName.name.length);
       }
     }
 
@@ -4430,7 +4423,6 @@
     }
 
     Expression write;
-
     if (writeTarget.isMissing) {
       write = inferrer.createMissingSuperIndexSet(
           node.writeOffset, writeIndex, valueExpression);
@@ -4572,7 +4564,7 @@
         : const ObjectAccessTarget.missing();
 
     DartType writeIndexType =
-        inferrer.getIndexSetValueType(writeTarget, receiverType);
+        inferrer.getIndexKeyType(writeTarget, receiverType);
     Expression writeIndex = createVariableGet(indexVariable);
     writeIndex = inferrer.ensureAssignable(
         writeIndexType, indexResult.inferredType, writeIndex);
@@ -5159,6 +5151,14 @@
         isVoidAllowed: false);
     node.expression = expressionResult.expression..parent = node;
     DartType expressionType = expressionResult.inferredType;
+
+    Set<Field> enumFields;
+    if (expressionType is InterfaceType && expressionType.classNode.isEnum) {
+      enumFields = expressionType.classNode.fields
+          .where((Field field) => field.isConst && field.type == expressionType)
+          .toSet();
+    }
+
     inferrer.flowAnalysis.switchStatement_expressionEnd(node);
 
     bool hasDefault = false;
@@ -5175,41 +5175,46 @@
         Expression caseExpression = caseExpressionResult.expression;
         switchCase.expressions[index] = caseExpression..parent = switchCase;
         DartType caseExpressionType = caseExpressionResult.inferredType;
+        if (enumFields != null && caseExpression is StaticGet) {
+          enumFields.remove(caseExpression.target);
+        }
 
-        if (inferrer.library.isNonNullableByDefault) {
-          if (!inferrer.typeSchemaEnvironment.isSubtypeOf(caseExpressionType,
-              expressionType, SubtypeCheckMode.withNullabilities)) {
-            inferrer.helper.addProblem(
-                templateSwitchExpressionNotSubtype.withArguments(
-                    caseExpressionType,
-                    expressionType,
-                    inferrer.isNonNullableByDefault),
-                caseExpression.fileOffset,
-                noLength,
-                context: [
-                  messageSwitchExpressionNotAssignableCause.withLocation(
-                      inferrer.uriForInstrumentation,
-                      node.expression.fileOffset,
-                      noLength)
-                ]);
-          }
-        } else {
-          // Check whether the expression type is assignable to the case
-          // expression type.
-          if (!inferrer.isAssignable(expressionType, caseExpressionType)) {
-            inferrer.helper.addProblem(
-                templateSwitchExpressionNotAssignable.withArguments(
-                    expressionType,
-                    caseExpressionType,
-                    inferrer.isNonNullableByDefault),
-                caseExpression.fileOffset,
-                noLength,
-                context: [
-                  messageSwitchExpressionNotAssignableCause.withLocation(
-                      inferrer.uriForInstrumentation,
-                      node.expression.fileOffset,
-                      noLength)
-                ]);
+        if (!inferrer.isTopLevel) {
+          if (inferrer.library.isNonNullableByDefault) {
+            if (!inferrer.typeSchemaEnvironment.isSubtypeOf(caseExpressionType,
+                expressionType, SubtypeCheckMode.withNullabilities)) {
+              inferrer.helper.addProblem(
+                  templateSwitchExpressionNotSubtype.withArguments(
+                      caseExpressionType,
+                      expressionType,
+                      inferrer.isNonNullableByDefault),
+                  caseExpression.fileOffset,
+                  noLength,
+                  context: [
+                    messageSwitchExpressionNotAssignableCause.withLocation(
+                        inferrer.uriForInstrumentation,
+                        node.expression.fileOffset,
+                        noLength)
+                  ]);
+            }
+          } else {
+            // Check whether the expression type is assignable to the case
+            // expression type.
+            if (!inferrer.isAssignable(expressionType, caseExpressionType)) {
+              inferrer.helper.addProblem(
+                  templateSwitchExpressionNotAssignable.withArguments(
+                      expressionType,
+                      caseExpressionType,
+                      inferrer.isNonNullableByDefault),
+                  caseExpression.fileOffset,
+                  noLength,
+                  context: [
+                    messageSwitchExpressionNotAssignableCause.withLocation(
+                        inferrer.uriForInstrumentation,
+                        node.expression.fileOffset,
+                        noLength)
+                  ]);
+            }
           }
         }
       }
@@ -5219,7 +5224,7 @@
         switchCase.body = bodyResult.statement..parent = switchCase;
       }
 
-      if (inferrer.isNonNullableByDefault) {
+      if (!inferrer.isTopLevel && inferrer.isNonNullableByDefault) {
         // The last case block is allowed to complete normally.
         if (caseIndex < node.cases.length - 1 &&
             inferrer.flowAnalysis.isReachable) {
@@ -5228,7 +5233,9 @@
         }
       }
     }
-    inferrer.flowAnalysis.switchStatement_end(hasDefault);
+    bool isExhaustive =
+        hasDefault || (enumFields != null && enumFields.isEmpty);
+    inferrer.flowAnalysis.switchStatement_end(isExhaustive);
     return const StatementInferenceResult();
   }
 
@@ -5252,26 +5259,18 @@
         isVoidAllowed: false);
     node.expression = expressionResult.expression..parent = node;
     inferrer.flowAnalysis.handleExit();
-    if (inferrer.isNonNullableByDefault) {
+    if (!inferrer.isTopLevel && inferrer.isNonNullableByDefault) {
       if (!inferrer.isAssignable(
           inferrer.typeSchemaEnvironment.objectNonNullableRawType,
           expressionResult.inferredType,
           isStrongNullabilityMode: true)) {
-        if (inferrer.nnbdMode == NnbdMode.Weak) {
-          inferrer.helper.addProblem(
-              templateThrowingNotAssignableToObjectWarning.withArguments(
-                  expressionResult.inferredType, true),
-              node.expression.fileOffset,
-              noLength);
-        } else {
-          return new ExpressionInferenceResult(
-              const DynamicType(),
-              inferrer.helper.buildProblem(
-                  templateThrowingNotAssignableToObjectError.withArguments(
-                      expressionResult.inferredType, true),
-                  node.expression.fileOffset,
-                  noLength));
-        }
+        return new ExpressionInferenceResult(
+            const DynamicType(),
+            inferrer.helper.buildProblem(
+                templateThrowingNotAssignableToObjectError.withArguments(
+                    expressionResult.inferredType, true),
+                node.expression.fileOffset,
+                noLength));
       }
     }
     // Return BottomType in legacy mode for compatibility.
@@ -5352,26 +5351,54 @@
   ExpressionInferenceResult visitVariableSet(
       VariableSet node, DartType typeContext) {
     VariableDeclarationImpl variable = node.variable;
-    DartType writeContext = variable.type;
+    bool isDefinitelyAssigned = false;
+    if (inferrer.isNonNullableByDefault) {
+      isDefinitelyAssigned = inferrer.flowAnalysis.isAssigned(variable);
+    }
+    DartType declaredOrInferredType = variable.lateType ?? variable.type;
+    DartType writeContext = declaredOrInferredType;
     ExpressionInferenceResult rhsResult = inferrer.inferExpression(
         node.value, writeContext ?? const UnknownType(), true,
         isVoidAllowed: true);
     Expression rhs = inferrer.ensureAssignableResult(writeContext, rhsResult,
         fileOffset: node.fileOffset, isVoidAllowed: writeContext is VoidType);
     inferrer.flowAnalysis.write(variable, rhsResult.inferredType);
+    DartType resultType = rhsResult.inferredType;
+    Expression resultExpression;
     if (variable.lateSetter != null) {
-      return new ExpressionInferenceResult(
-          rhsResult.inferredType,
-          new MethodInvocation(
-              new VariableGet(variable.lateSetter)
-                ..fileOffset = node.fileOffset,
-              callName,
-              new Arguments(<Expression>[rhs])..fileOffset = node.fileOffset)
-            ..fileOffset = node.fileOffset);
+      resultExpression = new MethodInvocation(
+          new VariableGet(variable.lateSetter)..fileOffset = node.fileOffset,
+          callName,
+          new Arguments(<Expression>[rhs])..fileOffset = node.fileOffset)
+        ..fileOffset = node.fileOffset;
     } else {
       node.value = rhs..parent = node;
-      return new ExpressionInferenceResult(rhsResult.inferredType, node);
+      resultExpression = node;
     }
+    if (!inferrer.isTopLevel && inferrer.isNonNullableByDefault) {
+      // Synthetic variables, local functions, and variables with
+      // invalid types aren't checked.
+      if (variable.name != null &&
+          !variable.isLocalFunction &&
+          declaredOrInferredType is! InvalidType) {
+        if ((variable.isLate && variable.isFinal) ||
+            variable.isLateFinalWithoutInitializer) {
+          if (isDefinitelyAssigned &&
+              isPotentiallyNonNullable(
+                  declaredOrInferredType, inferrer.coreTypes.futureOrClass)) {
+            return new ExpressionInferenceResult(
+                resultType,
+                inferrer.helper.wrapInProblem(
+                    resultExpression,
+                    templateNonNullableLateDefinitelyAssignedError
+                        .withArguments(node.variable.name),
+                    node.fileOffset,
+                    node.variable.name.length));
+          }
+        }
+      }
+    }
+    return new ExpressionInferenceResult(resultType, resultExpression);
   }
 
   @override
@@ -5477,6 +5504,8 @@
       result.add(getter);
 
       if (!node.isFinal || node.initializer == null) {
+        node.isLateFinalWithoutInitializer =
+            node.isFinal && node.initializer == null;
         VariableDeclaration setVariable =
             new VariableDeclaration('#${node.name}#set')
               ..fileOffset = fileOffset;
@@ -5530,46 +5559,6 @@
   ExpressionInferenceResult visitVariableGet(
       covariant VariableGetImpl node, DartType typeContext) {
     VariableDeclarationImpl variable = node.variable;
-    bool isUnassigned = !inferrer.flowAnalysis.isAssigned(variable);
-    if (isUnassigned) {
-      inferrer.dataForTesting?.flowAnalysisResult?.unassignedNodes?.add(node);
-      if (inferrer.isNonNullableByDefault) {
-        // Synthetic variables, local functions, and variables with
-        // invalid types aren't checked.
-        // TODO(dmitryas): Report errors on definitely unassigned late
-        // local variables with potentially non-nullable types.
-        if (variable.name != null &&
-            !variable.isLocalFunction &&
-            variable.type is! InvalidType &&
-            isPotentiallyNonNullable(
-                variable.type, inferrer.coreTypes.futureOrClass) &&
-            !variable.isLate) {
-          if (inferrer.nnbdMode == NnbdMode.Weak) {
-            inferrer.library.addProblem(
-                templateNonNullableNotAssignedWarning
-                    .withArguments(node.variable.name),
-                node.fileOffset,
-                node.variable.name.length,
-                inferrer.helper.uri);
-          } else {
-            return new ExpressionInferenceResult(
-                new InvalidType(),
-                inferrer.helper.wrapInProblem(
-                    node,
-                    templateNonNullableNotAssignedError
-                        .withArguments(node.variable.name),
-                    node.fileOffset,
-                    node.variable.name.length));
-          }
-        }
-      }
-    }
-
-    if (inferrer.flowAnalysis.isUnassigned(variable)) {
-      inferrer.dataForTesting?.flowAnalysisResult?.definitelyUnassignedNodes
-          ?.add(node);
-    }
-
     DartType promotedType;
     DartType declaredOrInferredType = variable.lateType ?? variable.type;
     if (inferrer.isNonNullableByDefault) {
@@ -5595,21 +5584,67 @@
           new InstrumentationValueForType(promotedType));
     }
     node.promotedType = promotedType;
-    DartType type = promotedType ?? declaredOrInferredType;
+    DartType resultType = promotedType ?? declaredOrInferredType;
+    Expression resultExpression;
     if (variable.isLocalFunction) {
-      return inferrer.instantiateTearOff(type, typeContext, node);
+      return inferrer.instantiateTearOff(resultType, typeContext, node);
     } else if (variable.lateGetter != null) {
-      return new ExpressionInferenceResult(
-          type,
-          new MethodInvocation(
-              new VariableGet(variable.lateGetter)
-                ..fileOffset = node.fileOffset,
-              callName,
-              new Arguments(<Expression>[])..fileOffset = node.fileOffset)
-            ..fileOffset = node.fileOffset);
+      resultExpression = new MethodInvocation(
+          new VariableGet(variable.lateGetter)..fileOffset = node.fileOffset,
+          callName,
+          new Arguments(<Expression>[])..fileOffset = node.fileOffset)
+        ..fileOffset = node.fileOffset;
     } else {
-      return new ExpressionInferenceResult(type, node);
+      resultExpression = node;
     }
+    if (!inferrer.isTopLevel) {
+      bool isUnassigned = !inferrer.flowAnalysis.isAssigned(variable);
+      if (isUnassigned) {
+        inferrer.dataForTesting?.flowAnalysisResult?.unassignedNodes?.add(node);
+      }
+      bool isDefinitelyUnassigned =
+          inferrer.flowAnalysis.isUnassigned(variable);
+      if (isDefinitelyUnassigned) {
+        inferrer.dataForTesting?.flowAnalysisResult?.definitelyUnassignedNodes
+            ?.add(node);
+      }
+      if (inferrer.isNonNullableByDefault) {
+        // Synthetic variables, local functions, and variables with
+        // invalid types aren't checked.
+        if (variable.name != null &&
+            !variable.isLocalFunction &&
+            declaredOrInferredType is! InvalidType) {
+          if (variable.isLate || variable.lateGetter != null) {
+            if (isDefinitelyUnassigned &&
+                isPotentiallyNonNullable(
+                    declaredOrInferredType, inferrer.coreTypes.futureOrClass)) {
+              return new ExpressionInferenceResult(
+                  resultType,
+                  inferrer.helper.wrapInProblem(
+                      resultExpression,
+                      templateNonNullableLateDefinitelyUnassignedError
+                          .withArguments(node.variable.name),
+                      node.fileOffset,
+                      node.variable.name.length));
+            }
+          } else {
+            if (isUnassigned &&
+                isPotentiallyNonNullable(
+                    declaredOrInferredType, inferrer.coreTypes.futureOrClass)) {
+              return new ExpressionInferenceResult(
+                  resultType,
+                  inferrer.helper.wrapInProblem(
+                      resultExpression,
+                      templateNonNullableNotAssignedError
+                          .withArguments(node.variable.name),
+                      node.fileOffset,
+                      node.variable.name.length));
+            }
+          }
+        }
+      }
+    }
+    return new ExpressionInferenceResult(resultType, resultExpression);
   }
 
   @override
@@ -5662,7 +5697,7 @@
   ExpressionInferenceResult visitLoadLibrary(
       covariant LoadLibraryImpl node, DartType typeContext) {
     DartType inferredType = inferrer.typeSchemaEnvironment
-        .futureType(const DynamicType(), inferrer.library.nullable);
+        .futureType(const DynamicType(), inferrer.library.nonNullable);
     if (node.arguments != null) {
       FunctionType calleeType =
           new FunctionType([], inferredType, inferrer.library.nonNullable);
@@ -5677,7 +5712,7 @@
     DartType inferredType = new FunctionType(
         [],
         inferrer.typeSchemaEnvironment
-            .futureType(const DynamicType(), inferrer.library.nullable),
+            .futureType(const DynamicType(), inferrer.library.nonNullable),
         inferrer.library.nonNullable);
     Expression replacement = new StaticGet(node.target)
       ..fileOffset = node.fileOffset;
@@ -5794,7 +5829,7 @@
 
   void reportNonNullableInNullAwareWarningIfNeeded(
       DartType operandType, String operationName, int offset) {
-    if (inferrer.isNonNullableByDefault) {
+    if (!inferrer.isTopLevel && inferrer.isNonNullableByDefault) {
       if (operandType is! InvalidType &&
           !isPotentiallyNullable(
               operandType, inferrer.coreTypes.futureOrClass)) {
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 2272377..f74b9ed 100644
--- a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart
@@ -21,7 +21,7 @@
 import 'dart:core' hide MapEntry;
 
 import 'package:kernel/ast.dart';
-import 'package:kernel/text/ast_to_text.dart';
+import 'package:kernel/text/ast_to_text.dart' show Precedence, Printer;
 import 'package:kernel/core_types.dart';
 
 import '../fasta_codes.dart'
@@ -272,6 +272,11 @@
       body?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "ForInStatementWithSynthesizedVariable()";
+  }
 }
 
 class TryStatement extends InternalStatement {
@@ -309,6 +314,11 @@
       finallyBlock?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "TryStatement()";
+  }
 }
 
 class SwitchCaseImpl extends SwitchCase {
@@ -319,6 +329,11 @@
       {bool isDefault: false, this.hasLabel})
       : assert(hasLabel != null),
         super(expressions, expressionOffsets, body, isDefault: isDefault);
+
+  @override
+  String toString() {
+    return "SwitchCaseImpl()";
+  }
 }
 
 class BreakStatementImpl extends BreakStatement {
@@ -328,6 +343,11 @@
   BreakStatementImpl({this.isContinue})
       : assert(isContinue != null),
         super(null);
+
+  @override
+  String toString() {
+    return "BreakStatementImpl()";
+  }
 }
 
 enum InternalExpressionKind {
@@ -455,6 +475,11 @@
     arguments.types.clear();
     arguments._explicitTypeArgumentCount = 0;
   }
+
+  @override
+  String toString() {
+    return "ArgumentsImpl()";
+  }
 }
 
 /// Internal expression representing a cascade expression.
@@ -517,6 +542,11 @@
     }
     transformList(expressions, v, this);
   }
+
+  @override
+  String toString() {
+    return "Cascade()";
+  }
 }
 
 /// Internal expression representing a deferred check.
@@ -556,6 +586,11 @@
       expression?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "DeferredCheck()";
+  }
 }
 
 /// Common base class for shadow objects representing expressions in kernel
@@ -583,6 +618,11 @@
       InferenceVisitor visitor, DartType typeContext) {
     return visitor.visitFactoryConstructorInvocationJudgment(this, typeContext);
   }
+
+  @override
+  String toString() {
+    return "FactoryConstructorInvocationJudgment()";
+  }
 }
 
 /// Front end specific implementation of [FunctionDeclaration].
@@ -597,6 +637,11 @@
       FunctionDeclarationImpl declaration, bool hasImplicitReturnType) {
     declaration.hasImplicitReturnType = hasImplicitReturnType;
   }
+
+  @override
+  String toString() {
+    return "FunctionDeclarationImpl()";
+  }
 }
 
 /// Concrete shadow object representing a super initializer in kernel form.
@@ -613,6 +658,11 @@
   void acceptInference(InferenceVisitor visitor) {
     return visitor.visitInvalidSuperInitializerJudgment(this);
   }
+
+  @override
+  String toString() {
+    return "InvalidSuperInitializerJudgment()";
+  }
 }
 
 /// Internal expression representing an if-null expression.
@@ -656,6 +706,11 @@
       right?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "IfNullExpression()";
+  }
 }
 
 /// Common base class for shadow objects representing initializers in kernel
@@ -704,6 +759,11 @@
       InferenceVisitor visitor, DartType typeContext) {
     return visitor.visitIntJudgment(this, typeContext);
   }
+
+  @override
+  String toString() {
+    return "IntJudgment()";
+  }
 }
 
 class ShadowLargeIntLiteral extends IntLiteral implements ExpressionJudgment {
@@ -733,6 +793,11 @@
       InferenceVisitor visitor, DartType typeContext) {
     return visitor.visitShadowLargeIntLiteral(this, typeContext);
   }
+
+  @override
+  String toString() {
+    return "ShadowLargeIntLiteral()";
+  }
 }
 
 /// Concrete shadow object representing an invalid initializer in kernel form.
@@ -744,6 +809,11 @@
   void acceptInference(InferenceVisitor visitor) {
     return visitor.visitShadowInvalidInitializer(this);
   }
+
+  @override
+  String toString() {
+    return "ShadowInvalidInitializer()";
+  }
 }
 
 /// Concrete shadow object representing an invalid initializer in kernel form.
@@ -762,6 +832,11 @@
   void acceptInference(InferenceVisitor visitor) {
     return visitor.visitShadowInvalidFieldInitializer(this);
   }
+
+  @override
+  String toString() {
+    return "ShadowInvalidFieldInitializer()";
+  }
 }
 
 class ExpressionInvocation extends InternalExpression {
@@ -800,6 +875,11 @@
       arguments?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "ExpressionInvocation()";
+  }
 }
 
 /// Concrete shadow object representing a named function expression.
@@ -821,6 +901,11 @@
       InferenceVisitor visitor, DartType typeContext) {
     return visitor.visitNamedFunctionExpressionJudgment(this, typeContext);
   }
+
+  @override
+  String toString() {
+    return "NamedFunctionExpressionJudgment()";
+  }
 }
 
 /// Internal expression representing a null-aware method invocation.
@@ -868,6 +953,11 @@
       invocation?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "NullAwareMethodInvocation()";
+  }
 }
 
 /// Internal expression representing a null-aware read from a property.
@@ -915,6 +1005,11 @@
       read?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "NullAwarePropertyGet()";
+  }
 }
 
 /// Internal expression representing a null-aware read from a property.
@@ -962,6 +1057,11 @@
       write?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "NullAwarePropertySet()";
+  }
 }
 
 /// Front end specific implementation of [ReturnStatement].
@@ -970,6 +1070,11 @@
 
   ReturnStatementImpl(this.isArrow, [Expression expression])
       : super(expression);
+
+  @override
+  String toString() {
+    return "ReturnStatementImpl()";
+  }
 }
 
 /// Concrete implementation of [TypePromoter] specialized to work with kernel
@@ -1129,6 +1234,12 @@
   // lowering is enabled.
   VariableDeclaration lateSetter;
 
+  // Is `true` if this a lowered late final variable without an initializer.
+  //
+  // This is set in `InferenceVisitor.visitVariableDeclaration` when late
+  // lowering is enabled.
+  bool isLateFinalWithoutInitializer = false;
+
   // The original type (declared or inferred) of a lowered late variable.
   //
   // This is set in `InferenceVisitor.visitVariableDeclaration` when late
@@ -1150,6 +1261,11 @@
       {this.forNullGuardedAccess})
       : assert(forNullGuardedAccess != null),
         super(variable);
+
+  @override
+  String toString() {
+    return "VariableGetImpl()";
+  }
 }
 
 /// Front end specific implementation of [LoadLibrary].
@@ -1157,6 +1273,11 @@
   final Arguments arguments;
 
   LoadLibraryImpl(LibraryDependency import, this.arguments) : super(import);
+
+  @override
+  String toString() {
+    return "LoadLibraryImpl()";
+  }
 }
 
 /// Internal expression representing a tear-off of a `loadLibrary` function.
@@ -1190,6 +1311,11 @@
       target = target.accept<TreeNode>(v);
     }
   }
+
+  @override
+  String toString() {
+    return "LoadLibraryTearOff()";
+  }
 }
 
 /// Internal expression representing an if-null property set.
@@ -1254,6 +1380,11 @@
       write?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "IfNullPropertySet()";
+  }
 }
 
 /// Internal expression representing an if-null assignment.
@@ -1309,6 +1440,11 @@
       write?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "IfNullSet()";
+  }
 }
 
 /// Internal expression representing an compound extension assignment.
@@ -1426,6 +1562,11 @@
       rhs?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "CompoundExtensionSet()";
+  }
 }
 
 /// Internal expression representing an compound property assignment.
@@ -1510,6 +1651,11 @@
       rhs?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "CompoundPropertySet()";
+  }
 }
 
 /// Internal expression representing an compound property assignment.
@@ -1570,6 +1716,11 @@
       write?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "PropertyPostIncDec()";
+  }
 }
 
 /// Internal expression representing an local variable post inc/dec expression.
@@ -1618,6 +1769,11 @@
       write?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "LocalPostIncDec()";
+  }
 }
 
 /// Internal expression representing an static member post inc/dec expression.
@@ -1666,6 +1822,11 @@
       write?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "StaticPostIncDec()";
+  }
 }
 
 /// Internal expression representing an static member post inc/dec expression.
@@ -1714,6 +1875,11 @@
       write?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "SuperPostIncDec()";
+  }
 }
 
 /// Internal expression representing an index get expression.
@@ -1755,6 +1921,11 @@
       index?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "IndexGet()";
+  }
 }
 
 /// Internal expression representing an index set expression.
@@ -1824,6 +1995,11 @@
       value?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "IndexSet()";
+  }
 }
 
 /// Internal expression representing a  super index set expression.
@@ -1880,6 +2056,11 @@
       value?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "SuperIndexSet()";
+  }
 }
 
 /// Internal expression representing an extension index set expression.
@@ -1960,6 +2141,11 @@
       value?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "ExtensionIndexSet()";
+  }
 }
 
 /// Internal expression representing an if-null index assignment.
@@ -2057,6 +2243,11 @@
       value?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "IfNullIndexSet()";
+  }
 }
 
 /// Internal expression representing an if-null super index set expression.
@@ -2139,6 +2330,11 @@
       value?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "IfNullSuperIndexSet()";
+  }
 }
 
 /// Internal expression representing an if-null super index set expression.
@@ -2247,6 +2443,11 @@
       value?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "IfNullExtensionIndexSet()";
+  }
 }
 
 /// Internal expression representing a compound index assignment.
@@ -2340,6 +2541,11 @@
       rhs?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "CompoundIndexSet()";
+  }
 }
 
 /// Internal expression representing a null-aware compound assignment.
@@ -2447,6 +2653,11 @@
       rhs?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "NullAwareCompoundSet()";
+  }
 }
 
 /// Internal expression representing an null-aware if-null property set.
@@ -2529,6 +2740,11 @@
       value?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "NullAwareIfNullSet()";
+  }
 }
 
 /// Internal expression representing a compound super index assignment.
@@ -2615,6 +2831,11 @@
       rhs?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "CompoundSuperIndexSet()";
+  }
 }
 
 /// Internal expression representing a compound extension index assignment.
@@ -2738,6 +2959,11 @@
       rhs?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "CompoundExtensionIndexSet()";
+  }
 }
 
 /// Internal expression representing an assignment to an extension setter.
@@ -2820,6 +3046,11 @@
       value?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "ExtensionSet()";
+  }
 }
 
 /// Internal expression representing an null-aware extension expression.
@@ -2866,6 +3097,11 @@
       expression?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "NullAwareExtension()";
+  }
 }
 
 /// Front end specific implementation of [PropertySet].
@@ -2881,6 +3117,11 @@
       {Member interfaceTarget, this.forEffect, this.readOnlyReceiver})
       : assert(forEffect != null),
         super(receiver, name, value, interfaceTarget);
+
+  @override
+  String toString() {
+    return "PropertySetImpl()";
+  }
 }
 
 /// Internal representation of a read of an extension instance member.
@@ -2927,6 +3168,11 @@
       arguments?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "ExtensionTearOff()";
+  }
 }
 
 /// Internal expression for an equals or not-equals expression.
@@ -2967,6 +3213,11 @@
       right?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "EqualsExpression()";
+  }
 }
 
 /// Internal expression for a binary expression.
@@ -3006,6 +3257,11 @@
       right?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "BinaryExpression()";
+  }
 }
 
 /// Internal expression for a unary expression.
@@ -3038,6 +3294,11 @@
       expression?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "UnaryExpression()";
+  }
 }
 
 /// Internal expression for a parenthesized expression.
@@ -3069,6 +3330,11 @@
       expression?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "ParenthesizedExpression()";
+  }
 }
 
 /// Creates a [Let] of [variable] with the given [body] using
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 b8f1156..4544f76 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -92,15 +92,12 @@
         FormattedMessage,
         messageConstConstructorLateFinalFieldCause,
         messageConstConstructorLateFinalFieldError,
-        messageConstConstructorLateFinalFieldWarning,
         messageConstConstructorNonFinalField,
         messageConstConstructorNonFinalFieldCause,
         messageConstConstructorRedirectionToNonConst,
         noLength,
         templateFieldNonNullableNotInitializedByConstructorError,
-        templateFieldNonNullableNotInitializedByConstructorWarning,
         templateFieldNonNullableWithoutInitializerError,
-        templateFieldNonNullableWithoutInitializerWarning,
         templateFinalFieldNotInitialized,
         templateFinalFieldNotInitializedByConstructor,
         templateInferredPackageUri,
@@ -154,9 +151,12 @@
       new NamedTypeBuilder("Object", const NullabilityBuilder.omitted(), null);
 
   // Null is always nullable.
-  final TypeBuilder bottomType =
+  final TypeBuilder nullType =
       new NamedTypeBuilder("Null", const NullabilityBuilder.nullable(), null);
 
+  final TypeBuilder bottomType =
+      new NamedTypeBuilder("Never", const NullabilityBuilder.omitted(), null);
+
   final bool excludeSource = !CompilerContext.current.options.embedSourceText;
 
   final Map<String, String> environmentDefines =
@@ -278,11 +278,11 @@
     cls.implementedTypes.clear();
     cls.supertype = null;
     cls.mixedInType = null;
-    builder.supertype =
+    builder.supertypeBuilder =
         new NamedTypeBuilder("Object", const NullabilityBuilder.omitted(), null)
           ..bind(objectClassBuilder);
-    builder.interfaces = null;
-    builder.mixedInType = null;
+    builder.interfaceBuilders = null;
+    builder.mixedInTypeBuilder = null;
   }
 
   @override
@@ -294,12 +294,15 @@
       loader.coreLibrary.becomeCoreLibrary();
       dynamicType.bind(
           loader.coreLibrary.lookupLocalMember("dynamic", required: true));
+      bottomType
+          .bind(loader.coreLibrary.lookupLocalMember("Never", required: true));
       loader.resolveParts();
       loader.computeLibraryScopes();
       setupTopAndBottomTypes();
       loader.resolveTypes();
       loader.computeVariances();
-      loader.computeDefaultTypes(dynamicType, bottomType, objectClassBuilder);
+      loader.computeDefaultTypes(
+          dynamicType, nullType, bottomType, objectClassBuilder);
       List<SourceClassBuilder> myClasses =
           loader.checkSemantics(objectClassBuilder);
       loader.finishTypeVariables(objectClassBuilder, dynamicType);
@@ -420,12 +423,12 @@
             Class cls = declaration.cls;
             if (cls != objectClass) {
               cls.supertype ??= objectClass.asRawSupertype;
-              declaration.supertype ??= new NamedTypeBuilder(
+              declaration.supertypeBuilder ??= new NamedTypeBuilder(
                   "Object", const NullabilityBuilder.omitted(), null)
                 ..bind(objectClassBuilder);
             }
             if (declaration.isMixinApplication) {
-              cls.mixedInType = declaration.mixedInType.buildMixedInType(
+              cls.mixedInType = declaration.mixedInTypeBuilder.buildMixedInType(
                   library, declaration.charOffset, declaration.fileUri);
             }
           }
@@ -514,7 +517,7 @@
     /// >that is accessible to LM , C has an implicitly declared constructor
     /// >named q'i = [C/S]qi of the form q'i(ai1,...,aiki) :
     /// >super(ai1,...,aiki);.
-    TypeBuilder type = builder.supertype;
+    TypeBuilder type = builder.supertypeBuilder;
     TypeDeclarationBuilder supertype;
     if (type is NamedTypeBuilder) {
       supertype = type.declaration;
@@ -671,7 +674,7 @@
     ClassBuilder nullClassBuilder =
         loader.coreLibrary.lookupLocalMember("Null", required: true);
     nullClassBuilder.isNullClass = true;
-    bottomType.bind(nullClassBuilder);
+    nullType.bind(nullClassBuilder);
   }
 
   void computeCoreTypes() {
@@ -864,23 +867,13 @@
         SourceLibraryBuilder library = builder.library;
         if (library.isNonNullableByDefault) {
           if (constructor.isConst && lateFinalFields.isNotEmpty) {
-            if (library.loader.nnbdMode == NnbdMode.Weak) {
-              builder.addProblem(messageConstConstructorLateFinalFieldWarning,
-                  constructor.fileOffset, noLength,
-                  context: lateFinalFields
-                      .map((field) => messageConstConstructorLateFinalFieldCause
-                          .withLocation(
-                              field.fileUri, field.charOffset, noLength))
-                      .toList());
-            } else {
-              builder.addProblem(messageConstConstructorLateFinalFieldError,
-                  constructor.fileOffset, noLength,
-                  context: lateFinalFields
-                      .map((field) => messageConstConstructorLateFinalFieldCause
-                          .withLocation(
-                              field.fileUri, field.charOffset, noLength))
-                      .toList());
-            }
+            builder.addProblem(messageConstConstructorLateFinalFieldError,
+                constructor.fileOffset, noLength,
+                context: lateFinalFields
+                    .map((field) =>
+                        messageConstConstructorLateFinalFieldCause.withLocation(
+                            field.fileUri, field.charOffset, noLength))
+                    .toList());
             lateFinalFields.clear();
           }
         }
@@ -950,27 +943,14 @@
               (cls.constructors.isNotEmpty || cls.isMixinDeclaration)) {
             SourceLibraryBuilder library = builder.library;
             if (library.isNonNullableByDefault) {
-              if (library.loader.nnbdMode == NnbdMode.Weak) {
-                library.addProblem(
-                    templateFieldNonNullableWithoutInitializerWarning
-                        .withArguments(
-                            fieldBuilder.name,
-                            fieldBuilder.field.type,
-                            library.isNonNullableByDefault),
-                    fieldBuilder.charOffset,
-                    fieldBuilder.name.length,
-                    fieldBuilder.fileUri);
-              } else {
-                library.addProblem(
-                    templateFieldNonNullableWithoutInitializerError
-                        .withArguments(
-                            fieldBuilder.name,
-                            fieldBuilder.field.type,
-                            library.isNonNullableByDefault),
-                    fieldBuilder.charOffset,
-                    fieldBuilder.name.length,
-                    fieldBuilder.fileUri);
-              }
+              library.addProblem(
+                  templateFieldNonNullableWithoutInitializerError.withArguments(
+                      fieldBuilder.name,
+                      fieldBuilder.field.type,
+                      library.isNonNullableByDefault),
+                  fieldBuilder.charOffset,
+                  fieldBuilder.name.length,
+                  fieldBuilder.fileUri);
             }
           }
         }
@@ -1008,27 +988,13 @@
                   fieldBuilder.field.type, loader.coreTypes.futureOrClass)) {
             SourceLibraryBuilder library = builder.library;
             if (library.isNonNullableByDefault) {
-              if (library.loader.nnbdMode == NnbdMode.Weak) {
-                library.addProblem(
-                    templateFieldNonNullableNotInitializedByConstructorWarning
-                        .withArguments(
-                            fieldBuilder.name,
-                            fieldBuilder.field.type,
-                            library.isNonNullableByDefault),
-                    fieldBuilder.charOffset,
-                    fieldBuilder.name.length,
-                    fieldBuilder.fileUri);
-              } else {
-                library.addProblem(
-                    templateFieldNonNullableNotInitializedByConstructorError
-                        .withArguments(
-                            fieldBuilder.name,
-                            fieldBuilder.field.type,
-                            library.isNonNullableByDefault),
-                    fieldBuilder.charOffset,
-                    fieldBuilder.name.length,
-                    fieldBuilder.fileUri);
-              }
+              library.addProblem(
+                  templateFieldNonNullableNotInitializedByConstructorError
+                      .withArguments(fieldBuilder.name, fieldBuilder.field.type,
+                          library.isNonNullableByDefault),
+                  fieldBuilder.charOffset,
+                  fieldBuilder.name.length,
+                  fieldBuilder.fileUri);
             }
           }
         }
diff --git a/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart b/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
index 6b88bcd..ed0ca4a9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
@@ -129,6 +129,11 @@
     }
     return result;
   }
+
+  @override
+  String toString() {
+    return "RedirectingFactoryBody()";
+  }
 }
 
 bool isRedirectingFactory(Member member, {EnsureLoaded helper}) {
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 43d78d8..90341d9 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -26,8 +26,6 @@
 import 'package:kernel/ast.dart'
     show InvalidType, Nullability, ProcedureKind, Variance;
 
-import '../../base/nnbd_mode.dart';
-
 import '../builder/constructor_reference_builder.dart';
 import '../builder/enum_builder.dart';
 import '../builder/fixed_type_builder.dart';
@@ -585,42 +583,24 @@
       if (supertypeForErrors != null) {
         if (supertypeForErrors.nullabilityBuilder.build(libraryBuilder) ==
             Nullability.nullable) {
-          if (libraryBuilder.loader.nnbdMode == NnbdMode.Weak) {
-            libraryBuilder.addProblem(
-                templateNullableSuperclassWarning
-                    .withArguments(supertypeForErrors.fullNameForErrors),
-                nameOffset,
-                classNameForErrors.length,
-                uri);
-          } else {
-            libraryBuilder.addProblem(
-                templateNullableSuperclassError
-                    .withArguments(supertypeForErrors.fullNameForErrors),
-                nameOffset,
-                classNameForErrors.length,
-                uri);
-          }
+          libraryBuilder.addProblem(
+              templateNullableSuperclassError
+                  .withArguments(supertypeForErrors.fullNameForErrors),
+              nameOffset,
+              classNameForErrors.length,
+              uri);
         }
       }
       if (mixins != null) {
         for (TypeBuilder mixin in mixins) {
           if (mixin.nullabilityBuilder.build(libraryBuilder) ==
               Nullability.nullable) {
-            if (libraryBuilder.loader.nnbdMode == NnbdMode.Weak) {
-              libraryBuilder.addProblem(
-                  templateNullableMixinWarning
-                      .withArguments(mixin.fullNameForErrors),
-                  nameOffset,
-                  classNameForErrors.length,
-                  uri);
-            } else {
-              libraryBuilder.addProblem(
-                  templateNullableMixinError
-                      .withArguments(mixin.fullNameForErrors),
-                  nameOffset,
-                  classNameForErrors.length,
-                  uri);
-            }
+            libraryBuilder.addProblem(
+                templateNullableMixinError
+                    .withArguments(mixin.fullNameForErrors),
+                nameOffset,
+                classNameForErrors.length,
+                uri);
           }
         }
       }
@@ -628,21 +608,12 @@
         for (TypeBuilder interface in interfaces) {
           if (interface.nullabilityBuilder.build(libraryBuilder) ==
               Nullability.nullable) {
-            if (libraryBuilder.loader.nnbdMode == NnbdMode.Weak) {
-              libraryBuilder.addProblem(
-                  templateNullableInterfaceWarning
-                      .withArguments(interface.fullNameForErrors),
-                  nameOffset,
-                  classNameForErrors.length,
-                  uri);
-            } else {
-              libraryBuilder.addProblem(
-                  templateNullableInterfaceError
-                      .withArguments(interface.fullNameForErrors),
-                  nameOffset,
-                  classNameForErrors.length,
-                  uri);
-            }
+            libraryBuilder.addProblem(
+                templateNullableInterfaceError
+                    .withArguments(interface.fullNameForErrors),
+                nameOffset,
+                classNameForErrors.length,
+                uri);
           }
         }
       }
@@ -702,21 +673,12 @@
         for (TypeBuilder supertype in supertypeConstraints) {
           if (supertype.nullabilityBuilder.build(libraryBuilder) ==
               Nullability.nullable) {
-            if (libraryBuilder.loader.nnbdMode == NnbdMode.Weak) {
-              libraryBuilder.addProblem(
-                  templateNullableSuperclassWarning
-                      .withArguments(supertype.fullNameForErrors),
-                  nameOffset,
-                  classNameForErrors.length,
-                  uri);
-            } else {
-              libraryBuilder.addProblem(
-                  templateNullableSuperclassError
-                      .withArguments(supertype.fullNameForErrors),
-                  nameOffset,
-                  classNameForErrors.length,
-                  uri);
-            }
+            libraryBuilder.addProblem(
+                templateNullableSuperclassError
+                    .withArguments(supertype.fullNameForErrors),
+                nameOffset,
+                classNameForErrors.length,
+                uri);
           }
         }
       }
@@ -724,21 +686,12 @@
         for (TypeBuilder interface in interfaces) {
           if (interface.nullabilityBuilder.build(libraryBuilder) ==
               Nullability.nullable) {
-            if (libraryBuilder.loader.nnbdMode == NnbdMode.Weak) {
-              libraryBuilder.addProblem(
-                  templateNullableInterfaceWarning
-                      .withArguments(interface.fullNameForErrors),
-                  nameOffset,
-                  classNameForErrors.length,
-                  uri);
-            } else {
-              libraryBuilder.addProblem(
-                  templateNullableInterfaceError
-                      .withArguments(interface.fullNameForErrors),
-                  nameOffset,
-                  classNameForErrors.length,
-                  uri);
-            }
+            libraryBuilder.addProblem(
+                templateNullableInterfaceError
+                    .withArguments(interface.fullNameForErrors),
+                nameOffset,
+                classNameForErrors.length,
+                uri);
           }
         }
       }
@@ -1241,62 +1194,34 @@
       if (supertype != null && supertype is! MixinApplicationBuilder) {
         if (supertype.nullabilityBuilder.build(libraryBuilder) ==
             Nullability.nullable) {
-          if (libraryBuilder.loader.nnbdMode == NnbdMode.Weak) {
-            libraryBuilder.addProblem(
-                templateNullableSuperclassWarning
-                    .withArguments(supertype.fullNameForErrors),
-                charOffset,
-                classNameForErrors.length,
-                uri);
-          } else {
-            libraryBuilder.addProblem(
-                templateNullableSuperclassError
-                    .withArguments(supertype.fullNameForErrors),
-                charOffset,
-                classNameForErrors.length,
-                uri);
-          }
+          libraryBuilder.addProblem(
+              templateNullableSuperclassError
+                  .withArguments(supertype.fullNameForErrors),
+              charOffset,
+              classNameForErrors.length,
+              uri);
         }
       }
       for (TypeBuilder mixin in mixins) {
         if (mixin.nullabilityBuilder.build(libraryBuilder) ==
             Nullability.nullable) {
-          if (libraryBuilder.loader.nnbdMode == NnbdMode.Weak) {
-            libraryBuilder.addProblem(
-                templateNullableMixinWarning
-                    .withArguments(mixin.fullNameForErrors),
-                charOffset,
-                classNameForErrors.length,
-                uri);
-          } else {
-            libraryBuilder.addProblem(
-                templateNullableMixinError
-                    .withArguments(mixin.fullNameForErrors),
-                charOffset,
-                classNameForErrors.length,
-                uri);
-          }
+          libraryBuilder.addProblem(
+              templateNullableMixinError.withArguments(mixin.fullNameForErrors),
+              charOffset,
+              classNameForErrors.length,
+              uri);
         }
       }
       if (interfaces != null) {
         for (TypeBuilder interface in interfaces) {
           if (interface.nullabilityBuilder.build(libraryBuilder) ==
               Nullability.nullable) {
-            if (libraryBuilder.loader.nnbdMode == NnbdMode.Weak) {
-              libraryBuilder.addProblem(
-                  templateNullableInterfaceWarning
-                      .withArguments(interface.fullNameForErrors),
-                  charOffset,
-                  classNameForErrors.length,
-                  uri);
-            } else {
-              libraryBuilder.addProblem(
-                  templateNullableInterfaceError
-                      .withArguments(interface.fullNameForErrors),
-                  charOffset,
-                  classNameForErrors.length,
-                  uri);
-            }
+            libraryBuilder.addProblem(
+                templateNullableInterfaceError
+                    .withArguments(interface.fullNameForErrors),
+                charOffset,
+                classNameForErrors.length,
+                uri);
           }
         }
       }
@@ -1675,13 +1600,24 @@
             TypeParameterScopeKind.functionType, "<syntax-error>");
         return;
       }
-      if (type is FunctionTypeBuilder) {
-        // TODO(ahe): We need to start a nested declaration when parsing the
-        // formals and return type so we can correctly bind
-        // `type.typeVariables`. A typedef can have type variables, and a new
-        // function type can also have type variables (representing the type of
-        // a generic function).
-        aliasedType = type;
+      if (type is FunctionTypeBuilder &&
+          !libraryBuilder.loader.target.enableNonfunctionTypeAliases) {
+        if (type.nullabilityBuilder.build(libraryBuilder) ==
+                Nullability.nullable &&
+            libraryBuilder.loader.target.enableNonNullable) {
+          // The error is reported when the non-nullable experiment is enabled.
+          // Otherwise, the attempt to use a nullable type will be reported
+          // elsewhere.
+          addProblem(
+              messageTypedefNullableType, equals.charOffset, equals.length);
+        } else {
+          // TODO(ahe): We need to start a nested declaration when parsing the
+          // formals and return type so we can correctly bind
+          // `type.typeVariables`. A typedef can have type variables, and a new
+          // function type can also have type variables (representing the type
+          // of a generic function).
+          aliasedType = type;
+        }
       } else if (libraryBuilder.loader.target.enableNonfunctionTypeAliases) {
         if (type is TypeBuilder) {
           aliasedType = type;
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 a3b5e82..a2f46e2 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
@@ -75,6 +75,9 @@
     show
         Message,
         noLength,
+        messageExtendFunction,
+        messageImplementFunction,
+        messageMixinFunction,
         templateConflictsWithConstructor,
         templateConflictsWithFactory,
         templateConflictsWithMember,
@@ -138,7 +141,7 @@
 
   final List<ConstructorReferenceBuilder> constructorReferences;
 
-  TypeBuilder mixedInType;
+  TypeBuilder mixedInTypeBuilder;
 
   bool isMixinDeclaration;
 
@@ -163,7 +166,7 @@
     Class referencesFrom,
     IndexedClass referencesFromIndexed, {
     Class cls,
-    this.mixedInType,
+    this.mixedInTypeBuilder,
     this.isMixinDeclaration = false,
   })  : actualCls = initializeClass(cls, typeVariables, name, parent,
             startCharOffset, nameOffset, charEndOffset, referencesFrom),
@@ -210,9 +213,19 @@
 
     scope.forEach(buildBuilders);
     constructors.forEach(buildBuilders);
-    supertype = checkSupertype(supertype);
-    actualCls.supertype =
-        supertype?.buildSupertype(library, charOffset, fileUri);
+    supertypeBuilder = checkSupertype(supertypeBuilder);
+    Supertype supertype =
+        supertypeBuilder?.buildSupertype(library, charOffset, fileUri);
+    if (supertype != null) {
+      Class superclass = supertype.classNode;
+      if (superclass.name == 'Function' &&
+          superclass.enclosingLibrary == coreLibrary.library) {
+        library.addProblem(
+            messageExtendFunction, charOffset, noLength, fileUri);
+        supertype = null;
+        supertypeBuilder = null;
+      }
+    }
     if (!isMixinDeclaration &&
         actualCls.supertype != null &&
         actualCls.superclass.isMixinDeclaration) {
@@ -225,27 +238,49 @@
           charOffset,
           noLength,
           fileUri);
-      actualCls.supertype = null;
-    }
-    if (actualCls.supertype == null && supertype is! NamedTypeBuilder) {
       supertype = null;
     }
-    mixedInType = checkSupertype(mixedInType);
-    actualCls.mixedInType =
-        mixedInType?.buildMixedInType(library, charOffset, fileUri);
-    if (actualCls.mixedInType == null && mixedInType is! NamedTypeBuilder) {
-      mixedInType = null;
+    if (supertype == null && supertypeBuilder is! NamedTypeBuilder) {
+      supertypeBuilder = null;
+    }
+    actualCls.supertype = supertype;
+
+    mixedInTypeBuilder = checkSupertype(mixedInTypeBuilder);
+    Supertype mixedInType =
+        mixedInTypeBuilder?.buildMixedInType(library, charOffset, fileUri);
+    if (mixedInType != null) {
+      Class superclass = mixedInType.classNode;
+      if (superclass.name == 'Function' &&
+          superclass.enclosingLibrary == coreLibrary.library) {
+        library.addProblem(messageMixinFunction, charOffset, noLength, fileUri);
+        mixedInType = null;
+        mixedInTypeBuilder = null;
+        actualCls.isAnonymousMixin = false;
+        isMixinDeclaration = false;
+      }
+    }
+    if (mixedInType == null && mixedInTypeBuilder is! NamedTypeBuilder) {
+      mixedInTypeBuilder = null;
     }
     actualCls.isMixinDeclaration = isMixinDeclaration;
+    actualCls.mixedInType = mixedInType;
+
     // TODO(ahe): If `cls.supertype` is null, and this isn't Object, report a
     // compile-time error.
     cls.isAbstract = isAbstract;
-    if (interfaces != null) {
-      for (int i = 0; i < interfaces.length; ++i) {
-        interfaces[i] = checkSupertype(interfaces[i]);
+    if (interfaceBuilders != null) {
+      for (int i = 0; i < interfaceBuilders.length; ++i) {
+        interfaceBuilders[i] = checkSupertype(interfaceBuilders[i]);
         Supertype supertype =
-            interfaces[i].buildSupertype(library, charOffset, fileUri);
+            interfaceBuilders[i].buildSupertype(library, charOffset, fileUri);
         if (supertype != null) {
+          Class superclass = supertype.classNode;
+          if (superclass.name == 'Function' &&
+              superclass.enclosingLibrary == coreLibrary.library) {
+            library.addProblem(
+                messageImplementFunction, charOffset, noLength, fileUri);
+            continue;
+          }
           // TODO(ahe): Report an error if supertype is null.
           actualCls.implementedTypes.add(supertype);
         }
@@ -364,7 +399,7 @@
 
   List<Builder> computeDirectSupertypes(ClassBuilder objectClass) {
     final List<Builder> result = <Builder>[];
-    final TypeBuilder supertype = this.supertype;
+    final TypeBuilder supertype = this.supertypeBuilder;
     if (supertype != null) {
       TypeDeclarationBuilder declarationBuilder = supertype.declaration;
       if (declarationBuilder is TypeAliasBuilder) {
@@ -375,7 +410,7 @@
     } else if (objectClass != this) {
       result.add(objectClass);
     }
-    final List<TypeBuilder> interfaces = this.interfaces;
+    final List<TypeBuilder> interfaces = this.interfaceBuilders;
     if (interfaces != null) {
       for (int i = 0; i < interfaces.length; i++) {
         TypeBuilder interface = interfaces[i];
@@ -387,7 +422,7 @@
         result.add(declarationBuilder);
       }
     }
-    final TypeBuilder mixedInType = this.mixedInType;
+    final TypeBuilder mixedInType = this.mixedInTypeBuilder;
     if (mixedInType != null) {
       TypeDeclarationBuilder declarationBuilder = mixedInType.declaration;
       if (declarationBuilder is TypeAliasBuilder) {
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 d355d3e..78381f8 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
@@ -394,25 +394,23 @@
     for (String testDir in ['/tests/', '/generated_tests/']) {
       int start = path.indexOf(testDir);
       if (start == -1) continue;
-      int end = path.indexOf('/', start + testDir.length + 1);
-      if (end == -1) continue;
-      return optOutTestPaths.contains(path.substring(start, end));
+      String rest = path.substring(start + testDir.length);
+      return optOutTestPaths.any(rest.startsWith);
     }
     return false;
   }
 
-  static final Set<String> optOutTestPaths = {
-    '/tests/co19_2',
-    '/tests/corelib_2',
-    '/tests/language_2',
-    '/tests/lib_2',
-    '/tests/standalone_2',
-    '/generated_tests/co19_2',
-    '/generated_tests/corelib_2',
-    '/generated_tests/language_2',
-    '/generated_tests/lib_2',
-    '/generated_tests/standalone_2',
-  };
+  static const List<String> optOutTestPaths = [
+    'co19_2/',
+    'compiler/dart2js/',
+    'compiler/dart2js_extra/',
+    'compiler/dart2js_native/',
+    'corelib_2/',
+    'ffi_2',
+    'language_2/',
+    'lib_2/',
+    'standalone_2/',
+  ];
 
   LanguageVersion get languageVersion => _languageVersion;
 
@@ -1827,7 +1825,7 @@
           charEndOffset,
           referencesFromClass,
           referencesFromIndexedClass,
-          mixedInType: isMixinDeclaration ? null : mixin,
+          mixedInTypeBuilder: isMixinDeclaration ? null : mixin,
         );
         if (isNamedMixinApplication) {
           loader.target.metadataCollector
@@ -2729,8 +2727,8 @@
     return count;
   }
 
-  int computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder bottomType,
-      ClassBuilder objectClass) {
+  int computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder nullType,
+      TypeBuilder bottomType, ClassBuilder objectClass) {
     int count = 0;
 
     int computeDefaultTypesForVariables(List<TypeVariableBuilder> variables,
@@ -2752,8 +2750,11 @@
         }
 
         if (!haveErroneousBounds) {
-          List<TypeBuilder> calculatedBounds =
-              calculateBounds(variables, dynamicType, bottomType, objectClass);
+          List<TypeBuilder> calculatedBounds = calculateBounds(
+              variables,
+              dynamicType,
+              isNonNullableByDefault ? bottomType : nullType,
+              objectClass);
           for (int i = 0; i < variables.length; ++i) {
             variables[i].defaultType = calculatedBounds[i];
           }
@@ -2926,8 +2927,7 @@
       {bool inferred,
       TypeArgumentsInfo typeArgumentsInfo,
       DartType targetReceiver,
-      String targetName,
-      bool areWarnings = false}) {
+      String targetName}) {
     for (TypeArgumentIssue issue in issues) {
       DartType argument = issue.argument;
       TypeParameter typeParameter = issue.typeParameter;
@@ -2949,27 +2949,16 @@
       } else {
         if (issue.enclosingType == null && targetReceiver != null) {
           if (issueInferred) {
-            Template<
-                    Message Function(
-                        DartType, DartType, String, DartType, String, bool)>
-                template = areWarnings
-                    ? templateIncorrectTypeArgumentQualifiedInferredWarning
-                    : templateIncorrectTypeArgumentQualifiedInferred;
-            message = template.withArguments(
-                argument,
-                typeParameter.bound,
-                typeParameter.name,
-                targetReceiver,
-                targetName,
-                isNonNullableByDefault);
+            message =
+                templateIncorrectTypeArgumentQualifiedInferred.withArguments(
+                    argument,
+                    typeParameter.bound,
+                    typeParameter.name,
+                    targetReceiver,
+                    targetName,
+                    isNonNullableByDefault);
           } else {
-            Template<
-                    Message Function(
-                        DartType, DartType, String, DartType, String, bool)>
-                template = areWarnings
-                    ? templateIncorrectTypeArgumentQualifiedWarning
-                    : templateIncorrectTypeArgumentQualified;
-            message = template.withArguments(
+            message = templateIncorrectTypeArgumentQualified.withArguments(
                 argument,
                 typeParameter.bound,
                 typeParameter.name,
@@ -2983,19 +2972,19 @@
               : getGenericTypeName(issue.enclosingType);
           assert(enclosingName != null);
           if (issueInferred) {
-            Template<Message Function(DartType, DartType, String, String, bool)>
-                template = areWarnings
-                    ? templateIncorrectTypeArgumentInferredWarning
-                    : templateIncorrectTypeArgumentInferred;
-            message = template.withArguments(argument, typeParameter.bound,
-                typeParameter.name, enclosingName, isNonNullableByDefault);
+            message = templateIncorrectTypeArgumentInferred.withArguments(
+                argument,
+                typeParameter.bound,
+                typeParameter.name,
+                enclosingName,
+                isNonNullableByDefault);
           } else {
-            Template<Message Function(DartType, DartType, String, String, bool)>
-                template = areWarnings
-                    ? templateIncorrectTypeArgumentWarning
-                    : templateIncorrectTypeArgument;
-            message = template.withArguments(argument, typeParameter.bound,
-                typeParameter.name, enclosingName, isNonNullableByDefault);
+            message = templateIncorrectTypeArgument.withArguments(
+                argument,
+                typeParameter.bound,
+                typeParameter.name,
+                enclosingName,
+                isNonNullableByDefault);
           }
         }
       }
@@ -3036,25 +3025,14 @@
           fieldType is! InvalidType &&
           isPotentiallyNonNullable(fieldType, typeEnvironment.futureOrClass) &&
           !fieldBuilder.hasInitializer) {
-        if (loader.nnbdMode == NnbdMode.Weak) {
-          addProblem(
-              templateFieldNonNullableWithoutInitializerWarning.withArguments(
-                  fieldBuilder.name,
-                  fieldBuilder.field.type,
-                  isNonNullableByDefault),
-              fieldBuilder.charOffset,
-              fieldBuilder.name.length,
-              fileUri);
-        } else {
-          addProblem(
-              templateFieldNonNullableWithoutInitializerError.withArguments(
-                  fieldBuilder.name,
-                  fieldBuilder.field.type,
-                  isNonNullableByDefault),
-              fieldBuilder.charOffset,
-              fieldBuilder.name.length,
-              fileUri);
-        }
+        addProblem(
+            templateFieldNonNullableWithoutInitializerError.withArguments(
+                fieldBuilder.name,
+                fieldBuilder.field.type,
+                isNonNullableByDefault),
+            fieldBuilder.charOffset,
+            fieldBuilder.name.length,
+            fileUri);
       }
     }
   }
@@ -3071,22 +3049,12 @@
           isPotentiallyNonNullable(
               formal.variable.type, typeEnvironment.futureOrClass) &&
           !formal.hasDeclaredInitializer) {
-        if (loader.nnbdMode == NnbdMode.Weak) {
-          addProblem(
-              templateOptionalNonNullableWithoutInitializerWarning
-                  .withArguments(formal.name, formal.variable.type,
-                      isNonNullableByDefault),
-              formal.charOffset,
-              formal.name.length,
-              formal.fileUri);
-        } else {
-          addProblem(
-              templateOptionalNonNullableWithoutInitializerError.withArguments(
-                  formal.name, formal.variable.type, isNonNullableByDefault),
-              formal.charOffset,
-              formal.name.length,
-              formal.fileUri);
-        }
+        addProblem(
+            templateOptionalNonNullableWithoutInitializerError.withArguments(
+                formal.name, formal.variable.type, isNonNullableByDefault),
+            formal.charOffset,
+            formal.name.length,
+            formal.fileUri);
       }
     }
   }
@@ -3122,64 +3090,44 @@
       }
     }
     if (returnType != null) {
-      Set<TypeArgumentIssue> legacyIssues = findTypeArgumentIssues(returnType,
-              typeEnvironment, SubtypeCheckMode.ignoringNullabilities,
-              allowSuperBounded: true)
-          ?.toSet();
-      Set<TypeArgumentIssue> nnbdIssues = isNonNullableByDefault
-          ? findTypeArgumentIssues(returnType, typeEnvironment,
-                  SubtypeCheckMode.withNullabilities)
-              ?.toSet()
-          : null;
-      if (legacyIssues != null || nnbdIssues != null) {
-        Set<TypeArgumentIssue> mergedIssues = legacyIssues ?? {};
-        if (nnbdIssues != null) {
-          nnbdIssues = nnbdIssues
-              .where((issue) =>
-                  legacyIssues == null || !legacyIssues.contains(issue))
-              .toSet();
-          mergedIssues.addAll(nnbdIssues);
-        }
-        int offset = fileOffset;
-        for (TypeArgumentIssue issue in mergedIssues) {
-          DartType argument = issue.argument;
-          TypeParameter typeParameter = issue.typeParameter;
+      final DartType bottomType = isNonNullableByDefault
+          ? const NeverType(Nullability.nonNullable)
+          : typeEnvironment.nullType;
+      Set<TypeArgumentIssue> issues = {};
+      issues.addAll(findTypeArgumentIssues(returnType, typeEnvironment,
+              SubtypeCheckMode.ignoringNullabilities, bottomType,
+              allowSuperBounded: true) ??
+          const []);
+      if (isNonNullableByDefault) {
+        issues.addAll(findTypeArgumentIssues(returnType, typeEnvironment,
+                SubtypeCheckMode.withNullabilities, bottomType,
+                allowSuperBounded: true) ??
+            const []);
+      }
+      for (TypeArgumentIssue issue in issues) {
+        DartType argument = issue.argument;
+        TypeParameter typeParameter = issue.typeParameter;
 
-          // We don't need to check if [argument] was inferred or specified
-          // here, because inference in return types boils down to instantiate-
-          // -to-bound, and it can't provide a type that violates the bound.
-          if (argument is FunctionType && argument.typeParameters.length > 0) {
-            reportTypeArgumentIssue(
-                messageGenericFunctionTypeUsedAsActualTypeArgument,
-                fileUri,
-                offset,
-                null);
-          } else {
-            void reportProblem(
-                Template<
-                        Message Function(
-                            DartType, DartType, String, String, bool)>
-                    template) {
-              reportTypeArgumentIssue(
-                  template.withArguments(
-                      argument,
-                      typeParameter.bound,
-                      typeParameter.name,
-                      getGenericTypeName(issue.enclosingType),
-                      isNonNullableByDefault),
-                  fileUri,
-                  offset,
-                  typeParameter);
-            }
-
-            nnbdIssues ??= const {};
-            if (nnbdIssues.contains(issue) &&
-                loader.nnbdMode == NnbdMode.Weak) {
-              reportProblem(templateIncorrectTypeArgumentInReturnTypeWarning);
-            } else {
-              reportProblem(templateIncorrectTypeArgumentInReturnType);
-            }
-          }
+        // We don't need to check if [argument] was inferred or specified
+        // here, because inference in return types boils down to instantiate-
+        // -to-bound, and it can't provide a type that violates the bound.
+        if (argument is FunctionType && argument.typeParameters.length > 0) {
+          reportTypeArgumentIssue(
+              messageGenericFunctionTypeUsedAsActualTypeArgument,
+              fileUri,
+              fileOffset,
+              null);
+        } else {
+          reportTypeArgumentIssue(
+              templateIncorrectTypeArgumentInReturnType.withArguments(
+                  argument,
+                  typeParameter.bound,
+                  typeParameter.name,
+                  getGenericTypeName(issue.enclosingType),
+                  isNonNullableByDefault),
+              fileUri,
+              fileOffset,
+              typeParameter);
         }
       }
     }
@@ -3224,28 +3172,21 @@
   void checkBoundsInType(
       DartType type, TypeEnvironment typeEnvironment, Uri fileUri, int offset,
       {bool inferred, bool allowSuperBounded = true}) {
-    Set<TypeArgumentIssue> legacyIssues = findTypeArgumentIssues(
-            type, typeEnvironment, SubtypeCheckMode.ignoringNullabilities,
-            allowSuperBounded: allowSuperBounded)
-        ?.toSet();
-    Set<TypeArgumentIssue> nnbdIssues = isNonNullableByDefault
-        ? findTypeArgumentIssues(
-                type, typeEnvironment, SubtypeCheckMode.withNullabilities,
-                allowSuperBounded: allowSuperBounded)
-            ?.toSet()
-        : null;
-    if (legacyIssues != null) {
-      reportTypeArgumentIssues(legacyIssues, fileUri, offset,
-          inferred: inferred);
+    final DartType bottomType = isNonNullableByDefault
+        ? const NeverType(Nullability.nonNullable)
+        : typeEnvironment.nullType;
+    Set<TypeArgumentIssue> issues = {};
+    issues.addAll(findTypeArgumentIssues(type, typeEnvironment,
+            SubtypeCheckMode.ignoringNullabilities, bottomType,
+            allowSuperBounded: allowSuperBounded) ??
+        const []);
+    if (isNonNullableByDefault) {
+      issues.addAll(findTypeArgumentIssues(type, typeEnvironment,
+              SubtypeCheckMode.withNullabilities, bottomType,
+              allowSuperBounded: allowSuperBounded) ??
+          const []);
     }
-    if (nnbdIssues != null) {
-      if (legacyIssues != null) {
-        nnbdIssues =
-            nnbdIssues.where((issue) => !legacyIssues.contains(issue)).toSet();
-      }
-      reportTypeArgumentIssues(nnbdIssues, fileUri, offset,
-          inferred: inferred, areWarnings: loader.nnbdMode == NnbdMode.Weak);
-    }
+    reportTypeArgumentIssues(issues, fileUri, offset, inferred: inferred);
   }
 
   void checkBoundsInVariableDeclaration(
@@ -3297,46 +3238,39 @@
     List<DartType> arguments = node.arguments.types;
     // The following error is to be reported elsewhere.
     if (parameters.length != arguments.length) return;
-    Set<TypeArgumentIssue> legacyIssues = findTypeArgumentIssuesForInvocation(
+
+    final DartType bottomType = isNonNullableByDefault
+        ? const NeverType(Nullability.nonNullable)
+        : typeEnvironment.nullType;
+    Set<TypeArgumentIssue> issues = {};
+    issues.addAll(findTypeArgumentIssuesForInvocation(
             parameters,
             arguments,
             typeEnvironment,
-            SubtypeCheckMode.ignoringNullabilities)
-        ?.toSet();
-    Set<TypeArgumentIssue> nnbdIssues = isNonNullableByDefault
-        ? findTypeArgumentIssuesForInvocation(parameters, arguments,
-                typeEnvironment, SubtypeCheckMode.withNullabilities)
-            ?.toSet()
-        : null;
-    if (legacyIssues != null) {
+            SubtypeCheckMode.ignoringNullabilities,
+            bottomType) ??
+        const []);
+    if (isNonNullableByDefault) {
+      issues.addAll(findTypeArgumentIssuesForInvocation(
+              parameters,
+              arguments,
+              typeEnvironment,
+              SubtypeCheckMode.withNullabilities,
+              bottomType) ??
+          const []);
+    }
+    if (issues.isNotEmpty) {
       DartType targetReceiver;
       if (klass != null) {
         targetReceiver =
             new InterfaceType(klass, klass.enclosingLibrary.nonNullable);
       }
       String targetName = node.target.name.name;
-      reportTypeArgumentIssues(legacyIssues, fileUri, node.fileOffset,
+      reportTypeArgumentIssues(issues, fileUri, node.fileOffset,
           typeArgumentsInfo: typeArgumentsInfo,
           targetReceiver: targetReceiver,
           targetName: targetName);
     }
-    if (nnbdIssues != null) {
-      DartType targetReceiver;
-      if (klass != null) {
-        targetReceiver =
-            new InterfaceType(klass, klass.enclosingLibrary.nonNullable);
-      }
-      String targetName = node.target.name.name;
-      if (legacyIssues != null) {
-        nnbdIssues =
-            nnbdIssues.where((issue) => !legacyIssues.contains(issue)).toSet();
-      }
-      reportTypeArgumentIssues(nnbdIssues, fileUri, node.fileOffset,
-          typeArgumentsInfo: typeArgumentsInfo,
-          targetReceiver: targetReceiver,
-          targetName: targetName,
-          areWarnings: loader.nnbdMode == NnbdMode.Weak);
-    }
   }
 
   void checkBoundsInMethodInvocation(
@@ -3389,37 +3323,31 @@
       instantiatedMethodParameters[i].bound =
           substitute(methodParameters[i].bound, substitutionMap);
     }
-    Set<TypeArgumentIssue> legacyIssues = findTypeArgumentIssuesForInvocation(
+
+    final DartType bottomType = isNonNullableByDefault
+        ? const NeverType(Nullability.nonNullable)
+        : typeEnvironment.nullType;
+    Set<TypeArgumentIssue> issues = {};
+    issues.addAll(findTypeArgumentIssuesForInvocation(
             instantiatedMethodParameters,
             arguments.types,
             typeEnvironment,
-            SubtypeCheckMode.ignoringNullabilities)
-        ?.toSet();
-    Set<TypeArgumentIssue> nnbdIssues = isNonNullableByDefault
-        ? findTypeArgumentIssuesForInvocation(
-                instantiatedMethodParameters,
-                arguments.types,
-                typeEnvironment,
-                SubtypeCheckMode.withNullabilities)
-            ?.toSet()
-        : null;
-    if (legacyIssues != null) {
-      reportTypeArgumentIssues(legacyIssues, fileUri, offset,
-          typeArgumentsInfo: getTypeArgumentsInfo(arguments),
-          targetReceiver: receiverType,
-          targetName: name.name);
+            SubtypeCheckMode.ignoringNullabilities,
+            bottomType) ??
+        const []);
+    if (isNonNullableByDefault) {
+      issues.addAll(findTypeArgumentIssuesForInvocation(
+              instantiatedMethodParameters,
+              arguments.types,
+              typeEnvironment,
+              SubtypeCheckMode.withNullabilities,
+              bottomType) ??
+          const []);
     }
-    if (nnbdIssues != null) {
-      if (legacyIssues != null) {
-        nnbdIssues =
-            nnbdIssues.where((issue) => !legacyIssues.contains(issue)).toSet();
-      }
-      reportTypeArgumentIssues(nnbdIssues, fileUri, offset,
-          typeArgumentsInfo: getTypeArgumentsInfo(arguments),
-          targetReceiver: receiverType,
-          targetName: name.name,
-          areWarnings: loader.nnbdMode == NnbdMode.Weak);
-    }
+    reportTypeArgumentIssues(issues, fileUri, offset,
+        typeArgumentsInfo: getTypeArgumentsInfo(arguments),
+        targetReceiver: receiverType,
+        targetName: name.name);
   }
 
   void checkTypesInOutline(TypeEnvironment typeEnvironment) {
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 de1fdb5..3c85eb6 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -585,13 +585,13 @@
     ticker.logMs("Computed variances of $count type variables");
   }
 
-  void computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder bottomType,
-      ClassBuilder objectClass) {
+  void computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder nullType,
+      TypeBuilder bottomType, ClassBuilder objectClass) {
     int count = 0;
     builders.forEach((Uri uri, LibraryBuilder library) {
       if (library.loader == this) {
-        count +=
-            library.computeDefaultTypes(dynamicType, bottomType, objectClass);
+        count += library.computeDefaultTypes(
+            dynamicType, nullType, bottomType, objectClass);
       }
     });
     ticker.logMs("Computed default types for $count type variables");
@@ -622,20 +622,20 @@
   void checkObjectClassHierarchy(ClassBuilder objectClass) {
     if (objectClass is SourceClassBuilder &&
         objectClass.library.loader == this) {
-      if (objectClass.supertype != null) {
-        objectClass.supertype = null;
+      if (objectClass.supertypeBuilder != null) {
+        objectClass.supertypeBuilder = null;
         objectClass.addProblem(
             messageObjectExtends, objectClass.charOffset, noLength);
       }
-      if (objectClass.interfaces != null) {
+      if (objectClass.interfaceBuilders != null) {
         objectClass.addProblem(
             messageObjectImplements, objectClass.charOffset, noLength);
-        objectClass.interfaces = null;
+        objectClass.interfaceBuilders = null;
       }
-      if (objectClass.mixedInType != null) {
+      if (objectClass.mixedInTypeBuilder != null) {
         objectClass.addProblem(
             messageObjectMixesIn, objectClass.charOffset, noLength);
-        objectClass.mixedInType = null;
+        objectClass.mixedInTypeBuilder = null;
       }
     }
   }
@@ -763,7 +763,7 @@
     }
 
     // Check that the mixed-in type can be used as a mixin.
-    final TypeBuilder mixedInType = cls.mixedInType;
+    final TypeBuilder mixedInType = cls.mixedInTypeBuilder;
     if (mixedInType != null) {
       bool isClassBuilder = false;
       if (mixedInType is NamedTypeBuilder) {
diff --git a/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart b/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
index bb85651..8a94bac 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
@@ -271,6 +271,9 @@
   /// additionally handles the unknown type that appears during type inference.
   DartType getStandardLowerBound(
       DartType type1, DartType type2, Library clientLibrary) {
+    if (type1 is InvalidType || type2 is InvalidType) {
+      return const InvalidType();
+    }
     if (clientLibrary.isNonNullableByDefault) {
       return _getNullabilityAwareStandardLowerBound(
           type1, type2, clientLibrary);
@@ -555,6 +558,9 @@
   /// additionally handles the unknown type that appears during type inference.
   DartType getStandardUpperBound(
       DartType type1, DartType type2, Library clientLibrary) {
+    if (type1 is InvalidType || type2 is InvalidType) {
+      return const InvalidType();
+    }
     if (clientLibrary.isNonNullableByDefault) {
       return _getNullabilityAwareStandardUpperBound(
           type1, type2, clientLibrary);
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 b0271ce..2970f25 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
@@ -125,6 +125,8 @@
 
   final bool _needToInferReturnType;
 
+  DartType _inferredReturnType;
+
   /// The type that actually appeared as the subexpression of `return` or
   /// `yield` statements inside the function.
   ///
@@ -364,7 +366,56 @@
           returnExpressionTypes[i]);
     }
 
-    return demoteTypeInLibrary(inferredType, inferrer.library.library);
+    return _inferredReturnType =
+        demoteTypeInLibrary(inferredType, inferrer.library.library);
+  }
+
+  StatementInferenceResult handleImplicitReturn(
+      TypeInferrerImpl inferrer,
+      Statement body,
+      StatementInferenceResult inferenceResult,
+      int fileOffset) {
+    if (isGenerator) {
+      // There is no implicit return.
+      return inferenceResult;
+    }
+
+    DartType returnType;
+    if (_needToInferReturnType) {
+      assert(_inferredReturnType != null,
+          "Return type has not yet been inferred.");
+      returnType = _inferredReturnType;
+    } else {
+      returnType = declaredReturnType;
+    }
+    if (isAsync) {
+      returnType = inferrer.typeSchemaEnvironment.unfutureType(returnType);
+    }
+    if (inferrer.library.isNonNullableByDefault &&
+        isPotentiallyNonNullable(
+            returnType, inferrer.coreTypes.futureOrClass) &&
+        inferrer.flowAnalysis.isReachable) {
+      Statement resultStatement =
+          inferenceResult.hasChanged ? inferenceResult.statement : body;
+      // Create a synthetic return statement with the error.
+      Statement returnStatement = new ReturnStatement(inferrer.helper
+          .wrapInProblem(
+              new NullLiteral()..fileOffset = fileOffset,
+              templateImplicitReturnNull.withArguments(
+                  returnType, inferrer.library.isNonNullableByDefault),
+              fileOffset,
+              noLength))
+        ..fileOffset = fileOffset;
+      if (resultStatement is Block) {
+        resultStatement.statements.add(returnStatement);
+      } else {
+        resultStatement =
+            new Block(<Statement>[resultStatement, returnStatement])
+              ..fileOffset = fileOffset;
+      }
+      return new StatementInferenceResult.single(resultStatement);
+    }
+    return inferenceResult;
   }
 
   DartType _wrapAsyncOrGenerator(
@@ -429,8 +480,8 @@
       InferenceHelper helper, DartType declaredType, Expression initializer);
 
   /// Performs type inference on the given function body.
-  Statement inferFunctionBody(InferenceHelper helper, DartType returnType,
-      AsyncMarker asyncMarker, Statement body);
+  Statement inferFunctionBody(InferenceHelper helper, int fileOffset,
+      DartType returnType, AsyncMarker asyncMarker, Statement body);
 
   /// Performs type inference on the given constructor initializer.
   void inferInitializer(InferenceHelper helper, Initializer initializer);
@@ -663,8 +714,7 @@
       {int fileOffset,
       bool isReturnFromAsync: false,
       bool isVoidAllowed: false,
-      Template<Message Function(DartType, DartType, bool)> errorTemplate,
-      Template<Message Function(DartType, DartType, bool)> warningTemplate}) {
+      Template<Message Function(DartType, DartType, bool)> errorTemplate}) {
     assert(contextType != null);
 
     // We don't need to insert assignability checks when doing top level type
@@ -696,8 +746,7 @@
         preciseTypeErrorTemplate = _getPreciseTypeErrorTemplate(expression);
     AssignabilityKind kind = _computeAssignabilityKind(
         contextType, expressionType,
-        isStrongNullabilityMode:
-            isNonNullableByDefault && nnbdMode != NnbdMode.Weak,
+        isNonNullableByDefault: isNonNullableByDefault,
         isVoidAllowed: isVoidAllowed,
         isExpressionTypePrecise: preciseTypeErrorTemplate != null);
 
@@ -752,12 +801,6 @@
             typedTearoff.tearoffType, contextType, errorTemplate);
         break;
       case AssignabilityKind.unassignableCantTearoff:
-        // The first call to _computeAssignabilityKind is done for the purpose
-        // of code generation, and the inability to tear off from a
-        // potentially nullable receiver shouldn't arise as an issue in any
-        // mode other than the strong mode.
-        assert(isNonNullableByDefault && nnbdMode != NnbdMode.Weak);
-
         result = _wrapTearoffErrorExpression(
             expression, contextType, templateNullableTearoffError);
         break;
@@ -765,84 +808,6 @@
         return unhandled("${kind}", "ensureAssignable", fileOffset, helper.uri);
     }
 
-    // Report warnings in weak mode.
-    if (isNonNullableByDefault && nnbdMode == NnbdMode.Weak) {
-      AssignabilityKind weakKind = _computeAssignabilityKind(
-          contextType, expressionType,
-          isStrongNullabilityMode: true,
-          isVoidAllowed: isVoidAllowed,
-          isExpressionTypePrecise: preciseTypeErrorTemplate != null);
-      switch (weakKind) {
-        case AssignabilityKind.assignable:
-          // Do nothing if an error wouldn't be reported in the strong mode.
-          break;
-        case AssignabilityKind.assignableCast:
-          // Do nothing if an error wouldn't be reported in the strong mode.
-          break;
-        case AssignabilityKind.assignableTearoff:
-          // Do nothing if an error wouldn't be reported in the strong mode.
-          break;
-        case AssignabilityKind.assignableTearoffCast:
-          // Do nothing if an error wouldn't be reported in the strong mode.
-          break;
-        case AssignabilityKind.unassignable:
-          // Don't report the same problem twice.
-          if (kind == AssignabilityKind.unassignable) break;
-          if (contextType is! InvalidType && expressionType is! InvalidType) {
-            helper.addProblem(
-                (warningTemplate ?? templateInvalidAssignmentWarning)
-                    .withArguments(
-                        expressionType, contextType, isNonNullableByDefault),
-                fileOffset,
-                noLength);
-          }
-          break;
-        case AssignabilityKind.unassignableVoid:
-          // The NNBD feature can't cause this case..
-          return unhandled(
-              "${kind}", "ensureAssignable:weak", fileOffset, helper.uri);
-        case AssignabilityKind.unassignablePrecise:
-          // The NNBD feature can't cause this case..
-          return unhandled(
-              "${kind}", "ensureAssignable:weak", fileOffset, helper.uri);
-        case AssignabilityKind.unassignableTearoff:
-          // Don't report the same problem twice.
-          if (kind == AssignabilityKind.unassignableTearoff) break;
-
-          // The first handling of the error should have happened in the strong
-          // mode.
-          assert(nnbdMode == NnbdMode.Weak);
-
-          if (contextType is! InvalidType && expressionType is! InvalidType) {
-            TypedTearoff typedTearoff =
-                _tearOffCall(expression, expressionType, fileOffset);
-            helper.addProblem(
-                (warningTemplate ?? templateInvalidAssignmentWarning)
-                    .withArguments(typedTearoff.tearoffType, contextType,
-                        isNonNullableByDefault),
-                fileOffset,
-                noLength);
-          }
-          break;
-        case AssignabilityKind.unassignableCantTearoff:
-          // Don't report the same problem twice.
-          if (kind == AssignabilityKind.unassignableCantTearoff) break;
-
-          // The first handling of the error should have happened in the strong
-          // mode.
-          assert(nnbdMode == NnbdMode.Weak);
-
-          if (isNonNullableByDefault) {
-            result = _wrapTearoffErrorExpression(
-                expression, contextType, templateNullableTearoffWarning);
-          }
-          break;
-        default:
-          return unhandled(
-              "${kind}", "ensureAssignable:weak", fileOffset, helper.uri);
-      }
-    }
-
     return result;
   }
 
@@ -925,10 +890,10 @@
   /// The computation is side-effect free.
   AssignabilityKind _computeAssignabilityKind(
       DartType contextType, DartType expressionType,
-      {bool isStrongNullabilityMode,
+      {bool isNonNullableByDefault,
       bool isVoidAllowed,
       bool isExpressionTypePrecise}) {
-    assert(isStrongNullabilityMode != null);
+    assert(isNonNullableByDefault != null);
     assert(isVoidAllowed != null);
     assert(isExpressionTypePrecise != null);
 
@@ -943,7 +908,7 @@
       if (callMember is Procedure && callMember.kind == ProcedureKind.Method) {
         if (_shouldTearOffCall(contextType, expressionType)) {
           needsTearoff = true;
-          if (isStrongNullabilityMode &&
+          if (isNonNullableByDefault &&
               isPotentiallyNullable(expressionType, coreTypes.futureOrClass)) {
             return AssignabilityKind.unassignableCantTearoff;
           }
@@ -961,7 +926,7 @@
     {
       IsSubtypeOf result = typeSchemaEnvironment
           .performNullabilityAwareSubtypeCheck(expressionType, contextType);
-      bool isDirectlyAssignable = isStrongNullabilityMode
+      bool isDirectlyAssignable = isNonNullableByDefault
           ? result.isSubtypeWhenUsingNullabilities()
           : result.isSubtypeWhenIgnoringNullabilities();
       if (isDirectlyAssignable) {
@@ -971,7 +936,7 @@
       }
     }
 
-    bool isIndirectlyAssignable = isStrongNullabilityMode
+    bool isIndirectlyAssignable = isNonNullableByDefault
         ? expressionType is DynamicType
         : typeSchemaEnvironment
             .performNullabilityAwareSubtypeCheck(contextType, expressionType)
@@ -1156,8 +1121,8 @@
             }
             onType = inferredSubstitution
                 .substituteType(extensionBuilder.extension.onType);
-            List<DartType> instantiateToBoundTypeArguments =
-                calculateBounds(typeParameters, coreTypes.objectClass);
+            List<DartType> instantiateToBoundTypeArguments = calculateBounds(
+                typeParameters, coreTypes.objectClass, library.library);
             Substitution instantiateToBoundsSubstitution =
                 Substitution.fromPairs(
                     typeParameters, instantiateToBoundTypeArguments);
@@ -1168,6 +1133,7 @@
           if (typeSchemaEnvironment.isSubtypeOf(
               receiverType, onType, SubtypeCheckMode.ignoringNullabilities)) {
             ExtensionAccessCandidate candidate = new ExtensionAccessCandidate(
+                thisBuilder ?? otherBuilder,
                 onType,
                 onTypeInstantiateToBounds,
                 thisBuilder != null &&
@@ -1218,8 +1184,9 @@
       if (bestSoFar != null) {
         target = bestSoFar.target;
       } else {
-        // TODO(johnniwinther): Report a better error message when more than
-        // one potential targets were found.
+        if (noneMoreSpecific.isNotEmpty) {
+          target = new AmbiguousExtensionAccessTarget(noneMoreSpecific);
+        }
       }
     }
     return target;
@@ -1378,10 +1345,12 @@
     switch (target.kind) {
       case ObjectAccessTargetKind.callFunction:
         return receiverType;
+      case ObjectAccessTargetKind.invalid:
+        return const InvalidType();
       case ObjectAccessTargetKind.unresolved:
       case ObjectAccessTargetKind.dynamic:
-      case ObjectAccessTargetKind.invalid:
       case ObjectAccessTargetKind.missing:
+      case ObjectAccessTargetKind.ambiguous:
         return const DynamicType();
       case ObjectAccessTargetKind.never:
         return const NeverType(Nullability.nonNullable);
@@ -1488,6 +1457,7 @@
       case ObjectAccessTargetKind.never:
       case ObjectAccessTargetKind.invalid:
       case ObjectAccessTargetKind.missing:
+      case ObjectAccessTargetKind.ambiguous:
         return unknownFunction;
       case ObjectAccessTargetKind.instanceMember:
         return _getFunctionType(
@@ -1551,11 +1521,13 @@
         break;
       case ObjectAccessTargetKind.never:
         return const NeverType(Nullability.nonNullable);
+      case ObjectAccessTargetKind.invalid:
+        return const InvalidType();
       case ObjectAccessTargetKind.callFunction:
       case ObjectAccessTargetKind.unresolved:
       case ObjectAccessTargetKind.dynamic:
-      case ObjectAccessTargetKind.invalid:
       case ObjectAccessTargetKind.missing:
+      case ObjectAccessTargetKind.ambiguous:
         break;
     }
     return const DynamicType();
@@ -1585,12 +1557,14 @@
           return keyType;
         }
         break;
+      case ObjectAccessTargetKind.invalid:
+        return const InvalidType();
       case ObjectAccessTargetKind.callFunction:
       case ObjectAccessTargetKind.unresolved:
       case ObjectAccessTargetKind.dynamic:
       case ObjectAccessTargetKind.never:
-      case ObjectAccessTargetKind.invalid:
       case ObjectAccessTargetKind.missing:
+      case ObjectAccessTargetKind.ambiguous:
         break;
     }
     return const DynamicType();
@@ -1644,12 +1618,14 @@
             throw unhandled('$target', 'getFunctionType', null, null);
         }
         break;
+      case ObjectAccessTargetKind.invalid:
+        return const InvalidType();
       case ObjectAccessTargetKind.callFunction:
       case ObjectAccessTargetKind.unresolved:
       case ObjectAccessTargetKind.dynamic:
       case ObjectAccessTargetKind.never:
-      case ObjectAccessTargetKind.invalid:
       case ObjectAccessTargetKind.missing:
+      case ObjectAccessTargetKind.ambiguous:
         break;
     }
     return const DynamicType();
@@ -1700,12 +1676,14 @@
             throw unhandled('$target', 'getFunctionType', null, null);
         }
         break;
+      case ObjectAccessTargetKind.invalid:
+        return const InvalidType();
       case ObjectAccessTargetKind.callFunction:
       case ObjectAccessTargetKind.unresolved:
       case ObjectAccessTargetKind.dynamic:
       case ObjectAccessTargetKind.never:
-      case ObjectAccessTargetKind.invalid:
       case ObjectAccessTargetKind.missing:
+      case ObjectAccessTargetKind.ambiguous:
         break;
     }
     return const DynamicType();
@@ -1759,9 +1737,11 @@
       case ObjectAccessTargetKind.unresolved:
       case ObjectAccessTargetKind.dynamic:
       case ObjectAccessTargetKind.never:
-      case ObjectAccessTargetKind.invalid:
       case ObjectAccessTargetKind.missing:
+      case ObjectAccessTargetKind.ambiguous:
         return const DynamicType();
+      case ObjectAccessTargetKind.invalid:
+        return const InvalidType();
       case ObjectAccessTargetKind.instanceMember:
         Member interfaceMember = target.member;
         Class memberClass = interfaceMember.enclosingClass;
@@ -1825,61 +1805,6 @@
     }
   }
 
-  /// Adds an "as" check to a [MethodInvocation] if necessary due to
-  /// contravariance.
-  ///
-  /// The returned expression is the [AsExpression], if one was added; otherwise
-  /// it is the [MethodInvocation].
-  Expression handleInvocationContravariance(
-      MethodContravarianceCheckKind checkKind,
-      MethodInvocation desugaredInvocation,
-      Arguments arguments,
-      Expression expression,
-      DartType inferredType,
-      FunctionType functionType,
-      int fileOffset) {
-    switch (checkKind) {
-      case MethodContravarianceCheckKind.checkMethodReturn:
-        AsExpression replacement = new AsExpression(expression, inferredType)
-          ..isTypeError = true
-          ..isCovarianceCheck = true
-          ..isForNonNullableByDefault = isNonNullableByDefault
-          ..fileOffset = fileOffset;
-        if (instrumentation != null) {
-          int offset = arguments.fileOffset == -1
-              ? expression.fileOffset
-              : arguments.fileOffset;
-          instrumentation.record(uriForInstrumentation, offset, 'checkReturn',
-              new InstrumentationValueForType(inferredType));
-        }
-        return replacement;
-      case MethodContravarianceCheckKind.checkGetterReturn:
-        PropertyGet propertyGet = new PropertyGet(desugaredInvocation.receiver,
-            desugaredInvocation.name, desugaredInvocation.interfaceTarget);
-        AsExpression asExpression = new AsExpression(propertyGet, functionType)
-          ..isTypeError = true
-          ..isCovarianceCheck = true
-          ..isForNonNullableByDefault = isNonNullableByDefault
-          ..fileOffset = fileOffset;
-        MethodInvocation replacement = new MethodInvocation(
-            asExpression, callName, desugaredInvocation.arguments);
-        if (instrumentation != null) {
-          int offset = arguments.fileOffset == -1
-              ? expression.fileOffset
-              : arguments.fileOffset;
-          instrumentation.record(
-              uriForInstrumentation,
-              offset,
-              'checkGetterReturn',
-              new InstrumentationValueForType(functionType));
-        }
-        return replacement;
-      case MethodContravarianceCheckKind.none:
-        break;
-    }
-    return expression;
-  }
-
   /// Modifies a type as appropriate when inferring a declared variable's type.
   DartType inferDeclarationType(DartType initializerType,
       {bool forSyntheticVariable: false}) {
@@ -2033,21 +1958,23 @@
   }
 
   @override
-  Statement inferFunctionBody(InferenceHelper helper, DartType returnType,
-      AsyncMarker asyncMarker, Statement body) {
+  Statement inferFunctionBody(InferenceHelper helper, int fileOffset,
+      DartType returnType, AsyncMarker asyncMarker, Statement body) {
     assert(body != null);
     assert(closureContext == null);
     this.helper = helper;
     closureContext = new ClosureContext(this, asyncMarker, returnType, false);
     StatementInferenceResult result = inferStatement(body);
-    closureContext = null;
-    this.helper = null;
     if (dataForTesting != null) {
       if (!flowAnalysis.isReachable) {
         dataForTesting.flowAnalysisResult.functionBodiesThatDontComplete
             .add(body);
       }
     }
+    result =
+        closureContext.handleImplicitReturn(this, body, result, fileOffset);
+    closureContext = null;
+    this.helper = null;
     flowAnalysis.finish();
     return result.hasChanged ? result.statement : body;
   }
@@ -2060,7 +1987,8 @@
       DartType receiverType,
       bool skipTypeArgumentInference: false,
       bool isConst: false,
-      bool isImplicitExtensionMember: false}) {
+      bool isImplicitExtensionMember: false,
+      bool isImplicitCall: false}) {
     assert(
         returnType == null || !containsFreeFunctionTypeVariables(returnType),
         "Return type $returnType contains free variables."
@@ -2090,7 +2018,8 @@
         returnType: returnType,
         skipTypeArgumentInference: skipTypeArgumentInference,
         isConst: isConst,
-        isImplicitExtensionMember: isImplicitExtensionMember);
+        isImplicitExtensionMember: isImplicitExtensionMember,
+        isImplicitCall: isImplicitCall);
   }
 
   InvocationInferenceResult _inferGenericExtensionMethodInvocation(
@@ -2099,13 +2028,14 @@
       int offset,
       FunctionType calleeType,
       Arguments arguments,
-      Node targetName,
+      Name targetName,
       List<VariableDeclaration> hoistedExpressions,
       {bool isOverloadedArithmeticOperator: false,
       DartType receiverType,
       bool skipTypeArgumentInference: false,
       bool isConst: false,
-      bool isImplicitExtensionMember: false}) {
+      bool isImplicitExtensionMember: false,
+      bool isImplicitCall: false}) {
     FunctionType extensionFunctionType = new FunctionType(
         [calleeType.positionalParameters.first],
         const DynamicType(),
@@ -2121,7 +2051,8 @@
         extensionArguments, targetName, hoistedExpressions,
         skipTypeArgumentInference: skipTypeArgumentInference,
         receiverType: receiverType,
-        isImplicitExtensionMember: isImplicitExtensionMember);
+        isImplicitExtensionMember: isImplicitExtensionMember,
+        isImplicitCall: isImplicitCall);
     Substitution extensionSubstitution = Substitution.fromPairs(
         extensionFunctionType.typeParameters, extensionArguments.types);
 
@@ -2146,7 +2077,8 @@
         targetFunctionType, targetArguments, targetName, hoistedExpressions,
         isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
         skipTypeArgumentInference: skipTypeArgumentInference,
-        isConst: isConst);
+        isConst: isConst,
+        isImplicitCall: isImplicitCall);
     arguments.positional.clear();
     arguments.positional.addAll(extensionArguments.positional);
     arguments.positional.addAll(targetArguments.positional);
@@ -2175,7 +2107,8 @@
       DartType returnType,
       bool skipTypeArgumentInference: false,
       bool isConst: false,
-      bool isImplicitExtensionMember: false}) {
+      bool isImplicitExtensionMember: false,
+      bool isImplicitCall}) {
     assert(
         returnType == null || !containsFreeFunctionTypeVariables(returnType),
         "Return type $returnType contains free variables."
@@ -2424,28 +2357,27 @@
         "Inferred return type $inferredType contains free variables."
         "Inferred function type: $calleeType.");
 
-    if (isNonNullableByDefault) {
+    if (!isTopLevel && isNonNullableByDefault) {
       if (receiverType != null &&
           receiverType is! DynamicType &&
           isPotentiallyNullable(receiverType, coreTypes.futureOrClass) &&
           !matchesObjectMemberCall(targetName, inferredTypes,
               positionalArgumentTypes, namedArgumentTypes)) {
-        // Use length 1 for .call -- in most cases its name is skipped.
-        int errorSpanLength =
-            targetName == callName ? noLength : targetName.name.length;
-        if (nnbdMode == NnbdMode.Weak) {
-          helper.addProblem(
-              templateNullableMethodCallWarning.withArguments(
-                  targetName.name, receiverType, isNonNullableByDefault),
+        if (isImplicitCall) {
+          return new WrapInProblemInferenceResult(
+              inferredType,
+              templateNullableExpressionCallError.withArguments(
+                  receiverType, isNonNullableByDefault),
               offset,
-              errorSpanLength);
+              noLength,
+              helper);
         } else {
           return new WrapInProblemInferenceResult(
               inferredType,
               templateNullableMethodCallError.withArguments(
                   targetName.name, receiverType, isNonNullableByDefault),
               offset,
-              errorSpanLength,
+              targetName.name.length,
               helper);
         }
       }
@@ -2571,23 +2503,12 @@
         if ((isOptionalPositional || isOptionalNamed) &&
             isPotentiallyNonNullable(formal.type, coreTypes.futureOrClass) &&
             !formal.hasDeclaredInitializer) {
-          if (nnbdMode == NnbdMode.Weak) {
-            library.addProblem(
-                templateOptionalNonNullableWithoutInitializerWarning
-                    .withArguments(
-                        formal.name, formal.type, isNonNullableByDefault),
-                formal.fileOffset,
-                formal.name.length,
-                library.importUri);
-          } else {
-            library.addProblem(
-                templateOptionalNonNullableWithoutInitializerError
-                    .withArguments(
-                        formal.name, formal.type, isNonNullableByDefault),
-                formal.fileOffset,
-                formal.name.length,
-                library.importUri);
-          }
+          library.addProblem(
+              templateOptionalNonNullableWithoutInitializerError.withArguments(
+                  formal.name, formal.type, isNonNullableByDefault),
+              formal.fileOffset,
+              formal.name.length,
+              library.importUri);
         }
       }
     }
@@ -2596,21 +2517,12 @@
       for (VariableDeclarationImpl formal in function.namedParameters) {
         // Required named parameters shouldn't have initializers.
         if (formal.isRequired && formal.hasDeclaredInitializer) {
-          if (nnbdMode == NnbdMode.Weak) {
-            library.addProblem(
-                templateRequiredNamedParameterHasDefaultValueWarning
-                    .withArguments(formal.name),
-                formal.fileOffset,
-                formal.name.length,
-                library.importUri);
-          } else {
-            library.addProblem(
-                templateRequiredNamedParameterHasDefaultValueError
-                    .withArguments(formal.name),
-                formal.fileOffset,
-                formal.name.length,
-                library.importUri);
-          }
+          library.addProblem(
+              templateRequiredNamedParameterHasDefaultValueError
+                  .withArguments(formal.name),
+              formal.fileOffset,
+              formal.name.length,
+              library.importUri);
         }
       }
     }
@@ -2630,9 +2542,6 @@
         this, function.asyncMarker, returnContext, needToSetReturnType);
     this.closureContext = closureContext;
     StatementInferenceResult bodyResult = inferStatement(function.body);
-    if (bodyResult.hasChanged) {
-      function.body = bodyResult.statement..parent = function;
-    }
 
     // If the closure is declared with `async*` or `sync*`, let `M` be the
     // least upper bound of the types of the `yield` expressions in `B’`, or
@@ -2652,6 +2561,12 @@
           new InstrumentationValueForType(inferredReturnType));
       function.returnType = inferredReturnType;
     }
+    bodyResult = closureContext.handleImplicitReturn(
+        this, function.body, bodyResult, fileOffset);
+
+    if (bodyResult.hasChanged) {
+      function.body = bodyResult.statement..parent = function;
+    }
     this.closureContext = oldClosureContext;
     return function.computeFunctionType(library.nonNullable);
   }
@@ -2704,11 +2619,14 @@
       Name name,
       Arguments arguments,
       DartType typeContext,
-      List<VariableDeclaration> hoistedExpressions) {
+      List<VariableDeclaration> hoistedExpressions,
+      {bool isImplicitCall}) {
+    assert(isImplicitCall != null);
     InvocationInferenceResult result = inferInvocation(
         typeContext, fileOffset, unknownFunction, arguments, name,
         hoistedExpressions: hoistedExpressions,
-        receiverType: const DynamicType());
+        receiverType: const DynamicType(),
+        isImplicitCall: isImplicitCall);
     assert(name != equalsName);
     return createNullAwareExpressionInferenceResult(
         result.inferredType,
@@ -2725,10 +2643,14 @@
       Name name,
       Arguments arguments,
       DartType typeContext,
-      List<VariableDeclaration> hoistedExpressions) {
+      List<VariableDeclaration> hoistedExpressions,
+      {bool isImplicitCall}) {
+    assert(isImplicitCall != null);
     InvocationInferenceResult result = inferInvocation(
         typeContext, fileOffset, unknownFunction, arguments, name,
-        hoistedExpressions: hoistedExpressions, receiverType: receiverType);
+        hoistedExpressions: hoistedExpressions,
+        receiverType: receiverType,
+        isImplicitCall: isImplicitCall);
     assert(name != equalsName);
     return createNullAwareExpressionInferenceResult(
         result.inferredType,
@@ -2748,14 +2670,21 @@
       DartType typeContext,
       List<VariableDeclaration> hoistedExpressions,
       {bool isExpressionInvocation,
+      bool isImplicitCall,
       Name implicitInvocationPropertyName}) {
+    assert(target.isMissing || target.isAmbiguous);
     assert(isExpressionInvocation != null);
+    assert(isImplicitCall != null);
     Expression error = createMissingMethodInvocation(
         fileOffset, receiver, receiverType, name, arguments,
         isExpressionInvocation: isExpressionInvocation,
-        implicitInvocationPropertyName: implicitInvocationPropertyName);
+        implicitInvocationPropertyName: implicitInvocationPropertyName,
+        extensionAccessCandidates:
+            target.isAmbiguous ? target.candidates : null);
     inferInvocation(typeContext, fileOffset, unknownFunction, arguments, name,
-        hoistedExpressions: hoistedExpressions, receiverType: receiverType);
+        hoistedExpressions: hoistedExpressions,
+        receiverType: receiverType,
+        isImplicitCall: isExpressionInvocation || isImplicitCall);
     assert(name != equalsName);
     // TODO(johnniwinther): Use InvalidType instead.
     return createNullAwareExpressionInferenceResult(
@@ -2771,7 +2700,9 @@
       Name name,
       Arguments arguments,
       DartType typeContext,
-      List<VariableDeclaration> hoistedExpressions) {
+      List<VariableDeclaration> hoistedExpressions,
+      {bool isImplicitCall}) {
+    assert(isImplicitCall != null);
     assert(target.isExtensionMember);
     DartType calleeType = getGetterType(target, receiverType);
     FunctionType functionType = getFunctionType(target, receiverType);
@@ -2783,6 +2714,7 @@
           staticInvocation, calleeType, callName, arguments, typeContext,
           hoistedExpressions: hoistedExpressions,
           isExpressionInvocation: false,
+          isImplicitCall: true,
           implicitInvocationPropertyName: name);
     } else {
       StaticInvocation staticInvocation = transformExtensionMethodInvocation(
@@ -2791,7 +2723,8 @@
           fileOffset, functionType, staticInvocation.arguments, name,
           hoistedExpressions: hoistedExpressions,
           receiverType: receiverType,
-          isImplicitExtensionMember: true);
+          isImplicitExtensionMember: true,
+          isImplicitCall: isImplicitCall);
       if (!isTopLevel) {
         library.checkBoundsInStaticInvocation(staticInvocation,
             typeSchemaEnvironment, helper.uri, getTypeArgumentsInfo(arguments));
@@ -2809,12 +2742,16 @@
       ObjectAccessTarget target,
       Arguments arguments,
       DartType typeContext,
-      List<VariableDeclaration> hoistedExpressions) {
+      List<VariableDeclaration> hoistedExpressions,
+      {bool isImplicitCall}) {
+    assert(isImplicitCall != null);
     assert(target.isCallFunction);
     FunctionType functionType = getFunctionType(target, receiverType);
     InvocationInferenceResult result = inferInvocation(
         typeContext, fileOffset, functionType, arguments, callName,
-        hoistedExpressions: hoistedExpressions, receiverType: receiverType);
+        hoistedExpressions: hoistedExpressions,
+        receiverType: receiverType,
+        isImplicitCall: isImplicitCall);
     // TODO(johnniwinther): Check that type arguments against the bounds.
     return createNullAwareExpressionInferenceResult(
         result.inferredType,
@@ -2831,7 +2768,9 @@
       ObjectAccessTarget target,
       Arguments arguments,
       DartType typeContext,
-      List<VariableDeclaration> hoistedExpressions) {
+      List<VariableDeclaration> hoistedExpressions,
+      {bool isImplicitCall}) {
+    assert(isImplicitCall != null);
     assert(target.isInstanceMember);
     Procedure method = target.member;
     assert(method.kind == ProcedureKind.Method,
@@ -2870,7 +2809,9 @@
     }
     InvocationInferenceResult result = inferInvocation(
         typeContext, fileOffset, functionType, arguments, target.member?.name,
-        hoistedExpressions: hoistedExpressions, receiverType: receiverType);
+        hoistedExpressions: hoistedExpressions,
+        receiverType: receiverType,
+        isImplicitCall: isImplicitCall);
 
     Expression replacement;
     if (contravariantCheck) {
@@ -2968,7 +2909,7 @@
       }
     }
     ExpressionInferenceResult invocationResult = inferMethodInvocation(
-        fileOffset,
+        arguments.fileOffset,
         const Link<NullAwareGuard>(),
         propertyGet,
         calleeType,
@@ -2977,6 +2918,7 @@
         typeContext,
         hoistedExpressions: hoistedExpressions,
         isExpressionInvocation: false,
+        isImplicitCall: true,
         implicitInvocationPropertyName: getter.name);
 
     if (isExpressionInvocation) {
@@ -3081,7 +3023,7 @@
     }
 
     ExpressionInferenceResult invocationResult = inferMethodInvocation(
-        fileOffset,
+        arguments.fileOffset,
         const Link<NullAwareGuard>(),
         propertyGet,
         calleeType,
@@ -3089,6 +3031,7 @@
         arguments,
         typeContext,
         isExpressionInvocation: false,
+        isImplicitCall: true,
         hoistedExpressions: hoistedExpressions,
         implicitInvocationPropertyName: field.name);
 
@@ -3134,9 +3077,11 @@
       Arguments arguments,
       DartType typeContext,
       {bool isExpressionInvocation,
+      bool isImplicitCall,
       Name implicitInvocationPropertyName,
       List<VariableDeclaration> hoistedExpressions}) {
     assert(isExpressionInvocation != null);
+    assert(isImplicitCall != null);
     ObjectAccessTarget target = findInterfaceMember(
         receiverType, name, fileOffset,
         instrumented: true, includeExtensionMethods: true);
@@ -3164,7 +3109,8 @@
                 target,
                 arguments,
                 typeContext,
-                hoistedExpressions);
+                hoistedExpressions,
+                isImplicitCall: isImplicitCall);
           }
         } else {
           return _inferInstanceFieldInvocation(
@@ -3181,7 +3127,8 @@
         break;
       case ObjectAccessTargetKind.callFunction:
         return _inferFunctionInvocation(fileOffset, nullAwareGuards, receiver,
-            receiverType, target, arguments, typeContext, hoistedExpressions);
+            receiverType, target, arguments, typeContext, hoistedExpressions,
+            isImplicitCall: isImplicitCall);
       case ObjectAccessTargetKind.extensionMember:
         return _inferExtensionInvocation(
             fileOffset,
@@ -3192,7 +3139,9 @@
             name,
             arguments,
             typeContext,
-            hoistedExpressions);
+            hoistedExpressions,
+            isImplicitCall: isImplicitCall);
+      case ObjectAccessTargetKind.ambiguous:
       case ObjectAccessTargetKind.missing:
         return _inferMissingInvocation(
             fileOffset,
@@ -3205,15 +3154,18 @@
             typeContext,
             hoistedExpressions,
             isExpressionInvocation: isExpressionInvocation,
+            isImplicitCall: isImplicitCall,
             implicitInvocationPropertyName: implicitInvocationPropertyName);
       case ObjectAccessTargetKind.dynamic:
       case ObjectAccessTargetKind.invalid:
       case ObjectAccessTargetKind.unresolved:
         return _inferDynamicInvocation(fileOffset, nullAwareGuards, receiver,
-            name, arguments, typeContext, hoistedExpressions);
+            name, arguments, typeContext, hoistedExpressions,
+            isImplicitCall: isExpressionInvocation || isImplicitCall);
       case ObjectAccessTargetKind.never:
         return _inferNeverInvocation(fileOffset, nullAwareGuards, receiver,
-            receiverType, name, arguments, typeContext, hoistedExpressions);
+            receiverType, name, arguments, typeContext, hoistedExpressions,
+            isImplicitCall: isImplicitCall);
     }
     return unhandled(
         '$target', 'inferMethodInvocation', fileOffset, uriForInstrumentation);
@@ -3604,115 +3556,175 @@
     }
   }
 
+  Expression _reportMissingOrAmbiguousMember(
+      int fileOffset,
+      int length,
+      DartType receiverType,
+      Name name,
+      List<ExtensionAccessCandidate> extensionAccessCandidates,
+      Template<Message Function(String, DartType, bool)> missingTemplate,
+      Template<Message Function(String, DartType, bool)> ambiguousTemplate) {
+    List<LocatedMessage> context;
+    Template<Message Function(String, DartType, bool)> template =
+        missingTemplate;
+    if (extensionAccessCandidates != null) {
+      context = extensionAccessCandidates
+          .map((ExtensionAccessCandidate c) =>
+              messageAmbiguousExtensionCause.withLocation(
+                  c.memberBuilder.fileUri,
+                  c.memberBuilder.charOffset,
+                  name == unaryMinusName ? 1 : c.memberBuilder.name.length))
+          .toList();
+      template = ambiguousTemplate;
+    }
+    return helper.buildProblem(
+        template.withArguments(name.name, resolveTypeParameter(receiverType),
+            isNonNullableByDefault),
+        fileOffset,
+        length,
+        context: context);
+  }
+
   Expression createMissingMethodInvocation(int fileOffset, Expression receiver,
       DartType receiverType, Name name, Arguments arguments,
-      {bool isExpressionInvocation, Name implicitInvocationPropertyName}) {
+      {bool isExpressionInvocation,
+      Name implicitInvocationPropertyName,
+      List<ExtensionAccessCandidate> extensionAccessCandidates}) {
     assert(isExpressionInvocation != null);
     if (isTopLevel) {
       return engine.forest
           .createMethodInvocation(fileOffset, receiver, name, arguments);
     } else if (implicitInvocationPropertyName != null) {
+      assert(extensionAccessCandidates == null);
       return helper.buildProblem(
           templateInvokeNonFunction
               .withArguments(implicitInvocationPropertyName.name),
           fileOffset,
           implicitInvocationPropertyName.name.length);
     } else {
-      return helper.buildProblem(
-          templateUndefinedMethod.withArguments(name.name,
-              resolveTypeParameter(receiverType), isNonNullableByDefault),
+      return _reportMissingOrAmbiguousMember(
           fileOffset,
-          isExpressionInvocation ? noLength : name.name.length);
+          isExpressionInvocation ? noLength : name.name.length,
+          receiverType,
+          name,
+          extensionAccessCandidates,
+          templateUndefinedMethod,
+          templateAmbiguousExtensionMethod);
     }
   }
 
   Expression createMissingPropertyGet(int fileOffset, Expression receiver,
-      DartType receiverType, Name propertyName) {
+      DartType receiverType, Name propertyName,
+      {List<ExtensionAccessCandidate> extensionAccessCandidates}) {
     if (isTopLevel) {
       return engine.forest
           .createPropertyGet(fileOffset, receiver, propertyName);
     } else {
-      return helper.buildProblem(
-          templateUndefinedGetter.withArguments(propertyName.name,
-              resolveTypeParameter(receiverType), isNonNullableByDefault),
+      return _reportMissingOrAmbiguousMember(
           fileOffset,
-          propertyName.name.length);
+          propertyName.name.length,
+          receiverType,
+          propertyName,
+          extensionAccessCandidates,
+          templateUndefinedGetter,
+          templateAmbiguousExtensionProperty);
     }
   }
 
   Expression createMissingPropertySet(int fileOffset, Expression receiver,
       DartType receiverType, Name propertyName, Expression value,
-      {bool forEffect}) {
+      {bool forEffect,
+      List<ExtensionAccessCandidate> extensionAccessCandidates}) {
     assert(forEffect != null);
     if (isTopLevel) {
       return engine.forest.createPropertySet(
           fileOffset, receiver, propertyName, value,
           forEffect: forEffect);
     } else {
-      return helper.buildProblem(
-          templateUndefinedSetter.withArguments(propertyName.name,
-              resolveTypeParameter(receiverType), isNonNullableByDefault),
+      return _reportMissingOrAmbiguousMember(
           fileOffset,
-          propertyName.name.length);
+          propertyName.name.length,
+          receiverType,
+          propertyName,
+          extensionAccessCandidates,
+          templateUndefinedSetter,
+          templateAmbiguousExtensionProperty);
     }
   }
 
   Expression createMissingIndexGet(int fileOffset, Expression receiver,
-      DartType receiverType, Expression index) {
+      DartType receiverType, Expression index,
+      {List<ExtensionAccessCandidate> extensionAccessCandidates}) {
     if (isTopLevel) {
       return engine.forest.createIndexGet(fileOffset, receiver, index);
     } else {
-      return helper.buildProblem(
-          templateUndefinedMethod.withArguments(indexGetName.name,
-              resolveTypeParameter(receiverType), isNonNullableByDefault),
+      return _reportMissingOrAmbiguousMember(
           fileOffset,
-          noLength);
+          noLength,
+          receiverType,
+          indexGetName,
+          extensionAccessCandidates,
+          templateUndefinedOperator,
+          templateAmbiguousExtensionOperator);
     }
   }
 
   Expression createMissingIndexSet(int fileOffset, Expression receiver,
       DartType receiverType, Expression index, Expression value,
-      {bool forEffect, bool readOnlyReceiver}) {
+      {bool forEffect,
+      bool readOnlyReceiver,
+      List<ExtensionAccessCandidate> extensionAccessCandidates}) {
     assert(forEffect != null);
     assert(readOnlyReceiver != null);
     if (isTopLevel) {
       return engine.forest.createIndexSet(fileOffset, receiver, index, value,
           forEffect: forEffect, readOnlyReceiver: readOnlyReceiver);
     } else {
-      return helper.buildProblem(
-          templateUndefinedMethod.withArguments(indexSetName.name,
-              resolveTypeParameter(receiverType), isNonNullableByDefault),
+      return _reportMissingOrAmbiguousMember(
           fileOffset,
-          noLength);
+          noLength,
+          receiverType,
+          indexSetName,
+          extensionAccessCandidates,
+          templateUndefinedOperator,
+          templateAmbiguousExtensionOperator);
     }
   }
 
   Expression createMissingBinary(int fileOffset, Expression left,
-      DartType leftType, Name binaryName, Expression right) {
+      DartType leftType, Name binaryName, Expression right,
+      {List<ExtensionAccessCandidate> extensionAccessCandidates}) {
     assert(binaryName != equalsName);
     if (isTopLevel) {
       return engine.forest.createMethodInvocation(fileOffset, left, binaryName,
           engine.forest.createArguments(fileOffset, <Expression>[right]));
     } else {
-      return helper.buildProblem(
-          templateUndefinedMethod.withArguments(binaryName.name,
-              resolveTypeParameter(leftType), isNonNullableByDefault),
+      return _reportMissingOrAmbiguousMember(
           fileOffset,
-          binaryName.name.length);
+          binaryName.name.length,
+          leftType,
+          binaryName,
+          extensionAccessCandidates,
+          templateUndefinedOperator,
+          templateAmbiguousExtensionOperator);
     }
   }
 
   Expression createMissingUnary(int fileOffset, Expression expression,
-      DartType expressionType, Name unaryName) {
+      DartType expressionType, Name unaryName,
+      {List<ExtensionAccessCandidate> extensionAccessCandidates}) {
     if (isTopLevel) {
       return new UnaryExpression(unaryName, expression)
         ..fileOffset = fileOffset;
     } else {
-      return helper.buildProblem(
-          templateUndefinedMethod.withArguments(unaryName.name,
-              resolveTypeParameter(expressionType), isNonNullableByDefault),
+      return _reportMissingOrAmbiguousMember(
           fileOffset,
-          unaryName == unaryMinusName ? 1 : unaryName.name.length);
+          unaryName == unaryMinusName ? 1 : unaryName.name.length,
+          expressionType,
+          unaryName,
+          extensionAccessCandidates,
+          templateUndefinedOperator,
+          templateAmbiguousExtensionOperator);
     }
   }
 }
@@ -3863,7 +3875,8 @@
       p.bound = substitution.substituteType(p.bound);
     }
     // Use instantiate to bounds.
-    List<DartType> bounds = calculateBounds(parameters, coreTypes.objectClass);
+    List<DartType> bounds = calculateBounds(
+        parameters, coreTypes.objectClass, classNode.enclosingLibrary);
     for (int i = 0; i < mixedInType.typeArguments.length; ++i) {
       mixedInType.typeArguments[i] = bounds[i];
     }
@@ -4101,6 +4114,7 @@
   never,
   invalid,
   missing,
+  ambiguous,
   // TODO(johnniwinther): Remove this.
   unresolved,
 }
@@ -4181,6 +4195,14 @@
   /// Returns `true` if this is an access with no target.
   bool get isMissing => kind == ObjectAccessTargetKind.missing;
 
+  /// Returns `true` if this is an access with no unambiguous target. This
+  /// occurs when an implicit extension access is ambiguous.
+  bool get isAmbiguous => kind == ObjectAccessTargetKind.ambiguous;
+
+  /// Returns the candidates for an ambiguous extension access.
+  List<ExtensionAccessCandidate> get candidates =>
+      throw new UnsupportedError('ObjectAccessTarget.candidates');
+
   /// Returns the original procedure kind, if this is an extension method
   /// target.
   ///
@@ -4223,14 +4245,26 @@
       '$inferredExtensionTypeArguments)';
 }
 
+class AmbiguousExtensionAccessTarget extends ObjectAccessTarget {
+  @override
+  final List<ExtensionAccessCandidate> candidates;
+
+  AmbiguousExtensionAccessTarget(this.candidates)
+      : super.internal(ObjectAccessTargetKind.ambiguous, null);
+
+  @override
+  String toString() => 'AmbiguousExtensionAccessTarget($kind,$candidates)';
+}
+
 class ExtensionAccessCandidate {
+  final MemberBuilder memberBuilder;
   final bool isPlatform;
   final DartType onType;
   final DartType onTypeInstantiateToBounds;
   final ObjectAccessTarget target;
 
-  ExtensionAccessCandidate(
-      this.onType, this.onTypeInstantiateToBounds, this.target,
+  ExtensionAccessCandidate(this.memberBuilder, this.onType,
+      this.onTypeInstantiateToBounds, this.target,
       {this.isPlatform})
       : assert(isPlatform != null);
 
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
index a632f1a..48410b5 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
@@ -86,6 +86,11 @@
 
   @override
   UnknownType withNullability(Nullability nullability) => this;
+
+  @override
+  String toString() {
+    return "UnknownType()";
+  }
 }
 
 /// Visitor that computes [isKnown].
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index adb3a6e..c88c6a6 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -14,6 +14,9 @@
 AbstractRedirectedClassInstantiation/example: Fail
 AccessError/analyzerCode: Fail
 AccessError/example: Fail
+AmbiguousExtensionMethod/analyzerCode: Fail
+AmbiguousExtensionOperator/analyzerCode: Fail
+AmbiguousExtensionProperty/analyzerCode: Fail
 AmbiguousSupertypes/example: Fail
 AnnotationOnEnumConstant/example: Fail
 AnnotationOnFunctionTypeTypeVariable/analyzerCode: Fail
@@ -223,6 +226,8 @@
 ExportOptOutFromOptIn/part_wrapped_script: Fail
 ExpressionNotMetadata/analyzerCode: Fail
 ExpressionNotMetadata/example: Fail
+ExtendFunction/part_wrapped_script: Fail
+ExtendFunction/script: Fail # TODO(johnniwinther): This message is currently ignored.
 ExtendingEnum/example: Fail
 ExtendingRestricted/example: Fail
 ExtendsDynamic/analyzerCode: Fail # Feature not yet in analyzer.
@@ -340,6 +345,8 @@
 IllegalRecursiveType/part_wrapped_script: Fail
 IllegalRecursiveType/script: Fail
 IllegalSyncGeneratorVoidReturnType/analyzerCode: Fail # The analyzer doesn't report this error.
+ImplementFunction/part_wrapped_script: Fail
+ImplementFunction/script: Fail # TODO(johnniwinther): This message is currently ignored.
 ImplementsBeforeExtends/part_wrapped_script: Fail
 ImplementsBeforeExtends/script: Fail
 ImplementsBeforeOn/part_wrapped_script: Fail
@@ -360,6 +367,7 @@
 ImplicitCallOfNonMethod/example: Fail
 ImplicitMixinOverride/analyzerCode: Fail
 ImplicitMixinOverride/example: Fail
+ImplicitReturnNull/analyzerCode: Fail
 ImportAfterPart/part_wrapped_script1: Fail
 ImportAfterPart/script1: Fail
 IncompatibleRedirecteeFunctionType/part_wrapped_script6: Fail
@@ -451,6 +459,8 @@
 MissingPartOf/part_wrapped_script: Fail # Using 'part' in the (now) part.
 MissingPrefixInDeferredImport/example: Fail
 MixinDeclaresConstructor/example: Fail
+MixinFunction/part_wrapped_script: Fail
+MixinFunction/script: Fail # TODO(johnniwinther): This message is currently ignored.
 MixinInferenceNoMatchingClass/example: Fail
 ModifierOutOfOrder/part_wrapped_script1: Fail
 ModifierOutOfOrder/script1: Fail
@@ -482,8 +492,9 @@
 NonNullAwareSpreadIsNull/analyzerCode: Fail # There's no analyzer code for that error yet.
 NonNullableInNullAware/analyzerCode: Fail
 NonNullableInNullAware/example: Fail
+NonNullableLateDefinitelyAssignedError/analyzerCode: Fail
+NonNullableLateDefinitelyUnassignedError/analyzerCode: Fail
 NonNullableNotAssignedError/analyzerCode: Fail
-NonNullableNotAssignedError/example: Fail
 NonNullableNotAssignedWarning/analyzerCode: Fail
 NonNullableNotAssignedWarning/example: Fail
 NonNullableOptOut/analyzerCode: Fail
@@ -540,6 +551,7 @@
 OverrideFewerNamedArguments/example: Fail
 OverrideFewerPositionalArguments/example: Fail
 OverrideMismatchNamedParameter/example: Fail
+OverrideMismatchRequiredNamedParameter/analyzerCode: Fail
 OverrideMoreRequiredArguments/example: Fail
 OverrideTypeMismatchParameter/example: Fail
 OverrideTypeMismatchParameterWarning/example: Fail
@@ -651,6 +663,7 @@
 TypeVariableSameNameAsEnclosing/example: Fail
 TypedefNotFunction/example: Fail
 TypedefNotType/example: Fail # Feature not yet enabled by default.
+TypedefNullableType/analyzerCode: Fail
 UnexpectedToken/part_wrapped_script1: Fail
 UnexpectedToken/script1: Fail
 UnmatchedToken/part_wrapped_script1: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 12dc0e6..a2740b1 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -2007,6 +2007,10 @@
   template: "This is the inherited member."
   severity: CONTEXT
 
+DeclaredMemberConflictsWithInheritedMembersCause:
+  template: "This is one of the inherited members."
+  severity: CONTEXT
+
 InheritedMembersConflict:
   template: "Can't inherit members that conflict with each other."
   analyzerCode: CONFLICTS_WITH_INHERITED_MEMBER
@@ -2080,31 +2084,25 @@
   tip: "Change to a supertype of '#type2', or, for a covariant parameter, a subtype."
   analyzerCode: INVALID_METHOD_OVERRIDE
 
-OverrideTypeMismatchParameterWarning:
-  template: "The parameter '#name' of the method '#name2' has type '#type', which does not match the corresponding type, '#type2', in the overridden method, '#name3'."
-  tip: "Change to a supertype of '#type2', or, for a covariant parameter, a subtype."
-  severity: WARNING
-  analyzerCode: INVALID_METHOD_OVERRIDE
-
 OverrideTypeMismatchReturnType:
   template: "The return type of the method '#name' is '#type', which does not match the return type, '#type2', of the overridden method, '#name2'."
   tip: "Change to a subtype of '#type2'."
   analyzerCode: INVALID_METHOD_OVERRIDE
 
-OverrideTypeMismatchReturnTypeWarning:
-  template: "The return type of the method '#name' is '#type', which does not match the return type, '#type2', of the overridden method, '#name2'."
-  tip: "Change to a subtype of '#type2'."
-  severity: WARNING
-  analyzerCode: INVALID_METHOD_OVERRIDE
-
 OverrideTypeMismatchSetter:
   template: "The field '#name' has type '#type', which does not match the corresponding type, '#type2', in the overridden setter, '#name2'."
   analyzerCode: INVALID_METHOD_OVERRIDE
 
-OverrideTypeMismatchSetterWarning:
-  template: "The field '#name' has type '#type', which does not match the corresponding type, '#type2', in the overridden setter, '#name2'."
-  severity: WARNING
-  analyzerCode: INVALID_METHOD_OVERRIDE
+OverrideMismatchRequiredNamedParameter:
+  template: "The required named parameter '#name' in method '#name2' is not required in overridden method '#name3'."
+  configuration: nnbd-strong
+  script: |
+    abstract class A {
+      method({int? a});
+    }
+    abstract class B implements A {
+      method({required int? a});
+    }
 
 PartOfSelf:
   template: "A file can't be a part of itself."
@@ -2198,6 +2196,11 @@
   template: "Can't create typedef from non-type."
   analyzerCode: INVALID_TYPE_IN_TYPEDEF
 
+TypedefNullableType:
+  template: "Can't create typedef from nullable type."
+  configuration: nnbd-strong
+  script: typedef F = void Function()?;
+
 LibraryDirectiveNotFirst:
   index: 37
   template: "The library directive must appear before all other directives."
@@ -2781,10 +2784,6 @@
 ConstConstructorLateFinalFieldError:
   template: "Constructor is marked 'const' so fields can't be late."
 
-ConstConstructorLateFinalFieldWarning:
-  template: "Constructor is marked 'const' and some fields are late."
-  severity: WARNING
-
 ConstConstructorLateFinalFieldCause:
   template: "Field is late, but constructor is 'const'."
   severity: CONTEXT
@@ -2923,10 +2922,6 @@
       i = 1.5;
     }
 
-InvalidAssignmentWarning:
-  template: "Assigning value of type '#type' to a variable of type '#type2'."
-  severity: WARNING
-
 PatchClassTypeVariablesMismatch:
   template: "A patch class must have the same number of type variables as its origin class."
 
@@ -3031,6 +3026,57 @@
       c.foo();
     }
 
+UndefinedOperator:
+  template: "The operator '#name' isn't defined for the class '#type'."
+  tip: "Try correcting the operator to an existing operator, or defining a '#name' operator."
+  analyzerCode: UNDEFINED_METHOD
+  script: >
+    class C {}
+    main() {
+      C c;
+      c + 0;
+    }
+
+AmbiguousExtensionMethod:
+  template: "The method '#name' is defined in multiple extensions for '#type' and neither is more specific."
+  tip: "Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope."
+  script: |
+    class C {}
+    extension A on C { method() {} }
+    extension B on C { method() {} }
+    main() {
+      C c = new C();
+      c.method();
+    }
+
+AmbiguousExtensionProperty:
+  template: "The property '#name' is defined in multiple extensions for '#type' and neither is more specific."
+  tip: "Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope."
+  script: |
+    class C {}
+    extension A on C { get property => null; }
+    extension B on C { set property(_) {} }
+    main() {
+      C c = new C();
+      c.property;
+    }
+
+AmbiguousExtensionOperator:
+  template: "The operator '#name' is defined in multiple extensions for '#type' and neither is more specific."
+  tip: "Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope."
+  script: |
+    class C {}
+    extension A on C { operator +(int i) {} }
+    extension B on C { operator +(int i) {}  }
+    main() {
+      C c = new C();
+      c + 0;
+    }
+
+AmbiguousExtensionCause:
+  template: "This is one of the extension members."
+  severity: CONTEXT
+
 SourceOutlineSummary:
   template: |
     Built outlines for #count compilation units (#count2 bytes) in #num1%.3ms, that is,
@@ -3301,6 +3347,12 @@
   analyzerCode: RETURN_WITHOUT_VALUE
   declaration: "int foo() { return; }"
 
+ImplicitReturnNull:
+  template: "A non-null value must be returned since the return type '#type' doesn't allow null."
+  configuration: nnbd-strong
+  script: |
+    String method() {}
+
 RethrowNotCatch:
   template: "'rethrow' can only be used in catch clauses."
   analyzerCode: RETHROW_OUTSIDE_CATCH
@@ -3395,11 +3447,6 @@
       }
       class B<T extends int, S extends String> implements A<T> {}
 
-IncompatibleRedirecteeFunctionTypeWarning:
-  template: "The constructor function type '#type' isn't a subtype of '#type2'."
-  severity: WARNING
-  analyzerCode: REDIRECT_TO_INVALID_TYPE
-
 RedirectingFactoryIncompatibleTypeArgument:
   template: "The type '#type' doesn't extend '#type2'."
   tip: "Try using a different type as argument."
@@ -3411,12 +3458,6 @@
       }
       class B<T extends int, S extends String> implements A<T> {}
 
-RedirectingFactoryIncompatibleTypeArgumentWarning:
-  template: "The type '#type' doesn't extend '#type2'."
-  tip: "Try using a different type as argument."
-  severity: WARNING
-  analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-
 SyntheticToken:
   template: "This couldn't be parsed."
   frontendInternal: true
@@ -3429,12 +3470,6 @@
     class C<T extends num> {}
     main() { new C<String>(); }
 
-IncorrectTypeArgumentWarning:
-  template: "Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2'."
-  tip: "Try changing type arguments so that they conform to the bounds."
-  severity: WARNING
-  analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-
 IncorrectTypeArgumentQualified:
   template: "Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#type3.#name2'."
   tip: "Try changing type arguments so that they conform to the bounds."
@@ -3443,12 +3478,6 @@
     class C<T> { foo<U extends num>() {} }
     main() { new C<String>().foo<String>(); }
 
-IncorrectTypeArgumentQualifiedWarning:
-  template: "Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#type3.#name2'."
-  tip: "Try changing type arguments so that they conform to the bounds."
-  severity: WARNING
-  analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-
 IncorrectTypeArgumentInSupertype:
   template: "Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the supertype '#name3' of class '#name4'."
   tip: "Try changing type arguments so that they conform to the bounds."
@@ -3457,12 +3486,6 @@
     class A<T extends num> {}
     class B extends A<String> {}
 
-IncorrectTypeArgumentInSupertypeWarning:
-  template: "Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the supertype '#name3' of class '#name4'."
-  tip: "Try changing type arguments so that they conform to the bounds."
-  severity: WARNING
-  analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-
 IncorrectTypeArgumentInReturnType:
   template: "Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the return type."
   tip: "Try changing type arguments so that they conform to the bounds."
@@ -3471,12 +3494,6 @@
     class A<T extends num> {}
     A<String> foo() => null;
 
-IncorrectTypeArgumentInReturnTypeWarning:
-  template: "Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the return type."
-  tip: "Try changing type arguments so that they conform to the bounds."
-  severity: WARNING
-  analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-
 IncorrectTypeArgumentInferred:
   template: "Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2'."
   tip: "Try specifying type arguments explicitly so that they conform to the bounds."
@@ -3485,12 +3502,6 @@
     void foo<T extends num>(T t) {}
     main() { foo("bar"); }
 
-IncorrectTypeArgumentInferredWarning:
-  template: "Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2'."
-  tip: "Try specifying type arguments explicitly so that they conform to the bounds."
-  severity: WARNING
-  analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-
 IncorrectTypeArgumentQualifiedInferred:
   template: "Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#type3.#name2'."
   tip: "Try specifying type arguments explicitly so that they conform to the bounds."
@@ -3499,12 +3510,6 @@
     class C<T> { foo<U extends num>(U u) {} }
     main() { new C<String>().foo(""); }
 
-IncorrectTypeArgumentQualifiedInferredWarning:
-  template: "Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#type3.#name2'."
-  tip: "Try specifying type arguments explicitly so that they conform to the bounds."
-  severity: WARNING
-  analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-
 IncorrectTypeArgumentInSupertypeInferred:
   template: "Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the supertype '#name3' of class '#name4'."
   tip: "Try specifying type arguments explicitly so that they conform to the bounds."
@@ -3513,12 +3518,6 @@
     class A<T extends A<T>> {}
     class B extends A {}
 
-IncorrectTypeArgumentInSupertypeInferredWarning:
-  template: "Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the supertype '#name3' of class '#name4'."
-  tip: "Try specifying type arguments explicitly so that they conform to the bounds."
-  severity: WARNING
-  analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-
 IncorrectTypeArgumentVariable:
   template: "This is the type variable whose bound isn't conformed to."
   severity: CONTEXT
@@ -3894,64 +3893,29 @@
   template: "Property '#name' cannot be accessed on '#type' because it is potentially null."
   tip: "Try accessing using ?. instead."
 
-NullablePropertyAccessWarning:
-  template: "Property '#name' is accessed on '#type' which is potentially null."
-  tip: "Try accessing using ?. instead."
-  severity: WARNING
-
 NullableMethodCallError:
   template: "Method '#name' cannot be called on '#type' because it is potentially null."
   tip: "Try calling using ?. instead."
 
-NullableMethodCallWarning:
-  template: "Method '#name' is called on '#type' which is potentially null."
-  tip: "Try calling using ?. instead."
-  severity: WARNING
-
 NullableExpressionCallError:
   template: "Can't use an expression of type '#type' as a function because it's potentially null."
   tip: "Try calling using ?.call instead."
 
-NullableExpressionCallWarning:
-  template: "Expression of type '#type' is used as a function, but it's potentially null."
-  tip: "Try calling using ?.call instead."
-  severity: WARNING
-
 NullableOperatorCallError:
   template: "Operator '#name' cannot be called on '#type' because it is potentially null."
 
-NullableOperatorCallWarning:
-  template: "Operator '#name' is called on '#type' which is potentially null."
-  severity: WARNING
-
 NullableTearoffError:
   template: "Can't tear off method '#name' from a potentially null value."
 
-NullableTearoffWarning:
-  template: "Tearing off method '#name' from a potentially null value."
-  severity: WARNING
-
 ThrowingNotAssignableToObjectError:
   template: "Can't throw a value of '#type' since it is neither dynamic nor non-nullable."
 
-ThrowingNotAssignableToObjectWarning:
-  template: "Throwing a value of '#type' that is neither dynamic nor non-nullable."
-  severity: WARNING
-
 RequiredNamedParameterHasDefaultValueError:
   template: "Named parameter '#name' is required and can't have a default value."
 
-RequiredNamedParameterHasDefaultValueWarning:
-  template: "Named parameter '#name' is required and has a default value."
-  severity: WARNING
-
 ValueForRequiredParameterNotProvidedError:
   template: "Required named parameter '#name' must be provided."
 
-ValueForRequiredParameterNotProvidedWarning:
-  template: "Missing required named parameter '#name'."
-  severity: WARNING
-
 OptionalNonNullableWithoutInitializerError:
   template: "Optional parameter '#name' should have a default value because its type '#type' doesn't allow null."
   configuration: nnbd-strong
@@ -3959,28 +3923,12 @@
     - method1({int a}) {}
     - method2([int a]) {}
 
-OptionalNonNullableWithoutInitializerWarning:
-  template: "Optional parameter '#name' doesn't have a default value and its type '#type' doesn't allow null."
-  configuration: nnbd-weak
-  severity: WARNING
-  script:
-    - method1({int a}) {}
-    - method2([int a]) {}
-
 FieldNonNullableWithoutInitializerError:
   template: "Field '#name' should be initialized because its type '#type' doesn't allow null."
 
-FieldNonNullableWithoutInitializerWarning:
-  template: "Field '#name' isn't initialized and its type '#type' doesn't allow null."
-  severity: WARNING
-
 FieldNonNullableNotInitializedByConstructorError:
   template: "This constructor should initialize field '#name' because its type '#type' doesn't allow null."
 
-FieldNonNullableNotInitializedByConstructorWarning:
-  template: "This constructor doesn't initialize field '#name' and its type '#type' doesn't allow null."
-  severity: WARNING
-
 NonNullableOptOut:
   template: "Null safety features are disabled for this library."
   # Used to be this:
@@ -3998,24 +3946,12 @@
 NullableSuperclassError:
   template: "Can't extend '#name' because it's marked with '?'."
 
-NullableSuperclassWarning:
-  template: "Extending '#name' marked with '?'."
-  severity: WARNING
-
 NullableInterfaceError:
   template: "Can't implement '#name' because it's marked with '?'."
 
-NullableInterfaceWarning:
-  template: "Implementing '#name' marked with '?'."
-  severity: WARNING
-
 NullableMixinError:
   template: "Can't mix '#name' in because it's marked with '?'."
 
-NullableMixinWarning:
-  template: "Mixing in '#name' marked with '?'."
-  severity: WARNING
-
 JsInteropIndexNotSupported:
   template: "JS interop classes do not support [] and []= operator methods."
   tip: "Try replacing with a normal method."
@@ -4028,21 +3964,35 @@
   template: "Can't use the default List constructor."
   tip: "Try using List.filled instead."
 
-DefaultListConstructorWarning:
-  template: "Using the default List constructor."
-  tip: "Try using List.filled instead."
-  severity: WARNING
-
 NonNullableInNullAware:
   template: "Operand of null-aware operation '#name' has type '#type' which excludes null."
   severity: WARNING
 
 NonNullableNotAssignedError:
   template: "Non-nullable variable '#name' must be assigned before it can be used."
+  configuration: nnbd-strong
+  script: |
+    method<T>() {
+      T t; t;
+    }
 
-NonNullableNotAssignedWarning:
-  template: "Non-nullable variable '#name' is used before it's assigned."
-  severity: WARNING
+NonNullableLateDefinitelyUnassignedError:
+  template: "Non-nullable late variable '#name' without initializer is definitely unassigned."
+  configuration: nnbd-strong
+  script: |
+    method<T>() {
+      late T t; t;
+    }
+
+NonNullableLateDefinitelyAssignedError:
+  template: "Non-nullable late final variable '#name' definitely assigned."
+  configuration: nnbd-strong
+  script: |
+    method() {
+      late final int t;
+      t = 0;
+      t = 0;
+    }
 
 NonAgnosticConstant:
   template: "Constant value is not strong/weak mode agnostic."
@@ -4056,3 +4006,25 @@
     lib.dart: |
       // @dart=2.5
       class A {}
+
+ExtendFunction:
+  template: "Extending 'Function' is deprecated."
+  tip: "Try removing 'Function' from the 'extends' clause."
+  severity: IGNORED
+  script: |
+    class A extends Function {}
+
+ImplementFunction:
+  template: "Implementing 'Function' is deprecated."
+  tip: "Try removing 'Function' from the 'implements' clause."
+  severity: IGNORED
+  script: |
+    class A implements Function {}
+
+MixinFunction:
+  template: "Mixing in 'Function' is deprecated."
+  tip: "Try removing 'Function' from the 'with' clause."
+  severity: IGNORED
+  script: |
+    class A extends Object with Function {}
+
diff --git a/pkg/front_end/test/extensions/extensions_test.dart b/pkg/front_end/test/extensions/extensions_test.dart
index 27e21fc..fdb1fc7 100644
--- a/pkg/front_end/test/extensions/extensions_test.dart
+++ b/pkg/front_end/test/extensions/extensions_test.dart
@@ -168,9 +168,9 @@
       }
     }
 
-    features[Tags.builderSupertype] = clsBuilder.supertype?.name;
-    if (clsBuilder.interfaces != null) {
-      for (TypeBuilder superinterface in clsBuilder.interfaces) {
+    features[Tags.builderSupertype] = clsBuilder.supertypeBuilder?.name;
+    if (clsBuilder.interfaceBuilders != null) {
+      for (TypeBuilder superinterface in clsBuilder.interfaceBuilders) {
         features.addElement(Tags.builderInterfaces, superinterface.name);
       }
     }
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 11792bc..d08c6e5 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
@@ -38,11 +38,12 @@
     expect(
         greatestClosure(new FunctionType(
                 [unknownType], dynamicType, Nullability.legacy))
-            .toString(),
+            .leakingDebugToString(),
         '(dart.core::Null?) →* dynamic');
     expect(
         greatestClosure(new FunctionType([], dynamicType, Nullability.legacy,
-            namedParameters: [new NamedType('foo', unknownType)])).toString(),
+                namedParameters: [new NamedType('foo', unknownType)]))
+            .leakingDebugToString(),
         '({foo: dart.core::Null?}) →* dynamic');
   }
 
@@ -51,18 +52,19 @@
         greatestClosure(new FunctionType([
           new FunctionType([unknownType], dynamicType, Nullability.legacy)
         ], dynamicType, Nullability.legacy))
-            .toString(),
+            .leakingDebugToString(),
         '((dynamic) →* dynamic) →* dynamic');
   }
 
   void test_greatestClosure_covariant() {
     expect(
         greatestClosure(new FunctionType([], unknownType, Nullability.legacy))
-            .toString(),
+            .leakingDebugToString(),
         '() →* dynamic');
     expect(
         greatestClosure(new InterfaceType(
-            coreTypes.listClass, Nullability.legacy, [unknownType])).toString(),
+                coreTypes.listClass, Nullability.legacy, [unknownType]))
+            .leakingDebugToString(),
         'dart.core::List<dynamic>*');
   }
 
@@ -73,24 +75,25 @@
             namedParameters: [
               new NamedType('a', unknownType),
               new NamedType('b', unknownType)
-            ])).toString(),
+            ])).leakingDebugToString(),
         '(dart.core::Null?, dart.core::Null?, {a: dart.core::Null?, '
         'b: dart.core::Null?}) →* dynamic');
   }
 
   void test_greatestClosure_simple() {
-    expect(greatestClosure(unknownType).toString(), 'dynamic');
+    expect(greatestClosure(unknownType).leakingDebugToString(), 'dynamic');
   }
 
   void test_leastClosure_contravariant() {
     expect(
         leastClosure(new FunctionType(
                 [unknownType], dynamicType, Nullability.legacy))
-            .toString(),
+            .leakingDebugToString(),
         '(dynamic) →* dynamic');
     expect(
         leastClosure(new FunctionType([], dynamicType, Nullability.legacy,
-            namedParameters: [new NamedType('foo', unknownType)])).toString(),
+                namedParameters: [new NamedType('foo', unknownType)]))
+            .leakingDebugToString(),
         '({foo: dynamic}) →* dynamic');
   }
 
@@ -99,18 +102,19 @@
         leastClosure(new FunctionType([
           new FunctionType([unknownType], dynamicType, Nullability.legacy)
         ], dynamicType, Nullability.legacy))
-            .toString(),
+            .leakingDebugToString(),
         '((dart.core::Null?) →* dynamic) →* dynamic');
   }
 
   void test_leastClosure_covariant() {
     expect(
         leastClosure(new FunctionType([], unknownType, Nullability.legacy))
-            .toString(),
+            .leakingDebugToString(),
         '() →* dart.core::Null?');
     expect(
         leastClosure(new InterfaceType(
-            coreTypes.listClass, Nullability.legacy, [unknownType])).toString(),
+                coreTypes.listClass, Nullability.legacy, [unknownType]))
+            .leakingDebugToString(),
         'dart.core::List<dart.core::Null?>*');
   }
 
@@ -121,12 +125,13 @@
             namedParameters: [
               new NamedType('a', unknownType),
               new NamedType('b', unknownType)
-            ])).toString(),
+            ])).leakingDebugToString(),
         '(dynamic, dynamic, {a: dynamic, b: dynamic}) →* dart.core::Null?');
   }
 
   void test_leastClosure_simple() {
-    expect(leastClosure(unknownType).toString(), 'dart.core::Null?');
+    expect(
+        leastClosure(unknownType).leakingDebugToString(), 'dart.core::Null?');
   }
 }
 
diff --git a/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart b/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
index 997eb27..fef974e 100644
--- a/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
+++ b/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
@@ -40,7 +40,7 @@
 
 typedef Typedef<T extends self::Object? = dynamic> = <S extends self::Object? = dynamic>(T%) → S%;
 typedef VoidFunction = () → void;
-typedef TestDefaultTypes = () → self::DefaultTypes<dynamic, self::Object, self::List<dynamic>, self::List<self::Object>, self::Comparable<dynamic>, (<BottomType>) → void, () → self::Comparable<dynamic>>;
+typedef TestDefaultTypes = () → self::DefaultTypes<dynamic, self::Object, self::List<dynamic>, self::List<self::Object>, self::Comparable<dynamic>, (Never) → void, () → self::Comparable<dynamic>>;
 typedef Id<T extends self::Object? = dynamic> = T%;
 typedef TestSorting = ({a: self::int, b: self::int, c: self::int}) → void;
 class Object {
@@ -69,7 +69,7 @@
 }
 class bool extends self::Object {
 }
-class DefaultTypes<S extends self::Object? = dynamic, T extends self::Object = self::Object, U extends self::List<self::DefaultTypes::S%> = self::List<dynamic>, V extends self::List<self::DefaultTypes::T> = self::List<self::Object>, W extends self::Comparable<self::DefaultTypes::W> = self::Comparable<dynamic>, X extends (self::DefaultTypes::W) → void = (<BottomType>) → void, Y extends () → self::DefaultTypes::W = () → self::Comparable<dynamic>> extends self::Object {
+class DefaultTypes<S extends self::Object? = dynamic, T extends self::Object = self::Object, U extends self::List<self::DefaultTypes::S%> = self::List<dynamic>, V extends self::List<self::DefaultTypes::T> = self::List<self::Object>, W extends self::Comparable<self::DefaultTypes::W> = self::Comparable<dynamic>, X extends (self::DefaultTypes::W) → void = (Never) → void, Y extends () → self::DefaultTypes::W = () → self::Comparable<dynamic>> extends self::Object {
 }
 class Super extends self::Object implements self::Comparable<self::Sub> {
 }
diff --git a/pkg/front_end/test/id_tests/definite_assignment_test.dart b/pkg/front_end/test/id_tests/definite_assignment_test.dart
index 02067af..cb48f84 100644
--- a/pkg/front_end/test/id_tests/definite_assignment_test.dart
+++ b/pkg/front_end/test/id_tests/definite_assignment_test.dart
@@ -46,6 +46,11 @@
     member.accept(new DefiniteAssignmentDataExtractor(compilerResult, actualMap,
         memberBuilder.dataForTesting.inferenceData.flowAnalysisResult));
   }
+
+  /// Errors are supported for testing erroneous code. The reported errors are
+  /// not tested.
+  @override
+  bool get supportsErrors => true;
 }
 
 class DefiniteAssignmentDataExtractor extends CfeDataExtractor<String> {
diff --git a/pkg/front_end/test/id_tests/definite_unassignment_test.dart b/pkg/front_end/test/id_tests/definite_unassignment_test.dart
index 06b8c7e..b22affb 100644
--- a/pkg/front_end/test/id_tests/definite_unassignment_test.dart
+++ b/pkg/front_end/test/id_tests/definite_unassignment_test.dart
@@ -48,6 +48,11 @@
         actualMap,
         memberBuilder.dataForTesting.inferenceData.flowAnalysisResult));
   }
+
+  /// Errors are supported for testing erroneous code. The reported errors are
+  /// not tested.
+  @override
+  bool get supportsErrors => true;
 }
 
 class DefiniteUnassignmentDataExtractor extends CfeDataExtractor<String> {
diff --git a/pkg/front_end/test/id_tests/reachability_test.dart b/pkg/front_end/test/id_tests/reachability_test.dart
index 6c469fa..e0cb2cd 100644
--- a/pkg/front_end/test/id_tests/reachability_test.dart
+++ b/pkg/front_end/test/id_tests/reachability_test.dart
@@ -47,6 +47,11 @@
     member.accept(new ReachabilityDataExtractor(compilerResult, actualMap,
         memberBuilder.dataForTesting.inferenceData.flowAnalysisResult));
   }
+
+  /// Errors are supported for testing erroneous code. The reported errors are
+  /// not tested.
+  @override
+  bool get supportsErrors => true;
 }
 
 class ReachabilityDataExtractor
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index d83c19d..a604ce3 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -109,8 +109,10 @@
 body's
 bof
 bom
+bones
 boolean
 bother
+boundness
 breadcrumbs
 brianwilkerson
 bs
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index 00036f4..2e71a8a 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -564,6 +564,7 @@
 conflicts
 conform
 conformed
+confuse
 confused
 connect
 connected
@@ -1112,6 +1113,7 @@
 fall
 fallback
 falls
+fallthrough
 false
 far
 fashion
@@ -1327,6 +1329,7 @@
 hidden
 hide
 hides
+hiding
 hierarchies
 hierarchy
 high
@@ -3025,6 +3028,7 @@
 unambiguous
 unary
 unassignable
+unassigned
 unbalanced
 unbind
 uncertain
@@ -3095,6 +3099,7 @@
 untranslatable
 untyped
 unused
+unwanted
 unwrap
 unwrapped
 up
@@ -3175,6 +3180,7 @@
 walk
 walked
 want
+wanted
 warn
 warning
 warnings
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index 46fbd01..1f0db0c 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -197,6 +197,7 @@
 finder
 fisk
 five
+flagged
 floor
 fluctuate
 foo1
@@ -345,6 +346,7 @@
 newest
 newworld
 ninja
+nondefault
 nonexisting
 noo
 numerator
diff --git a/pkg/front_end/test/static_types/data/class_call.dart b/pkg/front_end/test/static_types/data/class_call.dart
index 134c441..6575688 100644
--- a/pkg/front_end/test/static_types/data/class_call.dart
+++ b/pkg/front_end/test/static_types/data/class_call.dart
@@ -11,14 +11,17 @@
 }
 
 class Class {
-  ClassWithCall classWithCall;
+  ClassWithCall get classWithCall =>
+      /*cfe.<bottom>*/ /*cfe:nnbd.Never*/
+      throw /*cfe.int*/ /*cfe:nnbd.int!*/ 42;
 
   int method() =>
-      /*cfe.invoke: ClassWithCall*/
-      /*cfe:nnbd.invoke: ClassWithCall!*/
       /*cfe.ClassWithCall*/
       /*cfe:nnbd.ClassWithCall!*/
-      classWithCall()
+      classWithCall
+              /*cfe.invoke: ClassWithCall*/
+              /*cfe:nnbd.invoke: ClassWithCall!*/
+              ()
           . /*cfe.invoke: int*/
           /*cfe:nnbd.invoke: int!*/
           method();
@@ -30,14 +33,15 @@
 }
 
 class GenericClass<S, T extends GenericClassWithCall<S>> {
-  GenericClassWithCall<T> classWithCall;
+  GenericClassWithCall<T> get classWithCall =>
+      /*cfe.<bottom>*/ /*cfe:nnbd.Never*/
+      throw /*cfe.int*/ /*cfe:nnbd.int!*/ 42;
 
   S method() =>
-      /*cfe.invoke: T*/
-      /*cfe:nnbd.invoke: T!*/
       /*cfe.GenericClassWithCall<T>*/
       /*cfe:nnbd.GenericClassWithCall<T!>!*/
-      classWithCall(). /*cfe.invoke: S*/ /*cfe:nnbd.invoke: S%*/ method();
+      classWithCall /*cfe.invoke: T*/ /*cfe:nnbd.invoke: T!*/ ()
+          . /*cfe.invoke: S*/ /*cfe:nnbd.invoke: S%*/ method();
 }
 
 main() {
@@ -46,10 +50,11 @@
       GenericClass<String, GenericClassWithCall<String>>
           /*cfe.<String,GenericClassWithCall<String>>*/
           /*cfe:nnbd.<String!,GenericClassWithCall<String!>!>*/ ()
-      . /*cfe.invoke: GenericClassWithCall<String>*/
-      /*cfe:nnbd.invoke: GenericClassWithCall<String!>!*/
-      /*cfe.GenericClassWithCall<GenericClassWithCall<String>>*/
+      . /*cfe.GenericClassWithCall<GenericClassWithCall<String>>*/
       /*cfe:nnbd.GenericClassWithCall<GenericClassWithCall<String!>!>!*/
-      classWithCall()
+      classWithCall
+      /*cfe.invoke: GenericClassWithCall<String>*/
+      /*cfe:nnbd.invoke: GenericClassWithCall<String!>!*/
+      ()
       . /*cfe.invoke: String*/ /*cfe:nnbd.invoke: String!*/ method();
 }
diff --git a/pkg/front_end/test/static_types/data/constraint_gatherer_for_future_or.dart b/pkg/front_end/test/static_types/data/constraint_gatherer_for_future_or.dart
index 3eb10fc..32a491a 100644
--- a/pkg/front_end/test/static_types/data/constraint_gatherer_for_future_or.dart
+++ b/pkg/front_end/test/static_types/data/constraint_gatherer_for_future_or.dart
@@ -21,11 +21,13 @@
 
 // -----------------------------------------------------------------------------
 
-// Gathering constraints for S from comparison Null <: Future<S>.
+// Gathering constraints for S from comparison bot <: Future<S>.
 void func2() {
   void foo<S>(Future<S> bar) {}
 
-  /*invoke: void*/ foo/*<dynamic>*/(/*Null*/ null);
+  /*invoke: void*/ foo/*<dynamic>*/(
+      /*cfe.<bottom>*/ /*cfe:nnbd.Never*/
+      throw /*cfe.int*/ /*cfe:nnbd.int!*/ 42);
 }
 
 // -----------------------------------------------------------------------------
diff --git a/pkg/front_end/test/static_types/data/greatest_lower_bound_for_future_or.dart b/pkg/front_end/test/static_types/data/greatest_lower_bound_for_future_or.dart
index ccbc88b..28d998d 100644
--- a/pkg/front_end/test/static_types/data/greatest_lower_bound_for_future_or.dart
+++ b/pkg/front_end/test/static_types/data/greatest_lower_bound_for_future_or.dart
@@ -22,7 +22,9 @@
   // inserted as both the type argument and the return type of 'expr' by the
   // type inference.
   void context(FutureOr<T> x) {}
-  S expr<S extends Foo>() => /*Null*/ null;
+  S expr<S extends Foo>() =>
+      /*cfe.<bottom>*/ /*cfe:nnbd.Never*/
+      throw /*cfe.int*/ /*cfe:nnbd.int!*/ 42;
 
   // Type of the expression is GLB(FutureOr<T>, Foo) = T.
   /*invoke: void*/ context(
@@ -36,7 +38,9 @@
 // Tests rule GLB(FutureOr<A>, Future<B>) == Future<GLB(A, B)>.
 void func2<T extends Foo>() {
   void context(FutureOr<T> x) {}
-  S expr<S extends Future<Foo>>() => /*Null*/ null;
+  S expr<S extends Future<Foo>>() =>
+      /*cfe.<bottom>*/ /*cfe:nnbd.Never*/
+      throw /*cfe.int*/ /*cfe:nnbd.int!*/ 42;
 
   // Type of the expression is GLB(FutureOr<T>, Future<Foo>) = Future<T>.
   /*invoke: void*/ context(
@@ -51,7 +55,9 @@
 // Tests rule GLB(A, FutureOr<B>) == GLB(B, A).
 void func3<T extends Foo>() {
   void context(T x) {}
-  S expr<S extends FutureOr<Foo>>() => /*Null*/ null;
+  S expr<S extends FutureOr<Foo>>() =>
+      /*cfe.<bottom>*/ /*cfe:nnbd.Never*/
+      throw /*cfe.int*/ /*cfe:nnbd.int!*/ 42;
 
   // Type of the expression is GLB(T, FutureOr<Foo>) = T.
   /*invoke: void*/ context(
@@ -65,7 +71,9 @@
 // Tests rule GLB(Future<A>, FutureOr<B>) == Future<GLB(B, A)>.
 void func4<T extends Foo>() {
   void context(Future<T> x) {}
-  S expr<S extends FutureOr<Foo>>() => /*Null*/ null;
+  S expr<S extends FutureOr<Foo>>() =>
+      /*cfe.<bottom>*/ /*cfe:nnbd.Never*/
+      throw /*cfe.int*/ /*cfe:nnbd.int!*/ 42;
 
   // Type of the expression is GLB(Future<T>, FutureOr<Foo>) = Future<T>.
   /*invoke: void*/ context(
@@ -81,7 +89,9 @@
 // non-trivial case when neither A <: B, nor B <: A.
 void func5<T extends Foo>() {
   void context(FutureOr<FutureOr<T>> x) {}
-  S expr<S extends FutureOr<Future<Foo>>>() => /*Null*/ null;
+  S expr<S extends FutureOr<Future<Foo>>>() =>
+      /*cfe.<bottom>*/ /*cfe:nnbd.Never*/
+      throw /*cfe.int*/ /*cfe:nnbd.int!*/ 42;
 
   // Type of the expression is GLB(FutureOr<FutureOr<T>>, FutureOr<Future<Foo>>)
   // = FutureOr<Future<T>>.
diff --git a/pkg/front_end/testcases/extensions/ambiguous.dart b/pkg/front_end/testcases/extensions/ambiguous.dart
new file mode 100644
index 0000000..df66ba8
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/ambiguous.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.
+
+extension A on C {
+  void method() {}
+  int get getter => 42;
+  void set setter(int value) {}
+  int get property => 42;
+  int operator +(int i) => i;
+  int operator -() => 0;
+  int operator [](int i) => i;
+}
+
+extension B on C {
+  void method() {}
+  int get getter => 42;
+  void set setter(int value) {}
+  void set property(int value) {}
+  int operator +(int i) => i;
+  int operator -() => 0;
+  void operator []=(int i, int j) {}
+}
+
+class C {}
+
+errors(C c) {
+  c.method();
+  c.method;
+  c.getter;
+  c.setter;
+  c.getter = 42;
+  c.setter = 42;
+  c.property;
+  c.property = 42;
+  c + 0;
+  -c;
+  c[42];
+  c[42] = 0;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/extensions/ambiguous.dart.outline.expect b/pkg/front_end/testcases/extensions/ambiguous.dart.outline.expect
new file mode 100644
index 0000000..ecc48e2
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/ambiguous.dart.outline.expect
@@ -0,0 +1,64 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+}
+extension A on self::C* {
+  method method = self::A|method;
+  tearoff method = self::A|get#method;
+  get getter = self::A|get#getter;
+  get property = self::A|get#property;
+  operator + = self::A|+;
+  operator unary- = self::A|unary-;
+  operator [] = self::A|[];
+  set setter = self::A|set#setter;
+}
+extension B on self::C* {
+  method method = self::B|method;
+  tearoff method = self::B|get#method;
+  get getter = self::B|get#getter;
+  operator + = self::B|+;
+  operator unary- = self::B|unary-;
+  operator []= = self::B|[]=;
+  set setter = self::B|set#setter;
+  set property = self::B|set#property;
+}
+static method A|method(final self::C* #this) → void
+  ;
+static method A|get#method(final self::C* #this) → () →* void
+  return () → void => self::A|method(#this);
+static method A|get#getter(final self::C* #this) → core::int*
+  ;
+static method A|set#setter(final self::C* #this, core::int* value) → void
+  ;
+static method A|get#property(final self::C* #this) → core::int*
+  ;
+static method A|+(final self::C* #this, core::int* i) → core::int*
+  ;
+static method A|unary-(final self::C* #this) → core::int*
+  ;
+static method A|[](final self::C* #this, core::int* i) → core::int*
+  ;
+static method B|method(final self::C* #this) → void
+  ;
+static method B|get#method(final self::C* #this) → () →* void
+  return () → void => self::B|method(#this);
+static method B|get#getter(final self::C* #this) → core::int*
+  ;
+static method B|set#setter(final self::C* #this, core::int* value) → void
+  ;
+static method B|set#property(final self::C* #this, core::int* value) → void
+  ;
+static method B|+(final self::C* #this, core::int* i) → core::int*
+  ;
+static method B|unary-(final self::C* #this) → core::int*
+  ;
+static method B|[]=(final self::C* #this, core::int* i, core::int* j) → void
+  ;
+static method errors(self::C* c) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/ambiguous.dart.strong.expect b/pkg/front_end/testcases/extensions/ambiguous.dart.strong.expect
new file mode 100644
index 0000000..8573677
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/ambiguous.dart.strong.expect
@@ -0,0 +1,265 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:28:5: Error: The method 'method' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.method();
+//     ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:6:8: Context: This is one of the extension members.
+//   void method() {}
+//        ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:16:8: Context: This is one of the extension members.
+//   void method() {}
+//        ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:29:5: Error: The property 'method' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.method;
+//     ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:6:8: Context: This is one of the extension members.
+//   void method() {}
+//        ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:16:8: Context: This is one of the extension members.
+//   void method() {}
+//        ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:30:5: Error: The property 'getter' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.getter;
+//     ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:7:11: Context: This is one of the extension members.
+//   int get getter => 42;
+//           ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:17:11: Context: This is one of the extension members.
+//   int get getter => 42;
+//           ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:31:5: Error: The property 'setter' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.setter;
+//     ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:8:12: Context: This is one of the extension members.
+//   void set setter(int value) {}
+//            ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:18:12: Context: This is one of the extension members.
+//   void set setter(int value) {}
+//            ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:32:5: Error: The property 'getter' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.getter = 42;
+//     ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:7:11: Context: This is one of the extension members.
+//   int get getter => 42;
+//           ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:17:11: Context: This is one of the extension members.
+//   int get getter => 42;
+//           ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:33:5: Error: The property 'setter' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.setter = 42;
+//     ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:8:12: Context: This is one of the extension members.
+//   void set setter(int value) {}
+//            ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:18:12: Context: This is one of the extension members.
+//   void set setter(int value) {}
+//            ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:34:5: Error: The property 'property' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.property;
+//     ^^^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:9:11: Context: This is one of the extension members.
+//   int get property => 42;
+//           ^^^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:19:12: Context: This is one of the extension members.
+//   void set property(int value) {}
+//            ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:35:5: Error: The property 'property' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.property = 42;
+//     ^^^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:9:11: Context: This is one of the extension members.
+//   int get property => 42;
+//           ^^^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:19:12: Context: This is one of the extension members.
+//   void set property(int value) {}
+//            ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:36:5: Error: The operator '+' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c + 0;
+//     ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:10:16: Context: This is one of the extension members.
+//   int operator +(int i) => i;
+//                ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:20:16: Context: This is one of the extension members.
+//   int operator +(int i) => i;
+//                ^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:37:3: Error: The operator 'unary-' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   -c;
+//   ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:11:16: Context: This is one of the extension members.
+//   int operator -() => 0;
+//                ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:21:16: Context: This is one of the extension members.
+//   int operator -() => 0;
+//                ^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:38:4: Error: The operator '[]' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c[42];
+//    ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:12:16: Context: This is one of the extension members.
+//   int operator [](int i) => i;
+//                ^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:22:17: Context: This is one of the extension members.
+//   void operator []=(int i, int j) {}
+//                 ^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:39:4: Error: The operator '[]=' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c[42] = 0;
+//    ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:12:16: Context: This is one of the extension members.
+//   int operator [](int i) => i;
+//                ^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:22:17: Context: This is one of the extension members.
+//   void operator []=(int i, int j) {}
+//                 ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+}
+extension A on self::C* {
+  method method = self::A|method;
+  tearoff method = self::A|get#method;
+  get getter = self::A|get#getter;
+  get property = self::A|get#property;
+  operator + = self::A|+;
+  operator unary- = self::A|unary-;
+  operator [] = self::A|[];
+  set setter = self::A|set#setter;
+}
+extension B on self::C* {
+  method method = self::B|method;
+  tearoff method = self::B|get#method;
+  get getter = self::B|get#getter;
+  operator + = self::B|+;
+  operator unary- = self::B|unary-;
+  operator []= = self::B|[]=;
+  set setter = self::B|set#setter;
+  set property = self::B|set#property;
+}
+static method A|method(final self::C* #this) → void {}
+static method A|get#method(final self::C* #this) → () →* void
+  return () → void => self::A|method(#this);
+static method A|get#getter(final self::C* #this) → core::int*
+  return 42;
+static method A|set#setter(final self::C* #this, core::int* value) → void {}
+static method A|get#property(final self::C* #this) → core::int*
+  return 42;
+static method A|+(final self::C* #this, core::int* i) → core::int*
+  return i;
+static method A|unary-(final self::C* #this) → core::int*
+  return 0;
+static method A|[](final self::C* #this, core::int* i) → core::int*
+  return i;
+static method B|method(final self::C* #this) → void {}
+static method B|get#method(final self::C* #this) → () →* void
+  return () → void => self::B|method(#this);
+static method B|get#getter(final self::C* #this) → core::int*
+  return 42;
+static method B|set#setter(final self::C* #this, core::int* value) → void {}
+static method B|set#property(final self::C* #this, core::int* value) → void {}
+static method B|+(final self::C* #this, core::int* i) → core::int*
+  return i;
+static method B|unary-(final self::C* #this) → core::int*
+  return 0;
+static method B|[]=(final self::C* #this, core::int* i, core::int* j) → void {}
+static method errors(self::C* c) → dynamic {
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:28:5: Error: The method 'method' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.method();
+    ^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:29:5: Error: The property 'method' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.method;
+    ^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:30:5: Error: The property 'getter' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.getter;
+    ^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:31:5: Error: The property 'setter' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.setter;
+    ^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:32:5: Error: The property 'getter' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.getter = 42;
+    ^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:33:5: Error: The property 'setter' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.setter = 42;
+    ^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:34:5: Error: The property 'property' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.property;
+    ^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:35:5: Error: The property 'property' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.property = 42;
+    ^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:36:5: Error: The operator '+' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c + 0;
+    ^";
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:37:3: Error: The operator 'unary-' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  -c;
+  ^";
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:38:4: Error: The operator '[]' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c[42];
+   ^";
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:39:4: Error: The operator '[]=' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c[42] = 0;
+   ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/ambiguous.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/ambiguous.dart.strong.transformed.expect
new file mode 100644
index 0000000..8573677
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/ambiguous.dart.strong.transformed.expect
@@ -0,0 +1,265 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:28:5: Error: The method 'method' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.method();
+//     ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:6:8: Context: This is one of the extension members.
+//   void method() {}
+//        ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:16:8: Context: This is one of the extension members.
+//   void method() {}
+//        ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:29:5: Error: The property 'method' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.method;
+//     ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:6:8: Context: This is one of the extension members.
+//   void method() {}
+//        ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:16:8: Context: This is one of the extension members.
+//   void method() {}
+//        ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:30:5: Error: The property 'getter' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.getter;
+//     ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:7:11: Context: This is one of the extension members.
+//   int get getter => 42;
+//           ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:17:11: Context: This is one of the extension members.
+//   int get getter => 42;
+//           ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:31:5: Error: The property 'setter' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.setter;
+//     ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:8:12: Context: This is one of the extension members.
+//   void set setter(int value) {}
+//            ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:18:12: Context: This is one of the extension members.
+//   void set setter(int value) {}
+//            ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:32:5: Error: The property 'getter' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.getter = 42;
+//     ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:7:11: Context: This is one of the extension members.
+//   int get getter => 42;
+//           ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:17:11: Context: This is one of the extension members.
+//   int get getter => 42;
+//           ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:33:5: Error: The property 'setter' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.setter = 42;
+//     ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:8:12: Context: This is one of the extension members.
+//   void set setter(int value) {}
+//            ^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:18:12: Context: This is one of the extension members.
+//   void set setter(int value) {}
+//            ^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:34:5: Error: The property 'property' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.property;
+//     ^^^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:9:11: Context: This is one of the extension members.
+//   int get property => 42;
+//           ^^^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:19:12: Context: This is one of the extension members.
+//   void set property(int value) {}
+//            ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:35:5: Error: The property 'property' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c.property = 42;
+//     ^^^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:9:11: Context: This is one of the extension members.
+//   int get property => 42;
+//           ^^^^^^^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:19:12: Context: This is one of the extension members.
+//   void set property(int value) {}
+//            ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:36:5: Error: The operator '+' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c + 0;
+//     ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:10:16: Context: This is one of the extension members.
+//   int operator +(int i) => i;
+//                ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:20:16: Context: This is one of the extension members.
+//   int operator +(int i) => i;
+//                ^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:37:3: Error: The operator 'unary-' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   -c;
+//   ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:11:16: Context: This is one of the extension members.
+//   int operator -() => 0;
+//                ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:21:16: Context: This is one of the extension members.
+//   int operator -() => 0;
+//                ^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:38:4: Error: The operator '[]' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c[42];
+//    ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:12:16: Context: This is one of the extension members.
+//   int operator [](int i) => i;
+//                ^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:22:17: Context: This is one of the extension members.
+//   void operator []=(int i, int j) {}
+//                 ^^^
+//
+// pkg/front_end/testcases/extensions/ambiguous.dart:39:4: Error: The operator '[]=' is defined in multiple extensions for 'C' and neither is more specific.
+//  - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+//   c[42] = 0;
+//    ^
+// pkg/front_end/testcases/extensions/ambiguous.dart:12:16: Context: This is one of the extension members.
+//   int operator [](int i) => i;
+//                ^^
+// pkg/front_end/testcases/extensions/ambiguous.dart:22:17: Context: This is one of the extension members.
+//   void operator []=(int i, int j) {}
+//                 ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+}
+extension A on self::C* {
+  method method = self::A|method;
+  tearoff method = self::A|get#method;
+  get getter = self::A|get#getter;
+  get property = self::A|get#property;
+  operator + = self::A|+;
+  operator unary- = self::A|unary-;
+  operator [] = self::A|[];
+  set setter = self::A|set#setter;
+}
+extension B on self::C* {
+  method method = self::B|method;
+  tearoff method = self::B|get#method;
+  get getter = self::B|get#getter;
+  operator + = self::B|+;
+  operator unary- = self::B|unary-;
+  operator []= = self::B|[]=;
+  set setter = self::B|set#setter;
+  set property = self::B|set#property;
+}
+static method A|method(final self::C* #this) → void {}
+static method A|get#method(final self::C* #this) → () →* void
+  return () → void => self::A|method(#this);
+static method A|get#getter(final self::C* #this) → core::int*
+  return 42;
+static method A|set#setter(final self::C* #this, core::int* value) → void {}
+static method A|get#property(final self::C* #this) → core::int*
+  return 42;
+static method A|+(final self::C* #this, core::int* i) → core::int*
+  return i;
+static method A|unary-(final self::C* #this) → core::int*
+  return 0;
+static method A|[](final self::C* #this, core::int* i) → core::int*
+  return i;
+static method B|method(final self::C* #this) → void {}
+static method B|get#method(final self::C* #this) → () →* void
+  return () → void => self::B|method(#this);
+static method B|get#getter(final self::C* #this) → core::int*
+  return 42;
+static method B|set#setter(final self::C* #this, core::int* value) → void {}
+static method B|set#property(final self::C* #this, core::int* value) → void {}
+static method B|+(final self::C* #this, core::int* i) → core::int*
+  return i;
+static method B|unary-(final self::C* #this) → core::int*
+  return 0;
+static method B|[]=(final self::C* #this, core::int* i, core::int* j) → void {}
+static method errors(self::C* c) → dynamic {
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:28:5: Error: The method 'method' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.method();
+    ^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:29:5: Error: The property 'method' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.method;
+    ^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:30:5: Error: The property 'getter' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.getter;
+    ^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:31:5: Error: The property 'setter' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.setter;
+    ^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:32:5: Error: The property 'getter' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.getter = 42;
+    ^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:33:5: Error: The property 'setter' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.setter = 42;
+    ^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:34:5: Error: The property 'property' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.property;
+    ^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:35:5: Error: The property 'property' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c.property = 42;
+    ^^^^^^^^";
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:36:5: Error: The operator '+' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c + 0;
+    ^";
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:37:3: Error: The operator 'unary-' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  -c;
+  ^";
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:38:4: Error: The operator '[]' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c[42];
+   ^";
+  invalid-expression "pkg/front_end/testcases/extensions/ambiguous.dart:39:4: Error: The operator '[]=' is defined in multiple extensions for 'C' and neither is more specific.
+ - 'C' is from 'pkg/front_end/testcases/extensions/ambiguous.dart'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
+  c[42] = 0;
+   ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.strong.expect b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.strong.expect
index f432ee9..f5de7af 100644
--- a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.strong.expect
@@ -14,29 +14,53 @@
 //   c.m1 = 2;
 //     ^^
 //
-// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:32:5: Error: The getter 'm3' isn't defined for the class 'Class'.
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:32:5: Error: The property 'm3' is defined in multiple extensions for 'Class' and neither is more specific.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-// Try correcting the name to the name of an existing getter, or defining a getter or field named 'm3'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
 //   c.m3;
 //     ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:13:12: Context: This is one of the extension members.
+//   void set m3(int x) {}
+//            ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:18:11: Context: This is one of the extension members.
+//   int get m3 => 0;
+//           ^^
 //
-// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:33:5: Error: The setter 'm3' isn't defined for the class 'Class'.
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:33:5: Error: The property 'm3' is defined in multiple extensions for 'Class' and neither is more specific.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-// Try correcting the name to the name of an existing setter, or defining a setter or field named 'm3'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
 //   c.m3 = 2;
 //     ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:13:12: Context: This is one of the extension members.
+//   void set m3(int x) {}
+//            ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:18:11: Context: This is one of the extension members.
+//   int get m3 => 0;
+//           ^^
 //
-// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:34:5: Error: The getter 'm4' isn't defined for the class 'Class'.
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:34:5: Error: The property 'm4' is defined in multiple extensions for 'Class' and neither is more specific.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-// Try correcting the name to the name of an existing getter, or defining a getter or field named 'm4'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
 //   c.m4;
 //     ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:14:11: Context: This is one of the extension members.
+//   int get m4 => 0;
+//           ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:19:12: Context: This is one of the extension members.
+//   void set m4(int x) {}
+//            ^^
 //
-// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:35:5: Error: The setter 'm4' isn't defined for the class 'Class'.
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:35:5: Error: The property 'm4' is defined in multiple extensions for 'Class' and neither is more specific.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-// Try correcting the name to the name of an existing setter, or defining a setter or field named 'm4'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
 //   c.m4 = 2;
 //     ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:14:11: Context: This is one of the extension members.
+//   int get m4 => 0;
+//           ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:19:12: Context: This is one of the extension members.
+//   void set m4(int x) {}
+//            ^^
 //
 import self as self;
 import "dart:core" as core;
@@ -85,24 +109,24 @@
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'm1'.
   c.m1 = 2;
     ^^";
-  invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:32:5: Error: The getter 'm3' isn't defined for the class 'Class'.
+  invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:32:5: Error: The property 'm3' is defined in multiple extensions for 'Class' and neither is more specific.
  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-Try correcting the name to the name of an existing getter, or defining a getter or field named 'm3'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
   c.m3;
     ^^";
-  invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:33:5: Error: The setter 'm3' isn't defined for the class 'Class'.
+  invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:33:5: Error: The property 'm3' is defined in multiple extensions for 'Class' and neither is more specific.
  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'm3'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
   c.m3 = 2;
     ^^";
-  invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:34:5: Error: The getter 'm4' isn't defined for the class 'Class'.
+  invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:34:5: Error: The property 'm4' is defined in multiple extensions for 'Class' and neither is more specific.
  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-Try correcting the name to the name of an existing getter, or defining a getter or field named 'm4'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
   c.m4;
     ^^";
-  invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:35:5: Error: The setter 'm4' isn't defined for the class 'Class'.
+  invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:35:5: Error: The property 'm4' is defined in multiple extensions for 'Class' and neither is more specific.
  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'm4'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
   c.m4 = 2;
     ^^";
 }
diff --git a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.strong.transformed.expect
index f432ee9..f5de7af 100644
--- a/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/getter_setter_conflict.dart.strong.transformed.expect
@@ -14,29 +14,53 @@
 //   c.m1 = 2;
 //     ^^
 //
-// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:32:5: Error: The getter 'm3' isn't defined for the class 'Class'.
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:32:5: Error: The property 'm3' is defined in multiple extensions for 'Class' and neither is more specific.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-// Try correcting the name to the name of an existing getter, or defining a getter or field named 'm3'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
 //   c.m3;
 //     ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:13:12: Context: This is one of the extension members.
+//   void set m3(int x) {}
+//            ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:18:11: Context: This is one of the extension members.
+//   int get m3 => 0;
+//           ^^
 //
-// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:33:5: Error: The setter 'm3' isn't defined for the class 'Class'.
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:33:5: Error: The property 'm3' is defined in multiple extensions for 'Class' and neither is more specific.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-// Try correcting the name to the name of an existing setter, or defining a setter or field named 'm3'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
 //   c.m3 = 2;
 //     ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:13:12: Context: This is one of the extension members.
+//   void set m3(int x) {}
+//            ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:18:11: Context: This is one of the extension members.
+//   int get m3 => 0;
+//           ^^
 //
-// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:34:5: Error: The getter 'm4' isn't defined for the class 'Class'.
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:34:5: Error: The property 'm4' is defined in multiple extensions for 'Class' and neither is more specific.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-// Try correcting the name to the name of an existing getter, or defining a getter or field named 'm4'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
 //   c.m4;
 //     ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:14:11: Context: This is one of the extension members.
+//   int get m4 => 0;
+//           ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:19:12: Context: This is one of the extension members.
+//   void set m4(int x) {}
+//            ^^
 //
-// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:35:5: Error: The setter 'm4' isn't defined for the class 'Class'.
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:35:5: Error: The property 'm4' is defined in multiple extensions for 'Class' and neither is more specific.
 //  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-// Try correcting the name to the name of an existing setter, or defining a setter or field named 'm4'.
+// Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
 //   c.m4 = 2;
 //     ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:14:11: Context: This is one of the extension members.
+//   int get m4 => 0;
+//           ^^
+// pkg/front_end/testcases/extensions/getter_setter_conflict.dart:19:12: Context: This is one of the extension members.
+//   void set m4(int x) {}
+//            ^^
 //
 import self as self;
 import "dart:core" as core;
@@ -85,24 +109,24 @@
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'm1'.
   c.m1 = 2;
     ^^";
-  invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:32:5: Error: The getter 'm3' isn't defined for the class 'Class'.
+  invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:32:5: Error: The property 'm3' is defined in multiple extensions for 'Class' and neither is more specific.
  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-Try correcting the name to the name of an existing getter, or defining a getter or field named 'm3'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
   c.m3;
     ^^";
-  invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:33:5: Error: The setter 'm3' isn't defined for the class 'Class'.
+  invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:33:5: Error: The property 'm3' is defined in multiple extensions for 'Class' and neither is more specific.
  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'm3'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
   c.m3 = 2;
     ^^";
-  invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:34:5: Error: The getter 'm4' isn't defined for the class 'Class'.
+  invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:34:5: Error: The property 'm4' is defined in multiple extensions for 'Class' and neither is more specific.
  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-Try correcting the name to the name of an existing getter, or defining a getter or field named 'm4'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
   c.m4;
     ^^";
-  invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:35:5: Error: The setter 'm4' isn't defined for the class 'Class'.
+  invalid-expression "pkg/front_end/testcases/extensions/getter_setter_conflict.dart:35:5: Error: The property 'm4' is defined in multiple extensions for 'Class' and neither is more specific.
  - 'Class' is from 'pkg/front_end/testcases/extensions/getter_setter_conflict.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'm4'.
+Try using an explicit extension application of the wanted extension or hiding unwanted extensions from scope.
   c.m4 = 2;
     ^^";
 }
diff --git a/pkg/front_end/testcases/extensions/issue39527.dart b/pkg/front_end/testcases/extensions/issue39527.dart
new file mode 100644
index 0000000..7990741
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue39527.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.
+
+class C {
+  int value = 0;
+}
+
+extension Extension1 on C {
+  C operator [](int index) => this..value += index + 1;
+  void operator []=(int index, C other) =>
+      this.value += other.value + index + 1;
+  C operator -(int val) => this;
+}
+
+main() {
+  C c = C();
+  // Original term that produces an unexpected error.
+  --Extension1(c)[42];
+
+  // The pre-decrement desugars as follows, which is also flagged as an error.
+  Extension1(c)[42] -= 1;
+
+  // The compound assignment desugars as follows, which is accepted.
+  Extension1(c)[42] = Extension1(c)[42] - 1;
+}
diff --git a/pkg/front_end/testcases/extensions/issue39527.dart.outline.expect b/pkg/front_end/testcases/extensions/issue39527.dart.outline.expect
new file mode 100644
index 0000000..a9e1f18
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue39527.dart.outline.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::int* value;
+  synthetic constructor •() → self::C*
+    ;
+}
+extension Extension1 on self::C* {
+  operator [] = self::Extension1|[];
+  operator []= = self::Extension1|[]=;
+  operator - = self::Extension1|-;
+}
+static method Extension1|[](final self::C* #this, core::int* index) → self::C*
+  ;
+static method Extension1|[]=(final self::C* #this, core::int* index, self::C* other) → void
+  ;
+static method Extension1|-(final self::C* #this, core::int* val) → self::C*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/issue39527.dart.strong.expect b/pkg/front_end/testcases/extensions/issue39527.dart.strong.expect
new file mode 100644
index 0000000..56f3831
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue39527.dart.strong.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::int* value = 0;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+}
+extension Extension1 on self::C* {
+  operator [] = self::Extension1|[];
+  operator []= = self::Extension1|[]=;
+  operator - = self::Extension1|-;
+}
+static method Extension1|[](final self::C* #this, core::int* index) → self::C*
+  return let final self::C* #t1 = #this in let final void #t2 = let final self::C* #t3 = #t1 in #t3.{self::C::value} = #t3.{self::C::value}.{core::num::+}(index.{core::num::+}(1)) in #t1;
+static method Extension1|[]=(final self::C* #this, core::int* index, self::C* other) → void
+  return let final self::C* #t4 = #this in #t4.{self::C::value} = #t4.{self::C::value}.{core::num::+}(other.{self::C::value}.{core::num::+}(index).{core::num::+}(1));
+static method Extension1|-(final self::C* #this, core::int* val) → self::C*
+  return #this;
+static method main() → dynamic {
+  self::C* c = new self::C::•();
+  let final self::C* #t5 = c in let final core::int* #t6 = 42 in let final self::C* #t7 = self::Extension1|-(self::Extension1|[](#t5, #t6), 1) in let final void #t8 = self::Extension1|[]=(#t5, #t6, #t7) in #t7;
+  let final self::C* #t9 = c in let final core::int* #t10 = 42 in self::Extension1|[]=(#t9, #t10, self::Extension1|-(self::Extension1|[](#t9, #t10), 1));
+  self::Extension1|[]=(c, 42, self::Extension1|-(self::Extension1|[](c, 42), 1));
+}
diff --git a/pkg/front_end/testcases/extensions/issue39527.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/issue39527.dart.strong.transformed.expect
new file mode 100644
index 0000000..56f3831
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/issue39527.dart.strong.transformed.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field core::int* value = 0;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+}
+extension Extension1 on self::C* {
+  operator [] = self::Extension1|[];
+  operator []= = self::Extension1|[]=;
+  operator - = self::Extension1|-;
+}
+static method Extension1|[](final self::C* #this, core::int* index) → self::C*
+  return let final self::C* #t1 = #this in let final void #t2 = let final self::C* #t3 = #t1 in #t3.{self::C::value} = #t3.{self::C::value}.{core::num::+}(index.{core::num::+}(1)) in #t1;
+static method Extension1|[]=(final self::C* #this, core::int* index, self::C* other) → void
+  return let final self::C* #t4 = #this in #t4.{self::C::value} = #t4.{self::C::value}.{core::num::+}(other.{self::C::value}.{core::num::+}(index).{core::num::+}(1));
+static method Extension1|-(final self::C* #this, core::int* val) → self::C*
+  return #this;
+static method main() → dynamic {
+  self::C* c = new self::C::•();
+  let final self::C* #t5 = c in let final core::int* #t6 = 42 in let final self::C* #t7 = self::Extension1|-(self::Extension1|[](#t5, #t6), 1) in let final void #t8 = self::Extension1|[]=(#t5, #t6, #t7) in #t7;
+  let final self::C* #t9 = c in let final core::int* #t10 = 42 in self::Extension1|[]=(#t9, #t10, self::Extension1|-(self::Extension1|[](#t9, #t10), 1));
+  self::Extension1|[]=(c, 42, self::Extension1|-(self::Extension1|[](c, 42), 1));
+}
diff --git a/pkg/front_end/testcases/general/cascade.dart.strong.expect b/pkg/front_end/testcases/general/cascade.dart.strong.expect
index ed144d6..70120f9 100644
--- a/pkg/front_end/testcases/general/cascade.dart.strong.expect
+++ b/pkg/front_end/testcases/general/cascade.dart.strong.expect
@@ -12,8 +12,8 @@
 //     ..first.last.toString()
 //             ^^^^
 //
-// pkg/front_end/testcases/general/cascade.dart:29:12: Error: The method '[]' isn't defined for the class 'int'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// pkg/front_end/testcases/general/cascade.dart:29:12: Error: The operator '[]' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
 //     ..first[0].toString()
 //            ^
 //
@@ -38,8 +38,8 @@
     ^" in <core::int*>[1] as{TypeError} core::int*] in let final void #t15 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:28:13: Error: The getter 'last' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
     ..first.last.toString()
-            ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:29:12: Error: The method '[]' isn't defined for the class 'int'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+            ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:29:12: Error: The operator '[]' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
     ..first[0].toString()
            ^".{core::Object::toString}() in let final void #t17 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:30:11: Error: The getter 'last' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
diff --git a/pkg/front_end/testcases/general/cascade.dart.strong.transformed.expect b/pkg/front_end/testcases/general/cascade.dart.strong.transformed.expect
index ed144d6..70120f9 100644
--- a/pkg/front_end/testcases/general/cascade.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/cascade.dart.strong.transformed.expect
@@ -12,8 +12,8 @@
 //     ..first.last.toString()
 //             ^^^^
 //
-// pkg/front_end/testcases/general/cascade.dart:29:12: Error: The method '[]' isn't defined for the class 'int'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// pkg/front_end/testcases/general/cascade.dart:29:12: Error: The operator '[]' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
 //     ..first[0].toString()
 //            ^
 //
@@ -38,8 +38,8 @@
     ^" in <core::int*>[1] as{TypeError} core::int*] in let final void #t15 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:28:13: Error: The getter 'last' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
     ..first.last.toString()
-            ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:29:12: Error: The method '[]' isn't defined for the class 'int'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+            ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:29:12: Error: The operator '[]' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
     ..first[0].toString()
            ^".{core::Object::toString}() in let final void #t17 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:30:11: Error: The getter 'last' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
diff --git a/pkg/front_end/testcases/general/ignore_function.dart.outline.expect b/pkg/front_end/testcases/general/ignore_function.dart.outline.expect
index 777f40b..6172453 100644
--- a/pkg/front_end/testcases/general/ignore_function.dart.outline.expect
+++ b/pkg/front_end/testcases/general/ignore_function.dart.outline.expect
@@ -4,7 +4,7 @@
 
 import "dart:core" as core;
 
-class A extends core::Object implements core::Function {
+class A extends core::Object {
   synthetic constructor •() → self::A*
     ;
   operator ==(dynamic other) → core::bool*
diff --git a/pkg/front_end/testcases/general/ignore_function.dart.strong.expect b/pkg/front_end/testcases/general/ignore_function.dart.strong.expect
index 8006a4c..b28a177 100644
--- a/pkg/front_end/testcases/general/ignore_function.dart.strong.expect
+++ b/pkg/front_end/testcases/general/ignore_function.dart.strong.expect
@@ -4,7 +4,7 @@
 
 import "dart:core" as core;
 
-class A extends core::Object implements core::Function {
+class A extends core::Object {
   synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/general/ignore_function.dart.strong.transformed.expect b/pkg/front_end/testcases/general/ignore_function.dart.strong.transformed.expect
index 8006a4c..b28a177 100644
--- a/pkg/front_end/testcases/general/ignore_function.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/ignore_function.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 import "dart:core" as core;
 
-class A extends core::Object implements core::Function {
+class A extends core::Object {
   synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/general/infer_field_from_multiple.dart.outline.expect b/pkg/front_end/testcases/general/infer_field_from_multiple.dart.outline.expect
index 71c3fc8..8738863 100644
--- a/pkg/front_end/testcases/general/infer_field_from_multiple.dart.outline.expect
+++ b/pkg/front_end/testcases/general/infer_field_from_multiple.dart.outline.expect
@@ -6,66 +6,144 @@
 // Try adding an explicit type.
 //   var field2; // error
 //       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the inherited members.
+//   var field2 = 0;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the inherited members.
+//   var field2 = '';
+//       ^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:51:7: Error: Can't infer a type for 'field4' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field4 = 0; // error
 //       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the inherited members.
+//   var field4 = 0;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the inherited members.
+//   var field4 = '';
+//       ^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:53:7: Error: Can't infer a type for 'field6' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field6; // error
 //       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the inherited members.
+//   int field6;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the inherited members.
+//   String field6;
+//          ^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:55:7: Error: Can't infer a type for 'field8' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field8 = 0; // error
 //       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the inherited members.
+//   int field8;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the inherited members.
+//   String field8;
+//          ^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:58:7: Error: Can't infer a type for 'field11' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field11; // error
 //       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:16:5: Context: This is one of the inherited members.
+//   T field11;
+//     ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:37:5: Context: This is one of the inherited members.
+//   S field11;
+//     ^^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:64:7: Error: Can't infer a type for 'field17' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field17; // error
 //       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the inherited members.
+//   var field17 = 0;
+//       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the inherited members.
+//   String field17;
+//          ^^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:65:7: Error: Can't infer a type for 'field18' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field18; // error
 //       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the inherited members.
+//   int field18;
+//       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the inherited members.
+//   var field18 = '';
+//       ^^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:90:7: Error: Can't infer a type for 'field2' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field2; // error
 //       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the inherited members.
+//   var field2 = 0;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the inherited members.
+//   var field2 = '';
+//       ^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:92:7: Error: Can't infer a type for 'field4' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field4 = 0; // error
 //       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the inherited members.
+//   var field4 = 0;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the inherited members.
+//   var field4 = '';
+//       ^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:94:7: Error: Can't infer a type for 'field6' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field6; // error
 //       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the inherited members.
+//   int field6;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the inherited members.
+//   String field6;
+//          ^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:96:7: Error: Can't infer a type for 'field8' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field8 = 0; // error
 //       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the inherited members.
+//   int field8;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the inherited members.
+//   String field8;
+//          ^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:105:7: Error: Can't infer a type for 'field17' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field17; // error
 //       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the inherited members.
+//   var field17 = 0;
+//       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the inherited members.
+//   String field17;
+//          ^^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:106:7: Error: Can't infer a type for 'field18' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field18; // error
 //       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the inherited members.
+//   int field18;
+//       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the inherited members.
+//   var field18 = '';
+//       ^^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:61:7: Error: The return type of the method 'C.field14' is 'int', which does not match the return type, 'String', of the overridden method, 'B.field14'.
 // Change to a subtype of 'String'.
diff --git a/pkg/front_end/testcases/general/infer_field_from_multiple.dart.strong.expect b/pkg/front_end/testcases/general/infer_field_from_multiple.dart.strong.expect
index 811dec5..4b93926 100644
--- a/pkg/front_end/testcases/general/infer_field_from_multiple.dart.strong.expect
+++ b/pkg/front_end/testcases/general/infer_field_from_multiple.dart.strong.expect
@@ -6,66 +6,144 @@
 // Try adding an explicit type.
 //   var field2; // error
 //       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the inherited members.
+//   var field2 = 0;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the inherited members.
+//   var field2 = '';
+//       ^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:51:7: Error: Can't infer a type for 'field4' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field4 = 0; // error
 //       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the inherited members.
+//   var field4 = 0;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the inherited members.
+//   var field4 = '';
+//       ^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:53:7: Error: Can't infer a type for 'field6' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field6; // error
 //       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the inherited members.
+//   int field6;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the inherited members.
+//   String field6;
+//          ^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:55:7: Error: Can't infer a type for 'field8' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field8 = 0; // error
 //       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the inherited members.
+//   int field8;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the inherited members.
+//   String field8;
+//          ^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:58:7: Error: Can't infer a type for 'field11' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field11; // error
 //       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:16:5: Context: This is one of the inherited members.
+//   T field11;
+//     ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:37:5: Context: This is one of the inherited members.
+//   S field11;
+//     ^^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:64:7: Error: Can't infer a type for 'field17' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field17; // error
 //       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the inherited members.
+//   var field17 = 0;
+//       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the inherited members.
+//   String field17;
+//          ^^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:65:7: Error: Can't infer a type for 'field18' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field18; // error
 //       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the inherited members.
+//   int field18;
+//       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the inherited members.
+//   var field18 = '';
+//       ^^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:90:7: Error: Can't infer a type for 'field2' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field2; // error
 //       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:7:7: Context: This is one of the inherited members.
+//   var field2 = 0;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:28:7: Context: This is one of the inherited members.
+//   var field2 = '';
+//       ^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:92:7: Error: Can't infer a type for 'field4' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field4 = 0; // error
 //       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:9:7: Context: This is one of the inherited members.
+//   var field4 = 0;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:30:7: Context: This is one of the inherited members.
+//   var field4 = '';
+//       ^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:94:7: Error: Can't infer a type for 'field6' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field6; // error
 //       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:11:7: Context: This is one of the inherited members.
+//   int field6;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:32:10: Context: This is one of the inherited members.
+//   String field6;
+//          ^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:96:7: Error: Can't infer a type for 'field8' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field8 = 0; // error
 //       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:13:7: Context: This is one of the inherited members.
+//   int field8;
+//       ^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:34:10: Context: This is one of the inherited members.
+//   String field8;
+//          ^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:105:7: Error: Can't infer a type for 'field17' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field17; // error
 //       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:22:7: Context: This is one of the inherited members.
+//   var field17 = 0;
+//       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:43:10: Context: This is one of the inherited members.
+//   String field17;
+//          ^^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:106:7: Error: Can't infer a type for 'field18' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var field18; // error
 //       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:23:7: Context: This is one of the inherited members.
+//   int field18;
+//       ^^^^^^^
+// pkg/front_end/testcases/general/infer_field_from_multiple.dart:44:7: Context: This is one of the inherited members.
+//   var field18 = '';
+//       ^^^^^^^
 //
 // pkg/front_end/testcases/general/infer_field_from_multiple.dart:61:7: Error: The return type of the method 'C.field14' is 'int', which does not match the return type, 'String', of the overridden method, 'B.field14'.
 // Change to a subtype of 'String'.
diff --git a/pkg/front_end/testcases/general/inherit_function.dart b/pkg/front_end/testcases/general/inherit_function.dart
new file mode 100644
index 0000000..c670d37
--- /dev/null
+++ b/pkg/front_end/testcases/general/inherit_function.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 A implements Function {}
+
+class B extends Function {}
+
+class C extends Object with Function {}
+
+class D = Object with Function;
+
+main() {}
diff --git a/pkg/front_end/testcases/general/inherit_function.dart.outline.expect b/pkg/front_end/testcases/general/inherit_function.dart.outline.expect
new file mode 100644
index 0000000..76b247c
--- /dev/null
+++ b/pkg/front_end/testcases/general/inherit_function.dart.outline.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    ;
+}
+abstract class _C&Object&Function extends core::Object {
+  synthetic constructor •() → self::_C&Object&Function*
+    ;
+}
+class C extends self::_C&Object&Function {
+  synthetic constructor •() → self::C*
+    ;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/inherit_function.dart.strong.expect b/pkg/front_end/testcases/general/inherit_function.dart.strong.expect
new file mode 100644
index 0000000..3167f12
--- /dev/null
+++ b/pkg/front_end/testcases/general/inherit_function.dart.strong.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+}
+abstract class _C&Object&Function extends core::Object {
+  synthetic constructor •() → self::_C&Object&Function*
+    : super core::Object::•()
+    ;
+}
+class C extends self::_C&Object&Function {
+  synthetic constructor •() → self::C*
+    : super self::_C&Object&Function::•()
+    ;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/inherit_function.dart.strong.transformed.expect b/pkg/front_end/testcases/general/inherit_function.dart.strong.transformed.expect
new file mode 100644
index 0000000..3167f12
--- /dev/null
+++ b/pkg/front_end/testcases/general/inherit_function.dart.strong.transformed.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+}
+abstract class _C&Object&Function extends core::Object {
+  synthetic constructor •() → self::_C&Object&Function*
+    : super core::Object::•()
+    ;
+}
+class C extends self::_C&Object&Function {
+  synthetic constructor •() → self::C*
+    : super self::_C&Object&Function::•()
+    ;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/interface_conflict.dart.outline.expect b/pkg/front_end/testcases/general/interface_conflict.dart.outline.expect
index 3ccf348..4c1f615 100644
--- a/pkg/front_end/testcases/general/interface_conflict.dart.outline.expect
+++ b/pkg/front_end/testcases/general/interface_conflict.dart.outline.expect
@@ -6,10 +6,10 @@
 // Try adding a declaration of 'n' to 'C'.
 // abstract class C implements A, B {}
 //                ^
-// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is the inherited member.
+// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is one of the inherited members.
 //   int get n => 1;
 //           ^
-// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is the inherited member.
+// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is one of the inherited members.
 //   double get n => 2.0;
 //              ^
 //
diff --git a/pkg/front_end/testcases/general/interface_conflict.dart.strong.expect b/pkg/front_end/testcases/general/interface_conflict.dart.strong.expect
index af83801..12165b4 100644
--- a/pkg/front_end/testcases/general/interface_conflict.dart.strong.expect
+++ b/pkg/front_end/testcases/general/interface_conflict.dart.strong.expect
@@ -6,10 +6,10 @@
 // Try adding a declaration of 'n' to 'C'.
 // abstract class C implements A, B {}
 //                ^
-// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is the inherited member.
+// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is one of the inherited members.
 //   int get n => 1;
 //           ^
-// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is the inherited member.
+// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is one of the inherited members.
 //   double get n => 2.0;
 //              ^
 //
diff --git a/pkg/front_end/testcases/general/interface_conflict.dart.strong.transformed.expect b/pkg/front_end/testcases/general/interface_conflict.dart.strong.transformed.expect
index af83801..12165b4 100644
--- a/pkg/front_end/testcases/general/interface_conflict.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/interface_conflict.dart.strong.transformed.expect
@@ -6,10 +6,10 @@
 // Try adding a declaration of 'n' to 'C'.
 // abstract class C implements A, B {}
 //                ^
-// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is the inherited member.
+// pkg/front_end/testcases/general/interface_conflict.dart:6:11: Context: This is one of the inherited members.
 //   int get n => 1;
 //           ^
-// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is the inherited member.
+// pkg/front_end/testcases/general/interface_conflict.dart:10:14: Context: This is one of the inherited members.
 //   double get n => 2.0;
 //              ^
 //
diff --git a/pkg/front_end/testcases/general/invalid_operator.dart.outline.expect b/pkg/front_end/testcases/general/invalid_operator.dart.outline.expect
index fc36801..eeef39a 100644
--- a/pkg/front_end/testcases/general/invalid_operator.dart.outline.expect
+++ b/pkg/front_end/testcases/general/invalid_operator.dart.outline.expect
@@ -566,7 +566,7 @@
 class Operators1 extends core::Object {
   synthetic constructor •() → self::Operators1*
     ;
-  operator ==() → dynamic
+  operator ==() → core::bool*
     ;
   operator <() → dynamic
     ;
@@ -606,7 +606,7 @@
 class Operators2 extends core::Object {
   synthetic constructor •() → self::Operators2*
     ;
-  operator ==(dynamic a, dynamic b) → dynamic
+  operator ==(dynamic a, dynamic b) → core::bool*
     ;
   operator <(dynamic a, dynamic b) → dynamic
     ;
@@ -690,7 +690,7 @@
 class Operators4 extends core::Object {
   synthetic constructor •() → self::Operators4*
     ;
-  operator ==({dynamic a}) → dynamic
+  operator ==({dynamic a}) → core::bool*
     ;
   operator <({dynamic a}) → dynamic
     ;
diff --git a/pkg/front_end/testcases/general/invalid_operator.dart.strong.expect b/pkg/front_end/testcases/general/invalid_operator.dart.strong.expect
index e36b062..9580fe8 100644
--- a/pkg/front_end/testcases/general/invalid_operator.dart.strong.expect
+++ b/pkg/front_end/testcases/general/invalid_operator.dart.strong.expect
@@ -567,7 +567,7 @@
   synthetic constructor •() → self::Operators1*
     : super core::Object::•()
     ;
-  operator ==() → dynamic
+  operator ==() → core::bool*
     return true;
   operator <() → dynamic
     return true;
@@ -608,7 +608,7 @@
   synthetic constructor •() → self::Operators2*
     : super core::Object::•()
     ;
-  operator ==(dynamic a, dynamic b) → dynamic
+  operator ==(dynamic a, dynamic b) → core::bool*
     return true;
   operator <(dynamic a, dynamic b) → dynamic
     return true;
@@ -694,7 +694,7 @@
   synthetic constructor •() → self::Operators4*
     : super core::Object::•()
     ;
-  operator ==({dynamic a = #C1}) → dynamic
+  operator ==({dynamic a = #C1}) → core::bool*
     return true;
   operator <({dynamic a = #C1}) → dynamic
     return true;
diff --git a/pkg/front_end/testcases/general/invalid_type.dart.strong.transformed.expect b/pkg/front_end/testcases/general/invalid_type.dart.strong.transformed.expect
new file mode 100644
index 0000000..b405807
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_type.dart.strong.transformed.expect
@@ -0,0 +1,38 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/invalid_type.dart:7:5: Error: Expected identifier, but got 'this'.
+//     this.bar();
+//     ^^^^
+//
+// pkg/front_end/testcases/general/invalid_type.dart:12:12: Error: 'Missing' isn't a type.
+//   (null as Missing).bar();
+//            ^^^^^^^
+//
+// pkg/front_end/testcases/general/invalid_type.dart:13:8: Error: The method 'bar' isn't defined for the class 'Null'.
+// Try correcting the name to the name of an existing method, or defining a method named 'bar'.
+//   null.bar();
+//        ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  static method foo() → dynamic {
+    invalid-expression "pkg/front_end/testcases/general/invalid_type.dart:7:5: Error: Expected identifier, but got 'this'.
+    this.bar();
+    ^^^^".bar();
+  }
+}
+static method test() → dynamic {
+  (null as invalid-type).bar();
+  invalid-expression "pkg/front_end/testcases/general/invalid_type.dart:13:8: Error: The method 'bar' isn't defined for the class 'Null'.
+Try correcting the name to the name of an existing method, or defining a method named 'bar'.
+  null.bar();
+       ^^^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/missing_toplevel.dart.strong.expect b/pkg/front_end/testcases/general/missing_toplevel.dart.strong.expect
index 51f556d..921e9cd 100644
--- a/pkg/front_end/testcases/general/missing_toplevel.dart.strong.expect
+++ b/pkg/front_end/testcases/general/missing_toplevel.dart.strong.expect
@@ -2,21 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/missing_toplevel.dart:27:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+// pkg/front_end/testcases/general/missing_toplevel.dart:27:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
 //  - 'EmptyClass' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 // var missingBinary = classWithProperty.property += 2;
 //                                                ^
 //
-// pkg/front_end/testcases/general/missing_toplevel.dart:28:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+// pkg/front_end/testcases/general/missing_toplevel.dart:28:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
 //  - 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
 // var missingIndexGet = classWithIndexSet[0] ??= 2;
 //                                        ^
 //
-// pkg/front_end/testcases/general/missing_toplevel.dart:29:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+// pkg/front_end/testcases/general/missing_toplevel.dart:29:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
 //  - 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
 // var missingIndexSet = classWithIndexGet[0] ??= 2;
 //                                        ^
 //
@@ -63,19 +63,19 @@
 static field self::ClassWithProperty* classWithProperty = new self::ClassWithProperty::•();
 static field self::ClassWithIndexSet* classWithIndexSet = new self::ClassWithIndexSet::•();
 static field self::ClassWithIndexGet* classWithIndexGet = new self::ClassWithIndexGet::•();
-static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:27:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:27:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
  - 'EmptyClass' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
 var missingBinary = classWithProperty.property += 2;
                                                ^" as{TypeError,ForDynamic} self::EmptyClass*;
-static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:28:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:28:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
  - 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
 var missingIndexGet = classWithIndexSet[0] ??= 2;
                                        ^" in #t4.{core::Object::==}(null) ?{dynamic} let final core::int* #t5 = 2 in let final void #t6 = #t2.{self::ClassWithIndexSet::[]=}(#t3, #t5) in #t5 : #t4;
-static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:29:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:29:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
  - 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
 var missingIndexSet = classWithIndexGet[0] ??= 2;
                                        ^" in #t10 : #t9;
 static field dynamic missingPropertyGet = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:30:37: Error: The getter 'property' isn't defined for the class 'EmptyClass'.
diff --git a/pkg/front_end/testcases/general/missing_toplevel.dart.strong.transformed.expect b/pkg/front_end/testcases/general/missing_toplevel.dart.strong.transformed.expect
index 51f556d..921e9cd 100644
--- a/pkg/front_end/testcases/general/missing_toplevel.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/missing_toplevel.dart.strong.transformed.expect
@@ -2,21 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/missing_toplevel.dart:27:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+// pkg/front_end/testcases/general/missing_toplevel.dart:27:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
 //  - 'EmptyClass' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 // var missingBinary = classWithProperty.property += 2;
 //                                                ^
 //
-// pkg/front_end/testcases/general/missing_toplevel.dart:28:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+// pkg/front_end/testcases/general/missing_toplevel.dart:28:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
 //  - 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
 // var missingIndexGet = classWithIndexSet[0] ??= 2;
 //                                        ^
 //
-// pkg/front_end/testcases/general/missing_toplevel.dart:29:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+// pkg/front_end/testcases/general/missing_toplevel.dart:29:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
 //  - 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
 // var missingIndexSet = classWithIndexGet[0] ??= 2;
 //                                        ^
 //
@@ -63,19 +63,19 @@
 static field self::ClassWithProperty* classWithProperty = new self::ClassWithProperty::•();
 static field self::ClassWithIndexSet* classWithIndexSet = new self::ClassWithIndexSet::•();
 static field self::ClassWithIndexGet* classWithIndexGet = new self::ClassWithIndexGet::•();
-static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:27:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:27:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
  - 'EmptyClass' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
 var missingBinary = classWithProperty.property += 2;
                                                ^" as{TypeError,ForDynamic} self::EmptyClass*;
-static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:28:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:28:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
  - 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
 var missingIndexGet = classWithIndexSet[0] ??= 2;
                                        ^" in #t4.{core::Object::==}(null) ?{dynamic} let final core::int* #t5 = 2 in let final void #t6 = #t2.{self::ClassWithIndexSet::[]=}(#t3, #t5) in #t5 : #t4;
-static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:29:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:29:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
  - 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
 var missingIndexSet = classWithIndexGet[0] ??= 2;
                                        ^" in #t10 : #t9;
 static field dynamic missingPropertyGet = invalid-expression "pkg/front_end/testcases/general/missing_toplevel.dart:30:37: Error: The getter 'property' isn't defined for the class 'EmptyClass'.
diff --git a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.strong.expect b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.strong.expect
index 153bb13..483d84d 100644
--- a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.strong.expect
+++ b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.strong.expect
@@ -59,6 +59,6 @@
 
 constants  {
   #C1 = 0
-  #C2 = TypeLiteralConstant(dart.core::String*)
-  #C3 = TypeLiteralConstant(dart.core::int*)
+  #C2 = TypeLiteralConstant(core::String*)
+  #C3 = TypeLiteralConstant(core::int*)
 }
diff --git a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.strong.transformed.expect b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.strong.transformed.expect
index b2dbf88..fe66274 100644
--- a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.strong.transformed.expect
@@ -59,6 +59,6 @@
 
 constants  {
   #C1 = 0
-  #C2 = TypeLiteralConstant(dart.core::String*)
-  #C3 = TypeLiteralConstant(dart.core::int*)
+  #C2 = TypeLiteralConstant(core::String*)
+  #C3 = TypeLiteralConstant(core::int*)
 }
diff --git a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.outline.expect b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.outline.expect
index 695123b..c48e36c 100644
--- a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.outline.expect
+++ b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.outline.expect
@@ -6,10 +6,10 @@
 // Try adding a declaration of 'n' to 'B with C'.
 // mixin M on B, C {}
 //       ^^^^^^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is the inherited member.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is one of the inherited members.
 //   int get n => 1;
 //           ^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is the inherited member.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is one of the inherited members.
 //   double get n => 2.0;
 //              ^
 //
diff --git a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.expect b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.expect
index a66d785..57da879 100644
--- a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.expect
+++ b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.expect
@@ -6,10 +6,10 @@
 // Try adding a declaration of 'n' to 'B with C'.
 // mixin M on B, C {}
 //       ^^^^^^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is the inherited member.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is one of the inherited members.
 //   int get n => 1;
 //           ^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is the inherited member.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is one of the inherited members.
 //   double get n => 2.0;
 //              ^
 //
diff --git a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.transformed.expect b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.transformed.expect
index a66d785..57da879 100644
--- a/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/mixin_interface_conflict.dart.strong.transformed.expect
@@ -6,10 +6,10 @@
 // Try adding a declaration of 'n' to 'B with C'.
 // mixin M on B, C {}
 //       ^^^^^^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is the inherited member.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:6:11: Context: This is one of the inherited members.
 //   int get n => 1;
 //           ^
-// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is the inherited member.
+// pkg/front_end/testcases/general/mixin_interface_conflict.dart:10:14: Context: This is one of the inherited members.
 //   double get n => 2.0;
 //              ^
 //
diff --git a/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.expect b/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.expect
index 4bcc6e9..be431dd 100644
--- a/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.expect
+++ b/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.expect
@@ -75,117 +75,117 @@
 //   print(foo ~ 2);
 //             ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:12:13: Error: The method '<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:12:13: Error: The operator '<' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
 //   print(foo < 2);
 //             ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:13:13: Error: The method '>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:13:13: Error: The operator '>' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>'.
+// Try correcting the operator to an existing operator, or defining a '>' operator.
 //   print(foo > 2);
 //             ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:14:13: Error: The method '<=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:14:13: Error: The operator '<=' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<='.
+// Try correcting the operator to an existing operator, or defining a '<=' operator.
 //   print(foo <= 2);
 //             ^^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:15:13: Error: The method '>=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:15:13: Error: The operator '>=' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>='.
+// Try correcting the operator to an existing operator, or defining a '>=' operator.
 //   print(foo >= 2);
 //             ^^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:17:13: Error: The method '-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:17:13: Error: The operator '-' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '-'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
 //   print(foo - 2);
 //             ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:18:13: Error: The method '+' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:18:13: Error: The operator '+' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //   print(foo + 2);
 //             ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:19:13: Error: The method '/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:19:13: Error: The operator '/' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '/'.
+// Try correcting the operator to an existing operator, or defining a '/' operator.
 //   print(foo / 2);
 //             ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:20:13: Error: The method '~/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:20:13: Error: The operator '~/' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~/'.
+// Try correcting the operator to an existing operator, or defining a '~/' operator.
 //   print(foo ~/ 2);
 //             ^^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:21:13: Error: The method '*' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:21:13: Error: The operator '*' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '*'.
+// Try correcting the operator to an existing operator, or defining a '*' operator.
 //   print(foo * 2);
 //             ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:22:13: Error: The method '%' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:22:13: Error: The operator '%' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '%'.
+// Try correcting the operator to an existing operator, or defining a '%' operator.
 //   print(foo % 2);
 //             ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:23:13: Error: The method '|' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:23:13: Error: The operator '|' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '|'.
+// Try correcting the operator to an existing operator, or defining a '|' operator.
 //   print(foo | 2);
 //             ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:24:13: Error: The method '^' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:24:13: Error: The operator '^' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '^'.
+// Try correcting the operator to an existing operator, or defining a '^' operator.
 //   print(foo ^ 2);
 //             ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:25:13: Error: The method '&' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:25:13: Error: The operator '&' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '&'.
+// Try correcting the operator to an existing operator, or defining a '&' operator.
 //   print(foo & 2);
 //             ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:26:13: Error: The method '<<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:26:13: Error: The operator '<<' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<<'.
+// Try correcting the operator to an existing operator, or defining a '<<' operator.
 //   print(foo << 2);
 //             ^^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:27:13: Error: The method '>>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:27:13: Error: The operator '>>' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>>'.
+// Try correcting the operator to an existing operator, or defining a '>>' operator.
 //   print(foo >> 2);
 //             ^^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:29:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:29:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
 //   print(foo[2] = 2);
 //            ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:30:12: Error: The method '[]' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:30:12: Error: The operator '[]' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
 //   print(foo[2]);
 //            ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:31:9: Error: The method '~' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:31:9: Error: The operator '~' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~'.
+// Try correcting the operator to an existing operator, or defining a '~' operator.
 //   print(~foo);
 //         ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:32:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:32:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+// Try correcting the operator to an existing operator, or defining a 'unary-' operator.
 //   print(-foo);
 //         ^
 //
@@ -199,100 +199,100 @@
 }
 static method main() → dynamic {
   self::Foo* foo = new self::Foo::•();
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:12:13: Error: The method '<' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:12:13: Error: The operator '<' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
   print(foo < 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:13:13: Error: The method '>' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:13:13: Error: The operator '>' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>'.
+Try correcting the operator to an existing operator, or defining a '>' operator.
   print(foo > 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:14:13: Error: The method '<=' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:14:13: Error: The operator '<=' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<='.
+Try correcting the operator to an existing operator, or defining a '<=' operator.
   print(foo <= 2);
             ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:15:13: Error: The method '>=' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:15:13: Error: The operator '>=' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>='.
+Try correcting the operator to an existing operator, or defining a '>=' operator.
   print(foo >= 2);
             ^^");
   core::print(foo.{core::Object::==}(2));
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:17:13: Error: The method '-' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:17:13: Error: The operator '-' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
   print(foo - 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:18:13: Error: The method '+' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:18:13: Error: The operator '+' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
   print(foo + 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:19:13: Error: The method '/' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:19:13: Error: The operator '/' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '/'.
+Try correcting the operator to an existing operator, or defining a '/' operator.
   print(foo / 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:20:13: Error: The method '~/' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:20:13: Error: The operator '~/' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~/'.
+Try correcting the operator to an existing operator, or defining a '~/' operator.
   print(foo ~/ 2);
             ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:21:13: Error: The method '*' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:21:13: Error: The operator '*' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '*'.
+Try correcting the operator to an existing operator, or defining a '*' operator.
   print(foo * 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:22:13: Error: The method '%' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:22:13: Error: The operator '%' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '%'.
+Try correcting the operator to an existing operator, or defining a '%' operator.
   print(foo % 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:23:13: Error: The method '|' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:23:13: Error: The operator '|' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '|'.
+Try correcting the operator to an existing operator, or defining a '|' operator.
   print(foo | 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:24:13: Error: The method '^' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:24:13: Error: The operator '^' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '^'.
+Try correcting the operator to an existing operator, or defining a '^' operator.
   print(foo ^ 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:25:13: Error: The method '&' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:25:13: Error: The operator '&' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '&'.
+Try correcting the operator to an existing operator, or defining a '&' operator.
   print(foo & 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:26:13: Error: The method '<<' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:26:13: Error: The operator '<<' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<<'.
+Try correcting the operator to an existing operator, or defining a '<<' operator.
   print(foo << 2);
             ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:27:13: Error: The method '>>' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:27:13: Error: The operator '>>' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>>'.
+Try correcting the operator to an existing operator, or defining a '>>' operator.
   print(foo >> 2);
             ^^");
-  core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:29:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+  core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:29:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
   print(foo[2] = 2);
            ^" in #t3);
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:30:12: Error: The method '[]' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:30:12: Error: The operator '[]' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
   print(foo[2]);
            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:31:9: Error: The method '~' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:31:9: Error: The operator '~' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~'.
+Try correcting the operator to an existing operator, or defining a '~' operator.
   print(~foo);
         ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:32:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:32:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+Try correcting the operator to an existing operator, or defining a 'unary-' operator.
   print(-foo);
         ^");
   core::print(<invalid-type>[]);
diff --git a/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.transformed.expect b/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.transformed.expect
index 4bcc6e9..be431dd 100644
--- a/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.transformed.expect
@@ -75,117 +75,117 @@
 //   print(foo ~ 2);
 //             ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:12:13: Error: The method '<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:12:13: Error: The operator '<' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
 //   print(foo < 2);
 //             ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:13:13: Error: The method '>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:13:13: Error: The operator '>' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>'.
+// Try correcting the operator to an existing operator, or defining a '>' operator.
 //   print(foo > 2);
 //             ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:14:13: Error: The method '<=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:14:13: Error: The operator '<=' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<='.
+// Try correcting the operator to an existing operator, or defining a '<=' operator.
 //   print(foo <= 2);
 //             ^^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:15:13: Error: The method '>=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:15:13: Error: The operator '>=' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>='.
+// Try correcting the operator to an existing operator, or defining a '>=' operator.
 //   print(foo >= 2);
 //             ^^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:17:13: Error: The method '-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:17:13: Error: The operator '-' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '-'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
 //   print(foo - 2);
 //             ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:18:13: Error: The method '+' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:18:13: Error: The operator '+' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //   print(foo + 2);
 //             ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:19:13: Error: The method '/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:19:13: Error: The operator '/' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '/'.
+// Try correcting the operator to an existing operator, or defining a '/' operator.
 //   print(foo / 2);
 //             ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:20:13: Error: The method '~/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:20:13: Error: The operator '~/' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~/'.
+// Try correcting the operator to an existing operator, or defining a '~/' operator.
 //   print(foo ~/ 2);
 //             ^^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:21:13: Error: The method '*' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:21:13: Error: The operator '*' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '*'.
+// Try correcting the operator to an existing operator, or defining a '*' operator.
 //   print(foo * 2);
 //             ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:22:13: Error: The method '%' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:22:13: Error: The operator '%' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '%'.
+// Try correcting the operator to an existing operator, or defining a '%' operator.
 //   print(foo % 2);
 //             ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:23:13: Error: The method '|' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:23:13: Error: The operator '|' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '|'.
+// Try correcting the operator to an existing operator, or defining a '|' operator.
 //   print(foo | 2);
 //             ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:24:13: Error: The method '^' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:24:13: Error: The operator '^' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '^'.
+// Try correcting the operator to an existing operator, or defining a '^' operator.
 //   print(foo ^ 2);
 //             ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:25:13: Error: The method '&' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:25:13: Error: The operator '&' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '&'.
+// Try correcting the operator to an existing operator, or defining a '&' operator.
 //   print(foo & 2);
 //             ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:26:13: Error: The method '<<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:26:13: Error: The operator '<<' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<<'.
+// Try correcting the operator to an existing operator, or defining a '<<' operator.
 //   print(foo << 2);
 //             ^^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:27:13: Error: The method '>>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:27:13: Error: The operator '>>' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>>'.
+// Try correcting the operator to an existing operator, or defining a '>>' operator.
 //   print(foo >> 2);
 //             ^^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:29:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:29:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
 //   print(foo[2] = 2);
 //            ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:30:12: Error: The method '[]' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:30:12: Error: The operator '[]' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
 //   print(foo[2]);
 //            ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:31:9: Error: The method '~' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:31:9: Error: The operator '~' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~'.
+// Try correcting the operator to an existing operator, or defining a '~' operator.
 //   print(~foo);
 //         ^
 //
-// pkg/front_end/testcases/general/operator_method_not_found.dart:32:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general/operator_method_not_found.dart:32:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+// Try correcting the operator to an existing operator, or defining a 'unary-' operator.
 //   print(-foo);
 //         ^
 //
@@ -199,100 +199,100 @@
 }
 static method main() → dynamic {
   self::Foo* foo = new self::Foo::•();
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:12:13: Error: The method '<' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:12:13: Error: The operator '<' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
   print(foo < 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:13:13: Error: The method '>' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:13:13: Error: The operator '>' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>'.
+Try correcting the operator to an existing operator, or defining a '>' operator.
   print(foo > 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:14:13: Error: The method '<=' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:14:13: Error: The operator '<=' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<='.
+Try correcting the operator to an existing operator, or defining a '<=' operator.
   print(foo <= 2);
             ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:15:13: Error: The method '>=' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:15:13: Error: The operator '>=' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>='.
+Try correcting the operator to an existing operator, or defining a '>=' operator.
   print(foo >= 2);
             ^^");
   core::print(foo.{core::Object::==}(2));
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:17:13: Error: The method '-' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:17:13: Error: The operator '-' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
   print(foo - 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:18:13: Error: The method '+' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:18:13: Error: The operator '+' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
   print(foo + 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:19:13: Error: The method '/' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:19:13: Error: The operator '/' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '/'.
+Try correcting the operator to an existing operator, or defining a '/' operator.
   print(foo / 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:20:13: Error: The method '~/' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:20:13: Error: The operator '~/' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~/'.
+Try correcting the operator to an existing operator, or defining a '~/' operator.
   print(foo ~/ 2);
             ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:21:13: Error: The method '*' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:21:13: Error: The operator '*' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '*'.
+Try correcting the operator to an existing operator, or defining a '*' operator.
   print(foo * 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:22:13: Error: The method '%' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:22:13: Error: The operator '%' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '%'.
+Try correcting the operator to an existing operator, or defining a '%' operator.
   print(foo % 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:23:13: Error: The method '|' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:23:13: Error: The operator '|' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '|'.
+Try correcting the operator to an existing operator, or defining a '|' operator.
   print(foo | 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:24:13: Error: The method '^' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:24:13: Error: The operator '^' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '^'.
+Try correcting the operator to an existing operator, or defining a '^' operator.
   print(foo ^ 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:25:13: Error: The method '&' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:25:13: Error: The operator '&' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '&'.
+Try correcting the operator to an existing operator, or defining a '&' operator.
   print(foo & 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:26:13: Error: The method '<<' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:26:13: Error: The operator '<<' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<<'.
+Try correcting the operator to an existing operator, or defining a '<<' operator.
   print(foo << 2);
             ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:27:13: Error: The method '>>' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:27:13: Error: The operator '>>' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>>'.
+Try correcting the operator to an existing operator, or defining a '>>' operator.
   print(foo >> 2);
             ^^");
-  core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:29:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+  core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:29:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
   print(foo[2] = 2);
            ^" in #t3);
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:30:12: Error: The method '[]' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:30:12: Error: The operator '[]' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
   print(foo[2]);
            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:31:9: Error: The method '~' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:31:9: Error: The operator '~' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~'.
+Try correcting the operator to an existing operator, or defining a '~' operator.
   print(~foo);
         ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:32:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:32:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+Try correcting the operator to an existing operator, or defining a 'unary-' operator.
   print(-foo);
         ^");
   core::print(<invalid-type>[]);
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 7e0964d..e8ff6d1 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
@@ -6,21 +6,45 @@
 // Try adding an explicit type.
 //   get getterFromGetter;
 //       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+//   num get getterFromGetter;
+//           ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+//   int get getterFromGetter;
+//           ^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:52:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   set setterFromSetter(value);
 //                        ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+//   set setterFromSetter(num value);
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+//   set setterFromSetter(int value);
+//       ^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:80:7: Error: Can't infer a return type for 'getterFromGetter' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   get getterFromGetter;
 //       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+//   num get getterFromGetter;
+//           ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+//   int get getterFromGetter;
+//           ^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:82:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   set setterFromSetter(value);
 //                        ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+//   set setterFromSetter(num value);
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+//   set setterFromSetter(int value);
+//       ^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
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 b88ee41..4c57e56 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
@@ -6,21 +6,45 @@
 // Try adding an explicit type.
 //   get getterFromGetter;
 //       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+//   num get getterFromGetter;
+//           ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+//   int get getterFromGetter;
+//           ^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:52:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   set setterFromSetter(value);
 //                        ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+//   set setterFromSetter(num value);
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+//   set setterFromSetter(int value);
+//       ^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:80:7: Error: Can't infer a return type for 'getterFromGetter' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   get getterFromGetter;
 //       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+//   num get getterFromGetter;
+//           ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+//   int get getterFromGetter;
+//           ^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:82:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   set setterFromSetter(value);
 //                        ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+//   set setterFromSetter(num value);
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+//   set setterFromSetter(int value);
+//       ^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
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 b88ee41..4c57e56 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
@@ -6,21 +6,45 @@
 // Try adding an explicit type.
 //   get getterFromGetter;
 //       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+//   num get getterFromGetter;
+//           ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+//   int get getterFromGetter;
+//           ^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:52:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   set setterFromSetter(value);
 //                        ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+//   set setterFromSetter(num value);
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+//   set setterFromSetter(int value);
+//       ^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:80:7: Error: Can't infer a return type for 'getterFromGetter' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   get getterFromGetter;
 //       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:6:11: Context: This is one of the inherited members.
+//   num get getterFromGetter;
+//           ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:22:11: Context: This is one of the inherited members.
+//   int get getterFromGetter;
+//           ^^^^^^^^^^^^^^^^
 //
 // pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:82:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   set setterFromSetter(value);
 //                        ^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:8:7: Context: This is one of the inherited members.
+//   set setterFromSetter(num value);
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:24:7: Context: This is one of the inherited members.
+//   set setterFromSetter(int value);
+//       ^^^^^^^^^^^^^^^^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.strong.expect b/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.strong.expect
index 9051dbd..d0a33ce 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.strong.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.strong.expect
@@ -12,8 +12,8 @@
 //     ..first.last.toString()
 //             ^^^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The method '[]' isn't defined for the class 'int'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The operator '[]' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
 //     ..first[0].toString()
 //            ^
 //
@@ -38,8 +38,8 @@
     ^" in <core::int*>[1] as{TypeError} core::int*] in let final void #t15 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:30:13: Error: The getter 'last' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
     ..first.last.toString()
-            ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The method '[]' isn't defined for the class 'int'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+            ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The operator '[]' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
     ..first[0].toString()
            ^".{core::Object::toString}() in let final void #t17 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:32:11: Error: The getter 'last' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.strong.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.strong.transformed.expect
index 9051dbd..d0a33ce 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.strong.transformed.expect
@@ -12,8 +12,8 @@
 //     ..first.last.toString()
 //             ^^^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The method '[]' isn't defined for the class 'int'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The operator '[]' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
 //     ..first[0].toString()
 //            ^
 //
@@ -38,8 +38,8 @@
     ^" in <core::int*>[1] as{TypeError} core::int*] in let final void #t15 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:30:13: Error: The getter 'last' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
     ..first.last.toString()
-            ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The method '[]' isn't defined for the class 'int'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+            ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The operator '[]' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
     ..first[0].toString()
            ^".{core::Object::toString}() in let final void #t17 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:32:11: Error: The getter 'last' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.expect
index 9051dbd..d0a33ce 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.expect
@@ -12,8 +12,8 @@
 //     ..first.last.toString()
 //             ^^^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The method '[]' isn't defined for the class 'int'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The operator '[]' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
 //     ..first[0].toString()
 //            ^
 //
@@ -38,8 +38,8 @@
     ^" in <core::int*>[1] as{TypeError} core::int*] in let final void #t15 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:30:13: Error: The getter 'last' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
     ..first.last.toString()
-            ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The method '[]' isn't defined for the class 'int'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+            ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The operator '[]' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
     ..first[0].toString()
            ^".{core::Object::toString}() in let final void #t17 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:32:11: Error: The getter 'last' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.transformed.expect
index 9051dbd..d0a33ce 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart.weak.transformed.expect
@@ -12,8 +12,8 @@
 //     ..first.last.toString()
 //             ^^^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The method '[]' isn't defined for the class 'int'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The operator '[]' isn't defined for the class 'int'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
 //     ..first[0].toString()
 //            ^
 //
@@ -38,8 +38,8 @@
     ^" in <core::int*>[1] as{TypeError} core::int*] in let final void #t15 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:30:13: Error: The getter 'last' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
     ..first.last.toString()
-            ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The method '[]' isn't defined for the class 'int'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+            ^^^^".{core::Object::toString}() in let final void #t16 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:31:12: Error: The operator '[]' isn't defined for the class 'int'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
     ..first[0].toString()
            ^".{core::Object::toString}() in let final void #t17 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/cascade.dart:32:11: Error: The getter 'last' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.outline.expect b/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.outline.expect
index 777f40b..6172453 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.outline.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.outline.expect
@@ -4,7 +4,7 @@
 
 import "dart:core" as core;
 
-class A extends core::Object implements core::Function {
+class A extends core::Object {
   synthetic constructor •() → self::A*
     ;
   operator ==(dynamic other) → core::bool*
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.strong.expect b/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.strong.expect
index 8006a4c..b28a177 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.strong.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.strong.expect
@@ -4,7 +4,7 @@
 
 import "dart:core" as core;
 
-class A extends core::Object implements core::Function {
+class A extends core::Object {
   synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.strong.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.strong.transformed.expect
index 8006a4c..b28a177 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 import "dart:core" as core;
 
-class A extends core::Object implements core::Function {
+class A extends core::Object {
   synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.weak.expect
index 8006a4c..b28a177 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.weak.expect
@@ -4,7 +4,7 @@
 
 import "dart:core" as core;
 
-class A extends core::Object implements core::Function {
+class A extends core::Object {
   synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.weak.transformed.expect
index 8006a4c..b28a177 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/ignore_function.dart.weak.transformed.expect
@@ -4,7 +4,7 @@
 
 import "dart:core" as core;
 
-class A extends core::Object implements core::Function {
+class A extends core::Object {
   synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart.strong.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart.strong.transformed.expect
new file mode 100644
index 0000000..3be894f
--- /dev/null
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart.strong.transformed.expect
@@ -0,0 +1,38 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart:9:5: Error: Expected identifier, but got 'this'.
+//     this.bar();
+//     ^^^^
+//
+// pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart:14:12: Error: 'Missing' isn't a type.
+//   (null as Missing).bar();
+//            ^^^^^^^
+//
+// pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart:15:8: Error: The method 'bar' isn't defined for the class 'Null'.
+// Try correcting the name to the name of an existing method, or defining a method named 'bar'.
+//   null.bar();
+//        ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  static method foo() → dynamic {
+    invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart:9:5: Error: Expected identifier, but got 'this'.
+    this.bar();
+    ^^^^".bar();
+  }
+}
+static method test() → dynamic {
+  (null as invalid-type).bar();
+  invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart:15:8: Error: The method 'bar' isn't defined for the class 'Null'.
+Try correcting the name to the name of an existing method, or defining a method named 'bar'.
+  null.bar();
+       ^^^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart.weak.transformed.expect
new file mode 100644
index 0000000..3be894f
--- /dev/null
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart.weak.transformed.expect
@@ -0,0 +1,38 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart:9:5: Error: Expected identifier, but got 'this'.
+//     this.bar();
+//     ^^^^
+//
+// pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart:14:12: Error: 'Missing' isn't a type.
+//   (null as Missing).bar();
+//            ^^^^^^^
+//
+// pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart:15:8: Error: The method 'bar' isn't defined for the class 'Null'.
+// Try correcting the name to the name of an existing method, or defining a method named 'bar'.
+//   null.bar();
+//        ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  static method foo() → dynamic {
+    invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart:9:5: Error: Expected identifier, but got 'this'.
+    this.bar();
+    ^^^^".bar();
+  }
+}
+static method test() → dynamic {
+  (null as invalid-type).bar();
+  invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/invalid_type.dart:15:8: Error: The method 'bar' isn't defined for the class 'Null'.
+Try correcting the name to the name of an existing method, or defining a method named 'bar'.
+  null.bar();
+       ^^^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.strong.expect b/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.strong.expect
index 98ba00e..fec45f5 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.strong.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.strong.expect
@@ -2,21 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
 //  - 'EmptyClass' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 // var missingBinary = classWithProperty.property += 2;
 //                                                ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
 //  - 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
 // var missingIndexGet = classWithIndexSet[0] ??= 2;
 //                                        ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
 //  - 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
 // var missingIndexSet = classWithIndexGet[0] ??= 2;
 //                                        ^
 //
@@ -63,19 +63,19 @@
 static field self::ClassWithProperty* classWithProperty = new self::ClassWithProperty::•();
 static field self::ClassWithIndexSet* classWithIndexSet = new self::ClassWithIndexSet::•();
 static field self::ClassWithIndexGet* classWithIndexGet = new self::ClassWithIndexGet::•();
-static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
  - 'EmptyClass' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
 var missingBinary = classWithProperty.property += 2;
                                                ^" as{TypeError,ForDynamic} self::EmptyClass*;
-static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
  - 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
 var missingIndexGet = classWithIndexSet[0] ??= 2;
                                        ^" in #t4.{core::Object::==}(null) ?{dynamic} let final core::int* #t5 = 2 in let final void #t6 = #t2.{self::ClassWithIndexSet::[]=}(#t3, #t5) in #t5 : #t4;
-static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
  - 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
 var missingIndexSet = classWithIndexGet[0] ??= 2;
                                        ^" in #t10 : #t9;
 static field dynamic missingPropertyGet = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:32:37: Error: The getter 'property' isn't defined for the class 'EmptyClass'.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.strong.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.strong.transformed.expect
index 98ba00e..fec45f5 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.strong.transformed.expect
@@ -2,21 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
 //  - 'EmptyClass' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 // var missingBinary = classWithProperty.property += 2;
 //                                                ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
 //  - 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
 // var missingIndexGet = classWithIndexSet[0] ??= 2;
 //                                        ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
 //  - 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
 // var missingIndexSet = classWithIndexGet[0] ??= 2;
 //                                        ^
 //
@@ -63,19 +63,19 @@
 static field self::ClassWithProperty* classWithProperty = new self::ClassWithProperty::•();
 static field self::ClassWithIndexSet* classWithIndexSet = new self::ClassWithIndexSet::•();
 static field self::ClassWithIndexGet* classWithIndexGet = new self::ClassWithIndexGet::•();
-static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
  - 'EmptyClass' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
 var missingBinary = classWithProperty.property += 2;
                                                ^" as{TypeError,ForDynamic} self::EmptyClass*;
-static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
  - 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
 var missingIndexGet = classWithIndexSet[0] ??= 2;
                                        ^" in #t4.{core::Object::==}(null) ?{dynamic} let final core::int* #t5 = 2 in let final void #t6 = #t2.{self::ClassWithIndexSet::[]=}(#t3, #t5) in #t5 : #t4;
-static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
  - 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
 var missingIndexSet = classWithIndexGet[0] ??= 2;
                                        ^" in #t10 : #t9;
 static field dynamic missingPropertyGet = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:32:37: Error: The getter 'property' isn't defined for the class 'EmptyClass'.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.expect
index 98ba00e..fec45f5 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.expect
@@ -2,21 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
 //  - 'EmptyClass' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 // var missingBinary = classWithProperty.property += 2;
 //                                                ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
 //  - 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
 // var missingIndexGet = classWithIndexSet[0] ??= 2;
 //                                        ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
 //  - 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
 // var missingIndexSet = classWithIndexGet[0] ??= 2;
 //                                        ^
 //
@@ -63,19 +63,19 @@
 static field self::ClassWithProperty* classWithProperty = new self::ClassWithProperty::•();
 static field self::ClassWithIndexSet* classWithIndexSet = new self::ClassWithIndexSet::•();
 static field self::ClassWithIndexGet* classWithIndexGet = new self::ClassWithIndexGet::•();
-static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
  - 'EmptyClass' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
 var missingBinary = classWithProperty.property += 2;
                                                ^" as{TypeError,ForDynamic} self::EmptyClass*;
-static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
  - 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
 var missingIndexGet = classWithIndexSet[0] ??= 2;
                                        ^" in #t4.{core::Object::==}(null) ?{dynamic} let final core::int* #t5 = 2 in let final void #t6 = #t2.{self::ClassWithIndexSet::[]=}(#t3, #t5) in #t5 : #t4;
-static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
  - 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
 var missingIndexSet = classWithIndexGet[0] ??= 2;
                                        ^" in #t10 : #t9;
 static field dynamic missingPropertyGet = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:32:37: Error: The getter 'property' isn't defined for the class 'EmptyClass'.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.transformed.expect
index 98ba00e..fec45f5 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart.weak.transformed.expect
@@ -2,21 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
 //  - 'EmptyClass' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 // var missingBinary = classWithProperty.property += 2;
 //                                                ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
 //  - 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
 // var missingIndexGet = classWithIndexSet[0] ??= 2;
 //                                        ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+// pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
 //  - 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
 // var missingIndexSet = classWithIndexGet[0] ??= 2;
 //                                        ^
 //
@@ -63,19 +63,19 @@
 static field self::ClassWithProperty* classWithProperty = new self::ClassWithProperty::•();
 static field self::ClassWithIndexSet* classWithIndexSet = new self::ClassWithIndexSet::•();
 static field self::ClassWithIndexGet* classWithIndexGet = new self::ClassWithIndexGet::•();
-static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The method '+' isn't defined for the class 'EmptyClass'.
+static field dynamic missingBinary = let final self::ClassWithProperty* #t1 = self::classWithProperty in #t1.{self::ClassWithProperty::property} = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:29:48: Error: The operator '+' isn't defined for the class 'EmptyClass'.
  - 'EmptyClass' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
 var missingBinary = classWithProperty.property += 2;
                                                ^" as{TypeError,ForDynamic} self::EmptyClass*;
-static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The method '[]' isn't defined for the class 'ClassWithIndexSet'.
+static field dynamic missingIndexGet = let final self::ClassWithIndexSet* #t2 = self::classWithIndexSet in let final core::int* #t3 = 0 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:30:40: Error: The operator '[]' isn't defined for the class 'ClassWithIndexSet'.
  - 'ClassWithIndexSet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
 var missingIndexGet = classWithIndexSet[0] ??= 2;
                                        ^" in #t4.{core::Object::==}(null) ?{dynamic} let final core::int* #t5 = 2 in let final void #t6 = #t2.{self::ClassWithIndexSet::[]=}(#t3, #t5) in #t5 : #t4;
-static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The method '[]=' isn't defined for the class 'ClassWithIndexGet'.
+static field core::int* missingIndexSet = let final self::ClassWithIndexGet* #t7 = self::classWithIndexGet in let final core::int* #t8 = 0 in let final core::int* #t9 = #t7.{self::ClassWithIndexGet::[]}(#t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 2 in let final void #t11 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:31:40: Error: The operator '[]=' isn't defined for the class 'ClassWithIndexGet'.
  - 'ClassWithIndexGet' is from 'pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
 var missingIndexSet = classWithIndexGet[0] ??= 2;
                                        ^" in #t10 : #t9;
 static field dynamic missingPropertyGet = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/missing_toplevel.dart:32:37: Error: The getter 'property' isn't defined for the class 'EmptyClass'.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.strong.expect b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.strong.expect
index 500a9d3..37d2479 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.strong.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.strong.expect
@@ -59,6 +59,6 @@
 
 constants  {
   #C1 = 0
-  #C2 = TypeLiteralConstant(dart.core::String*)
-  #C3 = TypeLiteralConstant(dart.core::int*)
+  #C2 = TypeLiteralConstant(core::String*)
+  #C3 = TypeLiteralConstant(core::int*)
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.strong.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.strong.transformed.expect
index 9c19e86..a3cedca 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.strong.transformed.expect
@@ -59,6 +59,6 @@
 
 constants  {
   #C1 = 0
-  #C2 = TypeLiteralConstant(dart.core::String*)
-  #C3 = TypeLiteralConstant(dart.core::int*)
+  #C2 = TypeLiteralConstant(core::String*)
+  #C3 = TypeLiteralConstant(core::int*)
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.weak.expect
index 500a9d3..37d2479 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.weak.expect
@@ -59,6 +59,6 @@
 
 constants  {
   #C1 = 0
-  #C2 = TypeLiteralConstant(dart.core::String*)
-  #C3 = TypeLiteralConstant(dart.core::int*)
+  #C2 = TypeLiteralConstant(core::String*)
+  #C3 = TypeLiteralConstant(core::int*)
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.weak.transformed.expect
index 9c19e86..a3cedca 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/mixin_constructors_with_default_values.dart.weak.transformed.expect
@@ -59,6 +59,6 @@
 
 constants  {
   #C1 = 0
-  #C2 = TypeLiteralConstant(dart.core::String*)
-  #C3 = TypeLiteralConstant(dart.core::int*)
+  #C2 = TypeLiteralConstant(core::String*)
+  #C3 = TypeLiteralConstant(core::int*)
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.strong.expect b/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.strong.expect
index 21ad1af..e25cec2 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.strong.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.strong.expect
@@ -75,117 +75,117 @@
 //   print(foo ~ 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The method '<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The operator '<' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
 //   print(foo < 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The method '>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The operator '>' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>'.
+// Try correcting the operator to an existing operator, or defining a '>' operator.
 //   print(foo > 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The method '<=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The operator '<=' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<='.
+// Try correcting the operator to an existing operator, or defining a '<=' operator.
 //   print(foo <= 2);
 //             ^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The method '>=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The operator '>=' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>='.
+// Try correcting the operator to an existing operator, or defining a '>=' operator.
 //   print(foo >= 2);
 //             ^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The method '-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The operator '-' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '-'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
 //   print(foo - 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The method '+' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The operator '+' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //   print(foo + 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The method '/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The operator '/' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '/'.
+// Try correcting the operator to an existing operator, or defining a '/' operator.
 //   print(foo / 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The method '~/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The operator '~/' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~/'.
+// Try correcting the operator to an existing operator, or defining a '~/' operator.
 //   print(foo ~/ 2);
 //             ^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The method '*' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The operator '*' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '*'.
+// Try correcting the operator to an existing operator, or defining a '*' operator.
 //   print(foo * 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The method '%' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The operator '%' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '%'.
+// Try correcting the operator to an existing operator, or defining a '%' operator.
 //   print(foo % 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The method '|' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The operator '|' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '|'.
+// Try correcting the operator to an existing operator, or defining a '|' operator.
 //   print(foo | 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The method '^' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The operator '^' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '^'.
+// Try correcting the operator to an existing operator, or defining a '^' operator.
 //   print(foo ^ 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The method '&' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The operator '&' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '&'.
+// Try correcting the operator to an existing operator, or defining a '&' operator.
 //   print(foo & 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The method '<<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The operator '<<' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<<'.
+// Try correcting the operator to an existing operator, or defining a '<<' operator.
 //   print(foo << 2);
 //             ^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The method '>>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The operator '>>' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>>'.
+// Try correcting the operator to an existing operator, or defining a '>>' operator.
 //   print(foo >> 2);
 //             ^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
 //   print(foo[2] = 2);
 //            ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The method '[]' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The operator '[]' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
 //   print(foo[2]);
 //            ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The method '~' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The operator '~' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~'.
+// Try correcting the operator to an existing operator, or defining a '~' operator.
 //   print(~foo);
 //         ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+// Try correcting the operator to an existing operator, or defining a 'unary-' operator.
 //   print(-foo);
 //         ^
 //
@@ -199,100 +199,100 @@
 }
 static method main() → dynamic {
   self::Foo* foo = new self::Foo::•();
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The method '<' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The operator '<' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
   print(foo < 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The method '>' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The operator '>' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>'.
+Try correcting the operator to an existing operator, or defining a '>' operator.
   print(foo > 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The method '<=' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The operator '<=' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<='.
+Try correcting the operator to an existing operator, or defining a '<=' operator.
   print(foo <= 2);
             ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The method '>=' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The operator '>=' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>='.
+Try correcting the operator to an existing operator, or defining a '>=' operator.
   print(foo >= 2);
             ^^");
   core::print(foo.{core::Object::==}(2));
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The method '-' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The operator '-' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
   print(foo - 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The method '+' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The operator '+' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
   print(foo + 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The method '/' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The operator '/' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '/'.
+Try correcting the operator to an existing operator, or defining a '/' operator.
   print(foo / 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The method '~/' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The operator '~/' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~/'.
+Try correcting the operator to an existing operator, or defining a '~/' operator.
   print(foo ~/ 2);
             ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The method '*' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The operator '*' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '*'.
+Try correcting the operator to an existing operator, or defining a '*' operator.
   print(foo * 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The method '%' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The operator '%' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '%'.
+Try correcting the operator to an existing operator, or defining a '%' operator.
   print(foo % 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The method '|' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The operator '|' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '|'.
+Try correcting the operator to an existing operator, or defining a '|' operator.
   print(foo | 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The method '^' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The operator '^' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '^'.
+Try correcting the operator to an existing operator, or defining a '^' operator.
   print(foo ^ 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The method '&' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The operator '&' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '&'.
+Try correcting the operator to an existing operator, or defining a '&' operator.
   print(foo & 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The method '<<' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The operator '<<' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<<'.
+Try correcting the operator to an existing operator, or defining a '<<' operator.
   print(foo << 2);
             ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The method '>>' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The operator '>>' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>>'.
+Try correcting the operator to an existing operator, or defining a '>>' operator.
   print(foo >> 2);
             ^^");
-  core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+  core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
   print(foo[2] = 2);
            ^" in #t3);
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The method '[]' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The operator '[]' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
   print(foo[2]);
            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The method '~' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The operator '~' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~'.
+Try correcting the operator to an existing operator, or defining a '~' operator.
   print(~foo);
         ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+Try correcting the operator to an existing operator, or defining a 'unary-' operator.
   print(-foo);
         ^");
   core::print(<invalid-type>[]);
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.strong.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.strong.transformed.expect
index 21ad1af..e25cec2 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.strong.transformed.expect
@@ -75,117 +75,117 @@
 //   print(foo ~ 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The method '<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The operator '<' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
 //   print(foo < 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The method '>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The operator '>' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>'.
+// Try correcting the operator to an existing operator, or defining a '>' operator.
 //   print(foo > 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The method '<=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The operator '<=' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<='.
+// Try correcting the operator to an existing operator, or defining a '<=' operator.
 //   print(foo <= 2);
 //             ^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The method '>=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The operator '>=' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>='.
+// Try correcting the operator to an existing operator, or defining a '>=' operator.
 //   print(foo >= 2);
 //             ^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The method '-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The operator '-' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '-'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
 //   print(foo - 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The method '+' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The operator '+' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //   print(foo + 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The method '/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The operator '/' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '/'.
+// Try correcting the operator to an existing operator, or defining a '/' operator.
 //   print(foo / 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The method '~/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The operator '~/' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~/'.
+// Try correcting the operator to an existing operator, or defining a '~/' operator.
 //   print(foo ~/ 2);
 //             ^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The method '*' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The operator '*' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '*'.
+// Try correcting the operator to an existing operator, or defining a '*' operator.
 //   print(foo * 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The method '%' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The operator '%' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '%'.
+// Try correcting the operator to an existing operator, or defining a '%' operator.
 //   print(foo % 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The method '|' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The operator '|' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '|'.
+// Try correcting the operator to an existing operator, or defining a '|' operator.
 //   print(foo | 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The method '^' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The operator '^' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '^'.
+// Try correcting the operator to an existing operator, or defining a '^' operator.
 //   print(foo ^ 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The method '&' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The operator '&' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '&'.
+// Try correcting the operator to an existing operator, or defining a '&' operator.
 //   print(foo & 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The method '<<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The operator '<<' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<<'.
+// Try correcting the operator to an existing operator, or defining a '<<' operator.
 //   print(foo << 2);
 //             ^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The method '>>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The operator '>>' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>>'.
+// Try correcting the operator to an existing operator, or defining a '>>' operator.
 //   print(foo >> 2);
 //             ^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
 //   print(foo[2] = 2);
 //            ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The method '[]' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The operator '[]' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
 //   print(foo[2]);
 //            ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The method '~' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The operator '~' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~'.
+// Try correcting the operator to an existing operator, or defining a '~' operator.
 //   print(~foo);
 //         ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+// Try correcting the operator to an existing operator, or defining a 'unary-' operator.
 //   print(-foo);
 //         ^
 //
@@ -199,100 +199,100 @@
 }
 static method main() → dynamic {
   self::Foo* foo = new self::Foo::•();
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The method '<' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The operator '<' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
   print(foo < 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The method '>' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The operator '>' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>'.
+Try correcting the operator to an existing operator, or defining a '>' operator.
   print(foo > 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The method '<=' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The operator '<=' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<='.
+Try correcting the operator to an existing operator, or defining a '<=' operator.
   print(foo <= 2);
             ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The method '>=' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The operator '>=' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>='.
+Try correcting the operator to an existing operator, or defining a '>=' operator.
   print(foo >= 2);
             ^^");
   core::print(foo.{core::Object::==}(2));
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The method '-' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The operator '-' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
   print(foo - 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The method '+' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The operator '+' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
   print(foo + 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The method '/' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The operator '/' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '/'.
+Try correcting the operator to an existing operator, or defining a '/' operator.
   print(foo / 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The method '~/' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The operator '~/' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~/'.
+Try correcting the operator to an existing operator, or defining a '~/' operator.
   print(foo ~/ 2);
             ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The method '*' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The operator '*' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '*'.
+Try correcting the operator to an existing operator, or defining a '*' operator.
   print(foo * 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The method '%' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The operator '%' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '%'.
+Try correcting the operator to an existing operator, or defining a '%' operator.
   print(foo % 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The method '|' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The operator '|' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '|'.
+Try correcting the operator to an existing operator, or defining a '|' operator.
   print(foo | 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The method '^' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The operator '^' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '^'.
+Try correcting the operator to an existing operator, or defining a '^' operator.
   print(foo ^ 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The method '&' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The operator '&' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '&'.
+Try correcting the operator to an existing operator, or defining a '&' operator.
   print(foo & 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The method '<<' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The operator '<<' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<<'.
+Try correcting the operator to an existing operator, or defining a '<<' operator.
   print(foo << 2);
             ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The method '>>' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The operator '>>' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>>'.
+Try correcting the operator to an existing operator, or defining a '>>' operator.
   print(foo >> 2);
             ^^");
-  core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+  core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
   print(foo[2] = 2);
            ^" in #t3);
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The method '[]' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The operator '[]' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
   print(foo[2]);
            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The method '~' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The operator '~' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~'.
+Try correcting the operator to an existing operator, or defining a '~' operator.
   print(~foo);
         ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+Try correcting the operator to an existing operator, or defining a 'unary-' operator.
   print(-foo);
         ^");
   core::print(<invalid-type>[]);
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.expect
index 21ad1af..e25cec2 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.expect
@@ -75,117 +75,117 @@
 //   print(foo ~ 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The method '<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The operator '<' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
 //   print(foo < 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The method '>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The operator '>' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>'.
+// Try correcting the operator to an existing operator, or defining a '>' operator.
 //   print(foo > 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The method '<=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The operator '<=' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<='.
+// Try correcting the operator to an existing operator, or defining a '<=' operator.
 //   print(foo <= 2);
 //             ^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The method '>=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The operator '>=' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>='.
+// Try correcting the operator to an existing operator, or defining a '>=' operator.
 //   print(foo >= 2);
 //             ^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The method '-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The operator '-' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '-'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
 //   print(foo - 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The method '+' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The operator '+' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //   print(foo + 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The method '/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The operator '/' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '/'.
+// Try correcting the operator to an existing operator, or defining a '/' operator.
 //   print(foo / 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The method '~/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The operator '~/' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~/'.
+// Try correcting the operator to an existing operator, or defining a '~/' operator.
 //   print(foo ~/ 2);
 //             ^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The method '*' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The operator '*' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '*'.
+// Try correcting the operator to an existing operator, or defining a '*' operator.
 //   print(foo * 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The method '%' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The operator '%' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '%'.
+// Try correcting the operator to an existing operator, or defining a '%' operator.
 //   print(foo % 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The method '|' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The operator '|' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '|'.
+// Try correcting the operator to an existing operator, or defining a '|' operator.
 //   print(foo | 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The method '^' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The operator '^' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '^'.
+// Try correcting the operator to an existing operator, or defining a '^' operator.
 //   print(foo ^ 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The method '&' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The operator '&' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '&'.
+// Try correcting the operator to an existing operator, or defining a '&' operator.
 //   print(foo & 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The method '<<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The operator '<<' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<<'.
+// Try correcting the operator to an existing operator, or defining a '<<' operator.
 //   print(foo << 2);
 //             ^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The method '>>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The operator '>>' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>>'.
+// Try correcting the operator to an existing operator, or defining a '>>' operator.
 //   print(foo >> 2);
 //             ^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
 //   print(foo[2] = 2);
 //            ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The method '[]' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The operator '[]' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
 //   print(foo[2]);
 //            ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The method '~' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The operator '~' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~'.
+// Try correcting the operator to an existing operator, or defining a '~' operator.
 //   print(~foo);
 //         ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+// Try correcting the operator to an existing operator, or defining a 'unary-' operator.
 //   print(-foo);
 //         ^
 //
@@ -199,100 +199,100 @@
 }
 static method main() → dynamic {
   self::Foo* foo = new self::Foo::•();
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The method '<' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The operator '<' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
   print(foo < 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The method '>' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The operator '>' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>'.
+Try correcting the operator to an existing operator, or defining a '>' operator.
   print(foo > 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The method '<=' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The operator '<=' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<='.
+Try correcting the operator to an existing operator, or defining a '<=' operator.
   print(foo <= 2);
             ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The method '>=' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The operator '>=' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>='.
+Try correcting the operator to an existing operator, or defining a '>=' operator.
   print(foo >= 2);
             ^^");
   core::print(foo.{core::Object::==}(2));
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The method '-' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The operator '-' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
   print(foo - 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The method '+' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The operator '+' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
   print(foo + 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The method '/' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The operator '/' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '/'.
+Try correcting the operator to an existing operator, or defining a '/' operator.
   print(foo / 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The method '~/' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The operator '~/' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~/'.
+Try correcting the operator to an existing operator, or defining a '~/' operator.
   print(foo ~/ 2);
             ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The method '*' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The operator '*' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '*'.
+Try correcting the operator to an existing operator, or defining a '*' operator.
   print(foo * 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The method '%' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The operator '%' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '%'.
+Try correcting the operator to an existing operator, or defining a '%' operator.
   print(foo % 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The method '|' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The operator '|' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '|'.
+Try correcting the operator to an existing operator, or defining a '|' operator.
   print(foo | 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The method '^' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The operator '^' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '^'.
+Try correcting the operator to an existing operator, or defining a '^' operator.
   print(foo ^ 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The method '&' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The operator '&' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '&'.
+Try correcting the operator to an existing operator, or defining a '&' operator.
   print(foo & 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The method '<<' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The operator '<<' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<<'.
+Try correcting the operator to an existing operator, or defining a '<<' operator.
   print(foo << 2);
             ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The method '>>' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The operator '>>' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>>'.
+Try correcting the operator to an existing operator, or defining a '>>' operator.
   print(foo >> 2);
             ^^");
-  core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+  core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
   print(foo[2] = 2);
            ^" in #t3);
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The method '[]' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The operator '[]' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
   print(foo[2]);
            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The method '~' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The operator '~' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~'.
+Try correcting the operator to an existing operator, or defining a '~' operator.
   print(~foo);
         ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+Try correcting the operator to an existing operator, or defining a 'unary-' operator.
   print(-foo);
         ^");
   core::print(<invalid-type>[]);
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.transformed.expect
index 21ad1af..e25cec2 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart.weak.transformed.expect
@@ -75,117 +75,117 @@
 //   print(foo ~ 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The method '<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The operator '<' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
 //   print(foo < 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The method '>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The operator '>' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>'.
+// Try correcting the operator to an existing operator, or defining a '>' operator.
 //   print(foo > 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The method '<=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The operator '<=' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<='.
+// Try correcting the operator to an existing operator, or defining a '<=' operator.
 //   print(foo <= 2);
 //             ^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The method '>=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The operator '>=' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>='.
+// Try correcting the operator to an existing operator, or defining a '>=' operator.
 //   print(foo >= 2);
 //             ^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The method '-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The operator '-' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '-'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
 //   print(foo - 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The method '+' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The operator '+' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //   print(foo + 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The method '/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The operator '/' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '/'.
+// Try correcting the operator to an existing operator, or defining a '/' operator.
 //   print(foo / 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The method '~/' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The operator '~/' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~/'.
+// Try correcting the operator to an existing operator, or defining a '~/' operator.
 //   print(foo ~/ 2);
 //             ^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The method '*' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The operator '*' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '*'.
+// Try correcting the operator to an existing operator, or defining a '*' operator.
 //   print(foo * 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The method '%' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The operator '%' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '%'.
+// Try correcting the operator to an existing operator, or defining a '%' operator.
 //   print(foo % 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The method '|' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The operator '|' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '|'.
+// Try correcting the operator to an existing operator, or defining a '|' operator.
 //   print(foo | 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The method '^' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The operator '^' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '^'.
+// Try correcting the operator to an existing operator, or defining a '^' operator.
 //   print(foo ^ 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The method '&' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The operator '&' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '&'.
+// Try correcting the operator to an existing operator, or defining a '&' operator.
 //   print(foo & 2);
 //             ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The method '<<' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The operator '<<' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<<'.
+// Try correcting the operator to an existing operator, or defining a '<<' operator.
 //   print(foo << 2);
 //             ^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The method '>>' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The operator '>>' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>>'.
+// Try correcting the operator to an existing operator, or defining a '>>' operator.
 //   print(foo >> 2);
 //             ^^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
 //   print(foo[2] = 2);
 //            ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The method '[]' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The operator '[]' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
 //   print(foo[2]);
 //            ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The method '~' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The operator '~' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~'.
+// Try correcting the operator to an existing operator, or defining a '~' operator.
 //   print(~foo);
 //         ^
 //
-// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+// pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
 //  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+// Try correcting the operator to an existing operator, or defining a 'unary-' operator.
 //   print(-foo);
 //         ^
 //
@@ -199,100 +199,100 @@
 }
 static method main() → dynamic {
   self::Foo* foo = new self::Foo::•();
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The method '<' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:14:13: Error: The operator '<' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
   print(foo < 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The method '>' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:15:13: Error: The operator '>' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>'.
+Try correcting the operator to an existing operator, or defining a '>' operator.
   print(foo > 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The method '<=' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:16:13: Error: The operator '<=' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<='.
+Try correcting the operator to an existing operator, or defining a '<=' operator.
   print(foo <= 2);
             ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The method '>=' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:17:13: Error: The operator '>=' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>='.
+Try correcting the operator to an existing operator, or defining a '>=' operator.
   print(foo >= 2);
             ^^");
   core::print(foo.{core::Object::==}(2));
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The method '-' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:19:13: Error: The operator '-' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
   print(foo - 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The method '+' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:20:13: Error: The operator '+' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
   print(foo + 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The method '/' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:21:13: Error: The operator '/' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '/'.
+Try correcting the operator to an existing operator, or defining a '/' operator.
   print(foo / 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The method '~/' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:22:13: Error: The operator '~/' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~/'.
+Try correcting the operator to an existing operator, or defining a '~/' operator.
   print(foo ~/ 2);
             ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The method '*' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:23:13: Error: The operator '*' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '*'.
+Try correcting the operator to an existing operator, or defining a '*' operator.
   print(foo * 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The method '%' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:24:13: Error: The operator '%' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '%'.
+Try correcting the operator to an existing operator, or defining a '%' operator.
   print(foo % 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The method '|' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:25:13: Error: The operator '|' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '|'.
+Try correcting the operator to an existing operator, or defining a '|' operator.
   print(foo | 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The method '^' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:26:13: Error: The operator '^' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '^'.
+Try correcting the operator to an existing operator, or defining a '^' operator.
   print(foo ^ 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The method '&' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:27:13: Error: The operator '&' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '&'.
+Try correcting the operator to an existing operator, or defining a '&' operator.
   print(foo & 2);
             ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The method '<<' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:28:13: Error: The operator '<<' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<<'.
+Try correcting the operator to an existing operator, or defining a '<<' operator.
   print(foo << 2);
             ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The method '>>' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:29:13: Error: The operator '>>' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>>'.
+Try correcting the operator to an existing operator, or defining a '>>' operator.
   print(foo >> 2);
             ^^");
-  core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+  core::print(let final self::Foo* #t1 = foo in let final core::int* #t2 = 2 in let final core::int* #t3 = 2 in let final void #t4 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:31:12: Error: The operator '[]=' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
   print(foo[2] = 2);
            ^" in #t3);
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The method '[]' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:32:12: Error: The operator '[]' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
   print(foo[2]);
            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The method '~' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:33:9: Error: The operator '~' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~'.
+Try correcting the operator to an existing operator, or defining a '~' operator.
   print(~foo);
         ^");
-  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+  core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart:34:9: Error: The operator 'unary-' isn't defined for the class 'Foo'.
  - 'Foo' is from 'pkg/front_end/testcases/general_nnbd_opt_out/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+Try correcting the operator to an existing operator, or defining a 'unary-' operator.
   print(-foo);
         ^");
   core::print(<invalid-type>[]);
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 a20d4ff..4a9ec12 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
@@ -423,7 +423,7 @@
       return 1.{dart.core::int::unary-}();
     }
     method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ insert(dart.core::int* index, generic-covariant-impl dart.core::int* element) → void {
-      dart.core::ArgumentError::checkNotNull(index, "index");
+      dart.core::ArgumentError::checkNotNull<dart.core::int*>(index, "index");
       dart.core::RangeError::checkValueInInterval(index, 0, this.{dart.core::List::length}, "index");
       if(index.{dart.core::num::==}(this.{dart.core::List::length})) {
         this.{dart.collection::ListMixin::add}(element);
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 a20d4ff..4a9ec12 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
@@ -423,7 +423,7 @@
       return 1.{dart.core::int::unary-}();
     }
     method /* from org-dartlang-sdk:///sdk/lib/collection/list.dart */ insert(dart.core::int* index, generic-covariant-impl dart.core::int* element) → void {
-      dart.core::ArgumentError::checkNotNull(index, "index");
+      dart.core::ArgumentError::checkNotNull<dart.core::int*>(index, "index");
       dart.core::RangeError::checkValueInInterval(index, 0, this.{dart.core::List::length}, "index");
       if(index.{dart.core::num::==}(this.{dart.core::List::length})) {
         this.{dart.collection::ListMixin::add}(element);
diff --git a/pkg/front_end/testcases/inference/call_corner_cases.dart b/pkg/front_end/testcases/inference/call_corner_cases.dart
index 998d8a7..42ed206 100644
--- a/pkg/front_end/testcases/inference/call_corner_cases.dart
+++ b/pkg/front_end/testcases/inference/call_corner_cases.dart
@@ -23,13 +23,13 @@
 test() {
   var /*@ type=int* */ callA = new A() /*@target=A::call*/ ();
   var /*@ type=int* */ callFieldA =
-      new D(). /*@target=D::fieldA*/ /*@target=A::call*/ fieldA();
+      new D(). /*@target=D::fieldA*/ fieldA /*@target=A::call*/ ();
   var /*@ type=int* */ callGetA =
-      new D(). /*@target=D::getA*/ /*@target=A::call*/ getA();
+      new D(). /*@target=D::getA*/ getA /*@target=A::call*/ ();
   var /*@type=int**/ callFieldB = new D()
-      . /*@target=D::fieldB*/ /*@target=B::call*/ /*@target=A::call*/ fieldB();
+      . /*@target=D::fieldB*/ fieldB /*@target=B::call*/ /*@target=A::call*/ ();
   var /*@type=int**/ callGetB = new D()
-      . /*@target=D::getB*/ /*@target=B::call*/ /*@target=A::call*/ getB();
+      . /*@target=D::getB*/ getB /*@target=B::call*/ /*@target=A::call*/ ();
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/callable_generic_class.dart b/pkg/front_end/testcases/inference/callable_generic_class.dart
index 57f1e5e..fd64d35 100644
--- a/pkg/front_end/testcases/inference/callable_generic_class.dart
+++ b/pkg/front_end/testcases/inference/callable_generic_class.dart
@@ -17,7 +17,7 @@
 
 void main() {
   new FooActions()
-      . /*@target=FooActions::foo*/ /*@target=ActionDispatcher::call*/ foo(
+      . /*@target=FooActions::foo*/ foo /*@target=ActionDispatcher::call*/ (
           new Bar());
   new FooActions()
       . /*@target=FooActions::foo*/ foo
diff --git a/pkg/front_end/testcases/inference/conflicting_fields.dart.outline.expect b/pkg/front_end/testcases/inference/conflicting_fields.dart.outline.expect
index 36d9d8f..ecc609d 100644
--- a/pkg/front_end/testcases/inference/conflicting_fields.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/conflicting_fields.dart.outline.expect
@@ -6,21 +6,45 @@
 // Try adding an explicit type.
 //   get field1 => null;
 //       ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+//   dynamic field1;
+//           ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+//   int field1;
+//       ^^^^^^
 //
 // pkg/front_end/testcases/inference/conflicting_fields.dart:20:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   set field1(value) {}
 //              ^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+//   dynamic field1;
+//           ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+//   int field1;
+//       ^^^^^^
 //
 // pkg/front_end/testcases/inference/conflicting_fields.dart:19:7: Error: Can't infer a return type for 'field2' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   get field2 => null;
 //       ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+//   int field2;
+//       ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+//   dynamic field2;
+//           ^^^^^^
 //
 // pkg/front_end/testcases/inference/conflicting_fields.dart:21:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   set field2(value) {}
 //              ^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+//   int field2;
+//       ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+//   dynamic field2;
+//           ^^^^^^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.expect b/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.expect
index cdd0b47..c539ecb 100644
--- a/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.expect
@@ -6,21 +6,45 @@
 // Try adding an explicit type.
 //   get field1 => null;
 //       ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+//   dynamic field1;
+//           ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+//   int field1;
+//       ^^^^^^
 //
 // pkg/front_end/testcases/inference/conflicting_fields.dart:20:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   set field1(value) {}
 //              ^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+//   dynamic field1;
+//           ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+//   int field1;
+//       ^^^^^^
 //
 // pkg/front_end/testcases/inference/conflicting_fields.dart:19:7: Error: Can't infer a return type for 'field2' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   get field2 => null;
 //       ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+//   int field2;
+//       ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+//   dynamic field2;
+//           ^^^^^^
 //
 // pkg/front_end/testcases/inference/conflicting_fields.dart:21:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   set field2(value) {}
 //              ^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+//   int field2;
+//       ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+//   dynamic field2;
+//           ^^^^^^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.transformed.expect
index cdd0b47..c539ecb 100644
--- a/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.transformed.expect
@@ -6,21 +6,45 @@
 // Try adding an explicit type.
 //   get field1 => null;
 //       ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+//   dynamic field1;
+//           ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+//   int field1;
+//       ^^^^^^
 //
 // pkg/front_end/testcases/inference/conflicting_fields.dart:20:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   set field1(value) {}
 //              ^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:8:11: Context: This is one of the inherited members.
+//   dynamic field1;
+//           ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:13:7: Context: This is one of the inherited members.
+//   int field1;
+//       ^^^^^^
 //
 // pkg/front_end/testcases/inference/conflicting_fields.dart:19:7: Error: Can't infer a return type for 'field2' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   get field2 => null;
 //       ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+//   int field2;
+//       ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+//   dynamic field2;
+//           ^^^^^^
 //
 // pkg/front_end/testcases/inference/conflicting_fields.dart:21:14: Error: Can't infer a type for 'value' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   set field2(value) {}
 //              ^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:9:7: Context: This is one of the inherited members.
+//   int field2;
+//       ^^^^^^
+// pkg/front_end/testcases/inference/conflicting_fields.dart:14:11: Context: This is one of the inherited members.
+//   dynamic field2;
+//           ^^^^^^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.outline.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.outline.expect
index 10031dd..94b60b3 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.outline.expect
@@ -6,11 +6,23 @@
 // Try adding an explicit type.
 //   get a => null;
 //       ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+//   final I1 a = null;
+//            ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+//   final I2 a = null;
+//            ^
 //
 // pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   get a => null;
 //       ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+//   final I2 a = null;
+//            ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+//   final I1 a = null;
+//            ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
index f362386..2f9c0a9 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
@@ -6,11 +6,23 @@
 // Try adding an explicit type.
 //   get a => null;
 //       ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+//   final I1 a = null;
+//            ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+//   final I2 a = null;
+//            ^
 //
 // pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   get a => null;
 //       ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+//   final I2 a = null;
+//            ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+//   final I1 a = null;
+//            ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.transformed.expect
index f362386..2f9c0a9 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.transformed.expect
@@ -6,11 +6,23 @@
 // Try adding an explicit type.
 //   get a => null;
 //       ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+//   final I1 a = null;
+//            ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+//   final I2 a = null;
+//            ^
 //
 // pkg/front_end/testcases/inference/conflicts_can_happen.dart:30:7: Error: Can't infer a return type for 'a' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   get a => null;
 //       ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is one of the inherited members.
+//   final I2 a = null;
+//            ^
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is one of the inherited members.
+//   final I1 a = null;
+//            ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.outline.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.outline.expect
index f509791..6dec14e 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.outline.expect
@@ -6,6 +6,12 @@
 // Try adding an explicit type.
 //   get a => null;
 //       ^
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Context: This is one of the inherited members.
+//   final I1 a = null;
+//            ^
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Context: This is one of the inherited members.
+//   final I2 a = null;
+//            ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
index 5ca29a6..82780a7 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
@@ -6,6 +6,12 @@
 // Try adding an explicit type.
 //   get a => null;
 //       ^
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Context: This is one of the inherited members.
+//   final I1 a = null;
+//            ^
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Context: This is one of the inherited members.
+//   final I2 a = null;
+//            ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.transformed.expect
index 5ca29a6..82780a7 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.transformed.expect
@@ -6,6 +6,12 @@
 // Try adding an explicit type.
 //   get a => null;
 //       ^
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Context: This is one of the inherited members.
+//   final I1 a = null;
+//            ^
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Context: This is one of the inherited members.
+//   final I2 a = null;
+//            ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.expect b/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.expect
index 1f6a002..bab54ce 100644
--- a/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.expect
@@ -2,9 +2,9 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/dynamic_methods.dart:16:39: Error: 'hashCode' isn't a function or method and can't be invoked.
+// pkg/front_end/testcases/inference/dynamic_methods.dart:16:47: Error: 'hashCode' isn't a function or method and can't be invoked.
 //       d. /*@target=Object::hashCode*/ hashCode();
-//                                       ^^^^^^^^
+//                                               ^^^^...
 //
 import self as self;
 import "dart:core" as core;
@@ -19,9 +19,9 @@
 static method test() → dynamic {
   dynamic d = new self::Foo::•();
   core::int* get_hashCode = d.{core::Object::hashCode};
-  dynamic call_hashCode = invalid-expression "pkg/front_end/testcases/inference/dynamic_methods.dart:16:39: Error: 'hashCode' isn't a function or method and can't be invoked.
+  dynamic call_hashCode = invalid-expression "pkg/front_end/testcases/inference/dynamic_methods.dart:16:47: Error: 'hashCode' isn't a function or method and can't be invoked.
       d. /*@target=Object::hashCode*/ hashCode();
-                                      ^^^^^^^^";
+                                              ^^^^...";
   core::String* call_toString = d.{core::Object::toString}();
   dynamic call_toStringArg = d.toString(color: "pink");
   dynamic call_foo0 = d.foo();
diff --git a/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.transformed.expect
index 1f6a002..bab54ce 100644
--- a/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.transformed.expect
@@ -2,9 +2,9 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/dynamic_methods.dart:16:39: Error: 'hashCode' isn't a function or method and can't be invoked.
+// pkg/front_end/testcases/inference/dynamic_methods.dart:16:47: Error: 'hashCode' isn't a function or method and can't be invoked.
 //       d. /*@target=Object::hashCode*/ hashCode();
-//                                       ^^^^^^^^
+//                                               ^^^^...
 //
 import self as self;
 import "dart:core" as core;
@@ -19,9 +19,9 @@
 static method test() → dynamic {
   dynamic d = new self::Foo::•();
   core::int* get_hashCode = d.{core::Object::hashCode};
-  dynamic call_hashCode = invalid-expression "pkg/front_end/testcases/inference/dynamic_methods.dart:16:39: Error: 'hashCode' isn't a function or method and can't be invoked.
+  dynamic call_hashCode = invalid-expression "pkg/front_end/testcases/inference/dynamic_methods.dart:16:47: Error: 'hashCode' isn't a function or method and can't be invoked.
       d. /*@target=Object::hashCode*/ hashCode();
-                                      ^^^^^^^^";
+                                              ^^^^...";
   core::String* call_toString = d.{core::Object::toString}();
   dynamic call_toStringArg = d.toString(color: "pink");
   dynamic call_foo0 = d.foo();
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
index 05abfab..66a26bf 100644
--- a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
@@ -2,9 +2,9 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:123: Error: The method '+' isn't defined for the class 'FutureOr<String>'.
+// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:123: Error: The operator '+' isn't defined for the class 'FutureOr<String>'.
 //  - 'FutureOr' is from 'dart:async'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //                           /*@ type=int* */ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
 //                                                                                                                           ^
 //
@@ -24,9 +24,9 @@
 static method test() → dynamic {
   core::Iterable<asy::Future<core::int*>*>* list = <core::int*>[1, 2, 3].{core::Iterable::map}<asy::Future<core::int*>*>(#C1);
   asy::Future<core::List<core::int*>*>* results = asy::Future::wait<core::int*>(list);
-  asy::Future<core::String*>* results2 = results.{asy::Future::then}<core::String*>((core::List<core::int*>* list) → asy::FutureOr<core::String*>* => list.{core::Iterable::fold}<asy::FutureOr<core::String*>*>("", (asy::FutureOr<core::String*>* x, core::int* y) → asy::FutureOr<core::String*>* => invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:123: Error: The method '+' isn't defined for the class 'FutureOr<String>'.
+  asy::Future<core::String*>* results2 = results.{asy::Future::then}<core::String*>((core::List<core::int*>* list) → asy::FutureOr<core::String*>* => list.{core::Iterable::fold}<asy::FutureOr<core::String*>*>("", (asy::FutureOr<core::String*>* x, core::int* y) → asy::FutureOr<core::String*>* => invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:123: Error: The operator '+' isn't defined for the class 'FutureOr<String>'.
  - 'FutureOr' is from 'dart:async'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
                           /*@ type=int* */ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
                                                                                                                           ^" as{TypeError,ForDynamic} asy::FutureOr<core::String*>*));
   asy::Future<core::String*>* results3 = results.{asy::Future::then}<core::String*>((core::List<core::int*>* list) → asy::FutureOr<core::String*>* => list.{core::Iterable::fold}<asy::FutureOr<core::String*>*>("", let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:111: Error: The argument type 'String Function(String, int)' can't be assigned to the parameter type 'FutureOr<String> Function(FutureOr<String>, int)'.
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect
index 05abfab..66a26bf 100644
--- a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect
@@ -2,9 +2,9 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:123: Error: The method '+' isn't defined for the class 'FutureOr<String>'.
+// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:123: Error: The operator '+' isn't defined for the class 'FutureOr<String>'.
 //  - 'FutureOr' is from 'dart:async'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //                           /*@ type=int* */ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
 //                                                                                                                           ^
 //
@@ -24,9 +24,9 @@
 static method test() → dynamic {
   core::Iterable<asy::Future<core::int*>*>* list = <core::int*>[1, 2, 3].{core::Iterable::map}<asy::Future<core::int*>*>(#C1);
   asy::Future<core::List<core::int*>*>* results = asy::Future::wait<core::int*>(list);
-  asy::Future<core::String*>* results2 = results.{asy::Future::then}<core::String*>((core::List<core::int*>* list) → asy::FutureOr<core::String*>* => list.{core::Iterable::fold}<asy::FutureOr<core::String*>*>("", (asy::FutureOr<core::String*>* x, core::int* y) → asy::FutureOr<core::String*>* => invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:123: Error: The method '+' isn't defined for the class 'FutureOr<String>'.
+  asy::Future<core::String*>* results2 = results.{asy::Future::then}<core::String*>((core::List<core::int*>* list) → asy::FutureOr<core::String*>* => list.{core::Iterable::fold}<asy::FutureOr<core::String*>*>("", (asy::FutureOr<core::String*>* x, core::int* y) → asy::FutureOr<core::String*>* => invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:123: Error: The operator '+' isn't defined for the class 'FutureOr<String>'.
  - 'FutureOr' is from 'dart:async'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
                           /*@ type=int* */ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
                                                                                                                           ^" as{TypeError,ForDynamic} asy::FutureOr<core::String*>*));
   asy::Future<core::String*>* results3 = results.{asy::Future::then}<core::String*>((core::List<core::int*>* list) → asy::FutureOr<core::String*>* => list.{core::Iterable::fold}<asy::FutureOr<core::String*>*>("", let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:111: Error: The argument type 'String Function(String, int)' can't be assigned to the parameter type 'FutureOr<String> Function(FutureOr<String>, int)'.
diff --git a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.outline.expect b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.outline.expect
index 4287368..eaaeebe 100644
--- a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.outline.expect
@@ -6,31 +6,67 @@
 // Try adding an explicit type.
 //   f(x, {y}) {}
 //   ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+//   A f(A x, {A y}) {}
+//     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+//   I f(I x, {I y}) {}
+//     ^
 //
 // pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   f(x, {y}) {}
 //     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+//   A f(A x, {A y}) {}
+//     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+//   I f(I x, {I y}) {}
+//     ^
 //
 // pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   f(x, {y}) {}
 //         ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+//   A f(A x, {A y}) {}
+//     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+//   I f(I x, {I y}) {}
+//     ^
 //
 // pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   g(x, {y}) {}
 //     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+//   A g(A x, {A y}) {}
+//     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+//   A g(I x, {I y}) {}
+//     ^
 //
 // pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   g(x, {y}) {}
 //         ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+//   A g(A x, {A y}) {}
+//     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+//   A g(I x, {I y}) {}
+//     ^
 //
 // pkg/front_end/testcases/inference/inconsistent_overrides.dart:18:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   h(x, {y}) {}
 //         ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:12:5: Context: This is one of the inherited members.
+//   A h(A x, {A y}) {}
+//     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:24:5: Context: This is one of the inherited members.
+//   A h(A x, {I y}) {}
+//     ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.expect b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.expect
index 490cc37..76b9569 100644
--- a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.expect
@@ -6,31 +6,67 @@
 // Try adding an explicit type.
 //   f(x, {y}) {}
 //   ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+//   A f(A x, {A y}) {}
+//     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+//   I f(I x, {I y}) {}
+//     ^
 //
 // pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   f(x, {y}) {}
 //     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+//   A f(A x, {A y}) {}
+//     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+//   I f(I x, {I y}) {}
+//     ^
 //
 // pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   f(x, {y}) {}
 //         ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+//   A f(A x, {A y}) {}
+//     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+//   I f(I x, {I y}) {}
+//     ^
 //
 // pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   g(x, {y}) {}
 //     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+//   A g(A x, {A y}) {}
+//     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+//   A g(I x, {I y}) {}
+//     ^
 //
 // pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   g(x, {y}) {}
 //         ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+//   A g(A x, {A y}) {}
+//     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+//   A g(I x, {I y}) {}
+//     ^
 //
 // pkg/front_end/testcases/inference/inconsistent_overrides.dart:18:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   h(x, {y}) {}
 //         ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:12:5: Context: This is one of the inherited members.
+//   A h(A x, {A y}) {}
+//     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:24:5: Context: This is one of the inherited members.
+//   A h(A x, {I y}) {}
+//     ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.transformed.expect
index 490cc37..76b9569 100644
--- a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.transformed.expect
@@ -6,31 +6,67 @@
 // Try adding an explicit type.
 //   f(x, {y}) {}
 //   ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+//   A f(A x, {A y}) {}
+//     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+//   I f(I x, {I y}) {}
+//     ^
 //
 // pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   f(x, {y}) {}
 //     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+//   A f(A x, {A y}) {}
+//     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+//   I f(I x, {I y}) {}
+//     ^
 //
 // pkg/front_end/testcases/inference/inconsistent_overrides.dart:16:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   f(x, {y}) {}
 //         ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:10:5: Context: This is one of the inherited members.
+//   A f(A x, {A y}) {}
+//     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:22:5: Context: This is one of the inherited members.
+//   I f(I x, {I y}) {}
+//     ^
 //
 // pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:5: Error: Can't infer a type for 'x' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   g(x, {y}) {}
 //     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+//   A g(A x, {A y}) {}
+//     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+//   A g(I x, {I y}) {}
+//     ^
 //
 // pkg/front_end/testcases/inference/inconsistent_overrides.dart:17:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   g(x, {y}) {}
 //         ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:11:5: Context: This is one of the inherited members.
+//   A g(A x, {A y}) {}
+//     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:23:5: Context: This is one of the inherited members.
+//   A g(I x, {I y}) {}
+//     ^
 //
 // pkg/front_end/testcases/inference/inconsistent_overrides.dart:18:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   h(x, {y}) {}
 //         ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:12:5: Context: This is one of the inherited members.
+//   A h(A x, {A y}) {}
+//     ^
+// pkg/front_end/testcases/inference/inconsistent_overrides.dart:24:5: Context: This is one of the inherited members.
+//   A h(A x, {I y}) {}
+//     ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.outline.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.outline.expect
index d186b99..483a945 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.outline.expect
@@ -6,16 +6,34 @@
 // Try adding an explicit type.
 //   var x;
 //       ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+//   int get x;
+//           ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+//   num get x;
+//           ^
 //
 // pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+//   int get x;
+//           ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+//   double get x;
+//              ^
 //
 // pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+//   num get x;
+//           ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+//   double get x;
+//              ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
index 863160b..141243b 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
@@ -6,16 +6,34 @@
 // Try adding an explicit type.
 //   var x;
 //       ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+//   int get x;
+//           ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+//   num get x;
+//           ^
 //
 // pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+//   int get x;
+//           ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+//   double get x;
+//              ^
 //
 // pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+//   num get x;
+//           ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+//   double get x;
+//              ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.transformed.expect
index 863160b..141243b 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.transformed.expect
@@ -6,16 +6,34 @@
 // Try adding an explicit type.
 //   var x;
 //       ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+//   int get x;
+//           ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+//   num get x;
+//           ^
 //
 // pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is one of the inherited members.
+//   int get x;
+//           ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+//   double get x;
+//              ^
 //
 // pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var x;
 //       ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is one of the inherited members.
+//   num get x;
+//           ^
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is one of the inherited members.
+//   double get x;
+//              ^
 //
 import self as self;
 import "dart:core" as core;
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 5aa60b1..3376c0d 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
@@ -10,9 +10,9 @@
 //   /*error:UNDEFINED_IDENTIFIER*/ x
 //                                  ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:32:58: Error: The method 'unary-' isn't defined for the class 'A'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:32:58: Error: The operator 'unary-' isn't defined for the class 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+// Try correcting the operator to an existing operator, or defining a 'unary-' operator.
 // var i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
 //                                                          ^
 //
@@ -103,9 +103,9 @@
 static field core::int* f = 2.{core::num::+}(3);
 static field core::int* g = 3.{core::int::unary-}();
 static field self::B* h = new self::A::•().{self::A::+}(3);
-static field dynamic i = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:32:58: Error: The method 'unary-' isn't defined for the class 'A'.
+static field dynamic i = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:32:58: Error: The operator 'unary-' isn't defined for the class 'A'.
  - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+Try correcting the operator to an existing operator, or defining a 'unary-' operator.
 var i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
                                                          ^";
 static field self::B* j = null as self::B*;
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 5aa60b1..3376c0d 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
@@ -10,9 +10,9 @@
 //   /*error:UNDEFINED_IDENTIFIER*/ x
 //                                  ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:32:58: Error: The method 'unary-' isn't defined for the class 'A'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:32:58: Error: The operator 'unary-' isn't defined for the class 'A'.
 //  - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+// Try correcting the operator to an existing operator, or defining a 'unary-' operator.
 // var i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
 //                                                          ^
 //
@@ -103,9 +103,9 @@
 static field core::int* f = 2.{core::num::+}(3);
 static field core::int* g = 3.{core::int::unary-}();
 static field self::B* h = new self::A::•().{self::A::+}(3);
-static field dynamic i = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:32:58: Error: The method 'unary-' isn't defined for the class 'A'.
+static field dynamic i = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:32:58: Error: The operator 'unary-' isn't defined for the class 'A'.
  - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+Try correcting the operator to an existing operator, or defining a 'unary-' operator.
 var i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
                                                          ^";
 static field self::B* j = null as self::B*;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect
index 0c50386..b7726db 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect
@@ -6,11 +6,6 @@
 // class A extends Object with M0, M1<int> {}
 //       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:13:7: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
-//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
-// class A extends Object with M0, M1<int> {}
-//       ^
-//
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect
index 440e0b2..e4415d8 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect
@@ -6,11 +6,6 @@
 // class A extends Object with M0, M1<int> {}
 //       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:13:7: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
-//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
-// class A extends Object with M0, M1<int> {}
-//       ^
-//
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect
index b00323d..012864a 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect
@@ -6,11 +6,6 @@
 // class A extends Object with M0, M1 {}
 //       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:13:7: Error: 'A' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
-//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
-// class A extends Object with M0, M1 {}
-//       ^
-//
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect
index 7d11e0c..4a017f6 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect
@@ -6,11 +6,6 @@
 // class A extends Object with M0, M1 {}
 //       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:13:7: Error: 'A' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
-//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
-// class A extends Object with M0, M1 {}
-//       ^
-//
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect
index 73edc70..a0d028e 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect
@@ -7,12 +7,6 @@
 // class A extends Object with M0, M1 {}
 //       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:17:7: Error: 'A' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
-//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
-//  - 'List' is from 'dart:core'.
-// class A extends Object with M0, M1 {}
-//       ^
-//
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect
index af62b10..e061e87 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect
@@ -7,12 +7,6 @@
 // class A extends Object with M0, M1 {}
 //       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:17:7: Error: 'A' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
-//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
-//  - 'List' is from 'dart:core'.
-// class A extends Object with M0, M1 {}
-//       ^
-//
 library;
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.transformed.expect
index 6d183c0c..2620e6d 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.transformed.expect
@@ -2,34 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:17:72: Error: Can't infer the type of 'b': circularity found during type inference.
+// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:15:5: Error: Can't infer the type of 'a': circularity found during type inference.
 // Specify the type explicitly.
-// var  /*@error=CantInferTypeDueToCircularity*/ b = a/*@error=UndefinedMethod*/();
-//                                                                        ^
-//
-// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:15:72: Error: Can't infer the type of 'a': circularity found during type inference.
-// Specify the type explicitly.
-// var  /*@error=CantInferTypeDueToCircularity*/ a = /*@returnType=num*/ () =>
-//                                                                        ^
-//
-// pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:17:77: Error: The method 'call' isn't defined for the class 'invalid-type'.
-// Try correcting the name to the name of an existing method, or defining a method named 'call'.
-// var  /*@error=CantInferTypeDueToCircularity*/ b = a/*@error=UndefinedMethod*/();
-//                                                                             ^
+// var a = /*@ returnType=num* */ () => intValue /*@target=num::+*/ + b;
+//     ^
 //
 import self as self;
 import "dart:core" as core;
 
-static field core::int intValue = 0;
-static field core::num numValue = 0;
-static field core::double doubleValue = 0.0;
-static field invalid-type a = (() → core::num => self::intValue.{core::num::+}(self::b as{TypeError} core::num)) as{TypeError} invalid-type;
-static field invalid-type b = invalid-expression "pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart:17:77: Error: The method 'call' isn't defined for the class 'invalid-type'.
-Try correcting the name to the name of an existing method, or defining a method named 'call'.
-var  /*@error=CantInferTypeDueToCircularity*/ b = a/*@error=UndefinedMethod*/();
-                                                                            ^";
-static field () → core::num c = () → core::num => self::numValue.{core::num::+}(self::d);
-static field core::num d = self::c.call();
-static field () → core::double e = () → core::double => self::doubleValue.{core::double::+}(self::f);
-static field core::double f = self::e.call();
+static field core::int* intValue = 0;
+static field core::num* numValue = 0;
+static field core::double* doubleValue = 0.0;
+static field invalid-type a = (() → core::num* => self::intValue.{core::num::+}(self::b as{TypeError,ForDynamic} core::num*)) as{TypeError} invalid-type;
+static field dynamic b = self::a.call();
+static field () →* core::num* c = () → core::num* => self::numValue.{core::num::+}(self::d);
+static field core::num* d = self::c.call();
+static field () →* core::double* e = () → core::double* => self::doubleValue.{core::double::+}(self::f);
+static field core::double* f = self::e.call();
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.outline.expect
index 21e5e15..bbf0793 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.outline.expect
@@ -6,6 +6,12 @@
 // Try adding an explicit type.
 //   var x;
 //       ^
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:9:11: Context: This is one of the inherited members.
+//   int get x;
+//           ^
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is one of the inherited members.
+//   void set x(double value);
+//            ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
index 4b59c09..3fa7212 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
@@ -6,6 +6,12 @@
 // Try adding an explicit type.
 //   var x;
 //       ^
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:9:11: Context: This is one of the inherited members.
+//   int get x;
+//           ^
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is one of the inherited members.
+//   void set x(double value);
+//            ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.transformed.expect
index 4b59c09..3fa7212 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.transformed.expect
@@ -6,6 +6,12 @@
 // Try adding an explicit type.
 //   var x;
 //       ^
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:9:11: Context: This is one of the inherited members.
+//   int get x;
+//           ^
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is one of the inherited members.
+//   void set x(double value);
+//            ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.outline.expect
index f373c67..4f2a8df 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.outline.expect
@@ -6,11 +6,23 @@
 // Try adding an explicit type.
 //   var x;
 //       ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:6:9: Context: This is one of the inherited members.
+//   A get x;
+//         ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:7:12: Context: This is one of the inherited members.
+//   void set x(B value);
+//            ^
 //
 // pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:17:7: Error: Can't infer a type for 'y' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var y;
 //       ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:9:9: Context: This is one of the inherited members.
+//   B get y;
+//         ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:10:12: Context: This is one of the inherited members.
+//   void set y(A value);
+//            ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.expect
index b5ca7dd..66a001b 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.expect
@@ -6,11 +6,23 @@
 // Try adding an explicit type.
 //   var x;
 //       ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:6:9: Context: This is one of the inherited members.
+//   A get x;
+//         ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:7:12: Context: This is one of the inherited members.
+//   void set x(B value);
+//            ^
 //
 // pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:17:7: Error: Can't infer a type for 'y' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var y;
 //       ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:9:9: Context: This is one of the inherited members.
+//   B get y;
+//         ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:10:12: Context: This is one of the inherited members.
+//   void set y(A value);
+//            ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.transformed.expect
index b5ca7dd..66a001b 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.transformed.expect
@@ -6,11 +6,23 @@
 // Try adding an explicit type.
 //   var x;
 //       ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:6:9: Context: This is one of the inherited members.
+//   A get x;
+//         ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:7:12: Context: This is one of the inherited members.
+//   void set x(B value);
+//            ^
 //
 // pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:17:7: Error: Can't infer a type for 'y' as some of the inherited members have different types.
 // Try adding an explicit type.
 //   var y;
 //       ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:9:9: Context: This is one of the inherited members.
+//   B get y;
+//         ^
+// pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart:10:12: Context: This is one of the inherited members.
+//   void set y(A value);
+//            ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.outline.expect
index b8c0502..020678b 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.outline.expect
@@ -6,6 +6,12 @@
 // Try adding an explicit type.
 //   var x;
 //       ^
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:13:11: Context: This is one of the inherited members.
+//   int get x;
+//           ^
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Context: This is one of the inherited members.
+//   void set x(num value);
+//            ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
index cbb9102..b69c292 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
@@ -6,6 +6,12 @@
 // Try adding an explicit type.
 //   var x;
 //       ^
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:13:11: Context: This is one of the inherited members.
+//   int get x;
+//           ^
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Context: This is one of the inherited members.
+//   void set x(num value);
+//            ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.transformed.expect
index cbb9102..b69c292 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.transformed.expect
@@ -6,6 +6,12 @@
 // Try adding an explicit type.
 //   var x;
 //       ^
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:13:11: Context: This is one of the inherited members.
+//   int get x;
+//           ^
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Context: This is one of the inherited members.
+//   void set x(num value);
+//            ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.outline.expect
index ac573d6..593040e 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.outline.expect
@@ -6,6 +6,12 @@
 // Try adding an explicit type.
 //   var x;
 //       ^
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:9:11: Context: This is one of the inherited members.
+//   num get x;
+//           ^
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:13:12: Context: This is one of the inherited members.
+//   void set x(int value);
+//            ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.expect
index 0d0b140..c02f37f1 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.expect
@@ -6,6 +6,12 @@
 // Try adding an explicit type.
 //   var x;
 //       ^
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:9:11: Context: This is one of the inherited members.
+//   num get x;
+//           ^
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:13:12: Context: This is one of the inherited members.
+//   void set x(int value);
+//            ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.transformed.expect
index 0d0b140..c02f37f1 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.transformed.expect
@@ -6,6 +6,12 @@
 // Try adding an explicit type.
 //   var x;
 //       ^
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:9:11: Context: This is one of the inherited members.
+//   num get x;
+//           ^
+// pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart:13:12: Context: This is one of the inherited members.
+//   void set x(int value);
+//            ^
 //
 import self as self;
 import "dart:core" as core;
diff --git a/pkg/front_end/testcases/late_lowering/compound.dart b/pkg/front_end/testcases/late_lowering/compound.dart
new file mode 100644
index 0000000..1f29a5a
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/compound.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for 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() {
+  late int local1;
+  local1 = 0;
+  expect(0, local1);
+  local1 += 2;
+  expect(2, local1);
+
+  late int local2 = 1;
+  expect(1, local2);
+  local2 += 2;
+  expect(3, local2);
+}
+
+error() {
+  late final int local;
+  local += 0;
+}
+
+expect(expected, actual) {
+  if (expected != actual) throw 'Expected $expected, actual $actual';
+}
diff --git a/pkg/front_end/testcases/late_lowering/compound.dart.outline.expect b/pkg/front_end/testcases/late_lowering/compound.dart.outline.expect
new file mode 100644
index 0000000..afd7d44
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/compound.dart.outline.expect
@@ -0,0 +1,9 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+static method main() → dynamic
+  ;
+static method error() → dynamic
+  ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/late_lowering/compound.dart.strong.expect b/pkg/front_end/testcases/late_lowering/compound.dart.strong.expect
new file mode 100644
index 0000000..c4340c5
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/compound.dart.strong.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/compound.dart:20:3: Error: Non-nullable late variable 'local' without initializer is definitely unassigned.
+//   local += 0;
+//   ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+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};
+  function #local1#set(core::int #t2) → dynamic
+    return local1 = #t2;
+  #local1#set.call(0);
+  self::expect(0, #local1#get.call());
+  #local1#set.call(#local1#get.call().{core::num::+}(2));
+  self::expect(2, #local1#get.call());
+  core::int? local2;
+  function #local2#get() → core::int
+    return let final core::int? #t3 = local2 in #t3.==(null) ?{core::int} local2 = 1 : #t3{core::int};
+  function #local2#set(core::int #t4) → dynamic
+    return local2 = #t4;
+  self::expect(1, #local2#get.call());
+  #local2#set.call(#local2#get.call().{core::num::+}(2));
+  self::expect(3, #local2#get.call());
+}
+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};
+  function #local#set(core::int #t6) → dynamic
+    if(local.==(null))
+      return local = #t6;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local' has already been initialized.");
+  #local#set.call((let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/compound.dart:20:3: Error: Non-nullable late variable 'local' without initializer is definitely unassigned.
+  local += 0;
+  ^^^^^" in #local#get.call()).{core::num::+}(0));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
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
new file mode 100644
index 0000000..c4340c5
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/compound.dart.strong.transformed.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/compound.dart:20:3: Error: Non-nullable late variable 'local' without initializer is definitely unassigned.
+//   local += 0;
+//   ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+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};
+  function #local1#set(core::int #t2) → dynamic
+    return local1 = #t2;
+  #local1#set.call(0);
+  self::expect(0, #local1#get.call());
+  #local1#set.call(#local1#get.call().{core::num::+}(2));
+  self::expect(2, #local1#get.call());
+  core::int? local2;
+  function #local2#get() → core::int
+    return let final core::int? #t3 = local2 in #t3.==(null) ?{core::int} local2 = 1 : #t3{core::int};
+  function #local2#set(core::int #t4) → dynamic
+    return local2 = #t4;
+  self::expect(1, #local2#get.call());
+  #local2#set.call(#local2#get.call().{core::num::+}(2));
+  self::expect(3, #local2#get.call());
+}
+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};
+  function #local#set(core::int #t6) → dynamic
+    if(local.==(null))
+      return local = #t6;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local' has already been initialized.");
+  #local#set.call((let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/compound.dart:20:3: Error: Non-nullable late variable 'local' without initializer is definitely unassigned.
+  local += 0;
+  ^^^^^" in #local#get.call()).{core::num::+}(0));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/compound.dart.weak.expect b/pkg/front_end/testcases/late_lowering/compound.dart.weak.expect
new file mode 100644
index 0000000..c4340c5
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/compound.dart.weak.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/compound.dart:20:3: Error: Non-nullable late variable 'local' without initializer is definitely unassigned.
+//   local += 0;
+//   ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+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};
+  function #local1#set(core::int #t2) → dynamic
+    return local1 = #t2;
+  #local1#set.call(0);
+  self::expect(0, #local1#get.call());
+  #local1#set.call(#local1#get.call().{core::num::+}(2));
+  self::expect(2, #local1#get.call());
+  core::int? local2;
+  function #local2#get() → core::int
+    return let final core::int? #t3 = local2 in #t3.==(null) ?{core::int} local2 = 1 : #t3{core::int};
+  function #local2#set(core::int #t4) → dynamic
+    return local2 = #t4;
+  self::expect(1, #local2#get.call());
+  #local2#set.call(#local2#get.call().{core::num::+}(2));
+  self::expect(3, #local2#get.call());
+}
+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};
+  function #local#set(core::int #t6) → dynamic
+    if(local.==(null))
+      return local = #t6;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local' has already been initialized.");
+  #local#set.call((let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/compound.dart:20:3: Error: Non-nullable late variable 'local' without initializer is definitely unassigned.
+  local += 0;
+  ^^^^^" in #local#get.call()).{core::num::+}(0));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
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
new file mode 100644
index 0000000..c4340c5
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/compound.dart.weak.transformed.expect
@@ -0,0 +1,48 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/compound.dart:20:3: Error: Non-nullable late variable 'local' without initializer is definitely unassigned.
+//   local += 0;
+//   ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+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};
+  function #local1#set(core::int #t2) → dynamic
+    return local1 = #t2;
+  #local1#set.call(0);
+  self::expect(0, #local1#get.call());
+  #local1#set.call(#local1#get.call().{core::num::+}(2));
+  self::expect(2, #local1#get.call());
+  core::int? local2;
+  function #local2#get() → core::int
+    return let final core::int? #t3 = local2 in #t3.==(null) ?{core::int} local2 = 1 : #t3{core::int};
+  function #local2#set(core::int #t4) → dynamic
+    return local2 = #t4;
+  self::expect(1, #local2#get.call());
+  #local2#set.call(#local2#get.call().{core::num::+}(2));
+  self::expect(3, #local2#get.call());
+}
+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};
+  function #local#set(core::int #t6) → dynamic
+    if(local.==(null))
+      return local = #t6;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local' has already been initialized.");
+  #local#set.call((let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/compound.dart:20:3: Error: Non-nullable late variable 'local' without initializer is definitely unassigned.
+  local += 0;
+  ^^^^^" in #local#get.call()).{core::num::+}(0));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+  if(!expected.{core::Object::==}(actual))
+    throw "Expected ${expected}, actual ${actual}";
+}
diff --git a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart
new file mode 100644
index 0000000..12241c7
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart
@@ -0,0 +1,91 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for 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';
+
+methodDirect<T>(T value) {
+  late final T local2;
+  late final int local4;
+  late final FutureOr<int> local6;
+
+  local2 = value; // ok
+  local4 = 0; // ok
+  local6 = 0; // ok
+
+  local2 = value; // error
+  local4 = 0; // error
+  local6 = 0; // error
+}
+
+var fieldDirect = <T>(T value) {
+  late final T local2;
+  late final int local4;
+  late final FutureOr<int> local6;
+
+  local2 = value; // ok
+  local4 = 0; // ok
+  local6 = 0; // ok
+
+  local2 = value; // error
+  local4 = 0; // error
+  local6 = 0; // error
+};
+
+methodConditional<T>(bool b, T value) {
+  late final T local2;
+  late final int local4;
+  late final FutureOr<int> local6;
+
+  if (b) {
+    local2 = value; // ok
+    local4 = 0; // ok
+    local6 = 0; // ok
+  }
+
+  local2 = value; // ok
+  local4 = 0; // ok
+  local6 = 0; // ok
+
+  local2 = value; // error
+  local4 = 0; // error
+  local6 = 0; // error
+}
+
+var fieldConditional = <T>(bool b, T value) {
+  late final T local2;
+  late final int local4;
+  late final FutureOr<int> local6;
+
+  if (b) {
+    local2 = value; // ok
+    local4 = 0; // ok
+    local6 = 0; // ok
+  }
+
+  local2 = value; // ok
+  local4 = 0; // ok
+  local6 = 0; // ok
+
+  local2 = value; // error
+  local4 = 0; // error
+  local6 = 0; // error
+};
+
+methodCompound() {
+  late final int local4;
+
+  local4 = 0; // ok
+
+  local4 += 0; // error
+}
+
+var fieldCompound = () {
+  late final int local4;
+
+  local4 = 0; // ok
+
+  local4 += 0; // error
+};
+
+main() {}
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
new file mode 100644
index 0000000..1a5e8e7
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.outline.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+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 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
+  ;
+static method methodCompound() → dynamic
+  ;
+static method main() → 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
new file mode 100644
index 0000000..0f62abd
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.expect
@@ -0,0 +1,270 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::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.");
+  function #local2#set(T% #t1) → dynamic
+    if(#local2#isSet)
+      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+    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};
+  function #local4#set(core::int #t3) → dynamic
+    if(local4.==(null))
+      return local4 = #t3;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  final asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t4{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t5) → dynamic
+    if(local6.==(null))
+      return local6 = #t5;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+  #local2#set.call(value);
+  #local4#set.call(0);
+  #local6#set.call(0);
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in #local2#set.call(value);
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in #local4#set.call(0);
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  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? {
+  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.");
+  function #local2#set(T% #t9) → dynamic
+    if(#local2#isSet)
+      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+    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};
+  function #local4#set(core::int #t11) → dynamic
+    if(local4.==(null))
+      return local4 = #t11;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  final asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t12 = local6 in #t12.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t12{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t13) → dynamic
+    if(local6.==(null))
+      return local6 = #t13;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+  if(b) {
+    #local2#set.call(value);
+    #local4#set.call(0);
+    #local6#set.call(0);
+  }
+  #local2#set.call(value);
+  #local4#set.call(0);
+  #local6#set.call(0);
+  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in #local2#set.call(value);
+  let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in #local4#set.call(0);
+  let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in #local6#set.call(0);
+};
+static field () → core::Null? fieldCompound = () → core::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};
+  function #local4#set(core::int #t18) → dynamic
+    if(local4.==(null))
+      return local4 = #t18;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  #local4#set.call(0);
+  let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 += 0; // error
+  ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+  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.");
+  function #local2#set(self::methodDirect::T% #t20) → dynamic
+    if(#local2#isSet)
+      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+    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};
+  function #local4#set(core::int #t22) → dynamic
+    if(local4.==(null))
+      return local4 = #t22;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  final asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t23 = local6 in #t23.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t23{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t24) → dynamic
+    if(local6.==(null))
+      return local6 = #t24;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+  #local2#set.call(value);
+  #local4#set.call(0);
+  #local6#set.call(0);
+  let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in #local2#set.call(value);
+  let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in #local4#set.call(0);
+  let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in #local6#set.call(0);
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+  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.");
+  function #local2#set(self::methodConditional::T% #t28) → dynamic
+    if(#local2#isSet)
+      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+    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};
+  function #local4#set(core::int #t30) → dynamic
+    if(local4.==(null))
+      return local4 = #t30;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  final asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t31 = local6 in #t31.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t31{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t32) → dynamic
+    if(local6.==(null))
+      return local6 = #t32;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+  if(b) {
+    #local2#set.call(value);
+    #local4#set.call(0);
+    #local6#set.call(0);
+  }
+  #local2#set.call(value);
+  #local4#set.call(0);
+  #local6#set.call(0);
+  let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in #local2#set.call(value);
+  let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in #local4#set.call(0);
+  let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in #local6#set.call(0);
+}
+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};
+  function #local4#set(core::int #t37) → dynamic
+    if(local4.==(null))
+      return local4 = #t37;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  #local4#set.call(0);
+  let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 += 0; // error
+  ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
+}
+static method main() → dynamic {}
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
new file mode 100644
index 0000000..0f62abd
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.transformed.expect
@@ -0,0 +1,270 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::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.");
+  function #local2#set(T% #t1) → dynamic
+    if(#local2#isSet)
+      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+    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};
+  function #local4#set(core::int #t3) → dynamic
+    if(local4.==(null))
+      return local4 = #t3;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  final asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t4{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t5) → dynamic
+    if(local6.==(null))
+      return local6 = #t5;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+  #local2#set.call(value);
+  #local4#set.call(0);
+  #local6#set.call(0);
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in #local2#set.call(value);
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in #local4#set.call(0);
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  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? {
+  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.");
+  function #local2#set(T% #t9) → dynamic
+    if(#local2#isSet)
+      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+    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};
+  function #local4#set(core::int #t11) → dynamic
+    if(local4.==(null))
+      return local4 = #t11;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  final asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t12 = local6 in #t12.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t12{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t13) → dynamic
+    if(local6.==(null))
+      return local6 = #t13;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+  if(b) {
+    #local2#set.call(value);
+    #local4#set.call(0);
+    #local6#set.call(0);
+  }
+  #local2#set.call(value);
+  #local4#set.call(0);
+  #local6#set.call(0);
+  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in #local2#set.call(value);
+  let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in #local4#set.call(0);
+  let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in #local6#set.call(0);
+};
+static field () → core::Null? fieldCompound = () → core::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};
+  function #local4#set(core::int #t18) → dynamic
+    if(local4.==(null))
+      return local4 = #t18;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  #local4#set.call(0);
+  let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 += 0; // error
+  ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+  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.");
+  function #local2#set(self::methodDirect::T% #t20) → dynamic
+    if(#local2#isSet)
+      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+    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};
+  function #local4#set(core::int #t22) → dynamic
+    if(local4.==(null))
+      return local4 = #t22;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  final asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t23 = local6 in #t23.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t23{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t24) → dynamic
+    if(local6.==(null))
+      return local6 = #t24;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+  #local2#set.call(value);
+  #local4#set.call(0);
+  #local6#set.call(0);
+  let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in #local2#set.call(value);
+  let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in #local4#set.call(0);
+  let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in #local6#set.call(0);
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+  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.");
+  function #local2#set(self::methodConditional::T% #t28) → dynamic
+    if(#local2#isSet)
+      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+    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};
+  function #local4#set(core::int #t30) → dynamic
+    if(local4.==(null))
+      return local4 = #t30;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  final asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t31 = local6 in #t31.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t31{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t32) → dynamic
+    if(local6.==(null))
+      return local6 = #t32;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+  if(b) {
+    #local2#set.call(value);
+    #local4#set.call(0);
+    #local6#set.call(0);
+  }
+  #local2#set.call(value);
+  #local4#set.call(0);
+  #local6#set.call(0);
+  let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in #local2#set.call(value);
+  let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in #local4#set.call(0);
+  let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in #local6#set.call(0);
+}
+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};
+  function #local4#set(core::int #t37) → dynamic
+    if(local4.==(null))
+      return local4 = #t37;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  #local4#set.call(0);
+  let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 += 0; // error
+  ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
+}
+static method main() → dynamic {}
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
new file mode 100644
index 0000000..0f62abd
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.expect
@@ -0,0 +1,270 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::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.");
+  function #local2#set(T% #t1) → dynamic
+    if(#local2#isSet)
+      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+    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};
+  function #local4#set(core::int #t3) → dynamic
+    if(local4.==(null))
+      return local4 = #t3;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  final asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t4{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t5) → dynamic
+    if(local6.==(null))
+      return local6 = #t5;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+  #local2#set.call(value);
+  #local4#set.call(0);
+  #local6#set.call(0);
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in #local2#set.call(value);
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in #local4#set.call(0);
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  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? {
+  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.");
+  function #local2#set(T% #t9) → dynamic
+    if(#local2#isSet)
+      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+    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};
+  function #local4#set(core::int #t11) → dynamic
+    if(local4.==(null))
+      return local4 = #t11;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  final asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t12 = local6 in #t12.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t12{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t13) → dynamic
+    if(local6.==(null))
+      return local6 = #t13;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+  if(b) {
+    #local2#set.call(value);
+    #local4#set.call(0);
+    #local6#set.call(0);
+  }
+  #local2#set.call(value);
+  #local4#set.call(0);
+  #local6#set.call(0);
+  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in #local2#set.call(value);
+  let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in #local4#set.call(0);
+  let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in #local6#set.call(0);
+};
+static field () → core::Null? fieldCompound = () → core::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};
+  function #local4#set(core::int #t18) → dynamic
+    if(local4.==(null))
+      return local4 = #t18;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  #local4#set.call(0);
+  let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 += 0; // error
+  ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+  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.");
+  function #local2#set(self::methodDirect::T% #t20) → dynamic
+    if(#local2#isSet)
+      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+    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};
+  function #local4#set(core::int #t22) → dynamic
+    if(local4.==(null))
+      return local4 = #t22;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  final asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t23 = local6 in #t23.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t23{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t24) → dynamic
+    if(local6.==(null))
+      return local6 = #t24;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+  #local2#set.call(value);
+  #local4#set.call(0);
+  #local6#set.call(0);
+  let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in #local2#set.call(value);
+  let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in #local4#set.call(0);
+  let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in #local6#set.call(0);
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+  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.");
+  function #local2#set(self::methodConditional::T% #t28) → dynamic
+    if(#local2#isSet)
+      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+    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};
+  function #local4#set(core::int #t30) → dynamic
+    if(local4.==(null))
+      return local4 = #t30;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  final asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t31 = local6 in #t31.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t31{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t32) → dynamic
+    if(local6.==(null))
+      return local6 = #t32;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+  if(b) {
+    #local2#set.call(value);
+    #local4#set.call(0);
+    #local6#set.call(0);
+  }
+  #local2#set.call(value);
+  #local4#set.call(0);
+  #local6#set.call(0);
+  let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in #local2#set.call(value);
+  let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in #local4#set.call(0);
+  let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in #local6#set.call(0);
+}
+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};
+  function #local4#set(core::int #t37) → dynamic
+    if(local4.==(null))
+      return local4 = #t37;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  #local4#set.call(0);
+  let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 += 0; // error
+  ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
+}
+static method main() → dynamic {}
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
new file mode 100644
index 0000000..0f62abd
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.transformed.expect
@@ -0,0 +1,270 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::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.");
+  function #local2#set(T% #t1) → dynamic
+    if(#local2#isSet)
+      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+    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};
+  function #local4#set(core::int #t3) → dynamic
+    if(local4.==(null))
+      return local4 = #t3;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  final asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t4{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t5) → dynamic
+    if(local6.==(null))
+      return local6 = #t5;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+  #local2#set.call(value);
+  #local4#set.call(0);
+  #local6#set.call(0);
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in #local2#set.call(value);
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in #local4#set.call(0);
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  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? {
+  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.");
+  function #local2#set(T% #t9) → dynamic
+    if(#local2#isSet)
+      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+    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};
+  function #local4#set(core::int #t11) → dynamic
+    if(local4.==(null))
+      return local4 = #t11;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  final asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t12 = local6 in #t12.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t12{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t13) → dynamic
+    if(local6.==(null))
+      return local6 = #t13;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+  if(b) {
+    #local2#set.call(value);
+    #local4#set.call(0);
+    #local6#set.call(0);
+  }
+  #local2#set.call(value);
+  #local4#set.call(0);
+  #local6#set.call(0);
+  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in #local2#set.call(value);
+  let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in #local4#set.call(0);
+  let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in #local6#set.call(0);
+};
+static field () → core::Null? fieldCompound = () → core::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};
+  function #local4#set(core::int #t18) → dynamic
+    if(local4.==(null))
+      return local4 = #t18;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  #local4#set.call(0);
+  let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 += 0; // error
+  ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+  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.");
+  function #local2#set(self::methodDirect::T% #t20) → dynamic
+    if(#local2#isSet)
+      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+    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};
+  function #local4#set(core::int #t22) → dynamic
+    if(local4.==(null))
+      return local4 = #t22;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  final asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t23 = local6 in #t23.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t23{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t24) → dynamic
+    if(local6.==(null))
+      return local6 = #t24;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+  #local2#set.call(value);
+  #local4#set.call(0);
+  #local6#set.call(0);
+  let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in #local2#set.call(value);
+  let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in #local4#set.call(0);
+  let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in #local6#set.call(0);
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+  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.");
+  function #local2#set(self::methodConditional::T% #t28) → dynamic
+    if(#local2#isSet)
+      throw new _in::LateInitializationErrorImpl::•("Local 'local2' has already been initialized.");
+    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};
+  function #local4#set(core::int #t30) → dynamic
+    if(local4.==(null))
+      return local4 = #t30;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  final asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t31 = local6 in #t31.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t31{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t32) → dynamic
+    if(local6.==(null))
+      return local6 = #t32;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local6' has already been initialized.");
+  if(b) {
+    #local2#set.call(value);
+    #local4#set.call(0);
+    #local6#set.call(0);
+  }
+  #local2#set.call(value);
+  #local4#set.call(0);
+  #local6#set.call(0);
+  let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in #local2#set.call(value);
+  let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in #local4#set.call(0);
+  let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in #local6#set.call(0);
+}
+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};
+  function #local4#set(core::int #t37) → dynamic
+    if(local4.==(null))
+      return local4 = #t37;
+    else
+      throw new _in::LateInitializationErrorImpl::•("Local 'local4' has already been initialized.");
+  #local4#set.call(0);
+  let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 += 0; // error
+  ^^^^^^" in #local4#set.call(#local4#get.call().{core::num::+}(0));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart
new file mode 100644
index 0000000..5843b75
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart
@@ -0,0 +1,115 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for 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';
+
+methodDirect<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; // error
+  local2; // error
+  local3; // error
+  local4; // error
+  local5; // error
+  local6; // error
+  local7; // ok
+}
+
+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; // error
+  local2; // error
+  local3; // error
+  local4; // error
+  local5; // error
+  local6; // error
+  local7; // ok
+};
+
+methodConditional<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 = value;
+  }
+
+  local1; // error
+  local2; // ok
+  local3; // error
+  local4; // ok
+  local5; // error
+  local6; // ok
+  local7; // ok
+}
+
+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; // ok
+  }
+
+  local1; // error
+  local2; // ok
+  local3; // error
+  local4; // ok
+  local5; // error
+  local6; // ok
+  local7; // ok
+};
+
+methodCompound() {
+  int local3;
+  late int local4;
+
+  local3 += 0; // error
+  local4 += 0; // error
+}
+
+var fieldCompound = () {
+  int local3;
+  late int local4;
+
+  local3 += 0; // error
+  local4 += 0; // error
+};
+
+main() {}
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
new file mode 100644
index 0000000..1a5e8e7
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.outline.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+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 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
+  ;
+static method methodCompound() → dynamic
+  ;
+static method main() → 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
new file mode 100644
index 0000000..759a7c9
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.expect
@@ -0,0 +1,354 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+//   local2; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+//   local6; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+//   local2; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+//   local6; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::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.");
+  function #local2#set(T% #t1) → dynamic {
+    #local2#isSet = true;
+    return local2 = #t1;
+  }
+  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};
+  function #local4#set(core::int #t3) → dynamic
+    return local4 = #t3;
+  asy::FutureOr<core::int> local5;
+  asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t4{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t5) → dynamic
+    return local6 = #t5;
+  T? local7;
+  core::bool #local7#isSet = false;
+  function #local7#get() → T% {
+    if(!#local7#isSet) {
+      #local7#isSet = true;
+      local7 = value;
+    }
+    return local7{T%};
+  }
+  function #local7#set(T% #t6) → dynamic {
+    #local7#isSet = true;
+    return local7 = #t6;
+  }
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+  local2; // error
+  ^^^^^^" in #local2#get.call();
+  let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4; // error
+  ^^^^^^" in #local4#get.call();
+  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+  local6; // error
+  ^^^^^^" 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? {
+  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.");
+  function #local2#set(T% #t13) → dynamic {
+    #local2#isSet = true;
+    return local2 = #t13;
+  }
+  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};
+  function #local4#set(core::int #t15) → dynamic
+    return local4 = #t15;
+  asy::FutureOr<core::int> local5;
+  asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t16 = local6 in #t16.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t16{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t17) → dynamic
+    return local6 = #t17;
+  T? local7;
+  core::bool #local7#isSet = false;
+  function #local7#get() → T% {
+    if(!#local7#isSet) {
+      #local7#isSet = true;
+      local7 = value;
+    }
+    return local7{T%};
+  }
+  function #local7#set(T% #t18) → dynamic {
+    #local7#isSet = true;
+    return local7 = #t18;
+  }
+  if(b) {
+    local1 = value;
+    #local2#set.call(value);
+    local3 = 0;
+    #local4#set.call(0);
+    local5 = 0;
+    #local6#set.call(0);
+    #local7#get.call();
+  }
+  let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  #local2#get.call();
+  let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  #local4#get.call();
+  let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  #local6#get.call();
+  #local7#get.call();
+};
+static field () → core::Null? fieldCompound = () → core::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};
+  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.
+  local3 += 0; // error
+  ^^^^^^" in local3).{core::num::+}(0);
+  #local4#set.call((let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4 += 0; // error
+  ^^^^^^" in #local4#get.call()).{core::num::+}(0));
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+  self::methodDirect::T% local1;
+  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.");
+  function #local2#set(self::methodDirect::T% #t26) → dynamic {
+    #local2#isSet = true;
+    return local2 = #t26;
+  }
+  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};
+  function #local4#set(core::int #t28) → dynamic
+    return local4 = #t28;
+  asy::FutureOr<core::int> local5;
+  asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t29 = local6 in #t29.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t29{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t30) → dynamic
+    return local6 = #t30;
+  self::methodDirect::T? local7;
+  core::bool #local7#isSet = false;
+  function #local7#get() → self::methodDirect::T% {
+    if(!#local7#isSet) {
+      #local7#isSet = true;
+      local7 = value;
+    }
+    return local7{self::methodDirect::T%};
+  }
+  function #local7#set(self::methodDirect::T% #t31) → dynamic {
+    #local7#isSet = true;
+    return local7 = #t31;
+  }
+  let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+  local2; // error
+  ^^^^^^" in #local2#get.call();
+  let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4; // error
+  ^^^^^^" in #local4#get.call();
+  let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+  local6; // error
+  ^^^^^^" in #local6#get.call();
+  #local7#get.call();
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+  self::methodConditional::T% local1;
+  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.");
+  function #local2#set(self::methodConditional::T% #t38) → dynamic {
+    #local2#isSet = true;
+    return local2 = #t38;
+  }
+  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};
+  function #local4#set(core::int #t40) → dynamic
+    return local4 = #t40;
+  asy::FutureOr<core::int> local5;
+  asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t41 = local6 in #t41.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t41{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t42) → dynamic
+    return local6 = #t42;
+  self::methodConditional::T? local7;
+  core::bool #local7#isSet = false;
+  function #local7#get() → self::methodConditional::T% {
+    if(!#local7#isSet) {
+      #local7#isSet = true;
+      local7 = value;
+    }
+    return local7{self::methodConditional::T%};
+  }
+  function #local7#set(self::methodConditional::T% #t43) → dynamic {
+    #local7#isSet = true;
+    return local7 = #t43;
+  }
+  if(b) {
+    local1 = value;
+    #local2#set.call(value);
+    local3 = 0;
+    #local4#set.call(0);
+    local5 = 0;
+    #local6#set.call(0);
+    #local7#set.call(value);
+  }
+  let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  #local2#get.call();
+  let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  #local4#get.call();
+  let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  #local6#get.call();
+  #local7#get.call();
+}
+static method methodCompound() → dynamic {
+  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};
+  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.
+  local3 += 0; // error
+  ^^^^^^" in local3).{core::num::+}(0);
+  #local4#set.call((let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4 += 0; // error
+  ^^^^^^" in #local4#get.call()).{core::num::+}(0));
+}
+static method main() → dynamic {}
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
new file mode 100644
index 0000000..759a7c9
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.transformed.expect
@@ -0,0 +1,354 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+//   local2; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+//   local6; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+//   local2; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+//   local6; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::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.");
+  function #local2#set(T% #t1) → dynamic {
+    #local2#isSet = true;
+    return local2 = #t1;
+  }
+  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};
+  function #local4#set(core::int #t3) → dynamic
+    return local4 = #t3;
+  asy::FutureOr<core::int> local5;
+  asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t4{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t5) → dynamic
+    return local6 = #t5;
+  T? local7;
+  core::bool #local7#isSet = false;
+  function #local7#get() → T% {
+    if(!#local7#isSet) {
+      #local7#isSet = true;
+      local7 = value;
+    }
+    return local7{T%};
+  }
+  function #local7#set(T% #t6) → dynamic {
+    #local7#isSet = true;
+    return local7 = #t6;
+  }
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+  local2; // error
+  ^^^^^^" in #local2#get.call();
+  let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4; // error
+  ^^^^^^" in #local4#get.call();
+  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+  local6; // error
+  ^^^^^^" 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? {
+  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.");
+  function #local2#set(T% #t13) → dynamic {
+    #local2#isSet = true;
+    return local2 = #t13;
+  }
+  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};
+  function #local4#set(core::int #t15) → dynamic
+    return local4 = #t15;
+  asy::FutureOr<core::int> local5;
+  asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t16 = local6 in #t16.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t16{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t17) → dynamic
+    return local6 = #t17;
+  T? local7;
+  core::bool #local7#isSet = false;
+  function #local7#get() → T% {
+    if(!#local7#isSet) {
+      #local7#isSet = true;
+      local7 = value;
+    }
+    return local7{T%};
+  }
+  function #local7#set(T% #t18) → dynamic {
+    #local7#isSet = true;
+    return local7 = #t18;
+  }
+  if(b) {
+    local1 = value;
+    #local2#set.call(value);
+    local3 = 0;
+    #local4#set.call(0);
+    local5 = 0;
+    #local6#set.call(0);
+    #local7#get.call();
+  }
+  let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  #local2#get.call();
+  let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  #local4#get.call();
+  let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  #local6#get.call();
+  #local7#get.call();
+};
+static field () → core::Null? fieldCompound = () → core::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};
+  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.
+  local3 += 0; // error
+  ^^^^^^" in local3).{core::num::+}(0);
+  #local4#set.call((let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4 += 0; // error
+  ^^^^^^" in #local4#get.call()).{core::num::+}(0));
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+  self::methodDirect::T% local1;
+  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.");
+  function #local2#set(self::methodDirect::T% #t26) → dynamic {
+    #local2#isSet = true;
+    return local2 = #t26;
+  }
+  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};
+  function #local4#set(core::int #t28) → dynamic
+    return local4 = #t28;
+  asy::FutureOr<core::int> local5;
+  asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t29 = local6 in #t29.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t29{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t30) → dynamic
+    return local6 = #t30;
+  self::methodDirect::T? local7;
+  core::bool #local7#isSet = false;
+  function #local7#get() → self::methodDirect::T% {
+    if(!#local7#isSet) {
+      #local7#isSet = true;
+      local7 = value;
+    }
+    return local7{self::methodDirect::T%};
+  }
+  function #local7#set(self::methodDirect::T% #t31) → dynamic {
+    #local7#isSet = true;
+    return local7 = #t31;
+  }
+  let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+  local2; // error
+  ^^^^^^" in #local2#get.call();
+  let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4; // error
+  ^^^^^^" in #local4#get.call();
+  let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+  local6; // error
+  ^^^^^^" in #local6#get.call();
+  #local7#get.call();
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+  self::methodConditional::T% local1;
+  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.");
+  function #local2#set(self::methodConditional::T% #t38) → dynamic {
+    #local2#isSet = true;
+    return local2 = #t38;
+  }
+  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};
+  function #local4#set(core::int #t40) → dynamic
+    return local4 = #t40;
+  asy::FutureOr<core::int> local5;
+  asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t41 = local6 in #t41.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t41{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t42) → dynamic
+    return local6 = #t42;
+  self::methodConditional::T? local7;
+  core::bool #local7#isSet = false;
+  function #local7#get() → self::methodConditional::T% {
+    if(!#local7#isSet) {
+      #local7#isSet = true;
+      local7 = value;
+    }
+    return local7{self::methodConditional::T%};
+  }
+  function #local7#set(self::methodConditional::T% #t43) → dynamic {
+    #local7#isSet = true;
+    return local7 = #t43;
+  }
+  if(b) {
+    local1 = value;
+    #local2#set.call(value);
+    local3 = 0;
+    #local4#set.call(0);
+    local5 = 0;
+    #local6#set.call(0);
+    #local7#set.call(value);
+  }
+  let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  #local2#get.call();
+  let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  #local4#get.call();
+  let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  #local6#get.call();
+  #local7#get.call();
+}
+static method methodCompound() → dynamic {
+  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};
+  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.
+  local3 += 0; // error
+  ^^^^^^" in local3).{core::num::+}(0);
+  #local4#set.call((let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4 += 0; // error
+  ^^^^^^" in #local4#get.call()).{core::num::+}(0));
+}
+static method main() → dynamic {}
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
new file mode 100644
index 0000000..759a7c9
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.expect
@@ -0,0 +1,354 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+//   local2; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+//   local6; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+//   local2; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+//   local6; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::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.");
+  function #local2#set(T% #t1) → dynamic {
+    #local2#isSet = true;
+    return local2 = #t1;
+  }
+  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};
+  function #local4#set(core::int #t3) → dynamic
+    return local4 = #t3;
+  asy::FutureOr<core::int> local5;
+  asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t4{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t5) → dynamic
+    return local6 = #t5;
+  T? local7;
+  core::bool #local7#isSet = false;
+  function #local7#get() → T% {
+    if(!#local7#isSet) {
+      #local7#isSet = true;
+      local7 = value;
+    }
+    return local7{T%};
+  }
+  function #local7#set(T% #t6) → dynamic {
+    #local7#isSet = true;
+    return local7 = #t6;
+  }
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+  local2; // error
+  ^^^^^^" in #local2#get.call();
+  let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4; // error
+  ^^^^^^" in #local4#get.call();
+  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+  local6; // error
+  ^^^^^^" 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? {
+  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.");
+  function #local2#set(T% #t13) → dynamic {
+    #local2#isSet = true;
+    return local2 = #t13;
+  }
+  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};
+  function #local4#set(core::int #t15) → dynamic
+    return local4 = #t15;
+  asy::FutureOr<core::int> local5;
+  asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t16 = local6 in #t16.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t16{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t17) → dynamic
+    return local6 = #t17;
+  T? local7;
+  core::bool #local7#isSet = false;
+  function #local7#get() → T% {
+    if(!#local7#isSet) {
+      #local7#isSet = true;
+      local7 = value;
+    }
+    return local7{T%};
+  }
+  function #local7#set(T% #t18) → dynamic {
+    #local7#isSet = true;
+    return local7 = #t18;
+  }
+  if(b) {
+    local1 = value;
+    #local2#set.call(value);
+    local3 = 0;
+    #local4#set.call(0);
+    local5 = 0;
+    #local6#set.call(0);
+    #local7#get.call();
+  }
+  let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  #local2#get.call();
+  let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  #local4#get.call();
+  let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  #local6#get.call();
+  #local7#get.call();
+};
+static field () → core::Null? fieldCompound = () → core::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};
+  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.
+  local3 += 0; // error
+  ^^^^^^" in local3).{core::num::+}(0);
+  #local4#set.call((let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4 += 0; // error
+  ^^^^^^" in #local4#get.call()).{core::num::+}(0));
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+  self::methodDirect::T% local1;
+  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.");
+  function #local2#set(self::methodDirect::T% #t26) → dynamic {
+    #local2#isSet = true;
+    return local2 = #t26;
+  }
+  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};
+  function #local4#set(core::int #t28) → dynamic
+    return local4 = #t28;
+  asy::FutureOr<core::int> local5;
+  asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t29 = local6 in #t29.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t29{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t30) → dynamic
+    return local6 = #t30;
+  self::methodDirect::T? local7;
+  core::bool #local7#isSet = false;
+  function #local7#get() → self::methodDirect::T% {
+    if(!#local7#isSet) {
+      #local7#isSet = true;
+      local7 = value;
+    }
+    return local7{self::methodDirect::T%};
+  }
+  function #local7#set(self::methodDirect::T% #t31) → dynamic {
+    #local7#isSet = true;
+    return local7 = #t31;
+  }
+  let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+  local2; // error
+  ^^^^^^" in #local2#get.call();
+  let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4; // error
+  ^^^^^^" in #local4#get.call();
+  let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+  local6; // error
+  ^^^^^^" in #local6#get.call();
+  #local7#get.call();
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+  self::methodConditional::T% local1;
+  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.");
+  function #local2#set(self::methodConditional::T% #t38) → dynamic {
+    #local2#isSet = true;
+    return local2 = #t38;
+  }
+  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};
+  function #local4#set(core::int #t40) → dynamic
+    return local4 = #t40;
+  asy::FutureOr<core::int> local5;
+  asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t41 = local6 in #t41.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t41{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t42) → dynamic
+    return local6 = #t42;
+  self::methodConditional::T? local7;
+  core::bool #local7#isSet = false;
+  function #local7#get() → self::methodConditional::T% {
+    if(!#local7#isSet) {
+      #local7#isSet = true;
+      local7 = value;
+    }
+    return local7{self::methodConditional::T%};
+  }
+  function #local7#set(self::methodConditional::T% #t43) → dynamic {
+    #local7#isSet = true;
+    return local7 = #t43;
+  }
+  if(b) {
+    local1 = value;
+    #local2#set.call(value);
+    local3 = 0;
+    #local4#set.call(0);
+    local5 = 0;
+    #local6#set.call(0);
+    #local7#set.call(value);
+  }
+  let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  #local2#get.call();
+  let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  #local4#get.call();
+  let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  #local6#get.call();
+  #local7#get.call();
+}
+static method methodCompound() → dynamic {
+  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};
+  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.
+  local3 += 0; // error
+  ^^^^^^" in local3).{core::num::+}(0);
+  #local4#set.call((let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4 += 0; // error
+  ^^^^^^" in #local4#get.call()).{core::num::+}(0));
+}
+static method main() → dynamic {}
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
new file mode 100644
index 0000000..759a7c9
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.transformed.expect
@@ -0,0 +1,354 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+//   local2; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+//   local6; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+//   local2; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+//   local6; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::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.");
+  function #local2#set(T% #t1) → dynamic {
+    #local2#isSet = true;
+    return local2 = #t1;
+  }
+  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};
+  function #local4#set(core::int #t3) → dynamic
+    return local4 = #t3;
+  asy::FutureOr<core::int> local5;
+  asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t4 = local6 in #t4.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t4{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t5) → dynamic
+    return local6 = #t5;
+  T? local7;
+  core::bool #local7#isSet = false;
+  function #local7#get() → T% {
+    if(!#local7#isSet) {
+      #local7#isSet = true;
+      local7 = value;
+    }
+    return local7{T%};
+  }
+  function #local7#set(T% #t6) → dynamic {
+    #local7#isSet = true;
+    return local7 = #t6;
+  }
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+  local2; // error
+  ^^^^^^" in #local2#get.call();
+  let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4; // error
+  ^^^^^^" in #local4#get.call();
+  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+  local6; // error
+  ^^^^^^" 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? {
+  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.");
+  function #local2#set(T% #t13) → dynamic {
+    #local2#isSet = true;
+    return local2 = #t13;
+  }
+  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};
+  function #local4#set(core::int #t15) → dynamic
+    return local4 = #t15;
+  asy::FutureOr<core::int> local5;
+  asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t16 = local6 in #t16.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t16{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t17) → dynamic
+    return local6 = #t17;
+  T? local7;
+  core::bool #local7#isSet = false;
+  function #local7#get() → T% {
+    if(!#local7#isSet) {
+      #local7#isSet = true;
+      local7 = value;
+    }
+    return local7{T%};
+  }
+  function #local7#set(T% #t18) → dynamic {
+    #local7#isSet = true;
+    return local7 = #t18;
+  }
+  if(b) {
+    local1 = value;
+    #local2#set.call(value);
+    local3 = 0;
+    #local4#set.call(0);
+    local5 = 0;
+    #local6#set.call(0);
+    #local7#get.call();
+  }
+  let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  #local2#get.call();
+  let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  #local4#get.call();
+  let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  #local6#get.call();
+  #local7#get.call();
+};
+static field () → core::Null? fieldCompound = () → core::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};
+  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.
+  local3 += 0; // error
+  ^^^^^^" in local3).{core::num::+}(0);
+  #local4#set.call((let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4 += 0; // error
+  ^^^^^^" in #local4#get.call()).{core::num::+}(0));
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+  self::methodDirect::T% local1;
+  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.");
+  function #local2#set(self::methodDirect::T% #t26) → dynamic {
+    #local2#isSet = true;
+    return local2 = #t26;
+  }
+  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};
+  function #local4#set(core::int #t28) → dynamic
+    return local4 = #t28;
+  asy::FutureOr<core::int> local5;
+  asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t29 = local6 in #t29.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t29{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t30) → dynamic
+    return local6 = #t30;
+  self::methodDirect::T? local7;
+  core::bool #local7#isSet = false;
+  function #local7#get() → self::methodDirect::T% {
+    if(!#local7#isSet) {
+      #local7#isSet = true;
+      local7 = value;
+    }
+    return local7{self::methodDirect::T%};
+  }
+  function #local7#set(self::methodDirect::T% #t31) → dynamic {
+    #local7#isSet = true;
+    return local7 = #t31;
+  }
+  let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+  local2; // error
+  ^^^^^^" in #local2#get.call();
+  let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4; // error
+  ^^^^^^" in #local4#get.call();
+  let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+  local6; // error
+  ^^^^^^" in #local6#get.call();
+  #local7#get.call();
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+  self::methodConditional::T% local1;
+  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.");
+  function #local2#set(self::methodConditional::T% #t38) → dynamic {
+    #local2#isSet = true;
+    return local2 = #t38;
+  }
+  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};
+  function #local4#set(core::int #t40) → dynamic
+    return local4 = #t40;
+  asy::FutureOr<core::int> local5;
+  asy::FutureOr<core::int>? local6;
+  function #local6#get() → asy::FutureOr<core::int>
+    return let final asy::FutureOr<core::int>? #t41 = local6 in #t41.==(null) ?{asy::FutureOr<core::int>} throw new _in::LateInitializationErrorImpl::•("Local 'local6' has not been initialized.") : #t41{asy::FutureOr<core::int>};
+  function #local6#set(asy::FutureOr<core::int> #t42) → dynamic
+    return local6 = #t42;
+  self::methodConditional::T? local7;
+  core::bool #local7#isSet = false;
+  function #local7#get() → self::methodConditional::T% {
+    if(!#local7#isSet) {
+      #local7#isSet = true;
+      local7 = value;
+    }
+    return local7{self::methodConditional::T%};
+  }
+  function #local7#set(self::methodConditional::T% #t43) → dynamic {
+    #local7#isSet = true;
+    return local7 = #t43;
+  }
+  if(b) {
+    local1 = value;
+    #local2#set.call(value);
+    local3 = 0;
+    #local4#set.call(0);
+    local5 = 0;
+    #local6#set.call(0);
+    #local7#set.call(value);
+  }
+  let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  #local2#get.call();
+  let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  #local4#get.call();
+  let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  #local6#get.call();
+  #local7#get.call();
+}
+static method methodCompound() → dynamic {
+  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};
+  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.
+  local3 += 0; // error
+  ^^^^^^" in local3).{core::num::+}(0);
+  #local4#set.call((let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/late_lowering/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4 += 0; // error
+  ^^^^^^" in #local4#get.call()).{core::num::+}(0));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart
new file mode 100644
index 0000000..99b6bc0
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.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.
+
+T f<T>(T t) => t;
+
+main() {
+  late int local;
+  local = f(0);
+}
diff --git a/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.outline.expect b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.outline.expect
new file mode 100644
index 0000000..b6346e7
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.outline.expect
@@ -0,0 +1,8 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+  ;
+static method main() → dynamic
+  ;
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
new file mode 100644
index 0000000..4c0d317
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.strong.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+  return t;
+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};
+  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
new file mode 100644
index 0000000..4c0d317
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.strong.transformed.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+  return t;
+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};
+  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
new file mode 100644
index 0000000..4c0d317
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.weak.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+  return t;
+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};
+  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.transformed.expect b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.weak.transformed.expect
new file mode 100644
index 0000000..4c0d317
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/infer_from_late_variable.dart.weak.transformed.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+  return t;
+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};
+  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/issue40601.dart b/pkg/front_end/testcases/late_lowering/issue40601.dart
new file mode 100644
index 0000000..56ae989
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue40601.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.
+
+abstract class A<T> {
+  T baz();
+  bar(T value) {}
+  foo() {
+    late T value;
+    var result = () => bar(value);
+    (() {
+      value = baz();
+    })();
+    return result;
+  }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/late_lowering/issue40601.dart.outline.expect b/pkg/front_end/testcases/late_lowering/issue40601.dart.outline.expect
new file mode 100644
index 0000000..f2c5efd
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue40601.dart.outline.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    ;
+  abstract method baz() → self::A::T%;
+  method bar(generic-covariant-impl self::A::T% value) → dynamic
+    ;
+  method foo() → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.expect b/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.expect
new file mode 100644
index 0000000..b339c0e
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  abstract method baz() → self::A::T%;
+  method bar(generic-covariant-impl self::A::T% value) → dynamic {}
+  method foo() → dynamic {
+    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.");
+    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? {
+      #value#set.call(this.{self::A::baz}());
+    }).call();
+    return result;
+  }
+}
+static method main() → dynamic {}
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
new file mode 100644
index 0000000..b339c0e
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.transformed.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  abstract method baz() → self::A::T%;
+  method bar(generic-covariant-impl self::A::T% value) → dynamic {}
+  method foo() → dynamic {
+    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.");
+    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? {
+      #value#set.call(this.{self::A::baz}());
+    }).call();
+    return result;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.expect b/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.expect
new file mode 100644
index 0000000..b339c0e
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  abstract method baz() → self::A::T%;
+  method bar(generic-covariant-impl self::A::T% value) → dynamic {}
+  method foo() → dynamic {
+    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.");
+    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? {
+      #value#set.call(this.{self::A::baz}());
+    }).call();
+    return result;
+  }
+}
+static method main() → dynamic {}
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
new file mode 100644
index 0000000..b339c0e
--- /dev/null
+++ b/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.transformed.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  abstract method baz() → self::A::T%;
+  method bar(generic-covariant-impl self::A::T% value) → dynamic {}
+  method foo() → dynamic {
+    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.");
+    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? {
+      #value#set.call(this.{self::A::baz}());
+    }).call();
+    return result;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart
index b06d748..31db7ec 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart
@@ -3,20 +3,36 @@
 // BSD-style license that can be found in the LICENSE file.
 
 main() {
+  bool b = false;
   late final int lateLocal;
 
+  if (b) {
+    // Pretend to assign to confuse flow analysis for the read below.
+    lateLocal = 123;
+  }
   throws(() => lateLocal, 'Read value from uninitialized lateLocal');
-  expect(123, lateLocal = 123);
-  expect(123, lateLocal);
+  if (!b) {
+    // Pretend to not assign to confuse flow analysis for the write below.
+    expect(123, lateLocal = 123);
+    expect(123, lateLocal);
+  }
   throws(() => lateLocal = 124, 'Write value to initialized lateLocal');
 
   local<T>(T value) {
     late final T lateGenericLocal;
 
+    if (b) {
+      // Pretend to assign to confuse flow analysis for the read below.
+      lateGenericLocal = value;
+    }
     throws(() => lateGenericLocal,
         'Read value from uninitialized lateGenericLocal');
-    expect(value, lateGenericLocal = value);
-    expect(value, lateGenericLocal);
+
+    if (!b) {
+      // Pretend to not assign to confuse flow analysis for the write below.
+      expect(value, lateGenericLocal = value);
+      expect(value, lateGenericLocal);
+    }
     throws(() => lateGenericLocal = value,
         'Write value to initialized lateGenericLocal');
   }
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 bb8676d..3476c20 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
@@ -4,6 +4,7 @@
 import "dart:_internal" as _in;
 
 static method main() → dynamic {
+  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};
@@ -12,9 +13,14 @@
       return lateLocal = #t2;
     else
       throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has already been initialized.");
+  if(b) {
+    #lateLocal#set.call(123);
+  }
   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());
+  if(!b) {
+    self::expect(123, #lateLocal#set.call(123));
+    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? {
     final T? lateGenericLocal;
@@ -28,9 +34,14 @@
         #lateGenericLocal#isSet = true;
         return lateGenericLocal = #t3;
       }
+    if(b) {
+      #lateGenericLocal#set.call(value);
+    }
     self::throws(() → T% => #lateGenericLocal#get.call(), "Read value from uninitialized lateGenericLocal");
-    self::expect(value, #lateGenericLocal#set.call(value));
-    self::expect(value, #lateGenericLocal#get.call());
+    if(!b) {
+      self::expect(value, #lateGenericLocal#set.call(value));
+      self::expect(value, #lateGenericLocal#get.call());
+    }
     self::throws(() → T% => #lateGenericLocal#set.call(value), "Write value to initialized lateGenericLocal");
   }
   local.call<core::int?>(null);
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 bb8676d..3476c20 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
@@ -4,6 +4,7 @@
 import "dart:_internal" as _in;
 
 static method main() → dynamic {
+  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};
@@ -12,9 +13,14 @@
       return lateLocal = #t2;
     else
       throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has already been initialized.");
+  if(b) {
+    #lateLocal#set.call(123);
+  }
   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());
+  if(!b) {
+    self::expect(123, #lateLocal#set.call(123));
+    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? {
     final T? lateGenericLocal;
@@ -28,9 +34,14 @@
         #lateGenericLocal#isSet = true;
         return lateGenericLocal = #t3;
       }
+    if(b) {
+      #lateGenericLocal#set.call(value);
+    }
     self::throws(() → T% => #lateGenericLocal#get.call(), "Read value from uninitialized lateGenericLocal");
-    self::expect(value, #lateGenericLocal#set.call(value));
-    self::expect(value, #lateGenericLocal#get.call());
+    if(!b) {
+      self::expect(value, #lateGenericLocal#set.call(value));
+      self::expect(value, #lateGenericLocal#get.call());
+    }
     self::throws(() → T% => #lateGenericLocal#set.call(value), "Write value to initialized lateGenericLocal");
   }
   local.call<core::int?>(null);
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 bb8676d..3476c20 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
@@ -4,6 +4,7 @@
 import "dart:_internal" as _in;
 
 static method main() → dynamic {
+  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};
@@ -12,9 +13,14 @@
       return lateLocal = #t2;
     else
       throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has already been initialized.");
+  if(b) {
+    #lateLocal#set.call(123);
+  }
   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());
+  if(!b) {
+    self::expect(123, #lateLocal#set.call(123));
+    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? {
     final T? lateGenericLocal;
@@ -28,9 +34,14 @@
         #lateGenericLocal#isSet = true;
         return lateGenericLocal = #t3;
       }
+    if(b) {
+      #lateGenericLocal#set.call(value);
+    }
     self::throws(() → T% => #lateGenericLocal#get.call(), "Read value from uninitialized lateGenericLocal");
-    self::expect(value, #lateGenericLocal#set.call(value));
-    self::expect(value, #lateGenericLocal#get.call());
+    if(!b) {
+      self::expect(value, #lateGenericLocal#set.call(value));
+      self::expect(value, #lateGenericLocal#get.call());
+    }
     self::throws(() → T% => #lateGenericLocal#set.call(value), "Write value to initialized lateGenericLocal");
   }
   local.call<core::int?>(null);
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 bb8676d..3476c20 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
@@ -4,6 +4,7 @@
 import "dart:_internal" as _in;
 
 static method main() → dynamic {
+  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};
@@ -12,9 +13,14 @@
       return lateLocal = #t2;
     else
       throw new _in::LateInitializationErrorImpl::•("Local 'lateLocal' has already been initialized.");
+  if(b) {
+    #lateLocal#set.call(123);
+  }
   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());
+  if(!b) {
+    self::expect(123, #lateLocal#set.call(123));
+    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? {
     final T? lateGenericLocal;
@@ -28,9 +34,14 @@
         #lateGenericLocal#isSet = true;
         return lateGenericLocal = #t3;
       }
+    if(b) {
+      #lateGenericLocal#set.call(value);
+    }
     self::throws(() → T% => #lateGenericLocal#get.call(), "Read value from uninitialized lateGenericLocal");
-    self::expect(value, #lateGenericLocal#set.call(value));
-    self::expect(value, #lateGenericLocal#get.call());
+    if(!b) {
+      self::expect(value, #lateGenericLocal#set.call(value));
+      self::expect(value, #lateGenericLocal#get.call());
+    }
     self::throws(() → T% => #lateGenericLocal#set.call(value), "Write value to initialized lateGenericLocal");
   }
   local.call<core::int?>(null);
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 c886bcf..4646abe 100644
--- a/pkg/front_end/testcases/late_lowering/later.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/later.dart.weak.expect
@@ -55,7 +55,7 @@
 //   late String s2 = '${fisk}${await hest()}${fisk}'; // Error.
 //                              ^^^^^
 //
-// pkg/front_end/testcases/late_lowering/later.dart:48:9: Warning: Constructor is marked 'const' and some fields are late.
+// pkg/front_end/testcases/late_lowering/later.dart:48:9: Error: Constructor is marked 'const' so fields can't be late.
 //   const B(); // Error: B has late final fields.
 //         ^
 // pkg/front_end/testcases/late_lowering/later.dart:46:18: Context: Field is late, but constructor is 'const'.
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 a7094a7..a0a1523 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
@@ -55,7 +55,7 @@
 //   late String s2 = '${fisk}${await hest()}${fisk}'; // Error.
 //                              ^^^^^
 //
-// pkg/front_end/testcases/late_lowering/later.dart:48:9: Warning: Constructor is marked 'const' and some fields are late.
+// pkg/front_end/testcases/late_lowering/later.dart:48:9: Error: Constructor is marked 'const' so fields can't be late.
 //   const B(); // Error: B has late final fields.
 //         ^
 // pkg/front_end/testcases/late_lowering/later.dart:46:18: Context: Field is late, but constructor is 'const'.
diff --git a/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect b/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect
index ddfc6a4..9c3d453 100644
--- a/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/assignability.dart.weak.expect
@@ -2,94 +2,94 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:114:10: Warning: Assigning value of type 'Object?' 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'.
 //  - 'Object' is from 'dart:core'.
 //   Object objectVar = objectNullableArg;
-//          ^
+//                      ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:115:3: Warning: Assigning value of type 'num?' 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'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = numNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:116:3: Warning: Assigning value of type 'int?' 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'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = intNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:117:3: Warning: Assigning value of type 'double?' 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'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = doubleNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:118:3: Warning: Assigning value of type 'Function?' 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'.
 //  - 'Function' is from 'dart:core'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = functionNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:119:3: Warning: Assigning value of type 'void Function()?' 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'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = toVoidNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:120:3: Warning: Assigning value of type 'Tearoffable?' 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'.
 //  - '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:3: Warning: Assigning value of type 'XnonNull?' 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'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xNonNullNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:122:3: Warning: Assigning value of type 'XpotentiallyNull' 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'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xPotentiallyNullArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:123:3: Warning: Assigning value of type 'XpotentiallyNull?' 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'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xPotentiallyNullNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:124:3: Warning: Assigning value of type 'YnonNull?' 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'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yNonNullNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:125:3: Warning: Assigning value of type 'YpotentiallyNull' 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'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yPotentiallyNullArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:126:3: Warning: Assigning value of type 'YpotentiallyNull?' 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'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yPotentiallyNullNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:128:7: Warning: Assigning value of type 'Object' to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:128:16: Error: A value of type 'Object' can't be assigned to a variable of type 'num'.
 //  - 'Object' is from 'dart:core'.
 //   num numVar = objectArg;
-//       ^
+//                ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:129:3: Warning: Assigning value of type 'Object?' to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:129:12: Error: A value of type 'Object?' can't be assigned to a variable of type 'num'.
 //  - 'Object' is from 'dart:core'.
 //   numVar = objectNullableArg;
-//   ^
+//            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:130:3: Warning: Assigning value of type 'num?' 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'.
 //   numVar = numNullableArg;
-//   ^
+//            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:131:3: Warning: Assigning value of type 'int?' 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'.
 //   numVar = intNullableArg;
-//   ^
+//            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:132:3: Warning: Assigning value of type 'double?' 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'.
 //   numVar = doubleNullableArg;
-//   ^
+//            ^
 //
 // 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'.
 //  - 'Function' is from 'dart:core'.
@@ -151,27 +151,27 @@
 //   numVar = yPotentiallyNullNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:148:7: Warning: Assigning value of type 'Object' to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:148:16: Error: A value of type 'Object' can't be assigned to a variable of type 'int'.
 //  - 'Object' is from 'dart:core'.
 //   int intVar = objectArg;
-//       ^
+//                ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:149:3: Warning: Assigning value of type 'Object?' to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:149:12: Error: A value of type 'Object?' can't be assigned to a variable of type 'int'.
 //  - 'Object' is from 'dart:core'.
 //   intVar = objectNullableArg;
-//   ^
+//            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:150:3: Warning: Assigning value of type 'num' to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:150:12: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
 //   intVar = numArg;
-//   ^
+//            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:151:3: Warning: Assigning value of type 'num?' to a variable of type 'int'.
+// 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;
-//   ^
+//            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:152:3: Warning: Assigning value of type 'int?' 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'.
 //   intVar = intNullableArg;
-//   ^
+//            ^
 //
 // 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'.
 //   intVar = doubleArg;
@@ -241,23 +241,23 @@
 //   intVar = yPotentiallyNullNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:170:10: Warning: Assigning value of type 'Object' to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:170:22: Error: A value of type 'Object' can't be assigned to a variable of type 'double'.
 //  - 'Object' is from 'dart:core'.
 //   double doubleVar = objectArg;
-//          ^
+//                      ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:171:3: Warning: Assigning value of type 'Object?' to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:171:15: Error: A value of type 'Object?' can't be assigned to a variable of type 'double'.
 //  - 'Object' is from 'dart:core'.
 //   doubleVar = objectNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:172:3: Warning: Assigning value of type 'num' to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:172:15: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
 //   doubleVar = numArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:173:3: Warning: Assigning value of type 'num?' to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:173:15: Error: A value of type 'num?' can't be assigned to a variable of type 'double'.
 //   doubleVar = numNullableArg;
-//   ^
+//               ^
 //
 // pkg/front_end/testcases/nnbd/assignability.dart:174:15: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
 //   doubleVar = intArg;
@@ -267,9 +267,9 @@
 //   doubleVar = intNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:176:3: Warning: Assigning value of type 'double?' 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'.
 //   doubleVar = doubleNullableArg;
-//   ^
+//               ^
 //
 // 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'.
 //  - 'Function' is from 'dart:core'.
@@ -331,17 +331,17 @@
 //   doubleVar = yPotentiallyNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:192:12: Warning: Assigning value of type 'Object' to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:192:26: Error: A value of type 'Object' can't be assigned to a variable of type 'Function'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Function' is from 'dart:core'.
 //   Function functionVar = objectArg;
-//            ^
+//                          ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:193:3: Warning: Assigning value of type 'Object?' to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:193:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'Function'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Function' is from 'dart:core'.
 //   functionVar = objectNullableArg;
-//   ^
+//                 ^
 //
 // pkg/front_end/testcases/nnbd/assignability.dart:194:17: Error: A value of type 'num' can't be assigned to a variable of type 'Function'.
 //  - 'Function' is from 'dart:core'.
@@ -373,17 +373,17 @@
 //   functionVar = doubleNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:200:3: Warning: Assigning value of type 'Function?' 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'.
 //  - 'Function' is from 'dart:core'.
 //   functionVar = functionNullableArg;
-//   ^
+//                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:201:3: Warning: Assigning value of type 'void Function()?' 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'.
 //  - 'Function' is from 'dart:core'.
 //   functionVar = toVoidNullableArg;
-//   ^
+//                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:202:17: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/assignability.dart:202:17: Error: Can't tear off method 'call' from a potentially null value.
 //   functionVar = tearoffableNullableArg;
 //                 ^
 //
@@ -427,15 +427,15 @@
 //   functionVar = yPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:212:19: Warning: Assigning value of type 'Object' to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:212:31: Error: A value of type 'Object' can't be assigned to a variable of type 'void Function()'.
 //  - 'Object' is from 'dart:core'.
 //   void Function() toVoidVar = objectArg;
-//                   ^
+//                               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:213:3: Warning: Assigning value of type 'Object?' to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:213:15: Error: A value of type 'Object?' can't be assigned to a variable of type 'void Function()'.
 //  - 'Object' is from 'dart:core'.
 //   toVoidVar = objectNullableArg;
-//   ^
+//               ^
 //
 // pkg/front_end/testcases/nnbd/assignability.dart:214:15: Error: A value of type 'num' can't be assigned to a variable of type 'void Function()'.
 //   toVoidVar = numArg;
@@ -461,21 +461,21 @@
 //   toVoidVar = doubleNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:220:3: Warning: Assigning value of type 'Function' to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:220:15: Error: A value of type 'Function' can't be assigned to a variable of type 'void Function()'.
 //  - 'Function' is from 'dart:core'.
 //   toVoidVar = functionArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:221:3: Warning: Assigning value of type 'Function?' to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:221:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'void Function()'.
 //  - 'Function' is from 'dart:core'.
 //   toVoidVar = functionNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:222:3: Warning: Assigning value of type 'void Function()?' 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()'.
 //   toVoidVar = toVoidNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:223:15: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/assignability.dart:223:15: Error: Can't tear off method 'call' from a potentially null value.
 //   toVoidVar = tearoffableNullableArg;
 //               ^
 //
@@ -511,17 +511,17 @@
 //   toVoidVar = yPotentiallyNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:233:15: Warning: Assigning value of type 'Object' to a variable of type 'Tearoffable'.
+// pkg/front_end/testcases/nnbd/assignability.dart:233:32: Error: A value of type 'Object' can't be assigned to a variable of type 'Tearoffable'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
 //   Tearoffable tearoffableVar = objectArg;
-//               ^
+//                                ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:234:3: Warning: Assigning value of type 'Object?' to a variable of type 'Tearoffable'.
+// pkg/front_end/testcases/nnbd/assignability.dart:234:20: Error: A value of type 'Object?' can't be assigned to a variable of type 'Tearoffable'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
 //   tearoffableVar = objectNullableArg;
-//   ^
+//                    ^
 //
 // pkg/front_end/testcases/nnbd/assignability.dart:235:20: Error: A value of type 'num' can't be assigned to a variable of type 'Tearoffable'.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
@@ -575,10 +575,10 @@
 //   tearoffableVar = toVoidNullableArg;
 //                    ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:245:3: Warning: Assigning value of type 'Tearoffable?' 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'.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
 //   tearoffableVar = tearoffableNullableArg;
-//   ^
+//                    ^
 //
 // pkg/front_end/testcases/nnbd/assignability.dart:246:20: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Tearoffable'.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
@@ -620,15 +620,15 @@
 //   tearoffableVar = yPotentiallyNullNullableArg;
 //                    ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:255:12: Warning: Assigning value of type 'Object' to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:255:26: Error: A value of type 'Object' can't be assigned to a variable of type 'XnonNull'.
 //  - 'Object' is from 'dart:core'.
 //   XnonNull xNonNullVar = objectArg;
-//            ^
+//                          ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:256:3: Warning: Assigning value of type 'Object?' to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:256:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'XnonNull'.
 //  - 'Object' is from 'dart:core'.
 //   xNonNullVar = objectNullableArg;
-//   ^
+//                 ^
 //
 // pkg/front_end/testcases/nnbd/assignability.dart:257:17: Error: A value of type 'num' can't be assigned to a variable of type 'XnonNull'.
 //   xNonNullVar = numArg;
@@ -682,9 +682,9 @@
 //   xNonNullVar = tearoffableNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:269:3: Warning: Assigning value of type 'XnonNull?' 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'.
 //   xNonNullVar = xNonNullNullableArg;
-//   ^
+//                 ^
 //
 // 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'.
 //   xNonNullVar = xPotentiallyNullArg;
@@ -694,9 +694,9 @@
 //   xNonNullVar = xPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:272:3: Warning: Assigning value of type 'YnonNull?' 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'.
 //   xNonNullVar = yNonNullNullableArg;
-//   ^
+//                 ^
 //
 // 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'.
 //   xNonNullVar = yPotentiallyNullArg;
@@ -706,15 +706,15 @@
 //   xNonNullVar = yPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:276:20: Warning: Assigning value of type 'Object' to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:276:42: Error: A value of type 'Object' can't be assigned to a variable of type 'XpotentiallyNull'.
 //  - 'Object' is from 'dart:core'.
 //   XpotentiallyNull xPotentiallyNullVar = objectArg;
-//                    ^
+//                                          ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:277:3: Warning: Assigning value of type 'Object?' to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:277:25: Error: A value of type 'Object?' can't be assigned to a variable of type 'XpotentiallyNull'.
 //  - 'Object' is from 'dart:core'.
 //   xPotentiallyNullVar = objectNullableArg;
-//   ^
+//                         ^
 //
 // pkg/front_end/testcases/nnbd/assignability.dart:278:25: Error: A value of type 'num' can't be assigned to a variable of type 'XpotentiallyNull'.
 //   xPotentiallyNullVar = numArg;
@@ -776,9 +776,9 @@
 //   xPotentiallyNullVar = xNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:292:3: Warning: Assigning value of type 'XpotentiallyNull?' 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'.
 //   xPotentiallyNullVar = xPotentiallyNullNullableArg;
-//   ^
+//                         ^
 //
 // 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'.
 //   xPotentiallyNullVar = yNonNullArg;
@@ -788,19 +788,19 @@
 //   xPotentiallyNullVar = yNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:295:3: Warning: Assigning value of type 'YpotentiallyNull?' 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'.
 //   xPotentiallyNullVar = yPotentiallyNullNullableArg;
-//   ^
+//                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:297:12: Warning: Assigning value of type 'Object' to a variable of type 'YnonNull'.
+// 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'.
 //  - 'Object' is from 'dart:core'.
 //   YnonNull yNonNullVar = objectArg;
-//            ^
+//                          ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:298:3: Warning: Assigning value of type 'Object?' to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:298:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'YnonNull'.
 //  - 'Object' is from 'dart:core'.
 //   yNonNullVar = objectNullableArg;
-//   ^
+//                 ^
 //
 // pkg/front_end/testcases/nnbd/assignability.dart:299:17: Error: A value of type 'num' can't be assigned to a variable of type 'YnonNull'.
 //   yNonNullVar = numArg;
@@ -854,13 +854,13 @@
 //   yNonNullVar = tearoffableNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:311:3: Warning: Assigning value of type 'XnonNull' to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:311:17: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'YnonNull'.
 //   yNonNullVar = xNonNullArg;
-//   ^
+//                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:312:3: Warning: Assigning value of type 'XnonNull?' to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:312:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'YnonNull'.
 //   yNonNullVar = xNonNullNullableArg;
-//   ^
+//                 ^
 //
 // pkg/front_end/testcases/nnbd/assignability.dart:313:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
 //   yNonNullVar = xPotentiallyNullArg;
@@ -870,9 +870,9 @@
 //   yNonNullVar = xPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:315:3: Warning: Assigning value of type 'YnonNull?' 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'.
 //   yNonNullVar = yNonNullNullableArg;
-//   ^
+//                 ^
 //
 // 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'.
 //   yNonNullVar = yPotentiallyNullArg;
@@ -882,15 +882,15 @@
 //   yNonNullVar = yPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:319:20: Warning: Assigning value of type 'Object' to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:319:42: Error: A value of type 'Object' can't be assigned to a variable of type 'YpotentiallyNull'.
 //  - 'Object' is from 'dart:core'.
 //   YpotentiallyNull yPotentiallyNullVar = objectArg;
-//                    ^
+//                                          ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:320:3: Warning: Assigning value of type 'Object?' to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:320:25: Error: A value of type 'Object?' can't be assigned to a variable of type 'YpotentiallyNull'.
 //  - 'Object' is from 'dart:core'.
 //   yPotentiallyNullVar = objectNullableArg;
-//   ^
+//                         ^
 //
 // pkg/front_end/testcases/nnbd/assignability.dart:321:25: Error: A value of type 'num' can't be assigned to a variable of type 'YpotentiallyNull'.
 //   yPotentiallyNullVar = numArg;
@@ -952,13 +952,13 @@
 //   yPotentiallyNullVar = xNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:335:3: Warning: Assigning value of type 'XpotentiallyNull' to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:335:25: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YpotentiallyNull'.
 //   yPotentiallyNullVar = xPotentiallyNullArg;
-//   ^
+//                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:336:3: Warning: Assigning value of type 'XpotentiallyNull?' to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:336:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
 //   yPotentiallyNullVar = xPotentiallyNullNullableArg;
-//   ^
+//                         ^
 //
 // pkg/front_end/testcases/nnbd/assignability.dart:337:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
 //   yPotentiallyNullVar = yNonNullArg;
@@ -968,9 +968,9 @@
 //   yPotentiallyNullVar = yNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:339:3: Warning: Assigning value of type 'YpotentiallyNull?' 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'.
 //   yPotentiallyNullVar = yPotentiallyNullNullableArg;
-//   ^
+//                         ^
 //
 import self as self;
 import "dart:core" as core;
@@ -994,7 +994,7 @@
   dynamicVar = xPotentiallyNullArg;
   dynamicVar = yNonNullArg;
   dynamicVar = yPotentiallyNullArg;
-  core::Object objectVar = dynamicArg;
+  core::Object objectVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} core::Object;
   objectVar = objectArg;
   objectVar = numArg;
   objectVar = intArg;
@@ -1032,595 +1032,759 @@
   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 = objectNullableArg;
+  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'.
+ - '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'.
+ - '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'.
+ - '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'.
+ - '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'.
+ - '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'.
+ - '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'.
+ - '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'.
+ - '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'.
+ - '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'.
+ - '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'.
+ - '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'.
+ - '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'.
+ - 'Object' is from 'dart:core'.
   objectVar = yPotentiallyNullNullableArg;
-  core::num numVar = objectArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = objectNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+              ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+  core::num numVar = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:128:16: Error: A value of type 'Object' can't be assigned to a variable of type 'num'.
+ - 'Object' is from 'dart:core'.
+  num numVar = objectArg;
+               ^" in objectArg as{TypeError,ForNonNullableByDefault} core::num;
+  numVar = let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:129:12: Error: A value of type 'Object?' can't be assigned to a variable of type 'num'.
+ - '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 = 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 = 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 = doubleNullableArg;
-  numVar = let final<BottomType> #t3 = 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'.
+           ^" 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'.
  - 'Function' is from 'dart:core'.
   numVar = functionArg;
            ^" in functionArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:134:12: Error: A value of type 'Function?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:134:12: Error: A value of type 'Function?' can't be assigned to a variable of type 'num'.
  - 'Function' is from 'dart:core'.
   numVar = functionNullableArg;
            ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:135:12: Error: A value of type 'void Function()' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:135:12: Error: A value of type 'void Function()' can't be assigned to a variable of type 'num'.
   numVar = toVoidArg;
            ^" in toVoidArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:136:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:136:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'num'.
   numVar = toVoidNullableArg;
            ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:137:12: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:137:12: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'num'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   numVar = tearoffableArg;
            ^" in tearoffableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:138:12: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:138:12: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'num'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   numVar = tearoffableNullableArg;
            ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:139:12: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:139:12: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'num'.
   numVar = xNonNullArg;
            ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:140:12: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:140:12: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'num'.
   numVar = xNonNullNullableArg;
            ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:141:12: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t29 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:141:12: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'num'.
   numVar = xPotentiallyNullArg;
            ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:142:12: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t30 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:142:12: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'num'.
   numVar = xPotentiallyNullNullableArg;
            ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:143:12: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t31 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:143:12: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'num'.
   numVar = yNonNullArg;
            ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:144:12: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:144:12: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'num'.
   numVar = yNonNullNullableArg;
            ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:145:12: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:145:12: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'num'.
   numVar = yPotentiallyNullArg;
            ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:146:12: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:146:12: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'num'.
   numVar = yPotentiallyNullNullableArg;
            ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  core::int intVar = objectArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = objectNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = numArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = numNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+  core::int intVar = let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:148:16: Error: A value of type 'Object' can't be assigned to a variable of type 'int'.
+ - 'Object' is from 'dart:core'.
+  int intVar = objectArg;
+               ^" in objectArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:149:12: Error: A value of type 'Object?' can't be assigned to a variable of type 'int'.
+ - 'Object' is from 'dart:core'.
+  intVar = objectNullableArg;
+           ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:150:12: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  intVar = numArg;
+           ^" in numArg as{TypeError,ForNonNullableByDefault} core::int;
+  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 = intNullableArg;
-  intVar = let final<BottomType> #t17 = 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'.
+           ^" 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'.
   intVar = doubleArg;
            ^" in doubleArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:154:12: Error: A value of type 'double?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:154:12: Error: A value of type 'double?' can't be assigned to a variable of type 'int'.
   intVar = doubleNullableArg;
            ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:155:12: Error: A value of type 'Function' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:155:12: Error: A value of type 'Function' can't be assigned to a variable of type 'int'.
  - 'Function' is from 'dart:core'.
   intVar = functionArg;
            ^" in functionArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:156:12: Error: A value of type 'Function?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:156:12: Error: A value of type 'Function?' can't be assigned to a variable of type 'int'.
  - 'Function' is from 'dart:core'.
   intVar = functionNullableArg;
            ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:157:12: Error: A value of type 'void Function()' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:157:12: Error: A value of type 'void Function()' can't be assigned to a variable of type 'int'.
   intVar = toVoidArg;
            ^" in toVoidArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:158:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:158:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'int'.
   intVar = toVoidNullableArg;
            ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:159:12: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:159:12: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'int'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   intVar = tearoffableArg;
            ^" in tearoffableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:160:12: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:160:12: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'int'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   intVar = tearoffableNullableArg;
            ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:161:12: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t48 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:161:12: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'int'.
   intVar = xNonNullArg;
            ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:162:12: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:162:12: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'int'.
   intVar = xNonNullNullableArg;
            ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:163:12: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:163:12: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'int'.
   intVar = xPotentiallyNullArg;
            ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:164:12: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t51 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:164:12: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'int'.
   intVar = xPotentiallyNullNullableArg;
            ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t29 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:165:12: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t52 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:165:12: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'int'.
   intVar = yNonNullArg;
            ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t30 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:166:12: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t53 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:166:12: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'int'.
   intVar = yNonNullNullableArg;
            ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t31 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:167:12: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:167:12: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'int'.
   intVar = yPotentiallyNullArg;
            ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:168:12: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t55 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:168:12: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'int'.
   intVar = yPotentiallyNullNullableArg;
            ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  core::double doubleVar = objectArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = objectNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = numArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = numNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:174:15: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+  core::double doubleVar = let final<BottomType> #t56 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:170:22: Error: A value of type 'Object' can't be assigned to a variable of type 'double'.
+ - 'Object' is from 'dart:core'.
+  double doubleVar = objectArg;
+                     ^" in objectArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:171:15: Error: A value of type 'Object?' can't be assigned to a variable of type 'double'.
+ - 'Object' is from 'dart:core'.
+  doubleVar = objectNullableArg;
+              ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = let final<BottomType> #t58 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:172:15: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  doubleVar = numArg;
+              ^" in numArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = let final<BottomType> #t59 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:173:15: Error: A value of type 'num?' can't be assigned to a variable of type 'double'.
+  doubleVar = numNullableArg;
+              ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = let final<BottomType> #t60 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:174:15: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
   doubleVar = intArg;
               ^" in intArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t34 = 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 = 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 = doubleNullableArg;
-  doubleVar = let final<BottomType> #t35 = 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'.
+              ^" 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'.
  - 'Function' is from 'dart:core'.
   doubleVar = functionArg;
               ^" in functionArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:178:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t64 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:178:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'double'.
  - 'Function' is from 'dart:core'.
   doubleVar = functionNullableArg;
               ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:179:15: Error: A value of type 'void Function()' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t65 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:179:15: Error: A value of type 'void Function()' can't be assigned to a variable of type 'double'.
   doubleVar = toVoidArg;
               ^" in toVoidArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:180:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t66 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:180:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'double'.
   doubleVar = toVoidNullableArg;
               ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:181:15: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t67 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:181:15: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'double'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   doubleVar = tearoffableArg;
               ^" in tearoffableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t40 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:182:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t68 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:182:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'double'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   doubleVar = tearoffableNullableArg;
               ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:183:15: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t69 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:183:15: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'double'.
   doubleVar = xNonNullArg;
               ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:184:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t70 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:184:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'double'.
   doubleVar = xNonNullNullableArg;
               ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:185:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t71 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:185:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'double'.
   doubleVar = xPotentiallyNullArg;
               ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:186:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t72 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:186:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'double'.
   doubleVar = xPotentiallyNullNullableArg;
               ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:187:15: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t73 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:187:15: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'double'.
   doubleVar = yNonNullArg;
               ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:188:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t74 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:188:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'double'.
   doubleVar = yNonNullNullableArg;
               ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:189:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t75 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:189:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'double'.
   doubleVar = yPotentiallyNullArg;
               ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t48 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:190:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t76 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:190:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'double'.
   doubleVar = yPotentiallyNullNullableArg;
               ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  core::Function functionVar = objectArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = objectNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:194:17: Error: A value of type 'num' can't be assigned to a variable of type 'Function'.
+  core::Function functionVar = let final<BottomType> #t77 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:192:26: Error: A value of type 'Object' can't be assigned to a variable of type 'Function'.
+ - 'Object' is from 'dart:core'.
+ - 'Function' is from 'dart:core'.
+  Function functionVar = objectArg;
+                         ^" in objectArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = let final<BottomType> #t78 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:193:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'Function'.
+ - 'Object' is from 'dart:core'.
+ - 'Function' is from 'dart:core'.
+  functionVar = objectNullableArg;
+                ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:194:17: Error: A value of type 'num' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = numArg;
                 ^" in numArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:195:17: Error: A value of type 'num?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t80 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:195:17: Error: A value of type 'num?' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = numNullableArg;
                 ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t51 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:196:17: Error: A value of type 'int' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t81 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:196:17: Error: A value of type 'int' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = intArg;
                 ^" in intArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t52 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:197:17: Error: A value of type 'int?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t82 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:197:17: Error: A value of type 'int?' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = intNullableArg;
                 ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t53 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:198:17: Error: A value of type 'double' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t83 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:198:17: Error: A value of type 'double' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = doubleArg;
                 ^" in doubleArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:199:17: Error: A value of type 'double?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t84 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:199:17: Error: A value of type 'double?' can't be assigned to a variable of type 'Function'.
  - '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'.
+ - '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'.
+ - 'Function' is from 'dart:core'.
   functionVar = toVoidNullableArg;
-  functionVar = tearoffableNullableArg as{TypeError} core::Function;
-  functionVar = let final<BottomType> #t55 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:203:17: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Function'.
+                ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = let final<BottomType> #t87 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:202:17: Error: Can't tear off method 'call' from a potentially null value.
+  functionVar = tearoffableNullableArg;
+                ^" in tearoffableNullableArg as{TypeError} core::Function;
+  functionVar = let final<BottomType> #t88 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:203:17: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = xNonNullArg;
                 ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t56 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:204:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:204:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = xNonNullNullableArg;
                 ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:205:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t90 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:205:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = xPotentiallyNullArg;
                 ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t58 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:206:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t91 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:206:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = xPotentiallyNullNullableArg;
                 ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t59 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:207:17: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t92 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:207:17: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = yNonNullArg;
                 ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t60 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:208:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t93 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:208:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = yNonNullNullableArg;
                 ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t61 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:209:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:209:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = yPotentiallyNullArg;
                 ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:210:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t95 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:210:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = yPotentiallyNullNullableArg;
                 ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  () → void toVoidVar = objectArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = objectNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:214:15: Error: A value of type 'num' can't be assigned to a variable of type 'void Function()'.
+  () → void toVoidVar = let final<BottomType> #t96 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:212:31: Error: A value of type 'Object' can't be assigned to a variable of type 'void Function()'.
+ - 'Object' is from 'dart:core'.
+  void Function() toVoidVar = objectArg;
+                              ^" in objectArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = let final<BottomType> #t97 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:213:15: Error: A value of type 'Object?' can't be assigned to a variable of type 'void Function()'.
+ - 'Object' is from 'dart:core'.
+  toVoidVar = objectNullableArg;
+              ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = let final<BottomType> #t98 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:214:15: Error: A value of type 'num' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = numArg;
               ^" in numArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t64 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:215:15: Error: A value of type 'num?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t99 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:215:15: Error: A value of type 'num?' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = numNullableArg;
               ^" in numNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t65 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:216:15: Error: A value of type 'int' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t100 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:216:15: Error: A value of type 'int' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = intArg;
               ^" in intArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t66 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:217:15: Error: A value of type 'int?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t101 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:217:15: Error: A value of type 'int?' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = intNullableArg;
               ^" in intNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t67 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:218:15: Error: A value of type 'double' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t102 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:218:15: Error: A value of type 'double' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = doubleArg;
               ^" in doubleArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t68 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:219:15: Error: A value of type 'double?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t103 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:219:15: Error: A value of type 'double?' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = doubleNullableArg;
               ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = functionArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = functionNullableArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = let final<BottomType> #t104 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:220:15: Error: A value of type 'Function' can't be assigned to a variable of type 'void Function()'.
+ - 'Function' is from 'dart:core'.
+  toVoidVar = functionArg;
+              ^" in functionArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = let final<BottomType> #t105 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:221:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'void Function()'.
+ - '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 = toVoidNullableArg;
-  toVoidVar = tearoffableNullableArg as{TypeError} () → void;
-  toVoidVar = let final<BottomType> #t69 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:224:15: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'void Function()'.
+              ^" 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.
+  toVoidVar = tearoffableNullableArg;
+              ^" in tearoffableNullableArg as{TypeError} () → void;
+  toVoidVar = let final<BottomType> #t108 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:224:15: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = xNonNullArg;
               ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t70 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:225:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t109 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:225:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = xNonNullNullableArg;
               ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t71 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:226:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t110 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:226:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = xPotentiallyNullArg;
               ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t72 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:227:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t111 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:227:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = xPotentiallyNullNullableArg;
               ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t73 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:228:15: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t112 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:228:15: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = yNonNullArg;
               ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t74 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:229:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t113 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:229:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = yNonNullNullableArg;
               ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t75 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:230:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t114 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:230:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = yPotentiallyNullArg;
               ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t76 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:231:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t115 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:231:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = yPotentiallyNullNullableArg;
               ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  self::Tearoffable tearoffableVar = objectArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = objectNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t77 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:235:20: Error: A value of type 'num' can't be assigned to a variable of type 'Tearoffable'.
+  self::Tearoffable tearoffableVar = let final<BottomType> #t116 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:233:32: Error: A value of type 'Object' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Object' is from 'dart:core'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  Tearoffable tearoffableVar = objectArg;
+                               ^" in objectArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = let final<BottomType> #t117 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:234:20: Error: A value of type 'Object?' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Object' is from 'dart:core'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  tearoffableVar = objectNullableArg;
+                   ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = let final<BottomType> #t118 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:235:20: Error: A value of type 'num' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = numArg;
                    ^" in numArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t78 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:236:20: Error: A value of type 'num?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t119 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:236:20: Error: A value of type 'num?' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = numNullableArg;
                    ^" in numNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:237:20: Error: A value of type 'int' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t120 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:237:20: Error: A value of type 'int' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = intArg;
                    ^" in intArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t80 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:238:20: Error: A value of type 'int?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t121 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:238:20: Error: A value of type 'int?' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = intNullableArg;
                    ^" in intNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t81 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:239:20: Error: A value of type 'double' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t122 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:239:20: Error: A value of type 'double' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = doubleArg;
                    ^" in doubleArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t82 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:240:20: Error: A value of type 'double?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t123 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:240:20: Error: A value of type 'double?' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = doubleNullableArg;
                    ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t83 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:241:20: Error: A value of type 'Function' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t124 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:241:20: Error: A value of type 'Function' can't be assigned to a variable of type 'Tearoffable'.
  - 'Function' is from 'dart:core'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = functionArg;
                    ^" in functionArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t84 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:242:20: Error: A value of type 'Function?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t125 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:242:20: Error: A value of type 'Function?' can't be assigned to a variable of type 'Tearoffable'.
  - 'Function' is from 'dart:core'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = functionNullableArg;
                    ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:243:20: Error: A value of type 'void Function()' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t126 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:243:20: Error: A value of type 'void Function()' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = toVoidArg;
                    ^" in toVoidArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:244:20: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t127 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:244:20: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Tearoffable'.
  - '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'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = tearoffableNullableArg;
-  tearoffableVar = let final<BottomType> #t87 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:246:20: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Tearoffable'.
+                   ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = let final<BottomType> #t129 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:246:20: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = xNonNullArg;
                    ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t88 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:247:20: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t130 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:247:20: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = xNonNullNullableArg;
                    ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:248:20: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t131 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:248:20: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = xPotentiallyNullArg;
                    ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t90 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:249:20: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t132 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:249:20: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = xPotentiallyNullNullableArg;
                    ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t91 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:250:20: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t133 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:250:20: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = yNonNullArg;
                    ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t92 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:251:20: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t134 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:251:20: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = yNonNullNullableArg;
                    ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t93 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:252:20: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t135 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:252:20: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = yPotentiallyNullArg;
                    ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:253:20: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t136 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:253:20: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = yPotentiallyNullNullableArg;
                    ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  self::error::XnonNull xNonNullVar = objectArg as{TypeError,ForNonNullableByDefault} self::error::XnonNull;
-  xNonNullVar = objectNullableArg as{TypeError,ForNonNullableByDefault} self::error::XnonNull;
-  xNonNullVar = let final<BottomType> #t95 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:257:17: Error: A value of type 'num' can't be assigned to a variable of type 'XnonNull'.
+  self::error::XnonNull xNonNullVar = let final<BottomType> #t137 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:255:26: Error: A value of type 'Object' can't be assigned to a variable of type 'XnonNull'.
+ - 'Object' is from 'dart:core'.
+  XnonNull xNonNullVar = objectArg;
+                         ^" in objectArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  xNonNullVar = let final<BottomType> #t138 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:256:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'XnonNull'.
+ - 'Object' is from 'dart:core'.
+  xNonNullVar = objectNullableArg;
+                ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  xNonNullVar = let final<BottomType> #t139 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:257:17: Error: A value of type 'num' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = numArg;
                 ^" in numArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t96 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:258:17: Error: A value of type 'num?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t140 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:258:17: Error: A value of type 'num?' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = numNullableArg;
                 ^" in numNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t97 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:259:17: Error: A value of type 'int' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t141 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:259:17: Error: A value of type 'int' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = intArg;
                 ^" in intArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t98 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:260:17: Error: A value of type 'int?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t142 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:260:17: Error: A value of type 'int?' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = intNullableArg;
                 ^" in intNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t99 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:261:17: Error: A value of type 'double' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:261:17: Error: A value of type 'double' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = doubleArg;
                 ^" in doubleArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t100 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:262:17: Error: A value of type 'double?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t144 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:262:17: Error: A value of type 'double?' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = doubleNullableArg;
                 ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t101 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:263:17: Error: A value of type 'Function' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t145 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:263:17: Error: A value of type 'Function' can't be assigned to a variable of type 'XnonNull'.
  - 'Function' is from 'dart:core'.
   xNonNullVar = functionArg;
                 ^" in functionArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t102 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:264:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t146 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:264:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'XnonNull'.
  - 'Function' is from 'dart:core'.
   xNonNullVar = functionNullableArg;
                 ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t103 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:265:17: Error: A value of type 'void Function()' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t147 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:265:17: Error: A value of type 'void Function()' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = toVoidArg;
                 ^" in toVoidArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t104 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:266:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t148 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:266:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = toVoidNullableArg;
                 ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t105 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:267:17: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t149 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:267:17: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'XnonNull'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   xNonNullVar = tearoffableArg;
                 ^" in tearoffableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:268:17: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t150 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:268:17: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'XnonNull'.
  - '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 = xNonNullNullableArg;
-  xNonNullVar = let final<BottomType> #t107 = 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'.
+                ^" 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'.
   xNonNullVar = xPotentiallyNullArg;
                 ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t108 = 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 = 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 = yNonNullNullableArg;
-  xNonNullVar = let final<BottomType> #t109 = 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'.
+                ^" 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'.
   xNonNullVar = yPotentiallyNullArg;
                 ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t110 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:274:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t156 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:274:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = yPotentiallyNullNullableArg;
                 ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  self::error::XpotentiallyNull% xPotentiallyNullVar = objectArg as{TypeError,ForNonNullableByDefault} self::error::XpotentiallyNull%;
-  xPotentiallyNullVar = objectNullableArg as{TypeError,ForNonNullableByDefault} self::error::XpotentiallyNull%;
-  xPotentiallyNullVar = let final<BottomType> #t111 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:278:25: Error: A value of type 'num' can't be assigned to a variable of type 'XpotentiallyNull'.
+  self::error::XpotentiallyNull% xPotentiallyNullVar = let final<BottomType> #t157 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:276:42: Error: A value of type 'Object' can't be assigned to a variable of type 'XpotentiallyNull'.
+ - 'Object' is from 'dart:core'.
+  XpotentiallyNull xPotentiallyNullVar = objectArg;
+                                         ^" in objectArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  xPotentiallyNullVar = let final<BottomType> #t158 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:277:25: Error: A value of type 'Object?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ - 'Object' is from 'dart:core'.
+  xPotentiallyNullVar = objectNullableArg;
+                        ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  xPotentiallyNullVar = let final<BottomType> #t159 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:278:25: Error: A value of type 'num' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = numArg;
                         ^" in numArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t112 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:279:25: Error: A value of type 'num?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t160 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:279:25: Error: A value of type 'num?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = numNullableArg;
                         ^" in numNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t113 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:280:25: Error: A value of type 'int' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t161 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:280:25: Error: A value of type 'int' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = intArg;
                         ^" in intArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t114 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:281:25: Error: A value of type 'int?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t162 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:281:25: Error: A value of type 'int?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = intNullableArg;
                         ^" in intNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t115 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:282:25: Error: A value of type 'double' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t163 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:282:25: Error: A value of type 'double' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = doubleArg;
                         ^" in doubleArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t116 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:283:25: Error: A value of type 'double?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t164 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:283:25: Error: A value of type 'double?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = doubleNullableArg;
                         ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t117 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:284:25: Error: A value of type 'Function' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t165 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:284:25: Error: A value of type 'Function' can't be assigned to a variable of type 'XpotentiallyNull'.
  - 'Function' is from 'dart:core'.
   xPotentiallyNullVar = functionArg;
                         ^" in functionArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t118 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:285:25: Error: A value of type 'Function?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t166 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:285:25: Error: A value of type 'Function?' can't be assigned to a variable of type 'XpotentiallyNull'.
  - 'Function' is from 'dart:core'.
   xPotentiallyNullVar = functionNullableArg;
                         ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t119 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:286:25: Error: A value of type 'void Function()' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t167 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:286:25: Error: A value of type 'void Function()' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = toVoidArg;
                         ^" in toVoidArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t120 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:287:25: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t168 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:287:25: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = toVoidNullableArg;
                         ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t121 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:288:25: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t169 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:288:25: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'XpotentiallyNull'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   xPotentiallyNullVar = tearoffableArg;
                         ^" in tearoffableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t122 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:289:25: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t170 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:289:25: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'XpotentiallyNull'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   xPotentiallyNullVar = tearoffableNullableArg;
                         ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t123 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:290:25: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t171 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:290:25: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = xNonNullArg;
                         ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t124 = 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 = 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 = xPotentiallyNullNullableArg;
-  xPotentiallyNullVar = let final<BottomType> #t125 = 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'.
+                        ^" 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'.
   xPotentiallyNullVar = yNonNullArg;
                         ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t126 = 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 = 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 = yPotentiallyNullNullableArg;
-  self::error::YnonNull yNonNullVar = objectArg as{TypeError,ForNonNullableByDefault} self::error::YnonNull;
-  yNonNullVar = objectNullableArg as{TypeError,ForNonNullableByDefault} self::error::YnonNull;
-  yNonNullVar = let final<BottomType> #t127 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:299:17: Error: A value of type 'num' can't be assigned to a variable of type 'YnonNull'.
+                        ^" 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'.
+ - 'Object' is from 'dart:core'.
+  YnonNull yNonNullVar = objectArg;
+                         ^" in objectArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  yNonNullVar = let final<BottomType> #t178 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:298:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'YnonNull'.
+ - 'Object' is from 'dart:core'.
+  yNonNullVar = objectNullableArg;
+                ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  yNonNullVar = let final<BottomType> #t179 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:299:17: Error: A value of type 'num' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = numArg;
                 ^" in numArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:300:17: Error: A value of type 'num?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t180 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:300:17: Error: A value of type 'num?' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = numNullableArg;
                 ^" in numNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t129 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:301:17: Error: A value of type 'int' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t181 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:301:17: Error: A value of type 'int' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = intArg;
                 ^" in intArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t130 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:302:17: Error: A value of type 'int?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t182 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:302:17: Error: A value of type 'int?' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = intNullableArg;
                 ^" in intNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t131 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:303:17: Error: A value of type 'double' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t183 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:303:17: Error: A value of type 'double' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = doubleArg;
                 ^" in doubleArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t132 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:304:17: Error: A value of type 'double?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t184 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:304:17: Error: A value of type 'double?' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = doubleNullableArg;
                 ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t133 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:305:17: Error: A value of type 'Function' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t185 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:305:17: Error: A value of type 'Function' can't be assigned to a variable of type 'YnonNull'.
  - 'Function' is from 'dart:core'.
   yNonNullVar = functionArg;
                 ^" in functionArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t134 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:306:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t186 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:306:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'YnonNull'.
  - 'Function' is from 'dart:core'.
   yNonNullVar = functionNullableArg;
                 ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t135 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:307:17: Error: A value of type 'void Function()' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t187 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:307:17: Error: A value of type 'void Function()' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = toVoidArg;
                 ^" in toVoidArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t136 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:308:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t188 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:308:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = toVoidNullableArg;
                 ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t137 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:309:17: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t189 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:309:17: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'YnonNull'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   yNonNullVar = tearoffableArg;
                 ^" in tearoffableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t138 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:310:17: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t190 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:310:17: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'YnonNull'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   yNonNullVar = tearoffableNullableArg;
                 ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = xNonNullArg as{TypeError,ForNonNullableByDefault} self::error::YnonNull;
-  yNonNullVar = xNonNullNullableArg as{TypeError,ForNonNullableByDefault} self::error::YnonNull;
-  yNonNullVar = let final<BottomType> #t139 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:313:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t191 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:311:17: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = xNonNullArg;
+                ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  yNonNullVar = let final<BottomType> #t192 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:312:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = xNonNullNullableArg;
+                ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  yNonNullVar = let final<BottomType> #t193 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:313:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = xPotentiallyNullArg;
                 ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t140 = 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 = 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 = yNonNullNullableArg;
-  yNonNullVar = let final<BottomType> #t141 = 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'.
+                ^" 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'.
   yNonNullVar = yPotentiallyNullArg;
                 ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t142 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:317:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t197 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:317:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = yPotentiallyNullNullableArg;
                 ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  self::error::YpotentiallyNull% yPotentiallyNullVar = objectArg as{TypeError,ForNonNullableByDefault} self::error::YpotentiallyNull%;
-  yPotentiallyNullVar = objectNullableArg as{TypeError,ForNonNullableByDefault} self::error::YpotentiallyNull%;
-  yPotentiallyNullVar = let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:321:25: Error: A value of type 'num' can't be assigned to a variable of type 'YpotentiallyNull'.
+  self::error::YpotentiallyNull% yPotentiallyNullVar = let final<BottomType> #t198 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:319:42: Error: A value of type 'Object' can't be assigned to a variable of type 'YpotentiallyNull'.
+ - 'Object' is from 'dart:core'.
+  YpotentiallyNull yPotentiallyNullVar = objectArg;
+                                         ^" in objectArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  yPotentiallyNullVar = let final<BottomType> #t199 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:320:25: Error: A value of type 'Object?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ - 'Object' is from 'dart:core'.
+  yPotentiallyNullVar = objectNullableArg;
+                        ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  yPotentiallyNullVar = let final<BottomType> #t200 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:321:25: Error: A value of type 'num' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = numArg;
                         ^" in numArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t144 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:322:25: Error: A value of type 'num?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t201 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:322:25: Error: A value of type 'num?' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = numNullableArg;
                         ^" in numNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t145 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:323:25: Error: A value of type 'int' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t202 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:323:25: Error: A value of type 'int' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = intArg;
                         ^" in intArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t146 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:324:25: Error: A value of type 'int?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t203 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:324:25: Error: A value of type 'int?' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = intNullableArg;
                         ^" in intNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t147 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:325:25: Error: A value of type 'double' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t204 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:325:25: Error: A value of type 'double' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = doubleArg;
                         ^" in doubleArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t148 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:326:25: Error: A value of type 'double?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t205 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:326:25: Error: A value of type 'double?' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = doubleNullableArg;
                         ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t149 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:327:25: Error: A value of type 'Function' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t206 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:327:25: Error: A value of type 'Function' can't be assigned to a variable of type 'YpotentiallyNull'.
  - 'Function' is from 'dart:core'.
   yPotentiallyNullVar = functionArg;
                         ^" in functionArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t150 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:328:25: Error: A value of type 'Function?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t207 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:328:25: Error: A value of type 'Function?' can't be assigned to a variable of type 'YpotentiallyNull'.
  - 'Function' is from 'dart:core'.
   yPotentiallyNullVar = functionNullableArg;
                         ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:329:25: Error: A value of type 'void Function()' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t208 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:329:25: Error: A value of type 'void Function()' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = toVoidArg;
                         ^" in toVoidArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t152 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:330:25: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t209 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:330:25: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = toVoidNullableArg;
                         ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t153 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:331:25: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t210 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:331:25: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'YpotentiallyNull'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   yPotentiallyNullVar = tearoffableArg;
                         ^" in tearoffableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:332:25: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t211 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:332:25: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'YpotentiallyNull'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   yPotentiallyNullVar = tearoffableNullableArg;
                         ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t155 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:333:25: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t212 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:333:25: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = xNonNullArg;
                         ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t156 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:334:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t213 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:334:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = xNonNullNullableArg;
                         ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} self::error::YpotentiallyNull%;
-  yPotentiallyNullVar = xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} self::error::YpotentiallyNull%;
-  yPotentiallyNullVar = let final<BottomType> #t157 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:337:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t214 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:335:25: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = xPotentiallyNullArg;
+                        ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  yPotentiallyNullVar = let final<BottomType> #t215 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:336:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = xPotentiallyNullNullableArg;
+                        ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  yPotentiallyNullVar = let final<BottomType> #t216 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:337:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = yNonNullArg;
                         ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t158 = 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 = 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 = yPotentiallyNullNullableArg;
+                        ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
 }
 static method main() → dynamic {}
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 ddfc6a4..9c3d453 100644
--- a/pkg/front_end/testcases/nnbd/assignability.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/assignability.dart.weak.transformed.expect
@@ -2,94 +2,94 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:114:10: Warning: Assigning value of type 'Object?' 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'.
 //  - 'Object' is from 'dart:core'.
 //   Object objectVar = objectNullableArg;
-//          ^
+//                      ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:115:3: Warning: Assigning value of type 'num?' 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'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = numNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:116:3: Warning: Assigning value of type 'int?' 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'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = intNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:117:3: Warning: Assigning value of type 'double?' 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'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = doubleNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:118:3: Warning: Assigning value of type 'Function?' 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'.
 //  - 'Function' is from 'dart:core'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = functionNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:119:3: Warning: Assigning value of type 'void Function()?' 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'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = toVoidNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:120:3: Warning: Assigning value of type 'Tearoffable?' 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'.
 //  - '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:3: Warning: Assigning value of type 'XnonNull?' 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'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xNonNullNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:122:3: Warning: Assigning value of type 'XpotentiallyNull' 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'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xPotentiallyNullArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:123:3: Warning: Assigning value of type 'XpotentiallyNull?' 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'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = xPotentiallyNullNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:124:3: Warning: Assigning value of type 'YnonNull?' 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'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yNonNullNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:125:3: Warning: Assigning value of type 'YpotentiallyNull' 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'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yPotentiallyNullArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:126:3: Warning: Assigning value of type 'YpotentiallyNull?' 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'.
 //  - 'Object' is from 'dart:core'.
 //   objectVar = yPotentiallyNullNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:128:7: Warning: Assigning value of type 'Object' to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:128:16: Error: A value of type 'Object' can't be assigned to a variable of type 'num'.
 //  - 'Object' is from 'dart:core'.
 //   num numVar = objectArg;
-//       ^
+//                ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:129:3: Warning: Assigning value of type 'Object?' to a variable of type 'num'.
+// pkg/front_end/testcases/nnbd/assignability.dart:129:12: Error: A value of type 'Object?' can't be assigned to a variable of type 'num'.
 //  - 'Object' is from 'dart:core'.
 //   numVar = objectNullableArg;
-//   ^
+//            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:130:3: Warning: Assigning value of type 'num?' 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'.
 //   numVar = numNullableArg;
-//   ^
+//            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:131:3: Warning: Assigning value of type 'int?' 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'.
 //   numVar = intNullableArg;
-//   ^
+//            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:132:3: Warning: Assigning value of type 'double?' 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'.
 //   numVar = doubleNullableArg;
-//   ^
+//            ^
 //
 // 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'.
 //  - 'Function' is from 'dart:core'.
@@ -151,27 +151,27 @@
 //   numVar = yPotentiallyNullNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:148:7: Warning: Assigning value of type 'Object' to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:148:16: Error: A value of type 'Object' can't be assigned to a variable of type 'int'.
 //  - 'Object' is from 'dart:core'.
 //   int intVar = objectArg;
-//       ^
+//                ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:149:3: Warning: Assigning value of type 'Object?' to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:149:12: Error: A value of type 'Object?' can't be assigned to a variable of type 'int'.
 //  - 'Object' is from 'dart:core'.
 //   intVar = objectNullableArg;
-//   ^
+//            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:150:3: Warning: Assigning value of type 'num' to a variable of type 'int'.
+// pkg/front_end/testcases/nnbd/assignability.dart:150:12: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
 //   intVar = numArg;
-//   ^
+//            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:151:3: Warning: Assigning value of type 'num?' to a variable of type 'int'.
+// 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;
-//   ^
+//            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:152:3: Warning: Assigning value of type 'int?' 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'.
 //   intVar = intNullableArg;
-//   ^
+//            ^
 //
 // 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'.
 //   intVar = doubleArg;
@@ -241,23 +241,23 @@
 //   intVar = yPotentiallyNullNullableArg;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:170:10: Warning: Assigning value of type 'Object' to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:170:22: Error: A value of type 'Object' can't be assigned to a variable of type 'double'.
 //  - 'Object' is from 'dart:core'.
 //   double doubleVar = objectArg;
-//          ^
+//                      ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:171:3: Warning: Assigning value of type 'Object?' to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:171:15: Error: A value of type 'Object?' can't be assigned to a variable of type 'double'.
 //  - 'Object' is from 'dart:core'.
 //   doubleVar = objectNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:172:3: Warning: Assigning value of type 'num' to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:172:15: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
 //   doubleVar = numArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:173:3: Warning: Assigning value of type 'num?' to a variable of type 'double'.
+// pkg/front_end/testcases/nnbd/assignability.dart:173:15: Error: A value of type 'num?' can't be assigned to a variable of type 'double'.
 //   doubleVar = numNullableArg;
-//   ^
+//               ^
 //
 // pkg/front_end/testcases/nnbd/assignability.dart:174:15: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
 //   doubleVar = intArg;
@@ -267,9 +267,9 @@
 //   doubleVar = intNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:176:3: Warning: Assigning value of type 'double?' 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'.
 //   doubleVar = doubleNullableArg;
-//   ^
+//               ^
 //
 // 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'.
 //  - 'Function' is from 'dart:core'.
@@ -331,17 +331,17 @@
 //   doubleVar = yPotentiallyNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:192:12: Warning: Assigning value of type 'Object' to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:192:26: Error: A value of type 'Object' can't be assigned to a variable of type 'Function'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Function' is from 'dart:core'.
 //   Function functionVar = objectArg;
-//            ^
+//                          ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:193:3: Warning: Assigning value of type 'Object?' to a variable of type 'Function'.
+// pkg/front_end/testcases/nnbd/assignability.dart:193:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'Function'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Function' is from 'dart:core'.
 //   functionVar = objectNullableArg;
-//   ^
+//                 ^
 //
 // pkg/front_end/testcases/nnbd/assignability.dart:194:17: Error: A value of type 'num' can't be assigned to a variable of type 'Function'.
 //  - 'Function' is from 'dart:core'.
@@ -373,17 +373,17 @@
 //   functionVar = doubleNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:200:3: Warning: Assigning value of type 'Function?' 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'.
 //  - 'Function' is from 'dart:core'.
 //   functionVar = functionNullableArg;
-//   ^
+//                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:201:3: Warning: Assigning value of type 'void Function()?' 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'.
 //  - 'Function' is from 'dart:core'.
 //   functionVar = toVoidNullableArg;
-//   ^
+//                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:202:17: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/assignability.dart:202:17: Error: Can't tear off method 'call' from a potentially null value.
 //   functionVar = tearoffableNullableArg;
 //                 ^
 //
@@ -427,15 +427,15 @@
 //   functionVar = yPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:212:19: Warning: Assigning value of type 'Object' to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:212:31: Error: A value of type 'Object' can't be assigned to a variable of type 'void Function()'.
 //  - 'Object' is from 'dart:core'.
 //   void Function() toVoidVar = objectArg;
-//                   ^
+//                               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:213:3: Warning: Assigning value of type 'Object?' to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:213:15: Error: A value of type 'Object?' can't be assigned to a variable of type 'void Function()'.
 //  - 'Object' is from 'dart:core'.
 //   toVoidVar = objectNullableArg;
-//   ^
+//               ^
 //
 // pkg/front_end/testcases/nnbd/assignability.dart:214:15: Error: A value of type 'num' can't be assigned to a variable of type 'void Function()'.
 //   toVoidVar = numArg;
@@ -461,21 +461,21 @@
 //   toVoidVar = doubleNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:220:3: Warning: Assigning value of type 'Function' to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:220:15: Error: A value of type 'Function' can't be assigned to a variable of type 'void Function()'.
 //  - 'Function' is from 'dart:core'.
 //   toVoidVar = functionArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:221:3: Warning: Assigning value of type 'Function?' to a variable of type 'void Function()'.
+// pkg/front_end/testcases/nnbd/assignability.dart:221:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'void Function()'.
 //  - 'Function' is from 'dart:core'.
 //   toVoidVar = functionNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:222:3: Warning: Assigning value of type 'void Function()?' 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()'.
 //   toVoidVar = toVoidNullableArg;
-//   ^
+//               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:223:15: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/assignability.dart:223:15: Error: Can't tear off method 'call' from a potentially null value.
 //   toVoidVar = tearoffableNullableArg;
 //               ^
 //
@@ -511,17 +511,17 @@
 //   toVoidVar = yPotentiallyNullNullableArg;
 //               ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:233:15: Warning: Assigning value of type 'Object' to a variable of type 'Tearoffable'.
+// pkg/front_end/testcases/nnbd/assignability.dart:233:32: Error: A value of type 'Object' can't be assigned to a variable of type 'Tearoffable'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
 //   Tearoffable tearoffableVar = objectArg;
-//               ^
+//                                ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:234:3: Warning: Assigning value of type 'Object?' to a variable of type 'Tearoffable'.
+// pkg/front_end/testcases/nnbd/assignability.dart:234:20: Error: A value of type 'Object?' can't be assigned to a variable of type 'Tearoffable'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
 //   tearoffableVar = objectNullableArg;
-//   ^
+//                    ^
 //
 // pkg/front_end/testcases/nnbd/assignability.dart:235:20: Error: A value of type 'num' can't be assigned to a variable of type 'Tearoffable'.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
@@ -575,10 +575,10 @@
 //   tearoffableVar = toVoidNullableArg;
 //                    ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:245:3: Warning: Assigning value of type 'Tearoffable?' 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'.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
 //   tearoffableVar = tearoffableNullableArg;
-//   ^
+//                    ^
 //
 // pkg/front_end/testcases/nnbd/assignability.dart:246:20: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Tearoffable'.
 //  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
@@ -620,15 +620,15 @@
 //   tearoffableVar = yPotentiallyNullNullableArg;
 //                    ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:255:12: Warning: Assigning value of type 'Object' to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:255:26: Error: A value of type 'Object' can't be assigned to a variable of type 'XnonNull'.
 //  - 'Object' is from 'dart:core'.
 //   XnonNull xNonNullVar = objectArg;
-//            ^
+//                          ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:256:3: Warning: Assigning value of type 'Object?' to a variable of type 'XnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:256:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'XnonNull'.
 //  - 'Object' is from 'dart:core'.
 //   xNonNullVar = objectNullableArg;
-//   ^
+//                 ^
 //
 // pkg/front_end/testcases/nnbd/assignability.dart:257:17: Error: A value of type 'num' can't be assigned to a variable of type 'XnonNull'.
 //   xNonNullVar = numArg;
@@ -682,9 +682,9 @@
 //   xNonNullVar = tearoffableNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:269:3: Warning: Assigning value of type 'XnonNull?' 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'.
 //   xNonNullVar = xNonNullNullableArg;
-//   ^
+//                 ^
 //
 // 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'.
 //   xNonNullVar = xPotentiallyNullArg;
@@ -694,9 +694,9 @@
 //   xNonNullVar = xPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:272:3: Warning: Assigning value of type 'YnonNull?' 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'.
 //   xNonNullVar = yNonNullNullableArg;
-//   ^
+//                 ^
 //
 // 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'.
 //   xNonNullVar = yPotentiallyNullArg;
@@ -706,15 +706,15 @@
 //   xNonNullVar = yPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:276:20: Warning: Assigning value of type 'Object' to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:276:42: Error: A value of type 'Object' can't be assigned to a variable of type 'XpotentiallyNull'.
 //  - 'Object' is from 'dart:core'.
 //   XpotentiallyNull xPotentiallyNullVar = objectArg;
-//                    ^
+//                                          ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:277:3: Warning: Assigning value of type 'Object?' to a variable of type 'XpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:277:25: Error: A value of type 'Object?' can't be assigned to a variable of type 'XpotentiallyNull'.
 //  - 'Object' is from 'dart:core'.
 //   xPotentiallyNullVar = objectNullableArg;
-//   ^
+//                         ^
 //
 // pkg/front_end/testcases/nnbd/assignability.dart:278:25: Error: A value of type 'num' can't be assigned to a variable of type 'XpotentiallyNull'.
 //   xPotentiallyNullVar = numArg;
@@ -776,9 +776,9 @@
 //   xPotentiallyNullVar = xNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:292:3: Warning: Assigning value of type 'XpotentiallyNull?' 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'.
 //   xPotentiallyNullVar = xPotentiallyNullNullableArg;
-//   ^
+//                         ^
 //
 // 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'.
 //   xPotentiallyNullVar = yNonNullArg;
@@ -788,19 +788,19 @@
 //   xPotentiallyNullVar = yNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:295:3: Warning: Assigning value of type 'YpotentiallyNull?' 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'.
 //   xPotentiallyNullVar = yPotentiallyNullNullableArg;
-//   ^
+//                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:297:12: Warning: Assigning value of type 'Object' to a variable of type 'YnonNull'.
+// 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'.
 //  - 'Object' is from 'dart:core'.
 //   YnonNull yNonNullVar = objectArg;
-//            ^
+//                          ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:298:3: Warning: Assigning value of type 'Object?' to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:298:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'YnonNull'.
 //  - 'Object' is from 'dart:core'.
 //   yNonNullVar = objectNullableArg;
-//   ^
+//                 ^
 //
 // pkg/front_end/testcases/nnbd/assignability.dart:299:17: Error: A value of type 'num' can't be assigned to a variable of type 'YnonNull'.
 //   yNonNullVar = numArg;
@@ -854,13 +854,13 @@
 //   yNonNullVar = tearoffableNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:311:3: Warning: Assigning value of type 'XnonNull' to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:311:17: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'YnonNull'.
 //   yNonNullVar = xNonNullArg;
-//   ^
+//                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:312:3: Warning: Assigning value of type 'XnonNull?' to a variable of type 'YnonNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:312:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'YnonNull'.
 //   yNonNullVar = xNonNullNullableArg;
-//   ^
+//                 ^
 //
 // pkg/front_end/testcases/nnbd/assignability.dart:313:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
 //   yNonNullVar = xPotentiallyNullArg;
@@ -870,9 +870,9 @@
 //   yNonNullVar = xPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:315:3: Warning: Assigning value of type 'YnonNull?' 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'.
 //   yNonNullVar = yNonNullNullableArg;
-//   ^
+//                 ^
 //
 // 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'.
 //   yNonNullVar = yPotentiallyNullArg;
@@ -882,15 +882,15 @@
 //   yNonNullVar = yPotentiallyNullNullableArg;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:319:20: Warning: Assigning value of type 'Object' to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:319:42: Error: A value of type 'Object' can't be assigned to a variable of type 'YpotentiallyNull'.
 //  - 'Object' is from 'dart:core'.
 //   YpotentiallyNull yPotentiallyNullVar = objectArg;
-//                    ^
+//                                          ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:320:3: Warning: Assigning value of type 'Object?' to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:320:25: Error: A value of type 'Object?' can't be assigned to a variable of type 'YpotentiallyNull'.
 //  - 'Object' is from 'dart:core'.
 //   yPotentiallyNullVar = objectNullableArg;
-//   ^
+//                         ^
 //
 // pkg/front_end/testcases/nnbd/assignability.dart:321:25: Error: A value of type 'num' can't be assigned to a variable of type 'YpotentiallyNull'.
 //   yPotentiallyNullVar = numArg;
@@ -952,13 +952,13 @@
 //   yPotentiallyNullVar = xNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:335:3: Warning: Assigning value of type 'XpotentiallyNull' to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:335:25: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YpotentiallyNull'.
 //   yPotentiallyNullVar = xPotentiallyNullArg;
-//   ^
+//                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:336:3: Warning: Assigning value of type 'XpotentiallyNull?' to a variable of type 'YpotentiallyNull'.
+// pkg/front_end/testcases/nnbd/assignability.dart:336:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
 //   yPotentiallyNullVar = xPotentiallyNullNullableArg;
-//   ^
+//                         ^
 //
 // pkg/front_end/testcases/nnbd/assignability.dart:337:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
 //   yPotentiallyNullVar = yNonNullArg;
@@ -968,9 +968,9 @@
 //   yPotentiallyNullVar = yNonNullNullableArg;
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/assignability.dart:339:3: Warning: Assigning value of type 'YpotentiallyNull?' 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'.
 //   yPotentiallyNullVar = yPotentiallyNullNullableArg;
-//   ^
+//                         ^
 //
 import self as self;
 import "dart:core" as core;
@@ -994,7 +994,7 @@
   dynamicVar = xPotentiallyNullArg;
   dynamicVar = yNonNullArg;
   dynamicVar = yPotentiallyNullArg;
-  core::Object objectVar = dynamicArg;
+  core::Object objectVar = dynamicArg as{TypeError,ForDynamic,ForNonNullableByDefault} core::Object;
   objectVar = objectArg;
   objectVar = numArg;
   objectVar = intArg;
@@ -1032,595 +1032,759 @@
   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 = objectNullableArg;
+  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'.
+ - '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'.
+ - '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'.
+ - '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'.
+ - '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'.
+ - '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'.
+ - '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'.
+ - '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'.
+ - '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'.
+ - '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'.
+ - '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'.
+ - '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'.
+ - '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'.
+ - 'Object' is from 'dart:core'.
   objectVar = yPotentiallyNullNullableArg;
-  core::num numVar = objectArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = objectNullableArg as{TypeError,ForNonNullableByDefault} core::num;
+              ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Object;
+  core::num numVar = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:128:16: Error: A value of type 'Object' can't be assigned to a variable of type 'num'.
+ - 'Object' is from 'dart:core'.
+  num numVar = objectArg;
+               ^" in objectArg as{TypeError,ForNonNullableByDefault} core::num;
+  numVar = let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:129:12: Error: A value of type 'Object?' can't be assigned to a variable of type 'num'.
+ - '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 = 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 = 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 = doubleNullableArg;
-  numVar = let final<BottomType> #t3 = 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'.
+           ^" 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'.
  - 'Function' is from 'dart:core'.
   numVar = functionArg;
            ^" in functionArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:134:12: Error: A value of type 'Function?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:134:12: Error: A value of type 'Function?' can't be assigned to a variable of type 'num'.
  - 'Function' is from 'dart:core'.
   numVar = functionNullableArg;
            ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:135:12: Error: A value of type 'void Function()' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:135:12: Error: A value of type 'void Function()' can't be assigned to a variable of type 'num'.
   numVar = toVoidArg;
            ^" in toVoidArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:136:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:136:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'num'.
   numVar = toVoidNullableArg;
            ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:137:12: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:137:12: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'num'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   numVar = tearoffableArg;
            ^" in tearoffableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:138:12: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:138:12: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'num'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   numVar = tearoffableNullableArg;
            ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:139:12: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:139:12: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'num'.
   numVar = xNonNullArg;
            ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:140:12: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:140:12: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'num'.
   numVar = xNonNullNullableArg;
            ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:141:12: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t29 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:141:12: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'num'.
   numVar = xPotentiallyNullArg;
            ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:142:12: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t30 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:142:12: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'num'.
   numVar = xPotentiallyNullNullableArg;
            ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:143:12: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t31 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:143:12: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'num'.
   numVar = yNonNullArg;
            ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:144:12: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:144:12: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'num'.
   numVar = yNonNullNullableArg;
            ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:145:12: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:145:12: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'num'.
   numVar = yPotentiallyNullArg;
            ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::num;
-  numVar = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:146:12: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'num'.
+  numVar = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:146:12: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'num'.
   numVar = yPotentiallyNullNullableArg;
            ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::num;
-  core::int intVar = objectArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = objectNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = numArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = numNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+  core::int intVar = let final<BottomType> #t35 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:148:16: Error: A value of type 'Object' can't be assigned to a variable of type 'int'.
+ - 'Object' is from 'dart:core'.
+  int intVar = objectArg;
+               ^" in objectArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:149:12: Error: A value of type 'Object?' can't be assigned to a variable of type 'int'.
+ - 'Object' is from 'dart:core'.
+  intVar = objectNullableArg;
+           ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::int;
+  intVar = let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:150:12: Error: A value of type 'num' can't be assigned to a variable of type 'int'.
+  intVar = numArg;
+           ^" in numArg as{TypeError,ForNonNullableByDefault} core::int;
+  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 = intNullableArg;
-  intVar = let final<BottomType> #t17 = 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'.
+           ^" 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'.
   intVar = doubleArg;
            ^" in doubleArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:154:12: Error: A value of type 'double?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:154:12: Error: A value of type 'double?' can't be assigned to a variable of type 'int'.
   intVar = doubleNullableArg;
            ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:155:12: Error: A value of type 'Function' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:155:12: Error: A value of type 'Function' can't be assigned to a variable of type 'int'.
  - 'Function' is from 'dart:core'.
   intVar = functionArg;
            ^" in functionArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:156:12: Error: A value of type 'Function?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:156:12: Error: A value of type 'Function?' can't be assigned to a variable of type 'int'.
  - 'Function' is from 'dart:core'.
   intVar = functionNullableArg;
            ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:157:12: Error: A value of type 'void Function()' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:157:12: Error: A value of type 'void Function()' can't be assigned to a variable of type 'int'.
   intVar = toVoidArg;
            ^" in toVoidArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:158:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:158:12: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'int'.
   intVar = toVoidNullableArg;
            ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:159:12: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:159:12: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'int'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   intVar = tearoffableArg;
            ^" in tearoffableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:160:12: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:160:12: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'int'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   intVar = tearoffableNullableArg;
            ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:161:12: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t48 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:161:12: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'int'.
   intVar = xNonNullArg;
            ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t26 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:162:12: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:162:12: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'int'.
   intVar = xNonNullNullableArg;
            ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:163:12: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:163:12: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'int'.
   intVar = xPotentiallyNullArg;
            ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t28 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:164:12: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t51 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:164:12: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'int'.
   intVar = xPotentiallyNullNullableArg;
            ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t29 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:165:12: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t52 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:165:12: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'int'.
   intVar = yNonNullArg;
            ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t30 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:166:12: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t53 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:166:12: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'int'.
   intVar = yNonNullNullableArg;
            ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t31 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:167:12: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:167:12: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'int'.
   intVar = yPotentiallyNullArg;
            ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::int;
-  intVar = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:168:12: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'int'.
+  intVar = let final<BottomType> #t55 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:168:12: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'int'.
   intVar = yPotentiallyNullNullableArg;
            ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::int;
-  core::double doubleVar = objectArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = objectNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = numArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = numNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:174:15: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+  core::double doubleVar = let final<BottomType> #t56 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:170:22: Error: A value of type 'Object' can't be assigned to a variable of type 'double'.
+ - 'Object' is from 'dart:core'.
+  double doubleVar = objectArg;
+                     ^" in objectArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:171:15: Error: A value of type 'Object?' can't be assigned to a variable of type 'double'.
+ - 'Object' is from 'dart:core'.
+  doubleVar = objectNullableArg;
+              ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = let final<BottomType> #t58 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:172:15: Error: A value of type 'num' can't be assigned to a variable of type 'double'.
+  doubleVar = numArg;
+              ^" in numArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = let final<BottomType> #t59 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:173:15: Error: A value of type 'num?' can't be assigned to a variable of type 'double'.
+  doubleVar = numNullableArg;
+              ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::double;
+  doubleVar = let final<BottomType> #t60 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:174:15: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
   doubleVar = intArg;
               ^" in intArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t34 = 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 = 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 = doubleNullableArg;
-  doubleVar = let final<BottomType> #t35 = 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'.
+              ^" 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'.
  - 'Function' is from 'dart:core'.
   doubleVar = functionArg;
               ^" in functionArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t36 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:178:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t64 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:178:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'double'.
  - 'Function' is from 'dart:core'.
   doubleVar = functionNullableArg;
               ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t37 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:179:15: Error: A value of type 'void Function()' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t65 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:179:15: Error: A value of type 'void Function()' can't be assigned to a variable of type 'double'.
   doubleVar = toVoidArg;
               ^" in toVoidArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t38 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:180:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t66 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:180:15: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'double'.
   doubleVar = toVoidNullableArg;
               ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t39 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:181:15: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t67 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:181:15: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'double'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   doubleVar = tearoffableArg;
               ^" in tearoffableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t40 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:182:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t68 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:182:15: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'double'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   doubleVar = tearoffableNullableArg;
               ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:183:15: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t69 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:183:15: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'double'.
   doubleVar = xNonNullArg;
               ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:184:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t70 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:184:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'double'.
   doubleVar = xNonNullNullableArg;
               ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:185:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t71 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:185:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'double'.
   doubleVar = xPotentiallyNullArg;
               ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:186:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t72 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:186:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'double'.
   doubleVar = xPotentiallyNullNullableArg;
               ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t45 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:187:15: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t73 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:187:15: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'double'.
   doubleVar = yNonNullArg;
               ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t46 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:188:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t74 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:188:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'double'.
   doubleVar = yNonNullNullableArg;
               ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:189:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t75 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:189:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'double'.
   doubleVar = yPotentiallyNullArg;
               ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::double;
-  doubleVar = let final<BottomType> #t48 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:190:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'double'.
+  doubleVar = let final<BottomType> #t76 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:190:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'double'.
   doubleVar = yPotentiallyNullNullableArg;
               ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::double;
-  core::Function functionVar = objectArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = objectNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t49 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:194:17: Error: A value of type 'num' can't be assigned to a variable of type 'Function'.
+  core::Function functionVar = let final<BottomType> #t77 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:192:26: Error: A value of type 'Object' can't be assigned to a variable of type 'Function'.
+ - 'Object' is from 'dart:core'.
+ - 'Function' is from 'dart:core'.
+  Function functionVar = objectArg;
+                         ^" in objectArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = let final<BottomType> #t78 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:193:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'Function'.
+ - 'Object' is from 'dart:core'.
+ - 'Function' is from 'dart:core'.
+  functionVar = objectNullableArg;
+                ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:194:17: Error: A value of type 'num' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = numArg;
                 ^" in numArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:195:17: Error: A value of type 'num?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t80 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:195:17: Error: A value of type 'num?' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = numNullableArg;
                 ^" in numNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t51 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:196:17: Error: A value of type 'int' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t81 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:196:17: Error: A value of type 'int' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = intArg;
                 ^" in intArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t52 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:197:17: Error: A value of type 'int?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t82 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:197:17: Error: A value of type 'int?' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = intNullableArg;
                 ^" in intNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t53 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:198:17: Error: A value of type 'double' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t83 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:198:17: Error: A value of type 'double' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = doubleArg;
                 ^" in doubleArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:199:17: Error: A value of type 'double?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t84 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:199:17: Error: A value of type 'double?' can't be assigned to a variable of type 'Function'.
  - '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'.
+ - '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'.
+ - 'Function' is from 'dart:core'.
   functionVar = toVoidNullableArg;
-  functionVar = tearoffableNullableArg as{TypeError} core::Function;
-  functionVar = let final<BottomType> #t55 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:203:17: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Function'.
+                ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
+  functionVar = let final<BottomType> #t87 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:202:17: Error: Can't tear off method 'call' from a potentially null value.
+  functionVar = tearoffableNullableArg;
+                ^" in tearoffableNullableArg as{TypeError} core::Function;
+  functionVar = let final<BottomType> #t88 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:203:17: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = xNonNullArg;
                 ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t56 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:204:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:204:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = xNonNullNullableArg;
                 ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:205:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t90 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:205:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = xPotentiallyNullArg;
                 ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t58 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:206:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t91 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:206:17: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = xPotentiallyNullNullableArg;
                 ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t59 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:207:17: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t92 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:207:17: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = yNonNullArg;
                 ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t60 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:208:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t93 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:208:17: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = yNonNullNullableArg;
                 ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t61 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:209:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:209:17: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = yPotentiallyNullArg;
                 ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} core::Function;
-  functionVar = let final<BottomType> #t62 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:210:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Function'.
+  functionVar = let final<BottomType> #t95 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:210:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Function'.
  - 'Function' is from 'dart:core'.
   functionVar = yPotentiallyNullNullableArg;
                 ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} core::Function;
-  () → void toVoidVar = objectArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = objectNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t63 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:214:15: Error: A value of type 'num' can't be assigned to a variable of type 'void Function()'.
+  () → void toVoidVar = let final<BottomType> #t96 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:212:31: Error: A value of type 'Object' can't be assigned to a variable of type 'void Function()'.
+ - 'Object' is from 'dart:core'.
+  void Function() toVoidVar = objectArg;
+                              ^" in objectArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = let final<BottomType> #t97 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:213:15: Error: A value of type 'Object?' can't be assigned to a variable of type 'void Function()'.
+ - 'Object' is from 'dart:core'.
+  toVoidVar = objectNullableArg;
+              ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = let final<BottomType> #t98 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:214:15: Error: A value of type 'num' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = numArg;
               ^" in numArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t64 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:215:15: Error: A value of type 'num?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t99 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:215:15: Error: A value of type 'num?' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = numNullableArg;
               ^" in numNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t65 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:216:15: Error: A value of type 'int' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t100 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:216:15: Error: A value of type 'int' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = intArg;
               ^" in intArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t66 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:217:15: Error: A value of type 'int?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t101 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:217:15: Error: A value of type 'int?' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = intNullableArg;
               ^" in intNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t67 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:218:15: Error: A value of type 'double' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t102 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:218:15: Error: A value of type 'double' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = doubleArg;
               ^" in doubleArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t68 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:219:15: Error: A value of type 'double?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t103 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:219:15: Error: A value of type 'double?' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = doubleNullableArg;
               ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = functionArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = functionNullableArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = let final<BottomType> #t104 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:220:15: Error: A value of type 'Function' can't be assigned to a variable of type 'void Function()'.
+ - 'Function' is from 'dart:core'.
+  toVoidVar = functionArg;
+              ^" in functionArg as{TypeError,ForNonNullableByDefault} () → void;
+  toVoidVar = let final<BottomType> #t105 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:221:15: Error: A value of type 'Function?' can't be assigned to a variable of type 'void Function()'.
+ - '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 = toVoidNullableArg;
-  toVoidVar = tearoffableNullableArg as{TypeError} () → void;
-  toVoidVar = let final<BottomType> #t69 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:224:15: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'void Function()'.
+              ^" 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.
+  toVoidVar = tearoffableNullableArg;
+              ^" in tearoffableNullableArg as{TypeError} () → void;
+  toVoidVar = let final<BottomType> #t108 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:224:15: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = xNonNullArg;
               ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t70 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:225:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t109 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:225:15: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = xNonNullNullableArg;
               ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t71 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:226:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t110 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:226:15: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = xPotentiallyNullArg;
               ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t72 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:227:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t111 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:227:15: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = xPotentiallyNullNullableArg;
               ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t73 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:228:15: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t112 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:228:15: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = yNonNullArg;
               ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t74 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:229:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t113 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:229:15: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = yNonNullNullableArg;
               ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t75 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:230:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t114 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:230:15: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = yPotentiallyNullArg;
               ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} () → void;
-  toVoidVar = let final<BottomType> #t76 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:231:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'void Function()'.
+  toVoidVar = let final<BottomType> #t115 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:231:15: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'void Function()'.
   toVoidVar = yPotentiallyNullNullableArg;
               ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} () → void;
-  self::Tearoffable tearoffableVar = objectArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = objectNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t77 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:235:20: Error: A value of type 'num' can't be assigned to a variable of type 'Tearoffable'.
+  self::Tearoffable tearoffableVar = let final<BottomType> #t116 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:233:32: Error: A value of type 'Object' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Object' is from 'dart:core'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  Tearoffable tearoffableVar = objectArg;
+                               ^" in objectArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = let final<BottomType> #t117 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:234:20: Error: A value of type 'Object?' can't be assigned to a variable of type 'Tearoffable'.
+ - 'Object' is from 'dart:core'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
+  tearoffableVar = objectNullableArg;
+                   ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = let final<BottomType> #t118 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:235:20: Error: A value of type 'num' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = numArg;
                    ^" in numArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t78 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:236:20: Error: A value of type 'num?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t119 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:236:20: Error: A value of type 'num?' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = numNullableArg;
                    ^" in numNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:237:20: Error: A value of type 'int' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t120 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:237:20: Error: A value of type 'int' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = intArg;
                    ^" in intArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t80 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:238:20: Error: A value of type 'int?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t121 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:238:20: Error: A value of type 'int?' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = intNullableArg;
                    ^" in intNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t81 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:239:20: Error: A value of type 'double' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t122 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:239:20: Error: A value of type 'double' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = doubleArg;
                    ^" in doubleArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t82 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:240:20: Error: A value of type 'double?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t123 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:240:20: Error: A value of type 'double?' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = doubleNullableArg;
                    ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t83 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:241:20: Error: A value of type 'Function' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t124 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:241:20: Error: A value of type 'Function' can't be assigned to a variable of type 'Tearoffable'.
  - 'Function' is from 'dart:core'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = functionArg;
                    ^" in functionArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t84 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:242:20: Error: A value of type 'Function?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t125 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:242:20: Error: A value of type 'Function?' can't be assigned to a variable of type 'Tearoffable'.
  - 'Function' is from 'dart:core'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = functionNullableArg;
                    ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t85 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:243:20: Error: A value of type 'void Function()' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t126 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:243:20: Error: A value of type 'void Function()' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = toVoidArg;
                    ^" in toVoidArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:244:20: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t127 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:244:20: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'Tearoffable'.
  - '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'.
+ - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = tearoffableNullableArg;
-  tearoffableVar = let final<BottomType> #t87 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:246:20: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Tearoffable'.
+                   ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
+  tearoffableVar = let final<BottomType> #t129 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:246:20: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = xNonNullArg;
                    ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t88 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:247:20: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t130 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:247:20: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = xNonNullNullableArg;
                    ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:248:20: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t131 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:248:20: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = xPotentiallyNullArg;
                    ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t90 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:249:20: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t132 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:249:20: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = xPotentiallyNullNullableArg;
                    ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t91 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:250:20: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t133 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:250:20: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = yNonNullArg;
                    ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t92 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:251:20: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t134 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:251:20: Error: A value of type 'YnonNull?' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = yNonNullNullableArg;
                    ^" in yNonNullNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t93 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:252:20: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t135 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:252:20: Error: A value of type 'YpotentiallyNull' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = yPotentiallyNullArg;
                    ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  tearoffableVar = let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:253:20: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Tearoffable'.
+  tearoffableVar = let final<BottomType> #t136 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:253:20: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'Tearoffable'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   tearoffableVar = yPotentiallyNullNullableArg;
                    ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} self::Tearoffable;
-  self::error::XnonNull xNonNullVar = objectArg as{TypeError,ForNonNullableByDefault} self::error::XnonNull;
-  xNonNullVar = objectNullableArg as{TypeError,ForNonNullableByDefault} self::error::XnonNull;
-  xNonNullVar = let final<BottomType> #t95 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:257:17: Error: A value of type 'num' can't be assigned to a variable of type 'XnonNull'.
+  self::error::XnonNull xNonNullVar = let final<BottomType> #t137 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:255:26: Error: A value of type 'Object' can't be assigned to a variable of type 'XnonNull'.
+ - 'Object' is from 'dart:core'.
+  XnonNull xNonNullVar = objectArg;
+                         ^" in objectArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  xNonNullVar = let final<BottomType> #t138 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:256:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'XnonNull'.
+ - 'Object' is from 'dart:core'.
+  xNonNullVar = objectNullableArg;
+                ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  xNonNullVar = let final<BottomType> #t139 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:257:17: Error: A value of type 'num' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = numArg;
                 ^" in numArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t96 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:258:17: Error: A value of type 'num?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t140 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:258:17: Error: A value of type 'num?' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = numNullableArg;
                 ^" in numNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t97 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:259:17: Error: A value of type 'int' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t141 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:259:17: Error: A value of type 'int' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = intArg;
                 ^" in intArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t98 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:260:17: Error: A value of type 'int?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t142 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:260:17: Error: A value of type 'int?' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = intNullableArg;
                 ^" in intNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t99 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:261:17: Error: A value of type 'double' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:261:17: Error: A value of type 'double' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = doubleArg;
                 ^" in doubleArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t100 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:262:17: Error: A value of type 'double?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t144 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:262:17: Error: A value of type 'double?' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = doubleNullableArg;
                 ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t101 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:263:17: Error: A value of type 'Function' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t145 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:263:17: Error: A value of type 'Function' can't be assigned to a variable of type 'XnonNull'.
  - 'Function' is from 'dart:core'.
   xNonNullVar = functionArg;
                 ^" in functionArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t102 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:264:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t146 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:264:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'XnonNull'.
  - 'Function' is from 'dart:core'.
   xNonNullVar = functionNullableArg;
                 ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t103 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:265:17: Error: A value of type 'void Function()' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t147 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:265:17: Error: A value of type 'void Function()' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = toVoidArg;
                 ^" in toVoidArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t104 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:266:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t148 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:266:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = toVoidNullableArg;
                 ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t105 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:267:17: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t149 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:267:17: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'XnonNull'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   xNonNullVar = tearoffableArg;
                 ^" in tearoffableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t106 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:268:17: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t150 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:268:17: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'XnonNull'.
  - '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 = xNonNullNullableArg;
-  xNonNullVar = let final<BottomType> #t107 = 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'.
+                ^" 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'.
   xNonNullVar = xPotentiallyNullArg;
                 ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t108 = 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 = 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 = yNonNullNullableArg;
-  xNonNullVar = let final<BottomType> #t109 = 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'.
+                ^" 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'.
   xNonNullVar = yPotentiallyNullArg;
                 ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xNonNullVar = let final<BottomType> #t110 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:274:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
+  xNonNullVar = let final<BottomType> #t156 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:274:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'XnonNull'.
   xNonNullVar = yPotentiallyNullNullableArg;
                 ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  self::error::XpotentiallyNull% xPotentiallyNullVar = objectArg as{TypeError,ForNonNullableByDefault} self::error::XpotentiallyNull%;
-  xPotentiallyNullVar = objectNullableArg as{TypeError,ForNonNullableByDefault} self::error::XpotentiallyNull%;
-  xPotentiallyNullVar = let final<BottomType> #t111 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:278:25: Error: A value of type 'num' can't be assigned to a variable of type 'XpotentiallyNull'.
+  self::error::XpotentiallyNull% xPotentiallyNullVar = let final<BottomType> #t157 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:276:42: Error: A value of type 'Object' can't be assigned to a variable of type 'XpotentiallyNull'.
+ - 'Object' is from 'dart:core'.
+  XpotentiallyNull xPotentiallyNullVar = objectArg;
+                                         ^" in objectArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  xPotentiallyNullVar = let final<BottomType> #t158 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:277:25: Error: A value of type 'Object?' can't be assigned to a variable of type 'XpotentiallyNull'.
+ - 'Object' is from 'dart:core'.
+  xPotentiallyNullVar = objectNullableArg;
+                        ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  xPotentiallyNullVar = let final<BottomType> #t159 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:278:25: Error: A value of type 'num' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = numArg;
                         ^" in numArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t112 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:279:25: Error: A value of type 'num?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t160 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:279:25: Error: A value of type 'num?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = numNullableArg;
                         ^" in numNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t113 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:280:25: Error: A value of type 'int' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t161 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:280:25: Error: A value of type 'int' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = intArg;
                         ^" in intArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t114 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:281:25: Error: A value of type 'int?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t162 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:281:25: Error: A value of type 'int?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = intNullableArg;
                         ^" in intNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t115 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:282:25: Error: A value of type 'double' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t163 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:282:25: Error: A value of type 'double' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = doubleArg;
                         ^" in doubleArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t116 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:283:25: Error: A value of type 'double?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t164 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:283:25: Error: A value of type 'double?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = doubleNullableArg;
                         ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t117 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:284:25: Error: A value of type 'Function' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t165 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:284:25: Error: A value of type 'Function' can't be assigned to a variable of type 'XpotentiallyNull'.
  - 'Function' is from 'dart:core'.
   xPotentiallyNullVar = functionArg;
                         ^" in functionArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t118 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:285:25: Error: A value of type 'Function?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t166 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:285:25: Error: A value of type 'Function?' can't be assigned to a variable of type 'XpotentiallyNull'.
  - 'Function' is from 'dart:core'.
   xPotentiallyNullVar = functionNullableArg;
                         ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t119 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:286:25: Error: A value of type 'void Function()' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t167 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:286:25: Error: A value of type 'void Function()' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = toVoidArg;
                         ^" in toVoidArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t120 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:287:25: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t168 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:287:25: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = toVoidNullableArg;
                         ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t121 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:288:25: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t169 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:288:25: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'XpotentiallyNull'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   xPotentiallyNullVar = tearoffableArg;
                         ^" in tearoffableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t122 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:289:25: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t170 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:289:25: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'XpotentiallyNull'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   xPotentiallyNullVar = tearoffableNullableArg;
                         ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t123 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:290:25: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
+  xPotentiallyNullVar = let final<BottomType> #t171 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:290:25: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'XpotentiallyNull'.
   xPotentiallyNullVar = xNonNullArg;
                         ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t124 = 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 = 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 = xPotentiallyNullNullableArg;
-  xPotentiallyNullVar = let final<BottomType> #t125 = 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'.
+                        ^" 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'.
   xPotentiallyNullVar = yNonNullArg;
                         ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  xPotentiallyNullVar = let final<BottomType> #t126 = 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 = 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 = yPotentiallyNullNullableArg;
-  self::error::YnonNull yNonNullVar = objectArg as{TypeError,ForNonNullableByDefault} self::error::YnonNull;
-  yNonNullVar = objectNullableArg as{TypeError,ForNonNullableByDefault} self::error::YnonNull;
-  yNonNullVar = let final<BottomType> #t127 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:299:17: Error: A value of type 'num' can't be assigned to a variable of type 'YnonNull'.
+                        ^" 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'.
+ - 'Object' is from 'dart:core'.
+  YnonNull yNonNullVar = objectArg;
+                         ^" in objectArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  yNonNullVar = let final<BottomType> #t178 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:298:17: Error: A value of type 'Object?' can't be assigned to a variable of type 'YnonNull'.
+ - 'Object' is from 'dart:core'.
+  yNonNullVar = objectNullableArg;
+                ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  yNonNullVar = let final<BottomType> #t179 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:299:17: Error: A value of type 'num' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = numArg;
                 ^" in numArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t128 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:300:17: Error: A value of type 'num?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t180 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:300:17: Error: A value of type 'num?' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = numNullableArg;
                 ^" in numNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t129 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:301:17: Error: A value of type 'int' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t181 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:301:17: Error: A value of type 'int' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = intArg;
                 ^" in intArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t130 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:302:17: Error: A value of type 'int?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t182 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:302:17: Error: A value of type 'int?' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = intNullableArg;
                 ^" in intNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t131 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:303:17: Error: A value of type 'double' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t183 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:303:17: Error: A value of type 'double' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = doubleArg;
                 ^" in doubleArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t132 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:304:17: Error: A value of type 'double?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t184 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:304:17: Error: A value of type 'double?' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = doubleNullableArg;
                 ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t133 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:305:17: Error: A value of type 'Function' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t185 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:305:17: Error: A value of type 'Function' can't be assigned to a variable of type 'YnonNull'.
  - 'Function' is from 'dart:core'.
   yNonNullVar = functionArg;
                 ^" in functionArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t134 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:306:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t186 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:306:17: Error: A value of type 'Function?' can't be assigned to a variable of type 'YnonNull'.
  - 'Function' is from 'dart:core'.
   yNonNullVar = functionNullableArg;
                 ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t135 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:307:17: Error: A value of type 'void Function()' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t187 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:307:17: Error: A value of type 'void Function()' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = toVoidArg;
                 ^" in toVoidArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t136 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:308:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t188 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:308:17: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = toVoidNullableArg;
                 ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t137 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:309:17: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t189 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:309:17: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'YnonNull'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   yNonNullVar = tearoffableArg;
                 ^" in tearoffableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t138 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:310:17: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t190 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:310:17: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'YnonNull'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   yNonNullVar = tearoffableNullableArg;
                 ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = xNonNullArg as{TypeError,ForNonNullableByDefault} self::error::YnonNull;
-  yNonNullVar = xNonNullNullableArg as{TypeError,ForNonNullableByDefault} self::error::YnonNull;
-  yNonNullVar = let final<BottomType> #t139 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:313:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t191 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:311:17: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = xNonNullArg;
+                ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  yNonNullVar = let final<BottomType> #t192 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:312:17: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = xNonNullNullableArg;
+                ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  yNonNullVar = let final<BottomType> #t193 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:313:17: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = xPotentiallyNullArg;
                 ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t140 = 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 = 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 = yNonNullNullableArg;
-  yNonNullVar = let final<BottomType> #t141 = 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'.
+                ^" 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'.
   yNonNullVar = yPotentiallyNullArg;
                 ^" in yPotentiallyNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yNonNullVar = let final<BottomType> #t142 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:317:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
+  yNonNullVar = let final<BottomType> #t197 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:317:17: Error: A value of type 'YpotentiallyNull?' can't be assigned to a variable of type 'YnonNull'.
   yNonNullVar = yPotentiallyNullNullableArg;
                 ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  self::error::YpotentiallyNull% yPotentiallyNullVar = objectArg as{TypeError,ForNonNullableByDefault} self::error::YpotentiallyNull%;
-  yPotentiallyNullVar = objectNullableArg as{TypeError,ForNonNullableByDefault} self::error::YpotentiallyNull%;
-  yPotentiallyNullVar = let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:321:25: Error: A value of type 'num' can't be assigned to a variable of type 'YpotentiallyNull'.
+  self::error::YpotentiallyNull% yPotentiallyNullVar = let final<BottomType> #t198 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:319:42: Error: A value of type 'Object' can't be assigned to a variable of type 'YpotentiallyNull'.
+ - 'Object' is from 'dart:core'.
+  YpotentiallyNull yPotentiallyNullVar = objectArg;
+                                         ^" in objectArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  yPotentiallyNullVar = let final<BottomType> #t199 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:320:25: Error: A value of type 'Object?' can't be assigned to a variable of type 'YpotentiallyNull'.
+ - 'Object' is from 'dart:core'.
+  yPotentiallyNullVar = objectNullableArg;
+                        ^" in objectNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  yPotentiallyNullVar = let final<BottomType> #t200 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:321:25: Error: A value of type 'num' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = numArg;
                         ^" in numArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t144 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:322:25: Error: A value of type 'num?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t201 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:322:25: Error: A value of type 'num?' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = numNullableArg;
                         ^" in numNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t145 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:323:25: Error: A value of type 'int' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t202 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:323:25: Error: A value of type 'int' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = intArg;
                         ^" in intArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t146 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:324:25: Error: A value of type 'int?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t203 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:324:25: Error: A value of type 'int?' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = intNullableArg;
                         ^" in intNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t147 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:325:25: Error: A value of type 'double' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t204 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:325:25: Error: A value of type 'double' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = doubleArg;
                         ^" in doubleArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t148 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:326:25: Error: A value of type 'double?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t205 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:326:25: Error: A value of type 'double?' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = doubleNullableArg;
                         ^" in doubleNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t149 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:327:25: Error: A value of type 'Function' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t206 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:327:25: Error: A value of type 'Function' can't be assigned to a variable of type 'YpotentiallyNull'.
  - 'Function' is from 'dart:core'.
   yPotentiallyNullVar = functionArg;
                         ^" in functionArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t150 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:328:25: Error: A value of type 'Function?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t207 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:328:25: Error: A value of type 'Function?' can't be assigned to a variable of type 'YpotentiallyNull'.
  - 'Function' is from 'dart:core'.
   yPotentiallyNullVar = functionNullableArg;
                         ^" in functionNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:329:25: Error: A value of type 'void Function()' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t208 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:329:25: Error: A value of type 'void Function()' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = toVoidArg;
                         ^" in toVoidArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t152 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:330:25: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t209 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:330:25: Error: A value of type 'void Function()?' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = toVoidNullableArg;
                         ^" in toVoidNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t153 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:331:25: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t210 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:331:25: Error: A value of type 'Tearoffable' can't be assigned to a variable of type 'YpotentiallyNull'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   yPotentiallyNullVar = tearoffableArg;
                         ^" in tearoffableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:332:25: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t211 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:332:25: Error: A value of type 'Tearoffable?' can't be assigned to a variable of type 'YpotentiallyNull'.
  - 'Tearoffable' is from 'pkg/front_end/testcases/nnbd/assignability.dart'.
   yPotentiallyNullVar = tearoffableNullableArg;
                         ^" in tearoffableNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t155 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:333:25: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t212 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:333:25: Error: A value of type 'XnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = xNonNullArg;
                         ^" in xNonNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t156 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:334:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t213 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:334:25: Error: A value of type 'XnonNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = xNonNullNullableArg;
                         ^" in xNonNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} self::error::YpotentiallyNull%;
-  yPotentiallyNullVar = xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} self::error::YpotentiallyNull%;
-  yPotentiallyNullVar = let final<BottomType> #t157 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:337:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = let final<BottomType> #t214 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:335:25: Error: A value of type 'XpotentiallyNull' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = xPotentiallyNullArg;
+                        ^" in xPotentiallyNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  yPotentiallyNullVar = let final<BottomType> #t215 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:336:25: Error: A value of type 'XpotentiallyNull?' can't be assigned to a variable of type 'YpotentiallyNull'.
+  yPotentiallyNullVar = xPotentiallyNullNullableArg;
+                        ^" in xPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
+  yPotentiallyNullVar = let final<BottomType> #t216 = invalid-expression "pkg/front_end/testcases/nnbd/assignability.dart:337:25: Error: A value of type 'YnonNull' can't be assigned to a variable of type 'YpotentiallyNull'.
   yPotentiallyNullVar = yNonNullArg;
                         ^" in yNonNullArg as{TypeError,ForNonNullableByDefault} <BottomType>;
-  yPotentiallyNullVar = let final<BottomType> #t158 = 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 = 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 = yPotentiallyNullNullableArg;
+                        ^" in yPotentiallyNullNullableArg as{TypeError,ForNonNullableByDefault} <BottomType>;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart b/pkg/front_end/testcases/nnbd/bounds_checks.dart
index 3250d57..617a14a 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart
@@ -4,15 +4,15 @@
 
 class A<X extends num> {}
 
-foo(A<num?> a) {} // Error in strong mode and Warning in weak mode.
+foo(A<num?> a) {} // Error
 
-A<num?> bar() {} // Error in strong mode and Warning in weak mode.
+A<num?>? bar() {} // Error
 
-baz<T extends A<num?>>() {} // Error in strong mode and Warning in weak mode.
+baz<T extends A<num?>>() {} // Error
 
-class B extends A<num?> {} // Error in strong mode and Warning in weak mode.
+class B extends A<num?> {} // Error
 
-class C<T extends A<num?>> {} // Error in strong mode and Warning in weak mode.
+class C<T extends A<num?>> {} // Error
 
 void hest<T extends num>() {}
 
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart.outline.expect b/pkg/front_end/testcases/nnbd/bounds_checks.dart.outline.expect
index a66b2fe..f3c9fb6 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart.outline.expect
@@ -4,23 +4,23 @@
 //
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:7:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// foo(A<num?> a) {} // Error in strong mode and Warning in weak mode.
+// foo(A<num?> a) {} // Error
 //             ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:12: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
 // Try changing type arguments so that they conform to the bounds.
-// A<num?> bar() {} // Error in strong mode and Warning in weak mode.
-//            ^
+// A<num?>? bar() {} // Error
+//             ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:11:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// baz<T extends A<num?>>() {} // Error in strong mode and Warning in weak mode.
+// baz<T extends A<num?>>() {} // Error
 //     ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
@@ -28,7 +28,7 @@
 //
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:13:7: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
 // Try changing type arguments so that they conform to the bounds.
-// class B extends A<num?> {} // Error in strong mode and Warning in weak mode.
+// class B extends A<num?> {} // Error
 //       ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
@@ -36,7 +36,7 @@
 //
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:15:9: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// class C<T extends A<num?>> {} // Error in strong mode and Warning in weak mode.
+// class C<T extends A<num?>> {} // Error
 //         ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
@@ -65,7 +65,7 @@
 }
 static method foo(self::A<core::num?> a) → dynamic
   ;
-static method bar() → self::A<core::num?>
+static method bar() → self::A<core::num?>?
   ;
 static method baz<T extends self::A<core::num?> = self::A<core::num?>>() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.expect b/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.expect
index 686cc68..90866e8 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.expect
@@ -4,23 +4,23 @@
 //
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:7:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// foo(A<num?> a) {} // Error in strong mode and Warning in weak mode.
+// foo(A<num?> a) {} // Error
 //             ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:12: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
 // Try changing type arguments so that they conform to the bounds.
-// A<num?> bar() {} // Error in strong mode and Warning in weak mode.
-//            ^
+// A<num?>? bar() {} // Error
+//             ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:11:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// baz<T extends A<num?>>() {} // Error in strong mode and Warning in weak mode.
+// baz<T extends A<num?>>() {} // Error
 //     ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
@@ -28,7 +28,7 @@
 //
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:13:7: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
 // Try changing type arguments so that they conform to the bounds.
-// class B extends A<num?> {} // Error in strong mode and Warning in weak mode.
+// class B extends A<num?> {} // Error
 //       ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
@@ -36,7 +36,7 @@
 //
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:15:9: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// class C<T extends A<num?>> {} // Error in strong mode and Warning in weak mode.
+// class C<T extends A<num?>> {} // Error
 //         ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
@@ -81,7 +81,7 @@
   method hest<T extends core::num = core::num>() → void {}
 }
 static method foo(self::A<core::num?> a) → dynamic {}
-static method bar() → self::A<core::num?> {}
+static method bar() → self::A<core::num?>? {}
 static method baz<T extends self::A<core::num?> = self::A<core::num?>>() → dynamic {}
 static method hest<T extends core::num = core::num>() → void {}
 static method fisk(self::Hest h) → dynamic {
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.transformed.expect
index 686cc68..90866e8 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart.strong.transformed.expect
@@ -4,23 +4,23 @@
 //
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:7:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// foo(A<num?> a) {} // Error in strong mode and Warning in weak mode.
+// foo(A<num?> a) {} // Error
 //             ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:12: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
 // Try changing type arguments so that they conform to the bounds.
-// A<num?> bar() {} // Error in strong mode and Warning in weak mode.
-//            ^
+// A<num?>? bar() {} // Error
+//             ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:11:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// baz<T extends A<num?>>() {} // Error in strong mode and Warning in weak mode.
+// baz<T extends A<num?>>() {} // Error
 //     ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
@@ -28,7 +28,7 @@
 //
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:13:7: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
 // Try changing type arguments so that they conform to the bounds.
-// class B extends A<num?> {} // Error in strong mode and Warning in weak mode.
+// class B extends A<num?> {} // Error
 //       ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
@@ -36,7 +36,7 @@
 //
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:15:9: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// class C<T extends A<num?>> {} // Error in strong mode and Warning in weak mode.
+// class C<T extends A<num?>> {} // Error
 //         ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
@@ -81,7 +81,7 @@
   method hest<T extends core::num = core::num>() → void {}
 }
 static method foo(self::A<core::num?> a) → dynamic {}
-static method bar() → self::A<core::num?> {}
+static method bar() → self::A<core::num?>? {}
 static method baz<T extends self::A<core::num?> = self::A<core::num?>>() → dynamic {}
 static method hest<T extends core::num = core::num>() → void {}
 static method fisk(self::Hest h) → dynamic {
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.expect b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.expect
index d78654a..90866e8 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.expect
@@ -2,47 +2,47 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:13: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// foo(A<num?> a) {} // Error in strong mode and Warning in weak mode.
+// foo(A<num?> a) {} // Error
 //             ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:12: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
 // Try changing type arguments so that they conform to the bounds.
-// A<num?> bar() {} // Error in strong mode and Warning in weak mode.
-//            ^
+// A<num?>? bar() {} // Error
+//             ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:5: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// baz<T extends A<num?>>() {} // Error in strong mode and Warning in weak mode.
+// baz<T extends A<num?>>() {} // Error
 //     ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:7: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:7: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
 // Try changing type arguments so that they conform to the bounds.
-// class B extends A<num?> {} // Error in strong mode and Warning in weak mode.
+// class B extends A<num?> {} // Error
 //       ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:9: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:9: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// class C<T extends A<num?>> {} // Error in strong mode and Warning in weak mode.
+// class C<T extends A<num?>> {} // Error
 //         ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:24:3: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'hest'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:24:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'hest'.
 // Try changing type arguments so that they conform to the bounds.
 //   hest<num?>();
 //   ^
@@ -50,7 +50,7 @@
 // void hest<T extends num>() {}
 //           ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:25:5: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'Hest.hest'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:25:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'Hest.hest'.
 //  - 'Hest' is from 'pkg/front_end/testcases/nnbd/bounds_checks.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   h.hest<num?>();
@@ -81,7 +81,7 @@
   method hest<T extends core::num = core::num>() → void {}
 }
 static method foo(self::A<core::num?> a) → dynamic {}
-static method bar() → self::A<core::num?> {}
+static method bar() → self::A<core::num?>? {}
 static method baz<T extends self::A<core::num?> = self::A<core::num?>>() → dynamic {}
 static method hest<T extends core::num = core::num>() → void {}
 static method fisk(self::Hest h) → dynamic {
diff --git a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.transformed.expect
index d78654a..90866e8 100644
--- a/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/bounds_checks.dart.weak.transformed.expect
@@ -2,47 +2,47 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:13: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:7:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// foo(A<num?> a) {} // Error in strong mode and Warning in weak mode.
+// foo(A<num?> a) {} // Error
 //             ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:12: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:9:13: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the return type.
 // Try changing type arguments so that they conform to the bounds.
-// A<num?> bar() {} // Error in strong mode and Warning in weak mode.
-//            ^
+// A<num?>? bar() {} // Error
+//             ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:5: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:11:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// baz<T extends A<num?>>() {} // Error in strong mode and Warning in weak mode.
+// baz<T extends A<num?>>() {} // Error
 //     ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:7: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:13:7: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A' in the supertype 'A' of class 'B'.
 // Try changing type arguments so that they conform to the bounds.
-// class B extends A<num?> {} // Error in strong mode and Warning in weak mode.
+// class B extends A<num?> {} // Error
 //       ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:9: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:15:9: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'X' on 'A'.
 // Try changing type arguments so that they conform to the bounds.
-// class C<T extends A<num?>> {} // Error in strong mode and Warning in weak mode.
+// class C<T extends A<num?>> {} // Error
 //         ^
 // pkg/front_end/testcases/nnbd/bounds_checks.dart:5:9: Context: This is the type variable whose bound isn't conformed to.
 // class A<X extends num> {}
 //         ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:24:3: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'hest'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:24:3: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'hest'.
 // Try changing type arguments so that they conform to the bounds.
 //   hest<num?>();
 //   ^
@@ -50,7 +50,7 @@
 // void hest<T extends num>() {}
 //           ^
 //
-// pkg/front_end/testcases/nnbd/bounds_checks.dart:25:5: Warning: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'Hest.hest'.
+// pkg/front_end/testcases/nnbd/bounds_checks.dart:25:5: Error: Type argument 'num?' doesn't conform to the bound 'num' of the type variable 'T' on 'Hest.hest'.
 //  - 'Hest' is from 'pkg/front_end/testcases/nnbd/bounds_checks.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   h.hest<num?>();
@@ -81,7 +81,7 @@
   method hest<T extends core::num = core::num>() → void {}
 }
 static method foo(self::A<core::num?> a) → dynamic {}
-static method bar() → self::A<core::num?> {}
+static method bar() → self::A<core::num?>? {}
 static method baz<T extends self::A<core::num?> = self::A<core::num?>>() → dynamic {}
 static method hest<T extends core::num = core::num>() → void {}
 static method fisk(self::Hest h) → dynamic {
diff --git a/pkg/front_end/testcases/nnbd/call.dart.strong.expect b/pkg/front_end/testcases/nnbd/call.dart.strong.expect
index 9386657..66a5576 100644
--- a/pkg/front_end/testcases/nnbd/call.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/call.dart.strong.expect
@@ -2,11 +2,6 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-// Try calling using ?. instead.
-//   f();
-//    ^
-//
 // pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
 // Try calling using ?.call instead.
 //   f();
@@ -15,17 +10,17 @@
 // pkg/front_end/testcases/nnbd/call.dart:13:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
 // Try calling using ?. instead.
 //   f.call();
-//     ^
+//     ^^^^
 //
-// pkg/front_end/testcases/nnbd/call.dart:15:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-// Try calling using ?. instead.
+// pkg/front_end/testcases/nnbd/call.dart:15:10: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
 //   c.field();
-//     ^
+//          ^
 //
-// pkg/front_end/testcases/nnbd/call.dart:16:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-// Try calling using ?. instead.
+// pkg/front_end/testcases/nnbd/call.dart:16:11: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
 //   c.getter();
-//     ^
+//           ^
 //
 import self as self;
 import "dart:core" as core;
@@ -43,22 +38,19 @@
   let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
 Try calling using ?.call instead.
   f();
-   ^" in let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-Try calling using ?. instead.
-  f();
    ^" in f.call();
-  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:13:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:13:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
 Try calling using ?. instead.
   f.call();
-    ^" in f.call();
+    ^^^^" in f.call();
   self::Class c = new self::Class::•();
-  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:15:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-Try calling using ?. instead.
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:15:10: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
   c.field();
-    ^" in c.{self::Class::field}.call();
-  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:16:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-Try calling using ?. instead.
+         ^" in c.{self::Class::field}.call();
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:16:11: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
   c.getter();
-    ^" in c.{self::Class::getter}.call();
+          ^" in c.{self::Class::getter}.call();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/call.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/call.dart.strong.transformed.expect
index 9386657..66a5576 100644
--- a/pkg/front_end/testcases/nnbd/call.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/call.dart.strong.transformed.expect
@@ -2,11 +2,6 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-// Try calling using ?. instead.
-//   f();
-//    ^
-//
 // pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
 // Try calling using ?.call instead.
 //   f();
@@ -15,17 +10,17 @@
 // pkg/front_end/testcases/nnbd/call.dart:13:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
 // Try calling using ?. instead.
 //   f.call();
-//     ^
+//     ^^^^
 //
-// pkg/front_end/testcases/nnbd/call.dart:15:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-// Try calling using ?. instead.
+// pkg/front_end/testcases/nnbd/call.dart:15:10: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
 //   c.field();
-//     ^
+//          ^
 //
-// pkg/front_end/testcases/nnbd/call.dart:16:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-// Try calling using ?. instead.
+// pkg/front_end/testcases/nnbd/call.dart:16:11: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
 //   c.getter();
-//     ^
+//           ^
 //
 import self as self;
 import "dart:core" as core;
@@ -43,22 +38,19 @@
   let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
 Try calling using ?.call instead.
   f();
-   ^" in let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-Try calling using ?. instead.
-  f();
    ^" in f.call();
-  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:13:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:13:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
 Try calling using ?. instead.
   f.call();
-    ^" in f.call();
+    ^^^^" in f.call();
   self::Class c = new self::Class::•();
-  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:15:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-Try calling using ?. instead.
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:15:10: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
   c.field();
-    ^" in c.{self::Class::field}.call();
-  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:16:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
-Try calling using ?. instead.
+         ^" in c.{self::Class::field}.call();
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:16:11: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
   c.getter();
-    ^" in c.{self::Class::getter}.call();
+          ^" in c.{self::Class::getter}.call();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/call.dart.weak.expect b/pkg/front_end/testcases/nnbd/call.dart.weak.expect
index 3b6dfa5..66a5576 100644
--- a/pkg/front_end/testcases/nnbd/call.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/call.dart.weak.expect
@@ -2,30 +2,25 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/call.dart:12:4: Warning: Method 'call' is called on 'void Function()?' which is potentially null.
-// Try calling using ?. instead.
-//   f();
-//    ^
-//
-// pkg/front_end/testcases/nnbd/call.dart:12:4: Warning: Expression of type 'void Function()?' is used as a function, but it's potentially null.
+// pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
 // Try calling using ?.call instead.
 //   f();
 //    ^
 //
-// pkg/front_end/testcases/nnbd/call.dart:13:5: Warning: Method 'call' is called on 'void Function()?' which is potentially null.
+// pkg/front_end/testcases/nnbd/call.dart:13:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
 // Try calling using ?. instead.
 //   f.call();
-//     ^
+//     ^^^^
 //
-// pkg/front_end/testcases/nnbd/call.dart:15:5: Warning: Method 'call' is called on 'void Function()?' which is potentially null.
-// Try calling using ?. instead.
+// pkg/front_end/testcases/nnbd/call.dart:15:10: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
 //   c.field();
-//     ^
+//          ^
 //
-// pkg/front_end/testcases/nnbd/call.dart:16:5: Warning: Method 'call' is called on 'void Function()?' which is potentially null.
-// Try calling using ?. instead.
+// pkg/front_end/testcases/nnbd/call.dart:16:11: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
 //   c.getter();
-//     ^
+//           ^
 //
 import self as self;
 import "dart:core" as core;
@@ -40,10 +35,22 @@
 }
 static method error() → dynamic {
   () →? void f;
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+  f();
+   ^" in f.call();
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:13:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+Try calling using ?. instead.
   f.call();
-  f.call();
+    ^^^^" in f.call();
   self::Class c = new self::Class::•();
-  c.{self::Class::field}.call();
-  c.{self::Class::getter}.call();
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:15:10: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+  c.field();
+         ^" in c.{self::Class::field}.call();
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:16:11: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+  c.getter();
+          ^" in c.{self::Class::getter}.call();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/call.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/call.dart.weak.transformed.expect
index 3b6dfa5..66a5576 100644
--- a/pkg/front_end/testcases/nnbd/call.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/call.dart.weak.transformed.expect
@@ -2,30 +2,25 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/call.dart:12:4: Warning: Method 'call' is called on 'void Function()?' which is potentially null.
-// Try calling using ?. instead.
-//   f();
-//    ^
-//
-// pkg/front_end/testcases/nnbd/call.dart:12:4: Warning: Expression of type 'void Function()?' is used as a function, but it's potentially null.
+// pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
 // Try calling using ?.call instead.
 //   f();
 //    ^
 //
-// pkg/front_end/testcases/nnbd/call.dart:13:5: Warning: Method 'call' is called on 'void Function()?' which is potentially null.
+// pkg/front_end/testcases/nnbd/call.dart:13:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
 // Try calling using ?. instead.
 //   f.call();
-//     ^
+//     ^^^^
 //
-// pkg/front_end/testcases/nnbd/call.dart:15:5: Warning: Method 'call' is called on 'void Function()?' which is potentially null.
-// Try calling using ?. instead.
+// pkg/front_end/testcases/nnbd/call.dart:15:10: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
 //   c.field();
-//     ^
+//          ^
 //
-// pkg/front_end/testcases/nnbd/call.dart:16:5: Warning: Method 'call' is called on 'void Function()?' which is potentially null.
-// Try calling using ?. instead.
+// pkg/front_end/testcases/nnbd/call.dart:16:11: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
 //   c.getter();
-//     ^
+//           ^
 //
 import self as self;
 import "dart:core" as core;
@@ -40,10 +35,22 @@
 }
 static method error() → dynamic {
   () →? void f;
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:12:4: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+  f();
+   ^" in f.call();
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:13:5: Error: Method 'call' cannot be called on 'void Function()?' because it is potentially null.
+Try calling using ?. instead.
   f.call();
-  f.call();
+    ^^^^" in f.call();
   self::Class c = new self::Class::•();
-  c.{self::Class::field}.call();
-  c.{self::Class::getter}.call();
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:15:10: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+  c.field();
+         ^" in c.{self::Class::field}.call();
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/call.dart:16:11: Error: Can't use an expression of type 'void Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+  c.getter();
+          ^" in c.{self::Class::getter}.call();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/constants.dart b/pkg/front_end/testcases/nnbd/constants.dart
index 0a32e64..3335767 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart
+++ b/pkg/front_end/testcases/nnbd/constants.dart
@@ -41,17 +41,8 @@
 final bool inStrongMode = _inStrongMode();
 
 bool _inStrongMode() {
-  var f = (String? s) {
-    s.length; // This will be an invalid expression in strong mode.
-  };
-  try {
-    f("foo");
-  } catch (e) {
-    print('Running in strong mode.');
-    return true;
-  }
-  print('Running in weak mode.');
-  return false;
+  const List<int?> list = const <int?>[];
+  return list is! List<int>;
 }
 
 main() {
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.strong.expect b/pkg/front_end/testcases/nnbd/constants.dart.strong.expect
index 12632c3..0293eeb 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.strong.expect
@@ -1,12 +1,4 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/nnbd/constants.dart:45: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.
-//       ^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 import "constants_lib.dart" as con;
@@ -39,34 +31,20 @@
 static const field core::bool mapConcatenationIdentical = #C16;
 static final field core::bool inStrongMode = self::_inStrongMode();
 static method _inStrongMode() → core::bool {
-  (core::String?) → core::Null? f = (core::String? s) → core::Null? {
-    let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/constants.dart:45: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.
-      ^^^^^^" in s.{core::String::length};
-  };
-  try {
-    f.call("foo");
-  }
-  on dynamic catch(final dynamic e) {
-    core::print("Running in strong mode.");
-    return true;
-  }
-  core::print("Running in weak mode.");
-  return false;
+  return !((#C17) is{ForNonNullableByDefault} core::List<core::int>);
 }
 static method main() → dynamic {
-  self::test(#C1, #C17);
-  self::test(#C3, #C18);
-  self::test(#C5, #C19);
-  self::test(#C6, #C20);
-  self::test(#C7, #C21);
-  self::test(#C8, #C22);
-  self::test(#C12, #C24);
-  self::test(#C15, #C25);
-  self::test(#C8, #C22);
-  self::test(#C12, #C24);
-  self::test(#C15, #C25);
+  self::test(#C1, #C18);
+  self::test(#C3, #C19);
+  self::test(#C5, #C20);
+  self::test(#C6, #C21);
+  self::test(#C7, #C22);
+  self::test(#C8, #C23);
+  self::test(#C12, #C25);
+  self::test(#C15, #C26);
+  self::test(#C8, #C23);
+  self::test(#C12, #C25);
+  self::test(#C15, #C26);
   self::test(true, #C16);
   self::test(true, #C16);
   self::test(true, #C16);
@@ -105,29 +83,29 @@
     : con::Class::field = field, super core::Object::•()
     ;
 }
-static const field core::Type* objectTypeLiteral = #C17;
-static const field (core::Object*, core::Object*) →* core::bool* c2 = #C26;
-static const field (core::int*) →* core::int* partialInstantiation = #C18;
-static const field con::Class<core::int*>* instance = #C19;
-static const field core::Type* functionTypeLiteral = #C20;
-static const field core::Type* genericFunctionTypeLiteral = #C21;
-static const field core::List<core::int*>* listLiteral = #C22;
-static const field core::Set<core::int*>* setLiteral = #C24;
-static const field core::Map<core::int*, core::String*>* mapLiteral = #C25;
-static const field core::List<core::int*>* listConcatenation = #C22;
-static const field core::Set<core::int*>* setConcatenation = #C24;
-static const field core::Map<core::int*, core::String*>* mapConcatenation = #C25;
+static const field core::Type* objectTypeLiteral = #C18;
+static const field (core::Object*, core::Object*) →* core::bool* c2 = #C27;
+static const field (core::int*) →* core::int* partialInstantiation = #C19;
+static const field con::Class<core::int*>* instance = #C20;
+static const field core::Type* functionTypeLiteral = #C21;
+static const field core::Type* genericFunctionTypeLiteral = #C22;
+static const field core::List<core::int*>* listLiteral = #C23;
+static const field core::Set<core::int*>* setLiteral = #C25;
+static const field core::Map<core::int*, core::String*>* mapLiteral = #C26;
+static const field core::List<core::int*>* listConcatenation = #C23;
+static const field core::Set<core::int*>* setConcatenation = #C25;
+static const field core::Map<core::int*, core::String*>* mapConcatenation = #C26;
 static method id<T extends core::Object* = dynamic>(con::id::T* t) → con::id::T*
   return t;
 
 constants  {
-  #C1 = TypeLiteralConstant(dart.core::Object)
+  #C1 = TypeLiteralConstant(core::Object)
   #C2 = tearoff con::id
   #C3 = partial-instantiation con::id <core::int>
   #C4 = 0
   #C5 = con::Class<core::int> {field:#C4}
   #C6 = TypeLiteralConstant((dynamic) → dynamic)
-  #C7 = TypeLiteralConstant(<T extends dart.core::Object? = dynamic>(T%) → T%)
+  #C7 = TypeLiteralConstant(<T extends core::Object? = dynamic>(T%) → T%)
   #C8 = <core::int>[#C4]
   #C9 = null
   #C10 = <dynamic>[#C4, #C9]
@@ -137,14 +115,15 @@
   #C14 = <dynamic>[#C4, #C13]
   #C15 = core::_ImmutableMap<core::int, core::String> {_kvPairs:#C14}
   #C16 = false
-  #C17 = TypeLiteralConstant(dart.core::Object*)
-  #C18 = partial-instantiation con::id <core::int*>
-  #C19 = con::Class<core::int*> {field:#C4}
-  #C20 = TypeLiteralConstant((dynamic) →* dynamic)
-  #C21 = TypeLiteralConstant(<T extends dart.core::Object* = dynamic>(T*) →* T*)
-  #C22 = <core::int*>[#C4]
-  #C23 = core::_ImmutableMap<core::int*, core::Null?> {_kvPairs:#C10}
-  #C24 = col::_UnmodifiableSet<core::int*> {_map:#C23}
-  #C25 = core::_ImmutableMap<core::int*, core::String*> {_kvPairs:#C14}
-  #C26 = tearoff core::identical
+  #C17 = <core::int?>[]
+  #C18 = TypeLiteralConstant(core::Object*)
+  #C19 = partial-instantiation con::id <core::int*>
+  #C20 = con::Class<core::int*> {field:#C4}
+  #C21 = TypeLiteralConstant((dynamic) →* dynamic)
+  #C22 = TypeLiteralConstant(<T extends core::Object* = dynamic>(T*) →* T*)
+  #C23 = <core::int*>[#C4]
+  #C24 = core::_ImmutableMap<core::int*, core::Null?> {_kvPairs:#C10}
+  #C25 = col::_UnmodifiableSet<core::int*> {_map:#C24}
+  #C26 = core::_ImmutableMap<core::int*, core::String*> {_kvPairs:#C14}
+  #C27 = tearoff core::identical
 }
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 12632c3..0293eeb 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.strong.transformed.expect
@@ -1,12 +1,4 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/nnbd/constants.dart:45: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.
-//       ^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 import "constants_lib.dart" as con;
@@ -39,34 +31,20 @@
 static const field core::bool mapConcatenationIdentical = #C16;
 static final field core::bool inStrongMode = self::_inStrongMode();
 static method _inStrongMode() → core::bool {
-  (core::String?) → core::Null? f = (core::String? s) → core::Null? {
-    let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/constants.dart:45: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.
-      ^^^^^^" in s.{core::String::length};
-  };
-  try {
-    f.call("foo");
-  }
-  on dynamic catch(final dynamic e) {
-    core::print("Running in strong mode.");
-    return true;
-  }
-  core::print("Running in weak mode.");
-  return false;
+  return !((#C17) is{ForNonNullableByDefault} core::List<core::int>);
 }
 static method main() → dynamic {
-  self::test(#C1, #C17);
-  self::test(#C3, #C18);
-  self::test(#C5, #C19);
-  self::test(#C6, #C20);
-  self::test(#C7, #C21);
-  self::test(#C8, #C22);
-  self::test(#C12, #C24);
-  self::test(#C15, #C25);
-  self::test(#C8, #C22);
-  self::test(#C12, #C24);
-  self::test(#C15, #C25);
+  self::test(#C1, #C18);
+  self::test(#C3, #C19);
+  self::test(#C5, #C20);
+  self::test(#C6, #C21);
+  self::test(#C7, #C22);
+  self::test(#C8, #C23);
+  self::test(#C12, #C25);
+  self::test(#C15, #C26);
+  self::test(#C8, #C23);
+  self::test(#C12, #C25);
+  self::test(#C15, #C26);
   self::test(true, #C16);
   self::test(true, #C16);
   self::test(true, #C16);
@@ -105,29 +83,29 @@
     : con::Class::field = field, super core::Object::•()
     ;
 }
-static const field core::Type* objectTypeLiteral = #C17;
-static const field (core::Object*, core::Object*) →* core::bool* c2 = #C26;
-static const field (core::int*) →* core::int* partialInstantiation = #C18;
-static const field con::Class<core::int*>* instance = #C19;
-static const field core::Type* functionTypeLiteral = #C20;
-static const field core::Type* genericFunctionTypeLiteral = #C21;
-static const field core::List<core::int*>* listLiteral = #C22;
-static const field core::Set<core::int*>* setLiteral = #C24;
-static const field core::Map<core::int*, core::String*>* mapLiteral = #C25;
-static const field core::List<core::int*>* listConcatenation = #C22;
-static const field core::Set<core::int*>* setConcatenation = #C24;
-static const field core::Map<core::int*, core::String*>* mapConcatenation = #C25;
+static const field core::Type* objectTypeLiteral = #C18;
+static const field (core::Object*, core::Object*) →* core::bool* c2 = #C27;
+static const field (core::int*) →* core::int* partialInstantiation = #C19;
+static const field con::Class<core::int*>* instance = #C20;
+static const field core::Type* functionTypeLiteral = #C21;
+static const field core::Type* genericFunctionTypeLiteral = #C22;
+static const field core::List<core::int*>* listLiteral = #C23;
+static const field core::Set<core::int*>* setLiteral = #C25;
+static const field core::Map<core::int*, core::String*>* mapLiteral = #C26;
+static const field core::List<core::int*>* listConcatenation = #C23;
+static const field core::Set<core::int*>* setConcatenation = #C25;
+static const field core::Map<core::int*, core::String*>* mapConcatenation = #C26;
 static method id<T extends core::Object* = dynamic>(con::id::T* t) → con::id::T*
   return t;
 
 constants  {
-  #C1 = TypeLiteralConstant(dart.core::Object)
+  #C1 = TypeLiteralConstant(core::Object)
   #C2 = tearoff con::id
   #C3 = partial-instantiation con::id <core::int>
   #C4 = 0
   #C5 = con::Class<core::int> {field:#C4}
   #C6 = TypeLiteralConstant((dynamic) → dynamic)
-  #C7 = TypeLiteralConstant(<T extends dart.core::Object? = dynamic>(T%) → T%)
+  #C7 = TypeLiteralConstant(<T extends core::Object? = dynamic>(T%) → T%)
   #C8 = <core::int>[#C4]
   #C9 = null
   #C10 = <dynamic>[#C4, #C9]
@@ -137,14 +115,15 @@
   #C14 = <dynamic>[#C4, #C13]
   #C15 = core::_ImmutableMap<core::int, core::String> {_kvPairs:#C14}
   #C16 = false
-  #C17 = TypeLiteralConstant(dart.core::Object*)
-  #C18 = partial-instantiation con::id <core::int*>
-  #C19 = con::Class<core::int*> {field:#C4}
-  #C20 = TypeLiteralConstant((dynamic) →* dynamic)
-  #C21 = TypeLiteralConstant(<T extends dart.core::Object* = dynamic>(T*) →* T*)
-  #C22 = <core::int*>[#C4]
-  #C23 = core::_ImmutableMap<core::int*, core::Null?> {_kvPairs:#C10}
-  #C24 = col::_UnmodifiableSet<core::int*> {_map:#C23}
-  #C25 = core::_ImmutableMap<core::int*, core::String*> {_kvPairs:#C14}
-  #C26 = tearoff core::identical
+  #C17 = <core::int?>[]
+  #C18 = TypeLiteralConstant(core::Object*)
+  #C19 = partial-instantiation con::id <core::int*>
+  #C20 = con::Class<core::int*> {field:#C4}
+  #C21 = TypeLiteralConstant((dynamic) →* dynamic)
+  #C22 = TypeLiteralConstant(<T extends core::Object* = dynamic>(T*) →* T*)
+  #C23 = <core::int*>[#C4]
+  #C24 = core::_ImmutableMap<core::int*, core::Null?> {_kvPairs:#C10}
+  #C25 = col::_UnmodifiableSet<core::int*> {_map:#C24}
+  #C26 = core::_ImmutableMap<core::int*, core::String*> {_kvPairs:#C14}
+  #C27 = tearoff core::identical
 }
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.weak.expect b/pkg/front_end/testcases/nnbd/constants.dart.weak.expect
index 794e075..d4e1e3f7 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.weak.expect
@@ -1,12 +1,4 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/nnbd/constants.dart:45:7: Warning: Property 'length' is accessed on 'String?' which is potentially null.
-// Try accessing using ?. instead.
-//     s.length; // This will be an invalid expression in strong mode.
-//       ^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 import "constants_lib.dart" as con;
@@ -39,18 +31,7 @@
 static const field core::bool mapConcatenationIdentical = #C16;
 static final field core::bool inStrongMode = self::_inStrongMode();
 static method _inStrongMode() → core::bool {
-  (core::String?) → core::Null? f = (core::String? s) → core::Null? {
-    s.{core::String::length};
-  };
-  try {
-    f.call("foo");
-  }
-  on dynamic catch(final dynamic e) {
-    core::print("Running in strong mode.");
-    return true;
-  }
-  core::print("Running in weak mode.");
-  return false;
+  return !((#C17) is{ForNonNullableByDefault} core::List<core::int>);
 }
 static method main() → dynamic {
   self::test(#C1, #C1);
@@ -103,7 +84,7 @@
     ;
 }
 static const field core::Type* objectTypeLiteral = #C1;
-static const field (core::Object*, core::Object*) →* core::bool* c2 = #C17;
+static const field (core::Object*, core::Object*) →* core::bool* c2 = #C18;
 static const field (core::int*) →* core::int* partialInstantiation = #C3;
 static const field con::Class<core::int*>* instance = #C5;
 static const field core::Type* functionTypeLiteral = #C6;
@@ -118,13 +99,13 @@
   return t;
 
 constants  {
-  #C1 = TypeLiteralConstant(dart.core::Object*)
+  #C1 = TypeLiteralConstant(core::Object*)
   #C2 = tearoff con::id
   #C3 = partial-instantiation con::id <core::int*>
   #C4 = 0
   #C5 = con::Class<core::int*> {field:#C4}
   #C6 = TypeLiteralConstant((dynamic) →* dynamic)
-  #C7 = TypeLiteralConstant(<T extends dart.core::Object* = dynamic>(T*) →* T*)
+  #C7 = TypeLiteralConstant(<T extends core::Object* = dynamic>(T*) →* T*)
   #C8 = <core::int*>[#C4]
   #C9 = null
   #C10 = <dynamic>[#C4, #C9]
@@ -134,5 +115,6 @@
   #C14 = <dynamic>[#C4, #C13]
   #C15 = core::_ImmutableMap<core::int*, core::String*> {_kvPairs:#C14}
   #C16 = true
-  #C17 = tearoff core::identical
+  #C17 = <core::int*>[]
+  #C18 = tearoff core::identical
 }
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 794e075..d4e1e3f7 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.weak.transformed.expect
@@ -1,12 +1,4 @@
 library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/nnbd/constants.dart:45:7: Warning: Property 'length' is accessed on 'String?' which is potentially null.
-// Try accessing using ?. instead.
-//     s.length; // This will be an invalid expression in strong mode.
-//       ^^^^^^
-//
 import self as self;
 import "dart:core" as core;
 import "constants_lib.dart" as con;
@@ -39,18 +31,7 @@
 static const field core::bool mapConcatenationIdentical = #C16;
 static final field core::bool inStrongMode = self::_inStrongMode();
 static method _inStrongMode() → core::bool {
-  (core::String?) → core::Null? f = (core::String? s) → core::Null? {
-    s.{core::String::length};
-  };
-  try {
-    f.call("foo");
-  }
-  on dynamic catch(final dynamic e) {
-    core::print("Running in strong mode.");
-    return true;
-  }
-  core::print("Running in weak mode.");
-  return false;
+  return !((#C17) is{ForNonNullableByDefault} core::List<core::int>);
 }
 static method main() → dynamic {
   self::test(#C1, #C1);
@@ -103,7 +84,7 @@
     ;
 }
 static const field core::Type* objectTypeLiteral = #C1;
-static const field (core::Object*, core::Object*) →* core::bool* c2 = #C17;
+static const field (core::Object*, core::Object*) →* core::bool* c2 = #C18;
 static const field (core::int*) →* core::int* partialInstantiation = #C3;
 static const field con::Class<core::int*>* instance = #C5;
 static const field core::Type* functionTypeLiteral = #C6;
@@ -118,13 +99,13 @@
   return t;
 
 constants  {
-  #C1 = TypeLiteralConstant(dart.core::Object*)
+  #C1 = TypeLiteralConstant(core::Object*)
   #C2 = tearoff con::id
   #C3 = partial-instantiation con::id <core::int*>
   #C4 = 0
   #C5 = con::Class<core::int*> {field:#C4}
   #C6 = TypeLiteralConstant((dynamic) →* dynamic)
-  #C7 = TypeLiteralConstant(<T extends dart.core::Object* = dynamic>(T*) →* T*)
+  #C7 = TypeLiteralConstant(<T extends core::Object* = dynamic>(T*) →* T*)
   #C8 = <core::int*>[#C4]
   #C9 = null
   #C10 = <dynamic>[#C4, #C9]
@@ -134,5 +115,6 @@
   #C14 = <dynamic>[#C4, #C13]
   #C15 = core::_ImmutableMap<core::int*, core::String*> {_kvPairs:#C14}
   #C16 = true
-  #C17 = tearoff core::identical
+  #C17 = <core::int*>[]
+  #C18 = tearoff core::identical
 }
diff --git a/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart b/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart
index 2c8941e..2afbd86 100644
--- a/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart
+++ b/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart
@@ -10,7 +10,7 @@
   return x;
 }
 
-int bar() {}
+int bar() => 0;
 
 int baz(int x) {
   return x;
@@ -28,7 +28,7 @@
     return x;
   }
 
-  int bar() {}
+  int bar() => 0;
 
   int baz(int x) {
     return x;
diff --git a/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.strong.expect b/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.strong.expect
index ee1a35e..4742f80 100644
--- a/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.strong.expect
@@ -20,11 +20,12 @@
     ;
   method foo() → core::int {
     core::int x;
-    return (let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:28:12: Error: Non-nullable variable 'x' must be assigned before it can be used.
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:28:12: Error: Non-nullable variable 'x' must be assigned before it can be used.
     return x;
-           ^" in x) as{TypeError,ForNonNullableByDefault} core::int;
+           ^" in x;
   }
-  method bar() → core::int {}
+  method bar() → core::int
+    return 0;
   method baz(core::int x) → core::int {
     return x;
   }
@@ -33,11 +34,12 @@
 }
 static method foo() → core::int {
   core::int x;
-  return (let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:10:10: Error: Non-nullable variable 'x' must be assigned before it can be used.
+  return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:10:10: Error: Non-nullable variable 'x' must be assigned before it can be used.
   return x;
-         ^" in x) as{TypeError,ForNonNullableByDefault} core::int;
+         ^" in x;
 }
-static method bar() → core::int {}
+static method bar() → core::int
+  return 0;
 static method baz(core::int x) → core::int {
   return x;
 }
diff --git a/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.strong.transformed.expect
index ee1a35e..4742f80 100644
--- a/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.strong.transformed.expect
@@ -20,11 +20,12 @@
     ;
   method foo() → core::int {
     core::int x;
-    return (let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:28:12: Error: Non-nullable variable 'x' must be assigned before it can be used.
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:28:12: Error: Non-nullable variable 'x' must be assigned before it can be used.
     return x;
-           ^" in x) as{TypeError,ForNonNullableByDefault} core::int;
+           ^" in x;
   }
-  method bar() → core::int {}
+  method bar() → core::int
+    return 0;
   method baz(core::int x) → core::int {
     return x;
   }
@@ -33,11 +34,12 @@
 }
 static method foo() → core::int {
   core::int x;
-  return (let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:10:10: Error: Non-nullable variable 'x' must be assigned before it can be used.
+  return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:10:10: Error: Non-nullable variable 'x' must be assigned before it can be used.
   return x;
-         ^" in x) as{TypeError,ForNonNullableByDefault} core::int;
+         ^" in x;
 }
-static method bar() → core::int {}
+static method bar() → core::int
+  return 0;
 static method baz(core::int x) → core::int {
   return x;
 }
diff --git a/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.weak.expect b/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.weak.expect
index 645ac55..4742f80 100644
--- a/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.weak.expect
@@ -2,11 +2,11 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:10:10: Warning: Non-nullable variable 'x' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:10:10: Error: Non-nullable variable 'x' must be assigned before it can be used.
 //   return x;
 //          ^
 //
-// pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:28:12: Warning: Non-nullable variable 'x' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:28:12: Error: Non-nullable variable 'x' must be assigned before it can be used.
 //     return x;
 //            ^
 //
@@ -20,9 +20,12 @@
     ;
   method foo() → core::int {
     core::int x;
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:28:12: Error: Non-nullable variable 'x' must be assigned before it can be used.
     return x;
+           ^" in x;
   }
-  method bar() → core::int {}
+  method bar() → core::int
+    return 0;
   method baz(core::int x) → core::int {
     return x;
   }
@@ -31,9 +34,12 @@
 }
 static method foo() → core::int {
   core::int x;
+  return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:10:10: Error: Non-nullable variable 'x' must be assigned before it can be used.
   return x;
+         ^" in x;
 }
-static method bar() → core::int {}
+static method bar() → core::int
+  return 0;
 static method baz(core::int x) → core::int {
   return x;
 }
diff --git a/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.weak.transformed.expect
index 645ac55..4742f80 100644
--- a/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart.weak.transformed.expect
@@ -2,11 +2,11 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:10:10: Warning: Non-nullable variable 'x' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:10:10: Error: Non-nullable variable 'x' must be assigned before it can be used.
 //   return x;
 //          ^
 //
-// pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:28:12: Warning: Non-nullable variable 'x' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:28:12: Error: Non-nullable variable 'x' must be assigned before it can be used.
 //     return x;
 //            ^
 //
@@ -20,9 +20,12 @@
     ;
   method foo() → core::int {
     core::int x;
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:28:12: Error: Non-nullable variable 'x' must be assigned before it can be used.
     return x;
+           ^" in x;
   }
-  method bar() → core::int {}
+  method bar() → core::int
+    return 0;
   method baz(core::int x) → core::int {
     return x;
   }
@@ -31,9 +34,12 @@
 }
 static method foo() → core::int {
   core::int x;
+  return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definite_assignment_and_completion.dart:10:10: Error: Non-nullable variable 'x' must be assigned before it can be used.
   return x;
+         ^" in x;
 }
-static method bar() → core::int {}
+static method bar() → core::int
+  return 0;
 static method baz(core::int x) → core::int {
   return x;
 }
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart b/pkg/front_end/testcases/nnbd/definitely_assigned.dart
new file mode 100644
index 0000000..12241c7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart
@@ -0,0 +1,91 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for 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';
+
+methodDirect<T>(T value) {
+  late final T local2;
+  late final int local4;
+  late final FutureOr<int> local6;
+
+  local2 = value; // ok
+  local4 = 0; // ok
+  local6 = 0; // ok
+
+  local2 = value; // error
+  local4 = 0; // error
+  local6 = 0; // error
+}
+
+var fieldDirect = <T>(T value) {
+  late final T local2;
+  late final int local4;
+  late final FutureOr<int> local6;
+
+  local2 = value; // ok
+  local4 = 0; // ok
+  local6 = 0; // ok
+
+  local2 = value; // error
+  local4 = 0; // error
+  local6 = 0; // error
+};
+
+methodConditional<T>(bool b, T value) {
+  late final T local2;
+  late final int local4;
+  late final FutureOr<int> local6;
+
+  if (b) {
+    local2 = value; // ok
+    local4 = 0; // ok
+    local6 = 0; // ok
+  }
+
+  local2 = value; // ok
+  local4 = 0; // ok
+  local6 = 0; // ok
+
+  local2 = value; // error
+  local4 = 0; // error
+  local6 = 0; // error
+}
+
+var fieldConditional = <T>(bool b, T value) {
+  late final T local2;
+  late final int local4;
+  late final FutureOr<int> local6;
+
+  if (b) {
+    local2 = value; // ok
+    local4 = 0; // ok
+    local6 = 0; // ok
+  }
+
+  local2 = value; // ok
+  local4 = 0; // ok
+  local6 = 0; // ok
+
+  local2 = value; // error
+  local4 = 0; // error
+  local6 = 0; // error
+};
+
+methodCompound() {
+  late final int local4;
+
+  local4 = 0; // ok
+
+  local4 += 0; // error
+}
+
+var fieldCompound = () {
+  late final int local4;
+
+  local4 = 0; // ok
+
+  local4 += 0; // error
+};
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.outline.expect b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.outline.expect
new file mode 100644
index 0000000..1a5e8e7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.outline.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+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 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
+  ;
+static method methodCompound() → dynamic
+  ;
+static method main() → 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
new file mode 100644
index 0000000..9751d45
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.expect
@@ -0,0 +1,159 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+  late final T% local2;
+  late final core::int local4;
+  late final asy::FutureOr<core::int> local6;
+  local2 = value;
+  local4 = 0;
+  local6 = 0;
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in local2 = value;
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in local4 = 0;
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  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? {
+  late final T% local2;
+  late final core::int local4;
+  late final asy::FutureOr<core::int> local6;
+  if(b) {
+    local2 = value;
+    local4 = 0;
+    local6 = 0;
+  }
+  local2 = value;
+  local4 = 0;
+  local6 = 0;
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in local2 = value;
+  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in local4 = 0;
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in local6 = 0;
+};
+static field () → core::Null? fieldCompound = () → core::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: Non-nullable late final variable 'local4' definitely assigned.
+  local4 += 0; // error
+  ^^^^^^" in local4 = local4.{core::num::+}(0);
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+  late final self::methodDirect::T% local2;
+  late final core::int local4;
+  late final asy::FutureOr<core::int> local6;
+  local2 = value;
+  local4 = 0;
+  local6 = 0;
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in local2 = value;
+  let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in local4 = 0;
+  let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in local6 = 0;
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+  late final self::methodConditional::T% local2;
+  late final core::int local4;
+  late final asy::FutureOr<core::int> local6;
+  if(b) {
+    local2 = value;
+    local4 = 0;
+    local6 = 0;
+  }
+  local2 = value;
+  local4 = 0;
+  local6 = 0;
+  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in local2 = value;
+  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in local4 = 0;
+  let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in local6 = 0;
+}
+static method methodCompound() → dynamic {
+  late final core::int local4;
+  local4 = 0;
+  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 += 0; // error
+  ^^^^^^" in local4 = local4.{core::num::+}(0);
+}
+static method main() → dynamic {}
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
new file mode 100644
index 0000000..9751d45
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.transformed.expect
@@ -0,0 +1,159 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+  late final T% local2;
+  late final core::int local4;
+  late final asy::FutureOr<core::int> local6;
+  local2 = value;
+  local4 = 0;
+  local6 = 0;
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in local2 = value;
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in local4 = 0;
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  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? {
+  late final T% local2;
+  late final core::int local4;
+  late final asy::FutureOr<core::int> local6;
+  if(b) {
+    local2 = value;
+    local4 = 0;
+    local6 = 0;
+  }
+  local2 = value;
+  local4 = 0;
+  local6 = 0;
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in local2 = value;
+  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in local4 = 0;
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in local6 = 0;
+};
+static field () → core::Null? fieldCompound = () → core::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: Non-nullable late final variable 'local4' definitely assigned.
+  local4 += 0; // error
+  ^^^^^^" in local4 = local4.{core::num::+}(0);
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+  late final self::methodDirect::T% local2;
+  late final core::int local4;
+  late final asy::FutureOr<core::int> local6;
+  local2 = value;
+  local4 = 0;
+  local6 = 0;
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in local2 = value;
+  let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in local4 = 0;
+  let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in local6 = 0;
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+  late final self::methodConditional::T% local2;
+  late final core::int local4;
+  late final asy::FutureOr<core::int> local6;
+  if(b) {
+    local2 = value;
+    local4 = 0;
+    local6 = 0;
+  }
+  local2 = value;
+  local4 = 0;
+  local6 = 0;
+  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in local2 = value;
+  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in local4 = 0;
+  let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in local6 = 0;
+}
+static method methodCompound() → dynamic {
+  late final core::int local4;
+  local4 = 0;
+  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 += 0; // error
+  ^^^^^^" in local4 = local4.{core::num::+}(0);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.expect b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.expect
new file mode 100644
index 0000000..9751d45
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.expect
@@ -0,0 +1,159 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+  late final T% local2;
+  late final core::int local4;
+  late final asy::FutureOr<core::int> local6;
+  local2 = value;
+  local4 = 0;
+  local6 = 0;
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in local2 = value;
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in local4 = 0;
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  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? {
+  late final T% local2;
+  late final core::int local4;
+  late final asy::FutureOr<core::int> local6;
+  if(b) {
+    local2 = value;
+    local4 = 0;
+    local6 = 0;
+  }
+  local2 = value;
+  local4 = 0;
+  local6 = 0;
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in local2 = value;
+  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in local4 = 0;
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in local6 = 0;
+};
+static field () → core::Null? fieldCompound = () → core::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: Non-nullable late final variable 'local4' definitely assigned.
+  local4 += 0; // error
+  ^^^^^^" in local4 = local4.{core::num::+}(0);
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+  late final self::methodDirect::T% local2;
+  late final core::int local4;
+  late final asy::FutureOr<core::int> local6;
+  local2 = value;
+  local4 = 0;
+  local6 = 0;
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in local2 = value;
+  let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in local4 = 0;
+  let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in local6 = 0;
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+  late final self::methodConditional::T% local2;
+  late final core::int local4;
+  late final asy::FutureOr<core::int> local6;
+  if(b) {
+    local2 = value;
+    local4 = 0;
+    local6 = 0;
+  }
+  local2 = value;
+  local4 = 0;
+  local6 = 0;
+  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in local2 = value;
+  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in local4 = 0;
+  let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in local6 = 0;
+}
+static method methodCompound() → dynamic {
+  late final core::int local4;
+  local4 = 0;
+  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 += 0; // error
+  ^^^^^^" in local4 = local4.{core::num::+}(0);
+}
+static method main() → dynamic {}
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
new file mode 100644
index 0000000..9751d45
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.transformed.expect
@@ -0,0 +1,159 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+//   local2 = value; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+//   local6 = 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+  late final T% local2;
+  late final core::int local4;
+  late final asy::FutureOr<core::int> local6;
+  local2 = value;
+  local4 = 0;
+  local6 = 0;
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:30:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in local2 = value;
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:31:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in local4 = 0;
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:32:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  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? {
+  late final T% local2;
+  late final core::int local4;
+  late final asy::FutureOr<core::int> local6;
+  if(b) {
+    local2 = value;
+    local4 = 0;
+    local6 = 0;
+  }
+  local2 = value;
+  local4 = 0;
+  local6 = 0;
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:70:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in local2 = value;
+  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:71:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in local4 = 0;
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:72:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in local6 = 0;
+};
+static field () → core::Null? fieldCompound = () → core::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: Non-nullable late final variable 'local4' definitely assigned.
+  local4 += 0; // error
+  ^^^^^^" in local4 = local4.{core::num::+}(0);
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+  late final self::methodDirect::T% local2;
+  late final core::int local4;
+  late final asy::FutureOr<core::int> local6;
+  local2 = value;
+  local4 = 0;
+  local6 = 0;
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:16:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in local2 = value;
+  let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:17:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in local4 = 0;
+  let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:18:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in local6 = 0;
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+  late final self::methodConditional::T% local2;
+  late final core::int local4;
+  late final asy::FutureOr<core::int> local6;
+  if(b) {
+    local2 = value;
+    local4 = 0;
+    local6 = 0;
+  }
+  local2 = value;
+  local4 = 0;
+  local6 = 0;
+  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:50:3: Error: Non-nullable late final variable 'local2' definitely assigned.
+  local2 = value; // error
+  ^^^^^^" in local2 = value;
+  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:51:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 = 0; // error
+  ^^^^^^" in local4 = 0;
+  let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:52:3: Error: Non-nullable late final variable 'local6' definitely assigned.
+  local6 = 0; // error
+  ^^^^^^" in local6 = 0;
+}
+static method methodCompound() → dynamic {
+  late final core::int local4;
+  local4 = 0;
+  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:80:3: Error: Non-nullable late final variable 'local4' definitely assigned.
+  local4 += 0; // error
+  ^^^^^^" in local4 = local4.{core::num::+}(0);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart
new file mode 100644
index 0000000..5843b75
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart
@@ -0,0 +1,115 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for 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';
+
+methodDirect<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; // error
+  local2; // error
+  local3; // error
+  local4; // error
+  local5; // error
+  local6; // error
+  local7; // ok
+}
+
+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; // error
+  local2; // error
+  local3; // error
+  local4; // error
+  local5; // error
+  local6; // error
+  local7; // ok
+};
+
+methodConditional<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 = value;
+  }
+
+  local1; // error
+  local2; // ok
+  local3; // error
+  local4; // ok
+  local5; // error
+  local6; // ok
+  local7; // ok
+}
+
+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; // ok
+  }
+
+  local1; // error
+  local2; // ok
+  local3; // error
+  local4; // ok
+  local5; // error
+  local6; // ok
+  local7; // ok
+};
+
+methodCompound() {
+  int local3;
+  late int local4;
+
+  local3 += 0; // error
+  local4 += 0; // error
+}
+
+var fieldCompound = () {
+  int local3;
+  late int local4;
+
+  local3 += 0; // error
+  local4 += 0; // error
+};
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.outline.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.outline.expect
new file mode 100644
index 0000000..1a5e8e7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.outline.expect
@@ -0,0 +1,17 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+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 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
+  ;
+static method methodCompound() → dynamic
+  ;
+static method main() → 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
new file mode 100644
index 0000000..ba765a9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.expect
@@ -0,0 +1,237 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+//   local2; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+//   local6; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+//   local2; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+//   local6; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+  T% local1;
+  late T% local2;
+  core::int local3;
+  late core::int local4;
+  asy::FutureOr<core::int> local5;
+  late asy::FutureOr<core::int> local6;
+  late T% local7 = value;
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+  local2; // error
+  ^^^^^^" in local2;
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4; // error
+  ^^^^^^" in local4;
+  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+  local6; // error
+  ^^^^^^" 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? {
+  T% local1;
+  late T% local2;
+  core::int local3;
+  late core::int local4;
+  asy::FutureOr<core::int> local5;
+  late asy::FutureOr<core::int> local6;
+  late T% local7 = value;
+  if(b) {
+    local1 = value;
+    local2 = value;
+    local3 = 0;
+    local4 = 0;
+    local5 = 0;
+    local6 = 0;
+    local7;
+  }
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  local2;
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  local4;
+  let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  local6;
+  local7;
+};
+static field () → core::Null? fieldCompound = () → core::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.
+  local3 += 0; // error
+  ^^^^^^" in local3).{core::num::+}(0);
+  local4 = (let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4 += 0; // error
+  ^^^^^^" in local4).{core::num::+}(0);
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+  self::methodDirect::T% local1;
+  late self::methodDirect::T% local2;
+  core::int local3;
+  late core::int local4;
+  asy::FutureOr<core::int> local5;
+  late asy::FutureOr<core::int> local6;
+  late self::methodDirect::T% local7 = value;
+  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+  local2; // error
+  ^^^^^^" in local2;
+  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4; // error
+  ^^^^^^" in local4;
+  let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+  local6; // error
+  ^^^^^^" in local6;
+  local7;
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+  self::methodConditional::T% local1;
+  late self::methodConditional::T% local2;
+  core::int local3;
+  late core::int local4;
+  asy::FutureOr<core::int> local5;
+  late asy::FutureOr<core::int> local6;
+  late self::methodConditional::T% local7 = value;
+  if(b) {
+    local1 = value;
+    local2 = value;
+    local3 = 0;
+    local4 = 0;
+    local5 = 0;
+    local6 = 0;
+    local7 = value;
+  }
+  let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  local2;
+  let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  local4;
+  let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  local6;
+  local7;
+}
+static method methodCompound() → dynamic {
+  core::int local3;
+  late core::int local4;
+  local3 = (let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3 += 0; // error
+  ^^^^^^" in local3).{core::num::+}(0);
+  local4 = (let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4 += 0; // error
+  ^^^^^^" in local4).{core::num::+}(0);
+}
+static method main() → dynamic {}
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
new file mode 100644
index 0000000..9f695f8
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.transformed.expect
@@ -0,0 +1,245 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+//   local2; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+//   local6; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+//   local2; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+//   local6; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+  T% local1;
+  late T% local2;
+  core::int local3;
+  late core::int local4;
+  asy::FutureOr<core::int> local5;
+  late asy::FutureOr<core::int> local6;
+  function #local7#initializer() → T%
+    return value;
+  late T% local7 = #local7#initializer.call();
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+  local2; // error
+  ^^^^^^" in local2;
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4; // error
+  ^^^^^^" in local4;
+  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+  local6; // error
+  ^^^^^^" 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? {
+  T% local1;
+  late T% local2;
+  core::int local3;
+  late core::int local4;
+  asy::FutureOr<core::int> local5;
+  late asy::FutureOr<core::int> local6;
+  function #local7#initializer() → T%
+    return value;
+  late T% local7 = #local7#initializer.call();
+  if(b) {
+    local1 = value;
+    local2 = value;
+    local3 = 0;
+    local4 = 0;
+    local5 = 0;
+    local6 = 0;
+    local7;
+  }
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  local2;
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  local4;
+  let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  local6;
+  local7;
+};
+static field () → core::Null? fieldCompound = () → core::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.
+  local3 += 0; // error
+  ^^^^^^" in local3).{core::num::+}(0);
+  local4 = (let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4 += 0; // error
+  ^^^^^^" in local4).{core::num::+}(0);
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+  self::methodDirect::T% local1;
+  late self::methodDirect::T% local2;
+  core::int local3;
+  late core::int local4;
+  asy::FutureOr<core::int> local5;
+  late asy::FutureOr<core::int> local6;
+  function #local7#initializer() → self::methodDirect::T%
+    return value;
+  late self::methodDirect::T% local7 = #local7#initializer.call();
+  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+  local2; // error
+  ^^^^^^" in local2;
+  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4; // error
+  ^^^^^^" in local4;
+  let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+  local6; // error
+  ^^^^^^" in local6;
+  local7;
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+  self::methodConditional::T% local1;
+  late self::methodConditional::T% local2;
+  core::int local3;
+  late core::int local4;
+  asy::FutureOr<core::int> local5;
+  late asy::FutureOr<core::int> local6;
+  function #local7#initializer() → self::methodConditional::T%
+    return value;
+  late self::methodConditional::T% local7 = #local7#initializer.call();
+  if(b) {
+    local1 = value;
+    local2 = value;
+    local3 = 0;
+    local4 = 0;
+    local5 = 0;
+    local6 = 0;
+    local7 = value;
+  }
+  let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  local2;
+  let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  local4;
+  let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  local6;
+  local7;
+}
+static method methodCompound() → dynamic {
+  core::int local3;
+  late core::int local4;
+  local3 = (let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3 += 0; // error
+  ^^^^^^" in local3).{core::num::+}(0);
+  local4 = (let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4 += 0; // error
+  ^^^^^^" in local4).{core::num::+}(0);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.expect
new file mode 100644
index 0000000..ba765a9
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.expect
@@ -0,0 +1,237 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+//   local2; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+//   local6; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+//   local2; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+//   local6; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+  T% local1;
+  late T% local2;
+  core::int local3;
+  late core::int local4;
+  asy::FutureOr<core::int> local5;
+  late asy::FutureOr<core::int> local6;
+  late T% local7 = value;
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+  local2; // error
+  ^^^^^^" in local2;
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4; // error
+  ^^^^^^" in local4;
+  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+  local6; // error
+  ^^^^^^" 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? {
+  T% local1;
+  late T% local2;
+  core::int local3;
+  late core::int local4;
+  asy::FutureOr<core::int> local5;
+  late asy::FutureOr<core::int> local6;
+  late T% local7 = value;
+  if(b) {
+    local1 = value;
+    local2 = value;
+    local3 = 0;
+    local4 = 0;
+    local5 = 0;
+    local6 = 0;
+    local7;
+  }
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  local2;
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  local4;
+  let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  local6;
+  local7;
+};
+static field () → core::Null? fieldCompound = () → core::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.
+  local3 += 0; // error
+  ^^^^^^" in local3).{core::num::+}(0);
+  local4 = (let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4 += 0; // error
+  ^^^^^^" in local4).{core::num::+}(0);
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+  self::methodDirect::T% local1;
+  late self::methodDirect::T% local2;
+  core::int local3;
+  late core::int local4;
+  asy::FutureOr<core::int> local5;
+  late asy::FutureOr<core::int> local6;
+  late self::methodDirect::T% local7 = value;
+  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+  local2; // error
+  ^^^^^^" in local2;
+  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4; // error
+  ^^^^^^" in local4;
+  let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+  local6; // error
+  ^^^^^^" in local6;
+  local7;
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+  self::methodConditional::T% local1;
+  late self::methodConditional::T% local2;
+  core::int local3;
+  late core::int local4;
+  asy::FutureOr<core::int> local5;
+  late asy::FutureOr<core::int> local6;
+  late self::methodConditional::T% local7 = value;
+  if(b) {
+    local1 = value;
+    local2 = value;
+    local3 = 0;
+    local4 = 0;
+    local5 = 0;
+    local6 = 0;
+    local7 = value;
+  }
+  let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  local2;
+  let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  local4;
+  let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  local6;
+  local7;
+}
+static method methodCompound() → dynamic {
+  core::int local3;
+  late core::int local4;
+  local3 = (let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3 += 0; // error
+  ^^^^^^" in local3).{core::num::+}(0);
+  local4 = (let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4 += 0; // error
+  ^^^^^^" in local4).{core::num::+}(0);
+}
+static method main() → dynamic {}
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
new file mode 100644
index 0000000..9f695f8
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.transformed.expect
@@ -0,0 +1,245 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+//   local2; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+//   local6; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+//   local2; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+//   local6; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+//   local1; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+//   local5; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+//   local3 += 0; // error
+//   ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+//   local4 += 0; // error
+//   ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+  T% local1;
+  late T% local2;
+  core::int local3;
+  late core::int local4;
+  asy::FutureOr<core::int> local5;
+  late asy::FutureOr<core::int> local6;
+  function #local7#initializer() → T%
+    return value;
+  late T% local7 = #local7#initializer.call();
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:34:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:35:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+  local2; // error
+  ^^^^^^" in local2;
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:36:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:37:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4; // error
+  ^^^^^^" in local4;
+  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:38:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:39:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+  local6; // error
+  ^^^^^^" 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? {
+  T% local1;
+  late T% local2;
+  core::int local3;
+  late core::int local4;
+  asy::FutureOr<core::int> local5;
+  late asy::FutureOr<core::int> local6;
+  function #local7#initializer() → T%
+    return value;
+  late T% local7 = #local7#initializer.call();
+  if(b) {
+    local1 = value;
+    local2 = value;
+    local3 = 0;
+    local4 = 0;
+    local5 = 0;
+    local6 = 0;
+    local7;
+  }
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:90:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  local2;
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:92:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  local4;
+  let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:94:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  local6;
+  local7;
+};
+static field () → core::Null? fieldCompound = () → core::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.
+  local3 += 0; // error
+  ^^^^^^" in local3).{core::num::+}(0);
+  local4 = (let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:112:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4 += 0; // error
+  ^^^^^^" in local4).{core::num::+}(0);
+};
+static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic {
+  self::methodDirect::T% local1;
+  late self::methodDirect::T% local2;
+  core::int local3;
+  late core::int local4;
+  asy::FutureOr<core::int> local5;
+  late asy::FutureOr<core::int> local6;
+  function #local7#initializer() → self::methodDirect::T%
+    return value;
+  late self::methodDirect::T% local7 = #local7#initializer.call();
+  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:16:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:17:3: Error: Non-nullable late variable 'local2' without initializer is definitely unassigned.
+  local2; // error
+  ^^^^^^" in local2;
+  let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:18:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:19:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4; // error
+  ^^^^^^" in local4;
+  let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:20:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:21:3: Error: Non-nullable late variable 'local6' without initializer is definitely unassigned.
+  local6; // error
+  ^^^^^^" in local6;
+  local7;
+}
+static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic {
+  self::methodConditional::T% local1;
+  late self::methodConditional::T% local2;
+  core::int local3;
+  late core::int local4;
+  asy::FutureOr<core::int> local5;
+  late asy::FutureOr<core::int> local6;
+  function #local7#initializer() → self::methodConditional::T%
+    return value;
+  late self::methodConditional::T% local7 = #local7#initializer.call();
+  if(b) {
+    local1 = value;
+    local2 = value;
+    local3 = 0;
+    local4 = 0;
+    local5 = 0;
+    local6 = 0;
+    local7 = value;
+  }
+  let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:62:3: Error: Non-nullable variable 'local1' must be assigned before it can be used.
+  local1; // error
+  ^^^^^^" in local1;
+  local2;
+  let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:64:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3; // error
+  ^^^^^^" in local3;
+  local4;
+  let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:66:3: Error: Non-nullable variable 'local5' must be assigned before it can be used.
+  local5; // error
+  ^^^^^^" in local5;
+  local6;
+  local7;
+}
+static method methodCompound() → dynamic {
+  core::int local3;
+  late core::int local4;
+  local3 = (let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:103:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
+  local3 += 0; // error
+  ^^^^^^" in local3).{core::num::+}(0);
+  local4 = (let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:104:3: Error: Non-nullable late variable 'local4' without initializer is definitely unassigned.
+  local4 += 0; // error
+  ^^^^^^" in local4).{core::num::+}(0);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.strong.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.strong.expect
index 1696100..3b6af6d 100644
--- a/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.strong.expect
@@ -1,4 +1,15 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:15:9: Error: Non-nullable late variable 'value' without initializer is definitely unassigned.
+//     bar(value); // Error.
+//         ^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:16:12: Error: Non-nullable late variable 'intValue' without initializer is definitely unassigned.
+//     barInt(intValue); // Error.
+//            ^^^^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,8 +22,12 @@
   method foo() → dynamic {
     late self::A::T% value;
     late core::int intValue;
-    this.{self::A::bar}(value);
-    this.{self::A::barInt}(intValue);
+    this.{self::A::bar}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:15:9: Error: Non-nullable late variable 'value' without initializer is definitely unassigned.
+    bar(value); // Error.
+        ^^^^^" in value);
+    this.{self::A::barInt}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:16:12: Error: Non-nullable late variable 'intValue' without initializer is definitely unassigned.
+    barInt(intValue); // Error.
+           ^^^^^^^^" in intValue);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.strong.transformed.expect
index 1696100..3b6af6d 100644
--- a/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.strong.transformed.expect
@@ -1,4 +1,15 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:15:9: Error: Non-nullable late variable 'value' without initializer is definitely unassigned.
+//     bar(value); // Error.
+//         ^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:16:12: Error: Non-nullable late variable 'intValue' without initializer is definitely unassigned.
+//     barInt(intValue); // Error.
+//            ^^^^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,8 +22,12 @@
   method foo() → dynamic {
     late self::A::T% value;
     late core::int intValue;
-    this.{self::A::bar}(value);
-    this.{self::A::barInt}(intValue);
+    this.{self::A::bar}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:15:9: Error: Non-nullable late variable 'value' without initializer is definitely unassigned.
+    bar(value); // Error.
+        ^^^^^" in value);
+    this.{self::A::barInt}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:16:12: Error: Non-nullable late variable 'intValue' without initializer is definitely unassigned.
+    barInt(intValue); // Error.
+           ^^^^^^^^" in intValue);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.weak.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.weak.expect
index 1696100..3b6af6d 100644
--- a/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.weak.expect
@@ -1,4 +1,15 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:15:9: Error: Non-nullable late variable 'value' without initializer is definitely unassigned.
+//     bar(value); // Error.
+//         ^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:16:12: Error: Non-nullable late variable 'intValue' without initializer is definitely unassigned.
+//     barInt(intValue); // Error.
+//            ^^^^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,8 +22,12 @@
   method foo() → dynamic {
     late self::A::T% value;
     late core::int intValue;
-    this.{self::A::bar}(value);
-    this.{self::A::barInt}(intValue);
+    this.{self::A::bar}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:15:9: Error: Non-nullable late variable 'value' without initializer is definitely unassigned.
+    bar(value); // Error.
+        ^^^^^" in value);
+    this.{self::A::barInt}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:16:12: Error: Non-nullable late variable 'intValue' without initializer is definitely unassigned.
+    barInt(intValue); // Error.
+           ^^^^^^^^" in intValue);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.weak.transformed.expect
index 1696100..3b6af6d 100644
--- a/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart.weak.transformed.expect
@@ -1,4 +1,15 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:15:9: Error: Non-nullable late variable 'value' without initializer is definitely unassigned.
+//     bar(value); // Error.
+//         ^^^^^
+//
+// pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:16:12: Error: Non-nullable late variable 'intValue' without initializer is definitely unassigned.
+//     barInt(intValue); // Error.
+//            ^^^^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
@@ -11,8 +22,12 @@
   method foo() → dynamic {
     late self::A::T% value;
     late core::int intValue;
-    this.{self::A::bar}(value);
-    this.{self::A::barInt}(intValue);
+    this.{self::A::bar}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:15:9: Error: Non-nullable late variable 'value' without initializer is definitely unassigned.
+    bar(value); // Error.
+        ^^^^^" in value);
+    this.{self::A::barInt}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned_late_local_variables.dart:16:12: Error: Non-nullable late variable 'intValue' without initializer is definitely unassigned.
+    barInt(intValue); // Error.
+           ^^^^^^^^" in intValue);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/forbidden_supers.dart.weak.expect b/pkg/front_end/testcases/nnbd/forbidden_supers.dart.weak.expect
index 7dd2f83..5fac846 100644
--- a/pkg/front_end/testcases/nnbd/forbidden_supers.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/forbidden_supers.dart.weak.expect
@@ -2,59 +2,59 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:12:7: Warning: Mixing in 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:12:7: Error: Can't mix 'Aoo' in because it's marked with '?'.
 // class Coo extends Boo with Aoo? {}
 //       ^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:14:7: Warning: Extending 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:14:7: Error: Can't extend 'Aoo' because it's marked with '?'.
 // class Doo extends Aoo? {}
 //       ^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:16:7: Warning: Implementing 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:16:7: Error: Can't implement 'Boo' because it's marked with '?'.
 // class Eoo implements Boo? {}
 //       ^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:18:7: Warning: Extending 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:18:7: Error: Can't extend 'Boo' because it's marked with '?'.
 // class Foo extends Boo? with Aoo {}
 //       ^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:20:7: Warning: Extending 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:20:7: Error: Can't extend 'Boo' because it's marked with '?'.
 // class Goo = Boo? with Aoo?;
 //       ^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:20:7: Warning: Mixing in 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:20:7: Error: Can't mix 'Aoo' in because it's marked with '?'.
 // class Goo = Boo? with Aoo?;
 //       ^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:22:7: Warning: Implementing 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:22:7: Error: Can't implement 'Boo' because it's marked with '?'.
 // class Hoo extends Object with Aoo implements Boo? {}
 //       ^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:24:7: Warning: Implementing 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:24:7: Error: Can't implement 'Boo' because it's marked with '?'.
 // class Ioo = Object with Aoo implements Boo?;
 //       ^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:32:7: Warning: Extending 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:32:7: Error: Can't extend 'Aoo' because it's marked with '?'.
 // mixin Moo1 on Aoo? implements Boo? {}
 //       ^^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:32:7: Warning: Implementing 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:32:7: Error: Can't implement 'Boo' because it's marked with '?'.
 // mixin Moo1 on Aoo? implements Boo? {}
 //       ^^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:34:7: Warning: Extending 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:34:7: Error: Can't extend 'Aoo' because it's marked with '?'.
 // mixin Moo2 on Aoo?, Boo? {}
 //       ^^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:34:7: Warning: Extending 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:34:7: Error: Can't extend 'Boo' because it's marked with '?'.
 // mixin Moo2 on Aoo?, Boo? {}
 //       ^^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:36:7: Warning: Implementing 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:36:7: Error: Can't implement 'Aoo' because it's marked with '?'.
 // mixin Moo3 implements Aoo?, Boo? {}
 //       ^^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:36:7: Warning: Implementing 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:36:7: Error: Can't implement 'Boo' because it's marked with '?'.
 // mixin Moo3 implements Aoo?, Boo? {}
 //       ^^^^
 //
diff --git a/pkg/front_end/testcases/nnbd/forbidden_supers.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/forbidden_supers.dart.weak.transformed.expect
index 2222d06..a6f6d2a 100644
--- a/pkg/front_end/testcases/nnbd/forbidden_supers.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/forbidden_supers.dart.weak.transformed.expect
@@ -2,59 +2,59 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:12:7: Warning: Mixing in 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:12:7: Error: Can't mix 'Aoo' in because it's marked with '?'.
 // class Coo extends Boo with Aoo? {}
 //       ^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:14:7: Warning: Extending 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:14:7: Error: Can't extend 'Aoo' because it's marked with '?'.
 // class Doo extends Aoo? {}
 //       ^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:16:7: Warning: Implementing 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:16:7: Error: Can't implement 'Boo' because it's marked with '?'.
 // class Eoo implements Boo? {}
 //       ^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:18:7: Warning: Extending 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:18:7: Error: Can't extend 'Boo' because it's marked with '?'.
 // class Foo extends Boo? with Aoo {}
 //       ^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:20:7: Warning: Extending 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:20:7: Error: Can't extend 'Boo' because it's marked with '?'.
 // class Goo = Boo? with Aoo?;
 //       ^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:20:7: Warning: Mixing in 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:20:7: Error: Can't mix 'Aoo' in because it's marked with '?'.
 // class Goo = Boo? with Aoo?;
 //       ^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:22:7: Warning: Implementing 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:22:7: Error: Can't implement 'Boo' because it's marked with '?'.
 // class Hoo extends Object with Aoo implements Boo? {}
 //       ^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:24:7: Warning: Implementing 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:24:7: Error: Can't implement 'Boo' because it's marked with '?'.
 // class Ioo = Object with Aoo implements Boo?;
 //       ^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:32:7: Warning: Extending 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:32:7: Error: Can't extend 'Aoo' because it's marked with '?'.
 // mixin Moo1 on Aoo? implements Boo? {}
 //       ^^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:32:7: Warning: Implementing 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:32:7: Error: Can't implement 'Boo' because it's marked with '?'.
 // mixin Moo1 on Aoo? implements Boo? {}
 //       ^^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:34:7: Warning: Extending 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:34:7: Error: Can't extend 'Aoo' because it's marked with '?'.
 // mixin Moo2 on Aoo?, Boo? {}
 //       ^^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:34:7: Warning: Extending 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:34:7: Error: Can't extend 'Boo' because it's marked with '?'.
 // mixin Moo2 on Aoo?, Boo? {}
 //       ^^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:36:7: Warning: Implementing 'Aoo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:36:7: Error: Can't implement 'Aoo' because it's marked with '?'.
 // mixin Moo3 implements Aoo?, Boo? {}
 //       ^^^^
 //
-// pkg/front_end/testcases/nnbd/forbidden_supers.dart:36:7: Warning: Implementing 'Boo' marked with '?'.
+// pkg/front_end/testcases/nnbd/forbidden_supers.dart:36:7: Error: Can't implement 'Boo' because it's marked with '?'.
 // mixin Moo3 implements Aoo?, Boo? {}
 //       ^^^^
 //
diff --git a/pkg/front_end/testcases/nnbd/forin.dart.weak.expect b/pkg/front_end/testcases/nnbd/forin.dart.weak.expect
index 36438f5..d6e6324 100644
--- a/pkg/front_end/testcases/nnbd/forin.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/forin.dart.weak.expect
@@ -2,47 +2,47 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/forin.dart:9:17: Warning: Assigning value of type 'Iterable<int>?' to a variable of type '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>'.
 //  - 'Iterable' is from 'dart:core'.
 //   for (int x in i2) x;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:10:18: Warning: Assigning value of type 'Iterable<int>?' to a variable of type '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>'.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in i2) x];
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:12:17: Warning: Assigning value of type 'List<int>?' to a variable of type '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>'.
 //  - '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: Warning: Assigning value of type 'List<int>?' to a variable of type '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>'.
 //  - 'List' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in l2) x];
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:15:17: Warning: Assigning value of type 'Object' to a variable of type 'Iterable<dynamic>'.
+// 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'.
 //  - 'Iterable' is from 'dart:core'.
 //   for (int x in o1) x;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:16:18: Warning: Assigning value of type 'Object' to a variable of type 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:16:18: Error: The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in o1) x];
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:18:17: Warning: Assigning value of type 'Object?' to a variable of type 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:18:17: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   for (int x in o2) x;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:19:18: Warning: Assigning value of type 'Object?' to a variable of type 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:19:18: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in o2) x];
@@ -52,68 +52,98 @@
 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 i2)
-    x;
-  block {
-    final core::List<core::int> #t1 = <core::int>[];
-    for (core::int x in i2)
-      #t1.{core::List::add}(x);
-  } =>#t1;
-  for (core::int x in l2)
+  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>'.
+ - '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 l2)
+    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>'.
+ - '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;
-  for (final dynamic #t3 in o1 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
-    core::int x = #t3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+  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>'.
+ - 'List' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+  for (int x in l2) x;
+                ^" in l2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>)
+    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>'.
+ - '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;
+  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'.
+ - 'Iterable' is from 'dart:core'.
+  for (int x in o1) x;
+                ^" in o1 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
+    core::int x = #t7 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
     x;
   }
   block {
-    final core::List<core::int> #t4 = <core::int>[];
-    for (final dynamic #t5 in o1 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
-      core::int x = #t5 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-      #t4.{core::List::add}(x);
+    final core::List<core::int> #t9 = <core::int>[];
+    for (final dynamic #t10 in let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:16:18: Error: The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Object' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+  [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);
     }
-  } =>#t4;
-  for (final dynamic #t6 in o2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
-    core::int x = #t6 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+  } =>#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>'.
+ - 'Object' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+  for (int x in o2) x;
+                ^" in o2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
+    core::int x = #t12 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
     x;
   }
   block {
-    final core::List<core::int> #t7 = <core::int>[];
-    for (final dynamic #t8 in o2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>) {
-      core::int x = #t8 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-      #t7.{core::List::add}(x);
+    final core::List<core::int> #t14 = <core::int>[];
+    for (final dynamic #t15 in let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:19:18: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Object' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+  [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);
     }
-  } =>#t7;
+  } =>#t14;
 }
 static method ok(core::Iterable<core::int> i1, core::List<core::int> l1, dynamic d) → dynamic {
   for (core::int x in i1)
     x;
   block {
-    final core::List<core::int> #t9 = <core::int>[];
+    final core::List<core::int> #t17 = <core::int>[];
     for (core::int x in i1)
-      #t9.{core::List::add}(x);
-  } =>#t9;
+      #t17.{core::List::add}(x);
+  } =>#t17;
   for (core::int x in l1)
     x;
   block {
-    final core::List<core::int> #t10 = <core::int>[];
+    final core::List<core::int> #t18 = <core::int>[];
     for (core::int x in l1)
-      #t10.{core::List::add}(x);
-  } =>#t10;
-  for (final dynamic #t11 in d as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
-    core::int x = #t11 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+      #t18.{core::List::add}(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;
     x;
   }
   block {
-    final core::List<core::int> #t12 = <core::int>[];
-    for (final dynamic #t13 in d as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>) {
-      core::int x = #t13 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-      #t12.{core::List::add}(x);
+    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);
     }
-  } =>#t12;
+  } =>#t20;
 }
 static method main() → dynamic {}
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 d263365..b65a75c 100644
--- a/pkg/front_end/testcases/nnbd/forin.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/forin.dart.weak.transformed.expect
@@ -2,47 +2,47 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/forin.dart:9:17: Warning: Assigning value of type 'Iterable<int>?' to a variable of type '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>'.
 //  - 'Iterable' is from 'dart:core'.
 //   for (int x in i2) x;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:10:18: Warning: Assigning value of type 'Iterable<int>?' to a variable of type '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>'.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in i2) x];
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:12:17: Warning: Assigning value of type 'List<int>?' to a variable of type '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>'.
 //  - '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: Warning: Assigning value of type 'List<int>?' to a variable of type '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>'.
 //  - 'List' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in l2) x];
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:15:17: Warning: Assigning value of type 'Object' to a variable of type 'Iterable<dynamic>'.
+// 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'.
 //  - 'Iterable' is from 'dart:core'.
 //   for (int x in o1) x;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:16:18: Warning: Assigning value of type 'Object' to a variable of type 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:16:18: Error: The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in o1) x];
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:18:17: Warning: Assigning value of type 'Object?' to a variable of type 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:18:17: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   for (int x in o2) x;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/forin.dart:19:18: Warning: Assigning value of type 'Object?' to a variable of type 'Iterable<dynamic>'.
+// pkg/front_end/testcases/nnbd/forin.dart:19:18: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
 //  - 'Object' is from 'dart:core'.
 //  - 'Iterable' is from 'dart:core'.
 //   [for (int x in o2) x];
@@ -54,24 +54,10 @@
 
 static method error(core::Iterable<core::int>? i2, core::List<core::int>? l2, core::Object o1, core::Object? o2) → dynamic {
   {
-    core::Iterator<core::int>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int>*>(i2).{core::Iterable::iterator};
-    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-      core::int x = :sync-for-iterator.{core::Iterator::current};
-      x;
-    }
-  }
-  block {
-    final core::List<core::int> #t1 = <core::int>[];
-    {
-      core::Iterator<core::int>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int>*>(i2).{core::Iterable::iterator};
-      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        core::int x = :sync-for-iterator.{core::Iterator::current};
-        #t1.{core::List::add}(x);
-      }
-    }
-  } =>#t1;
-  {
-    core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(l2).{core::Iterable::iterator};
+    core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(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>'.
+ - 'Iterable' is from 'dart:core'.
+  for (int x in i2) x;
+                ^" in i2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
       core::int x = :sync-for-iterator.{core::Iterator::current};
       x;
@@ -80,7 +66,10 @@
   block {
     final core::List<core::int> #t2 = <core::int>[];
     {
-      core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(l2).{core::Iterable::iterator};
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(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>'.
+ - 'Iterable' is from 'dart:core'.
+  [for (int x in i2) x];
+                 ^" in i2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int x = :sync-for-iterator.{core::Iterator::current};
         #t2.{core::List::add}(x);
@@ -88,51 +77,92 @@
     }
   } =>#t2;
   {
-    core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(o1 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
+    core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(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>'.
+ - 'List' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+  for (int x in l2) x;
+                ^" in l2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-      final dynamic #t3 = :sync-for-iterator.{core::Iterator::current};
-      {
-        core::int x = #t3 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-        x;
-      }
+      core::int x = :sync-for-iterator.{core::Iterator::current};
+      x;
     }
   }
   block {
-    final core::List<core::int> #t4 = <core::int>[];
+    final core::List<core::int> #t5 = <core::int>[];
     {
-      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(o1 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(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>'.
+ - 'List' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+  [for (int x in l2) x];
+                 ^" in l2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t5 = :sync-for-iterator.{core::Iterator::current};
-        {
-          core::int x = #t5 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-          #t4.{core::List::add}(x);
-        }
+        core::int x = :sync-for-iterator.{core::Iterator::current};
+        #t5.{core::List::add}(x);
       }
     }
-  } =>#t4;
+  } =>#t5;
   {
-    core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(o2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
+    core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(let final<BottomType> #t7 = 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'.
+ - 'Iterable' is from 'dart:core'.
+  for (int x in o1) x;
+                ^" in o1 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-      final dynamic #t6 = :sync-for-iterator.{core::Iterator::current};
+      final dynamic #t8 = :sync-for-iterator.{core::Iterator::current};
       {
-        core::int x = #t6 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+        core::int x = #t8 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
         x;
       }
     }
   }
   block {
-    final core::List<core::int> #t7 = <core::int>[];
+    final core::List<core::int> #t9 = <core::int>[];
     {
-      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(o2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:16:18: Error: The type 'Object' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Object' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+  [for (int x in o1) x];
+                 ^" in o1 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t8 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t11 = :sync-for-iterator.{core::Iterator::current};
         {
-          core::int x = #t8 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-          #t7.{core::List::add}(x);
+          core::int x = #t11 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+          #t9.{core::List::add}(x);
         }
       }
     }
-  } =>#t7;
+  } =>#t9;
+  {
+    core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:18:17: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Object' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+  for (int x in o2) x;
+                ^" in o2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
+    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+      final dynamic #t13 = :sync-for-iterator.{core::Iterator::current};
+      {
+        core::int x = #t13 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+        x;
+      }
+    }
+  }
+  block {
+    final core::List<core::int> #t14 = <core::int>[];
+    {
+      core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/nnbd/forin.dart:19:18: Error: The type 'Object?' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Object' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+  [for (int x in o2) x];
+                 ^" in o2 as{TypeError,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
+      for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
+        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;
 }
 static method ok(core::Iterable<core::int> i1, core::List<core::int> l1, dynamic d) → dynamic {
   {
@@ -143,15 +173,15 @@
     }
   }
   block {
-    final core::List<core::int> #t9 = <core::int>[];
+    final core::List<core::int> #t17 = <core::int>[];
     {
       core::Iterator<core::int>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int>*>(i1).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int x = :sync-for-iterator.{core::Iterator::current};
-        #t9.{core::List::add}(x);
+        #t17.{core::List::add}(x);
       }
     }
-  } =>#t9;
+  } =>#t17;
   {
     core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(l1).{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -160,37 +190,37 @@
     }
   }
   block {
-    final core::List<core::int> #t10 = <core::int>[];
+    final core::List<core::int> #t18 = <core::int>[];
     {
       core::Iterator<core::int*>* :sync-for-iterator = _in::unsafeCast<core::Iterable<core::int*>*>(l1).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         core::int x = :sync-for-iterator.{core::Iterator::current};
-        #t10.{core::List::add}(x);
+        #t18.{core::List::add}(x);
       }
     }
-  } =>#t10;
+  } =>#t18;
   {
     core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(d as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
     for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-      final dynamic #t11 = :sync-for-iterator.{core::Iterator::current};
+      final dynamic #t19 = :sync-for-iterator.{core::Iterator::current};
       {
-        core::int x = #t11 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+        core::int x = #t19 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
         x;
       }
     }
   }
   block {
-    final core::List<core::int> #t12 = <core::int>[];
+    final core::List<core::int> #t20 = <core::int>[];
     {
       core::Iterator<dynamic>* :sync-for-iterator = _in::unsafeCast<core::Iterable<dynamic>*>(d as{TypeError,ForDynamic,ForNonNullableByDefault} core::Iterable<dynamic>).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-        final dynamic #t13 = :sync-for-iterator.{core::Iterator::current};
+        final dynamic #t21 = :sync-for-iterator.{core::Iterator::current};
         {
-          core::int x = #t13 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
-          #t12.{core::List::add}(x);
+          core::int x = #t21 as{TypeError,ForDynamic,ForNonNullableByDefault} core::int;
+          #t20.{core::List::add}(x);
         }
       }
     }
-  } =>#t12;
+  } =>#t20;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in.dart.weak.expect b/pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in.dart.weak.expect
index 1e36767..2ab45fe 100644
--- a/pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in.dart.weak.expect
@@ -47,12 +47,12 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in_lib.dart:11:9: Warning: Field 'field5' isn't initialized and its type 'C<int?>' doesn't allow null.
+// pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in_lib.dart:11:9: Error: Field 'field5' should be initialized because its type 'C<int?>' doesn't allow null.
 //  - 'C' is from 'pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in_lib.dart'.
 // C<int?> field5;
 //         ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in_lib.dart:13:5: Warning: Field 'field7' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in_lib.dart:13:5: Error: Field 'field7' should be initialized because its type 'int' doesn't allow null.
 // int field7;
 //     ^^^^^^
 //
diff --git a/pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in.dart.weak.transformed.expect
index 81342ac..755f2c9 100644
--- a/pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in.dart.weak.transformed.expect
@@ -47,12 +47,12 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in_lib.dart:11:9: Warning: Field 'field5' isn't initialized and its type 'C<int?>' doesn't allow null.
+// pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in_lib.dart:11:9: Error: Field 'field5' should be initialized because its type 'C<int?>' doesn't allow null.
 //  - 'C' is from 'pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in_lib.dart'.
 // C<int?> field5;
 //         ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in_lib.dart:13:5: Warning: Field 'field7' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/infer_constraints_from_opt_in_lib.dart:13:5: Error: Field 'field7' should be initialized because its type 'int' doesn't allow null.
 // int field7;
 //     ^^^^^^
 //
diff --git a/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart
new file mode 100644
index 0000000..99b6bc0
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_from_late_variable.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.
+
+T f<T>(T t) => t;
+
+main() {
+  late int local;
+  local = f(0);
+}
diff --git a/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.outline.expect b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.outline.expect
new file mode 100644
index 0000000..b6346e7
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.outline.expect
@@ -0,0 +1,8 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.strong.expect b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.strong.expect
new file mode 100644
index 0000000..954dd07
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.strong.expect
@@ -0,0 +1,10 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+  return t;
+static method main() → dynamic {
+  late core::int local;
+  local = self::f<core::int>(0);
+}
diff --git a/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.strong.transformed.expect
new file mode 100644
index 0000000..954dd07
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.strong.transformed.expect
@@ -0,0 +1,10 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+  return t;
+static method main() → dynamic {
+  late core::int local;
+  local = self::f<core::int>(0);
+}
diff --git a/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.weak.expect b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.weak.expect
new file mode 100644
index 0000000..954dd07
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.weak.expect
@@ -0,0 +1,10 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+  return t;
+static method main() → dynamic {
+  late core::int local;
+  local = self::f<core::int>(0);
+}
diff --git a/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.weak.transformed.expect
new file mode 100644
index 0000000..954dd07
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/infer_from_late_variable.dart.weak.transformed.expect
@@ -0,0 +1,10 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+static method f<T extends core::Object? = dynamic>(self::f::T% t) → self::f::T%
+  return t;
+static method main() → dynamic {
+  late core::int local;
+  local = self::f<core::int>(0);
+}
diff --git a/pkg/front_end/testcases/nnbd/issue39659.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue39659.dart.weak.expect
index 0579729..910ce4f 100644
--- a/pkg/front_end/testcases/nnbd/issue39659.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue39659.dart.weak.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue39659.dart:8:9: Warning: Throwing a value of 'String?' that is neither dynamic nor non-nullable.
+// pkg/front_end/testcases/nnbd/issue39659.dart:8:9: Error: Can't throw a value of 'String?' since it is neither dynamic nor non-nullable.
 //   throw bar();
 //         ^
 //
@@ -10,7 +10,9 @@
 import "dart:core" as core;
 
 static method foo() → dynamic {
-  throw self::bar();
+  invalid-expression "pkg/front_end/testcases/nnbd/issue39659.dart:8:9: Error: Can't throw a value of 'String?' since it is neither dynamic nor non-nullable.
+  throw bar();
+        ^";
 }
 static method bar() → core::String?
   return "asdf";
diff --git a/pkg/front_end/testcases/nnbd/issue39659.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue39659.dart.weak.transformed.expect
index 0579729..910ce4f 100644
--- a/pkg/front_end/testcases/nnbd/issue39659.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue39659.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue39659.dart:8:9: Warning: Throwing a value of 'String?' that is neither dynamic nor non-nullable.
+// pkg/front_end/testcases/nnbd/issue39659.dart:8:9: Error: Can't throw a value of 'String?' since it is neither dynamic nor non-nullable.
 //   throw bar();
 //         ^
 //
@@ -10,7 +10,9 @@
 import "dart:core" as core;
 
 static method foo() → dynamic {
-  throw self::bar();
+  invalid-expression "pkg/front_end/testcases/nnbd/issue39659.dart:8:9: Error: Can't throw a value of 'String?' since it is neither dynamic nor non-nullable.
+  throw bar();
+        ^";
 }
 static method bar() → core::String?
   return "asdf";
diff --git a/pkg/front_end/testcases/nnbd/issue40600.dart b/pkg/front_end/testcases/nnbd/issue40600.dart
index 270b693..41bdab6 100644
--- a/pkg/front_end/testcases/nnbd/issue40600.dart
+++ b/pkg/front_end/testcases/nnbd/issue40600.dart
@@ -20,11 +20,11 @@
 }
 
 class C<T> {
-  FutureOr<T> baz<X extends FutureOr<T>>(FutureOr<T> x) {}
+  FutureOr<T> baz<X extends FutureOr<T>>(FutureOr<T> x) => x;
 }
 
 class D<T> extends C<T> {
-  FutureOr<T> baz<X extends FutureOr<T>>(FutureOr<T> x) {}
+  FutureOr<T> baz<X extends FutureOr<T>>(FutureOr<T> x) => x;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue40600.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue40600.dart.strong.expect
index fc667aa..df7df7b 100644
--- a/pkg/front_end/testcases/nnbd/issue40600.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue40600.dart.strong.expect
@@ -26,13 +26,15 @@
   synthetic constructor •() → self::C<self::C::T%>
     : super core::Object::•()
     ;
-  method baz<generic-covariant-impl X extends asy::FutureOr<self::C::T%> = asy::FutureOr<self::C::T%>>(generic-covariant-impl asy::FutureOr<self::C::T%> x) → asy::FutureOr<self::C::T%> {}
+  method baz<generic-covariant-impl X extends asy::FutureOr<self::C::T%> = asy::FutureOr<self::C::T%>>(generic-covariant-impl asy::FutureOr<self::C::T%> x) → asy::FutureOr<self::C::T%>
+    return x;
 }
 class D<T extends core::Object? = dynamic> extends self::C<self::D::T%> {
   synthetic constructor •() → self::D<self::D::T%>
     : super self::C::•()
     ;
-  method baz<generic-covariant-impl X extends asy::FutureOr<self::D::T%> = asy::FutureOr<self::D::T%>>(generic-covariant-impl asy::FutureOr<self::D::T%> x) → asy::FutureOr<self::D::T%> {}
+  method baz<generic-covariant-impl X extends asy::FutureOr<self::D::T%> = asy::FutureOr<self::D::T%>>(generic-covariant-impl asy::FutureOr<self::D::T%> x) → asy::FutureOr<self::D::T%>
+    return x;
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd/issue40600.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue40600.dart.strong.transformed.expect
index fc667aa..df7df7b 100644
--- a/pkg/front_end/testcases/nnbd/issue40600.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue40600.dart.strong.transformed.expect
@@ -26,13 +26,15 @@
   synthetic constructor •() → self::C<self::C::T%>
     : super core::Object::•()
     ;
-  method baz<generic-covariant-impl X extends asy::FutureOr<self::C::T%> = asy::FutureOr<self::C::T%>>(generic-covariant-impl asy::FutureOr<self::C::T%> x) → asy::FutureOr<self::C::T%> {}
+  method baz<generic-covariant-impl X extends asy::FutureOr<self::C::T%> = asy::FutureOr<self::C::T%>>(generic-covariant-impl asy::FutureOr<self::C::T%> x) → asy::FutureOr<self::C::T%>
+    return x;
 }
 class D<T extends core::Object? = dynamic> extends self::C<self::D::T%> {
   synthetic constructor •() → self::D<self::D::T%>
     : super self::C::•()
     ;
-  method baz<generic-covariant-impl X extends asy::FutureOr<self::D::T%> = asy::FutureOr<self::D::T%>>(generic-covariant-impl asy::FutureOr<self::D::T%> x) → asy::FutureOr<self::D::T%> {}
+  method baz<generic-covariant-impl X extends asy::FutureOr<self::D::T%> = asy::FutureOr<self::D::T%>>(generic-covariant-impl asy::FutureOr<self::D::T%> x) → asy::FutureOr<self::D::T%>
+    return x;
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd/issue40600.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue40600.dart.weak.expect
index fc667aa..df7df7b 100644
--- a/pkg/front_end/testcases/nnbd/issue40600.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue40600.dart.weak.expect
@@ -26,13 +26,15 @@
   synthetic constructor •() → self::C<self::C::T%>
     : super core::Object::•()
     ;
-  method baz<generic-covariant-impl X extends asy::FutureOr<self::C::T%> = asy::FutureOr<self::C::T%>>(generic-covariant-impl asy::FutureOr<self::C::T%> x) → asy::FutureOr<self::C::T%> {}
+  method baz<generic-covariant-impl X extends asy::FutureOr<self::C::T%> = asy::FutureOr<self::C::T%>>(generic-covariant-impl asy::FutureOr<self::C::T%> x) → asy::FutureOr<self::C::T%>
+    return x;
 }
 class D<T extends core::Object? = dynamic> extends self::C<self::D::T%> {
   synthetic constructor •() → self::D<self::D::T%>
     : super self::C::•()
     ;
-  method baz<generic-covariant-impl X extends asy::FutureOr<self::D::T%> = asy::FutureOr<self::D::T%>>(generic-covariant-impl asy::FutureOr<self::D::T%> x) → asy::FutureOr<self::D::T%> {}
+  method baz<generic-covariant-impl X extends asy::FutureOr<self::D::T%> = asy::FutureOr<self::D::T%>>(generic-covariant-impl asy::FutureOr<self::D::T%> x) → asy::FutureOr<self::D::T%>
+    return x;
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd/issue40600.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue40600.dart.weak.transformed.expect
index fc667aa..df7df7b 100644
--- a/pkg/front_end/testcases/nnbd/issue40600.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue40600.dart.weak.transformed.expect
@@ -26,13 +26,15 @@
   synthetic constructor •() → self::C<self::C::T%>
     : super core::Object::•()
     ;
-  method baz<generic-covariant-impl X extends asy::FutureOr<self::C::T%> = asy::FutureOr<self::C::T%>>(generic-covariant-impl asy::FutureOr<self::C::T%> x) → asy::FutureOr<self::C::T%> {}
+  method baz<generic-covariant-impl X extends asy::FutureOr<self::C::T%> = asy::FutureOr<self::C::T%>>(generic-covariant-impl asy::FutureOr<self::C::T%> x) → asy::FutureOr<self::C::T%>
+    return x;
 }
 class D<T extends core::Object? = dynamic> extends self::C<self::D::T%> {
   synthetic constructor •() → self::D<self::D::T%>
     : super self::C::•()
     ;
-  method baz<generic-covariant-impl X extends asy::FutureOr<self::D::T%> = asy::FutureOr<self::D::T%>>(generic-covariant-impl asy::FutureOr<self::D::T%> x) → asy::FutureOr<self::D::T%> {}
+  method baz<generic-covariant-impl X extends asy::FutureOr<self::D::T%> = asy::FutureOr<self::D::T%>>(generic-covariant-impl asy::FutureOr<self::D::T%> x) → asy::FutureOr<self::D::T%>
+    return x;
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd/issue40601.dart b/pkg/front_end/testcases/nnbd/issue40601.dart
new file mode 100644
index 0000000..56ae989
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40601.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.
+
+abstract class A<T> {
+  T baz();
+  bar(T value) {}
+  foo() {
+    late T value;
+    var result = () => bar(value);
+    (() {
+      value = baz();
+    })();
+    return result;
+  }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/issue40601.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue40601.dart.outline.expect
new file mode 100644
index 0000000..f2c5efd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40601.dart.outline.expect
@@ -0,0 +1,15 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    ;
+  abstract method baz() → self::A::T%;
+  method bar(generic-covariant-impl self::A::T% value) → dynamic
+    ;
+  method foo() → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue40601.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue40601.dart.strong.expect
new file mode 100644
index 0000000..3d1b60c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40601.dart.strong.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  abstract method baz() → self::A::T%;
+  method bar(generic-covariant-impl self::A::T% value) → dynamic {}
+  method foo() → dynamic {
+    late self::A::T% value;
+    () → dynamic result = () → dynamic => this.{self::A::bar}(value);
+    (() → core::Null? {
+      value = this.{self::A::baz}();
+    }).call();
+    return result;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40601.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue40601.dart.strong.transformed.expect
new file mode 100644
index 0000000..3d1b60c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40601.dart.strong.transformed.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  abstract method baz() → self::A::T%;
+  method bar(generic-covariant-impl self::A::T% value) → dynamic {}
+  method foo() → dynamic {
+    late self::A::T% value;
+    () → dynamic result = () → dynamic => this.{self::A::bar}(value);
+    (() → core::Null? {
+      value = this.{self::A::baz}();
+    }).call();
+    return result;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40601.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue40601.dart.weak.expect
new file mode 100644
index 0000000..3d1b60c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40601.dart.weak.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  abstract method baz() → self::A::T%;
+  method bar(generic-covariant-impl self::A::T% value) → dynamic {}
+  method foo() → dynamic {
+    late self::A::T% value;
+    () → dynamic result = () → dynamic => this.{self::A::bar}(value);
+    (() → core::Null? {
+      value = this.{self::A::baz}();
+    }).call();
+    return result;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40601.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue40601.dart.weak.transformed.expect
new file mode 100644
index 0000000..3d1b60c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue40601.dart.weak.transformed.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object? = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T%>
+    : super core::Object::•()
+    ;
+  abstract method baz() → self::A::T%;
+  method bar(generic-covariant-impl self::A::T% value) → dynamic {}
+  method foo() → dynamic {
+    late self::A::T% value;
+    () → dynamic result = () → dynamic => this.{self::A::bar}(value);
+    (() → core::Null? {
+      value = this.{self::A::baz}();
+    }).call();
+    return result;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart b/pkg/front_end/testcases/nnbd/issue41102.dart
new file mode 100644
index 0000000..f10ab27
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41102.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.
+
+import 'dart:async';
+
+void main() {}
+
+final t = StreamTransformer.fromHandlers(
+    handleData: (data, sink) => Future.microtask(() => sink.add(data)),
+    handleDone: (sink) => Future.microtask(() => sink.close()));
+
+final s1 = [];
+
+final s2 = s1?.length;
+
+final s3 = new List<int>(2);
+
+final s4 = () {
+  var e = 0;
+  switch (e) {
+    case 0:
+      print('fallthrough');
+    case 1:
+    case '':
+  }
+}();
+
+int? s5;
+
+final s6 = s5 + 0;
+
+List? s7;
+
+final s8 = s7[0];
+
+final s9 = s7[0] = 0;
+
+final s10 = s7.length;
+
+final s11 = s5.length = 0;
+
+final s12 = -s5;
+
+int Function()? s13;
+
+final s14 = (s13)();
+
+final s15 = throw null;
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.outline.expect
new file mode 100644
index 0000000..ea7aadc
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.outline.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static final field asy::StreamTransformer<dynamic, dynamic> t;
+static final field core::List<dynamic> s1;
+static final field core::int? s2;
+static final field core::List<core::int> s3;
+static final field dynamic s4;
+static field core::int? s5;
+static final field core::int? s6;
+static field core::List<dynamic>? s7;
+static final field dynamic s8;
+static final field core::int s9;
+static final field core::int s10;
+static final field core::int s11;
+static final field core::int s12;
+static field () →? core::int s13;
+static final field core::int s14;
+static final field Never s15;
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect
new file mode 100644
index 0000000..7157bfd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect
@@ -0,0 +1,138 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:15:12: Warning: Operand of null-aware operation '?.' has type 'List<dynamic>' which excludes null.
+//  - 'List' is from 'dart:core'.
+// final s2 = s1?.length;
+//            ^
+//
+// 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);
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:22:5: Error: Switch case may fall through to the next case.
+//     case 0:
+//     ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:25:10: Error: Type 'String' of the case expression is not a subtype of type 'int' of this switch expression.
+//     case '':
+//          ^
+// pkg/front_end/testcases/nnbd/issue41102.dart:21:11: Context: The switch expression is here.
+//   switch (e) {
+//           ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+// final s6 = s5 + 0;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:35:14: Error: Operator '[]' cannot be called on 'List<dynamic>?' because it is potentially null.
+//  - 'List' is from 'dart:core'.
+// final s8 = s7[0];
+//              ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:37:14: Error: Operator '[]=' cannot be called on 'List<dynamic>?' because it is potentially null.
+//  - 'List' is from 'dart:core'.
+// final s9 = s7[0] = 0;
+//              ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:39:16: Error: Property 'length' cannot be accessed on 'List<dynamic>?' because it is potentially null.
+//  - 'List' is from 'dart:core'.
+// Try accessing using ?. instead.
+// final s10 = s7.length;
+//                ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: The setter 'length' isn't defined for the class 'int?'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'length'.
+// final s11 = s5.length = 0;
+//                ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: Property 'length' cannot be accessed on 'int?' because it is potentially null.
+// Try accessing using ?. instead.
+// final s11 = s5.length = 0;
+//                ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:43:13: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+// final s12 = -s5;
+//             ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:47:18: Error: Can't use an expression of type 'int Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
+// final s14 = (s13)();
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:49:19: Error: Can't throw a value of 'Null?' since it is neither dynamic nor non-nullable.
+// final s15 = throw null;
+//                   ^
+//
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static final field asy::StreamTransformer<dynamic, dynamic> t = new asy::_StreamHandlerTransformer::•<dynamic, dynamic>(handleData: (dynamic data, asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<dynamic> sink) → asy::Future<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? {
+  core::int e = 0;
+  switch(e) {
+    #L1:
+    case #C1:
+      {
+        core::print("fallthrough");
+      }
+    #L2:
+    case #C2:
+    case #C3:
+      {}
+  }
+}).call();
+static field core::int? s5;
+static final field core::int? s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+final s6 = s5 + 0;
+              ^" in self::s5.{core::num::+}(0);
+static field core::List<dynamic>? s7;
+static final field dynamic s8 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:35:14: Error: Operator '[]' cannot be called on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+final s8 = s7[0];
+             ^" in self::s7.{core::List::[]}(0);
+static final field core::int s9 = let final core::List<dynamic>? #t5 = self::s7 in let final core::int #t6 = 0 in let final core::int #t7 = 0 in let final void #t8 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:37:14: Error: Operator '[]=' cannot be called on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+final s9 = s7[0] = 0;
+             ^" in #t5.{core::List::[]=}(#t6, #t7) in #t7;
+static final field core::int s10 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:39:16: Error: Property 'length' cannot be accessed on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+Try accessing using ?. instead.
+final s10 = s7.length;
+               ^^^^^^" in self::s7.{core::List::length};
+static final field core::int s11 = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: Property 'length' cannot be accessed on 'int?' because it is potentially null.
+Try accessing using ?. instead.
+final s11 = s5.length = 0;
+               ^^^^^^" in invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: The setter 'length' isn't defined for the class 'int?'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'length'.
+final s11 = s5.length = 0;
+               ^^^^^^";
+static final field core::int s12 = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:43:13: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+final s12 = -s5;
+            ^" in self::s5.{core::int::unary-}();
+static field () →? core::int s13;
+static final field core::int s14 = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:47:18: Error: Can't use an expression of type 'int Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+final s14 = (s13)();
+                 ^" in self::s13.call();
+static final field Never s15 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:49:19: Error: Can't throw a value of 'Null?' since it is neither dynamic nor non-nullable.
+final s15 = throw null;
+                  ^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never;
+static method main() → void {}
+
+constants  {
+  #C1 = 0
+  #C2 = 1
+  #C3 = ""
+}
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
new file mode 100644
index 0000000..d888b44
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
@@ -0,0 +1,138 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:15:12: Warning: Operand of null-aware operation '?.' has type 'List<dynamic>' which excludes null.
+//  - 'List' is from 'dart:core'.
+// final s2 = s1?.length;
+//            ^
+//
+// 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);
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:22:5: Error: Switch case may fall through to the next case.
+//     case 0:
+//     ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:25:10: Error: Type 'String' of the case expression is not a subtype of type 'int' of this switch expression.
+//     case '':
+//          ^
+// pkg/front_end/testcases/nnbd/issue41102.dart:21:11: Context: The switch expression is here.
+//   switch (e) {
+//           ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+// final s6 = s5 + 0;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:35:14: Error: Operator '[]' cannot be called on 'List<dynamic>?' because it is potentially null.
+//  - 'List' is from 'dart:core'.
+// final s8 = s7[0];
+//              ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:37:14: Error: Operator '[]=' cannot be called on 'List<dynamic>?' because it is potentially null.
+//  - 'List' is from 'dart:core'.
+// final s9 = s7[0] = 0;
+//              ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:39:16: Error: Property 'length' cannot be accessed on 'List<dynamic>?' because it is potentially null.
+//  - 'List' is from 'dart:core'.
+// Try accessing using ?. instead.
+// final s10 = s7.length;
+//                ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: The setter 'length' isn't defined for the class 'int?'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'length'.
+// final s11 = s5.length = 0;
+//                ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: Property 'length' cannot be accessed on 'int?' because it is potentially null.
+// Try accessing using ?. instead.
+// final s11 = s5.length = 0;
+//                ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:43:13: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+// final s12 = -s5;
+//             ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:47:18: Error: Can't use an expression of type 'int Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
+// final s14 = (s13)();
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:49:19: Error: Can't throw a value of 'Null?' since it is neither dynamic nor non-nullable.
+// final s15 = throw null;
+//                   ^
+//
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static final field asy::StreamTransformer<dynamic, dynamic> t = new asy::_StreamHandlerTransformer::•<dynamic, dynamic>(handleData: (dynamic data, asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<dynamic> sink) → asy::Future<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? {
+  core::int e = 0;
+  switch(e) {
+    #L1:
+    case #C1:
+      {
+        core::print("fallthrough");
+      }
+    #L2:
+    case #C2:
+    case #C3:
+      {}
+  }
+}).call();
+static field core::int? s5;
+static final field core::int? s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+final s6 = s5 + 0;
+              ^" in self::s5.{core::num::+}(0);
+static field core::List<dynamic>? s7;
+static final field dynamic s8 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:35:14: Error: Operator '[]' cannot be called on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+final s8 = s7[0];
+             ^" in self::s7.{core::List::[]}(0);
+static final field core::int s9 = let final core::List<dynamic>? #t5 = self::s7 in let final core::int #t6 = 0 in let final core::int #t7 = 0 in let final void #t8 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:37:14: Error: Operator '[]=' cannot be called on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+final s9 = s7[0] = 0;
+             ^" in #t5.{core::List::[]=}(#t6, #t7) in #t7;
+static final field core::int s10 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:39:16: Error: Property 'length' cannot be accessed on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+Try accessing using ?. instead.
+final s10 = s7.length;
+               ^^^^^^" in self::s7.{core::List::length};
+static final field core::int s11 = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: Property 'length' cannot be accessed on 'int?' because it is potentially null.
+Try accessing using ?. instead.
+final s11 = s5.length = 0;
+               ^^^^^^" in invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: The setter 'length' isn't defined for the class 'int?'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'length'.
+final s11 = s5.length = 0;
+               ^^^^^^";
+static final field core::int s12 = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:43:13: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+final s12 = -s5;
+            ^" in self::s5.{core::int::unary-}();
+static field () →? core::int s13;
+static final field core::int s14 = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:47:18: Error: Can't use an expression of type 'int Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+final s14 = (s13)();
+                 ^" in self::s13.call();
+static final field Never s15 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:49:19: Error: Can't throw a value of 'Null?' since it is neither dynamic nor non-nullable.
+final s15 = throw null;
+                  ^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never;
+static method main() → void {}
+
+constants  {
+  #C1 = 0
+  #C2 = 1
+  #C3 = ""
+}
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect
new file mode 100644
index 0000000..7157bfd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect
@@ -0,0 +1,138 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:15:12: Warning: Operand of null-aware operation '?.' has type 'List<dynamic>' which excludes null.
+//  - 'List' is from 'dart:core'.
+// final s2 = s1?.length;
+//            ^
+//
+// 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);
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:22:5: Error: Switch case may fall through to the next case.
+//     case 0:
+//     ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:25:10: Error: Type 'String' of the case expression is not a subtype of type 'int' of this switch expression.
+//     case '':
+//          ^
+// pkg/front_end/testcases/nnbd/issue41102.dart:21:11: Context: The switch expression is here.
+//   switch (e) {
+//           ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+// final s6 = s5 + 0;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:35:14: Error: Operator '[]' cannot be called on 'List<dynamic>?' because it is potentially null.
+//  - 'List' is from 'dart:core'.
+// final s8 = s7[0];
+//              ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:37:14: Error: Operator '[]=' cannot be called on 'List<dynamic>?' because it is potentially null.
+//  - 'List' is from 'dart:core'.
+// final s9 = s7[0] = 0;
+//              ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:39:16: Error: Property 'length' cannot be accessed on 'List<dynamic>?' because it is potentially null.
+//  - 'List' is from 'dart:core'.
+// Try accessing using ?. instead.
+// final s10 = s7.length;
+//                ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: The setter 'length' isn't defined for the class 'int?'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'length'.
+// final s11 = s5.length = 0;
+//                ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: Property 'length' cannot be accessed on 'int?' because it is potentially null.
+// Try accessing using ?. instead.
+// final s11 = s5.length = 0;
+//                ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:43:13: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+// final s12 = -s5;
+//             ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:47:18: Error: Can't use an expression of type 'int Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
+// final s14 = (s13)();
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:49:19: Error: Can't throw a value of 'Null?' since it is neither dynamic nor non-nullable.
+// final s15 = throw null;
+//                   ^
+//
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static final field asy::StreamTransformer<dynamic, dynamic> t = new asy::_StreamHandlerTransformer::•<dynamic, dynamic>(handleData: (dynamic data, asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<dynamic> sink) → asy::Future<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? {
+  core::int e = 0;
+  switch(e) {
+    #L1:
+    case #C1:
+      {
+        core::print("fallthrough");
+      }
+    #L2:
+    case #C2:
+    case #C3:
+      {}
+  }
+}).call();
+static field core::int? s5;
+static final field core::int? s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+final s6 = s5 + 0;
+              ^" in self::s5.{core::num::+}(0);
+static field core::List<dynamic>? s7;
+static final field dynamic s8 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:35:14: Error: Operator '[]' cannot be called on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+final s8 = s7[0];
+             ^" in self::s7.{core::List::[]}(0);
+static final field core::int s9 = let final core::List<dynamic>? #t5 = self::s7 in let final core::int #t6 = 0 in let final core::int #t7 = 0 in let final void #t8 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:37:14: Error: Operator '[]=' cannot be called on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+final s9 = s7[0] = 0;
+             ^" in #t5.{core::List::[]=}(#t6, #t7) in #t7;
+static final field core::int s10 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:39:16: Error: Property 'length' cannot be accessed on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+Try accessing using ?. instead.
+final s10 = s7.length;
+               ^^^^^^" in self::s7.{core::List::length};
+static final field core::int s11 = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: Property 'length' cannot be accessed on 'int?' because it is potentially null.
+Try accessing using ?. instead.
+final s11 = s5.length = 0;
+               ^^^^^^" in invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: The setter 'length' isn't defined for the class 'int?'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'length'.
+final s11 = s5.length = 0;
+               ^^^^^^";
+static final field core::int s12 = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:43:13: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+final s12 = -s5;
+            ^" in self::s5.{core::int::unary-}();
+static field () →? core::int s13;
+static final field core::int s14 = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:47:18: Error: Can't use an expression of type 'int Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+final s14 = (s13)();
+                 ^" in self::s13.call();
+static final field Never s15 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:49:19: Error: Can't throw a value of 'Null?' since it is neither dynamic nor non-nullable.
+final s15 = throw null;
+                  ^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never;
+static method main() → void {}
+
+constants  {
+  #C1 = 0
+  #C2 = 1
+  #C3 = ""
+}
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
new file mode 100644
index 0000000..d888b44
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
@@ -0,0 +1,138 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:15:12: Warning: Operand of null-aware operation '?.' has type 'List<dynamic>' which excludes null.
+//  - 'List' is from 'dart:core'.
+// final s2 = s1?.length;
+//            ^
+//
+// 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);
+//                ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:22:5: Error: Switch case may fall through to the next case.
+//     case 0:
+//     ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:25:10: Error: Type 'String' of the case expression is not a subtype of type 'int' of this switch expression.
+//     case '':
+//          ^
+// pkg/front_end/testcases/nnbd/issue41102.dart:21:11: Context: The switch expression is here.
+//   switch (e) {
+//           ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+// final s6 = s5 + 0;
+//               ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:35:14: Error: Operator '[]' cannot be called on 'List<dynamic>?' because it is potentially null.
+//  - 'List' is from 'dart:core'.
+// final s8 = s7[0];
+//              ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:37:14: Error: Operator '[]=' cannot be called on 'List<dynamic>?' because it is potentially null.
+//  - 'List' is from 'dart:core'.
+// final s9 = s7[0] = 0;
+//              ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:39:16: Error: Property 'length' cannot be accessed on 'List<dynamic>?' because it is potentially null.
+//  - 'List' is from 'dart:core'.
+// Try accessing using ?. instead.
+// final s10 = s7.length;
+//                ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: The setter 'length' isn't defined for the class 'int?'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'length'.
+// final s11 = s5.length = 0;
+//                ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: Property 'length' cannot be accessed on 'int?' because it is potentially null.
+// Try accessing using ?. instead.
+// final s11 = s5.length = 0;
+//                ^^^^^^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:43:13: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+// final s12 = -s5;
+//             ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:47:18: Error: Can't use an expression of type 'int Function()?' as a function because it's potentially null.
+// Try calling using ?.call instead.
+// final s14 = (s13)();
+//                  ^
+//
+// pkg/front_end/testcases/nnbd/issue41102.dart:49:19: Error: Can't throw a value of 'Null?' since it is neither dynamic nor non-nullable.
+// final s15 = throw null;
+//                   ^
+//
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static final field asy::StreamTransformer<dynamic, dynamic> t = new asy::_StreamHandlerTransformer::•<dynamic, dynamic>(handleData: (dynamic data, asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<dynamic> sink) → asy::Future<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? {
+  core::int e = 0;
+  switch(e) {
+    #L1:
+    case #C1:
+      {
+        core::print("fallthrough");
+      }
+    #L2:
+    case #C2:
+    case #C3:
+      {}
+  }
+}).call();
+static field core::int? s5;
+static final field core::int? s6 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:31:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+final s6 = s5 + 0;
+              ^" in self::s5.{core::num::+}(0);
+static field core::List<dynamic>? s7;
+static final field dynamic s8 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:35:14: Error: Operator '[]' cannot be called on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+final s8 = s7[0];
+             ^" in self::s7.{core::List::[]}(0);
+static final field core::int s9 = let final core::List<dynamic>? #t5 = self::s7 in let final core::int #t6 = 0 in let final core::int #t7 = 0 in let final void #t8 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:37:14: Error: Operator '[]=' cannot be called on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+final s9 = s7[0] = 0;
+             ^" in #t5.{core::List::[]=}(#t6, #t7) in #t7;
+static final field core::int s10 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:39:16: Error: Property 'length' cannot be accessed on 'List<dynamic>?' because it is potentially null.
+ - 'List' is from 'dart:core'.
+Try accessing using ?. instead.
+final s10 = s7.length;
+               ^^^^^^" in self::s7.{core::List::length};
+static final field core::int s11 = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: Property 'length' cannot be accessed on 'int?' because it is potentially null.
+Try accessing using ?. instead.
+final s11 = s5.length = 0;
+               ^^^^^^" in invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:41:16: Error: The setter 'length' isn't defined for the class 'int?'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'length'.
+final s11 = s5.length = 0;
+               ^^^^^^";
+static final field core::int s12 = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:43:13: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+final s12 = -s5;
+            ^" in self::s5.{core::int::unary-}();
+static field () →? core::int s13;
+static final field core::int s14 = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:47:18: Error: Can't use an expression of type 'int Function()?' as a function because it's potentially null.
+Try calling using ?.call instead.
+final s14 = (s13)();
+                 ^" in self::s13.call();
+static final field Never s15 = invalid-expression "pkg/front_end/testcases/nnbd/issue41102.dart:49:19: Error: Can't throw a value of 'Null?' since it is neither dynamic nor non-nullable.
+final s15 = throw null;
+                  ^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never;
+static method main() → void {}
+
+constants  {
+  #C1 = 0
+  #C2 = 1
+  #C3 = ""
+}
diff --git a/pkg/front_end/testcases/nnbd/issue41103.dart b/pkg/front_end/testcases/nnbd/issue41103.dart
new file mode 100644
index 0000000..764b551
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41103.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 'dart:async';
+
+void main() {}
+
+final t = StreamTransformer.fromHandlers(
+    handleData: (data, sink) => Future.microtask(() => sink.add(data)),
+    handleDone: (sink) => Future.microtask(() => sink.close()));
diff --git a/pkg/front_end/testcases/nnbd/issue41103.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue41103.dart.outline.expect
new file mode 100644
index 0000000..49a4279
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41103.dart.outline.expect
@@ -0,0 +1,9 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static final field asy::StreamTransformer<dynamic, dynamic> t;
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/nnbd/issue41103.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41103.dart.strong.expect
new file mode 100644
index 0000000..367e4c5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41103.dart.strong.expect
@@ -0,0 +1,8 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static final field asy::StreamTransformer<dynamic, dynamic> t = new asy::_StreamHandlerTransformer::•<dynamic, dynamic>(handleData: (dynamic data, asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<dynamic> sink) → asy::Future<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
new file mode 100644
index 0000000..367e4c5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41103.dart.strong.transformed.expect
@@ -0,0 +1,8 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static final field asy::StreamTransformer<dynamic, dynamic> t = new asy::_StreamHandlerTransformer::•<dynamic, dynamic>(handleData: (dynamic data, asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<dynamic> sink) → asy::Future<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
new file mode 100644
index 0000000..367e4c5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41103.dart.weak.expect
@@ -0,0 +1,8 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static final field asy::StreamTransformer<dynamic, dynamic> t = new asy::_StreamHandlerTransformer::•<dynamic, dynamic>(handleData: (dynamic data, asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<dynamic> sink) → asy::Future<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
new file mode 100644
index 0000000..367e4c5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/issue41103.dart.weak.transformed.expect
@@ -0,0 +1,8 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static final field asy::StreamTransformer<dynamic, dynamic> t = new asy::_StreamHandlerTransformer::•<dynamic, dynamic>(handleData: (dynamic data, asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::add}(data)), handleDone: (asy::EventSink<dynamic> sink) → asy::Future<void> => asy::Future::microtask<void>(() → void => sink.{asy::EventSink::close}()));
+static method main() → void {}
diff --git a/pkg/front_end/testcases/nnbd/later.dart.weak.expect b/pkg/front_end/testcases/nnbd/later.dart.weak.expect
index 2ff6a62..4ea3cb9 100644
--- a/pkg/front_end/testcases/nnbd/later.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/later.dart.weak.expect
@@ -55,7 +55,7 @@
 //   late String s2 = '${fisk}${await hest()}${fisk}';
 //                              ^^^^^
 //
-// pkg/front_end/testcases/nnbd/later.dart:46:9: Warning: Constructor is marked 'const' and some fields are late.
+// pkg/front_end/testcases/nnbd/later.dart:46:9: Error: Constructor is marked 'const' so fields can't be late.
 //   const B();
 //         ^
 // pkg/front_end/testcases/nnbd/later.dart:44:18: Context: Field is late, but constructor is 'const'.
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 6f8ab34..37628df 100644
--- a/pkg/front_end/testcases/nnbd/later.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/later.dart.weak.transformed.expect
@@ -55,7 +55,7 @@
 //   late String s2 = '${fisk}${await hest()}${fisk}';
 //                              ^^^^^
 //
-// pkg/front_end/testcases/nnbd/later.dart:46:9: Warning: Constructor is marked 'const' and some fields are late.
+// pkg/front_end/testcases/nnbd/later.dart:46:9: Error: Constructor is marked 'const' so fields can't be late.
 //   const B();
 //         ^
 // pkg/front_end/testcases/nnbd/later.dart:44:18: Context: Field is late, but constructor is 'const'.
diff --git a/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.expect b/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.expect
index 4b2756e..5cc723c 100644
--- a/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.expect
@@ -2,17 +2,17 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/list_constructor.dart:9:7: Warning: Using the default List constructor.
+// pkg/front_end/testcases/nnbd/list_constructor.dart:9:7: Error: Can't use the default List constructor.
 // Try using List.filled instead.
 //   new List<T>(42);
 //       ^
 //
-// pkg/front_end/testcases/nnbd/list_constructor.dart:10:7: Warning: Using the default List constructor.
+// pkg/front_end/testcases/nnbd/list_constructor.dart:10:7: Error: Can't use the default List constructor.
 // Try using List.filled instead.
 //   new List<int?>(42);
 //       ^
 //
-// pkg/front_end/testcases/nnbd/list_constructor.dart:11:7: Warning: Using the default List constructor.
+// pkg/front_end/testcases/nnbd/list_constructor.dart:11:7: Error: Can't use the default List constructor.
 // Try using List.filled instead.
 //   new List<int>(42);
 //       ^
@@ -21,8 +21,17 @@
 import "dart:core" as core;
 
 static method foo<T extends core::Object? = core::Object?>() → dynamic {
-  core::List::•<self::foo::T%>(42);
-  core::List::•<core::int?>(42);
-  core::List::•<core::int>(42);
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/list_constructor.dart:9:7: Error: Can't use the default List constructor.
+Try using List.filled instead.
+  new List<T>(42);
+      ^" in core::List::•<self::foo::T%>(42);
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/list_constructor.dart:10:7: Error: Can't use the default List constructor.
+Try using List.filled instead.
+  new List<int?>(42);
+      ^" in core::List::•<core::int?>(42);
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/list_constructor.dart:11:7: Error: Can't use the default List constructor.
+Try using List.filled instead.
+  new List<int>(42);
+      ^" in core::List::•<core::int>(42);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.transformed.expect
index 80f0ed3..78ee25b 100644
--- a/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/list_constructor.dart.weak.transformed.expect
@@ -2,17 +2,17 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/list_constructor.dart:9:7: Warning: Using the default List constructor.
+// pkg/front_end/testcases/nnbd/list_constructor.dart:9:7: Error: Can't use the default List constructor.
 // Try using List.filled instead.
 //   new List<T>(42);
 //       ^
 //
-// pkg/front_end/testcases/nnbd/list_constructor.dart:10:7: Warning: Using the default List constructor.
+// pkg/front_end/testcases/nnbd/list_constructor.dart:10:7: Error: Can't use the default List constructor.
 // Try using List.filled instead.
 //   new List<int?>(42);
 //       ^
 //
-// pkg/front_end/testcases/nnbd/list_constructor.dart:11:7: Warning: Using the default List constructor.
+// pkg/front_end/testcases/nnbd/list_constructor.dart:11:7: Error: Can't use the default List constructor.
 // Try using List.filled instead.
 //   new List<int>(42);
 //       ^
@@ -21,8 +21,17 @@
 import "dart:core" as core;
 
 static method foo<T extends core::Object? = core::Object?>() → dynamic {
-  core::_List::•<self::foo::T%>(42);
-  core::_List::•<core::int?>(42);
-  core::_List::•<core::int>(42);
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/list_constructor.dart:9:7: Error: Can't use the default List constructor.
+Try using List.filled instead.
+  new List<T>(42);
+      ^" in core::_List::•<self::foo::T%>(42);
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/list_constructor.dart:10:7: Error: Can't use the default List constructor.
+Try using List.filled instead.
+  new List<int?>(42);
+      ^" in core::_List::•<core::int?>(42);
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/list_constructor.dart:11:7: Error: Can't use the default List constructor.
+Try using List.filled instead.
+  new List<int>(42);
+      ^" in core::_List::•<core::int>(42);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/load_library.dart b/pkg/front_end/testcases/nnbd/load_library.dart
new file mode 100644
index 0000000..95e2745
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/load_library.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.
+
+import "dart:math" deferred as math;
+
+main() {
+  var v1 = math.loadLibrary();
+  v1.then((_) {});
+  var v2 = math.loadLibrary;
+  v2().then((_) {});
+}
diff --git a/pkg/front_end/testcases/nnbd/load_library.dart.outline.expect b/pkg/front_end/testcases/nnbd/load_library.dart.outline.expect
new file mode 100644
index 0000000..69f8d21
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/load_library.dart.outline.expect
@@ -0,0 +1,7 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "dart:math" deferred as math;
+
+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
new file mode 100644
index 0000000..92acca2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/load_library.dart.strong.expect
@@ -0,0 +1,19 @@
+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? {});
+  () → asy::Future<dynamic> v2 = #C1;
+  v2.call().{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+}
+static method _#loadLibrary_math() → asy::Future<dynamic>
+  return LoadLibrary(math);
+
+constants  {
+  #C1 = tearoff self::_#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
new file mode 100644
index 0000000..92acca2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/load_library.dart.strong.transformed.expect
@@ -0,0 +1,19 @@
+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? {});
+  () → asy::Future<dynamic> v2 = #C1;
+  v2.call().{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+}
+static method _#loadLibrary_math() → asy::Future<dynamic>
+  return LoadLibrary(math);
+
+constants  {
+  #C1 = tearoff self::_#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
new file mode 100644
index 0000000..92acca2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/load_library.dart.weak.expect
@@ -0,0 +1,19 @@
+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? {});
+  () → asy::Future<dynamic> v2 = #C1;
+  v2.call().{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+}
+static method _#loadLibrary_math() → asy::Future<dynamic>
+  return LoadLibrary(math);
+
+constants  {
+  #C1 = tearoff self::_#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
new file mode 100644
index 0000000..92acca2
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/load_library.dart.weak.transformed.expect
@@ -0,0 +1,19 @@
+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? {});
+  () → asy::Future<dynamic> v2 = #C1;
+  v2.call().{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+}
+static method _#loadLibrary_math() → asy::Future<dynamic>
+  return LoadLibrary(math);
+
+constants  {
+  #C1 = tearoff self::_#loadLibrary_math
+}
diff --git a/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.outline.expect b/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.outline.expect
index 96347ea..712b735 100644
--- a/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.outline.expect
@@ -1,4 +1,35 @@
 library main /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:96:30: Error: The required named parameter 'a' in method 'Class2b.method5c' is not required in overridden method 'LegacyClass.method5c'.
+//   int method5c({required int a, required int b}) => 0;
+//                              ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:30:7: Context: This is the overridden method ('method5c').
+//   int method5c({int a, int b}) => 0;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:96:46: Error: The required named parameter 'b' in method 'Class2b.method5c' is not required in overridden method 'LegacyClass.method5c'.
+//   int method5c({required int a, required int b}) => 0;
+//                                              ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:30:7: Context: This is the overridden method ('method5c').
+//   int method5c({int a, int b}) => 0;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:102:32: Error: The required named parameter 'a' in method 'Class2b.method6c' is not required in overridden method 'LegacyClass.method6c'.
+//   int? method6c({required int? a, required int? b}) => 0;
+//                                ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:36:7: Context: This is the overridden method ('method6c').
+//   int method6c({int a, int b}) => 0;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:102:49: Error: The required named parameter 'b' in method 'Class2b.method6c' is not required in overridden method 'LegacyClass.method6c'.
+//   int? method6c({required int? a, required int? b}) => 0;
+//                                                 ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:36:7: Context: This is the overridden method ('method6c').
+//   int method6c({int a, int b}) => 0;
+//       ^
+//
 import self as self;
 import "dart:core" as core;
 import "member_inheritance_from_opt_out_lib.dart" as opt;
diff --git a/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.strong.expect b/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.strong.expect
index b776417..9e92aa7 100644
--- a/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.strong.expect
@@ -1,4 +1,35 @@
 library main /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:96:30: Error: The required named parameter 'a' in method 'Class2b.method5c' is not required in overridden method 'LegacyClass.method5c'.
+//   int method5c({required int a, required int b}) => 0;
+//                              ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:30:7: Context: This is the overridden method ('method5c').
+//   int method5c({int a, int b}) => 0;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:96:46: Error: The required named parameter 'b' in method 'Class2b.method5c' is not required in overridden method 'LegacyClass.method5c'.
+//   int method5c({required int a, required int b}) => 0;
+//                                              ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:30:7: Context: This is the overridden method ('method5c').
+//   int method5c({int a, int b}) => 0;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:102:32: Error: The required named parameter 'a' in method 'Class2b.method6c' is not required in overridden method 'LegacyClass.method6c'.
+//   int? method6c({required int? a, required int? b}) => 0;
+//                                ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:36:7: Context: This is the overridden method ('method6c').
+//   int method6c({int a, int b}) => 0;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:102:49: Error: The required named parameter 'b' in method 'Class2b.method6c' is not required in overridden method 'LegacyClass.method6c'.
+//   int? method6c({required int? a, required int? b}) => 0;
+//                                                 ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:36:7: Context: This is the overridden method ('method6c').
+//   int method6c({int a, int b}) => 0;
+//       ^
+//
 import self as self;
 import "dart:core" as core;
 import "member_inheritance_from_opt_out_lib.dart" as opt;
diff --git a/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.strong.transformed.expect
index b776417..9e92aa7 100644
--- a/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.strong.transformed.expect
@@ -1,4 +1,35 @@
 library main /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:96:30: Error: The required named parameter 'a' in method 'Class2b.method5c' is not required in overridden method 'LegacyClass.method5c'.
+//   int method5c({required int a, required int b}) => 0;
+//                              ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:30:7: Context: This is the overridden method ('method5c').
+//   int method5c({int a, int b}) => 0;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:96:46: Error: The required named parameter 'b' in method 'Class2b.method5c' is not required in overridden method 'LegacyClass.method5c'.
+//   int method5c({required int a, required int b}) => 0;
+//                                              ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:30:7: Context: This is the overridden method ('method5c').
+//   int method5c({int a, int b}) => 0;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:102:32: Error: The required named parameter 'a' in method 'Class2b.method6c' is not required in overridden method 'LegacyClass.method6c'.
+//   int? method6c({required int? a, required int? b}) => 0;
+//                                ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:36:7: Context: This is the overridden method ('method6c').
+//   int method6c({int a, int b}) => 0;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:102:49: Error: The required named parameter 'b' in method 'Class2b.method6c' is not required in overridden method 'LegacyClass.method6c'.
+//   int? method6c({required int? a, required int? b}) => 0;
+//                                                 ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:36:7: Context: This is the overridden method ('method6c').
+//   int method6c({int a, int b}) => 0;
+//       ^
+//
 import self as self;
 import "dart:core" as core;
 import "member_inheritance_from_opt_out_lib.dart" as opt;
diff --git a/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.weak.expect
index b776417..9e92aa7 100644
--- a/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.weak.expect
@@ -1,4 +1,35 @@
 library main /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:96:30: Error: The required named parameter 'a' in method 'Class2b.method5c' is not required in overridden method 'LegacyClass.method5c'.
+//   int method5c({required int a, required int b}) => 0;
+//                              ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:30:7: Context: This is the overridden method ('method5c').
+//   int method5c({int a, int b}) => 0;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:96:46: Error: The required named parameter 'b' in method 'Class2b.method5c' is not required in overridden method 'LegacyClass.method5c'.
+//   int method5c({required int a, required int b}) => 0;
+//                                              ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:30:7: Context: This is the overridden method ('method5c').
+//   int method5c({int a, int b}) => 0;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:102:32: Error: The required named parameter 'a' in method 'Class2b.method6c' is not required in overridden method 'LegacyClass.method6c'.
+//   int? method6c({required int? a, required int? b}) => 0;
+//                                ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:36:7: Context: This is the overridden method ('method6c').
+//   int method6c({int a, int b}) => 0;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:102:49: Error: The required named parameter 'b' in method 'Class2b.method6c' is not required in overridden method 'LegacyClass.method6c'.
+//   int? method6c({required int? a, required int? b}) => 0;
+//                                                 ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:36:7: Context: This is the overridden method ('method6c').
+//   int method6c({int a, int b}) => 0;
+//       ^
+//
 import self as self;
 import "dart:core" as core;
 import "member_inheritance_from_opt_out_lib.dart" as opt;
diff --git a/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.weak.transformed.expect
index b776417..9e92aa7 100644
--- a/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart.weak.transformed.expect
@@ -1,4 +1,35 @@
 library main /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:96:30: Error: The required named parameter 'a' in method 'Class2b.method5c' is not required in overridden method 'LegacyClass.method5c'.
+//   int method5c({required int a, required int b}) => 0;
+//                              ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:30:7: Context: This is the overridden method ('method5c').
+//   int method5c({int a, int b}) => 0;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:96:46: Error: The required named parameter 'b' in method 'Class2b.method5c' is not required in overridden method 'LegacyClass.method5c'.
+//   int method5c({required int a, required int b}) => 0;
+//                                              ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:30:7: Context: This is the overridden method ('method5c').
+//   int method5c({int a, int b}) => 0;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:102:32: Error: The required named parameter 'a' in method 'Class2b.method6c' is not required in overridden method 'LegacyClass.method6c'.
+//   int? method6c({required int? a, required int? b}) => 0;
+//                                ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:36:7: Context: This is the overridden method ('method6c').
+//   int method6c({int a, int b}) => 0;
+//       ^
+//
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:102:49: Error: The required named parameter 'b' in method 'Class2b.method6c' is not required in overridden method 'LegacyClass.method6c'.
+//   int? method6c({required int? a, required int? b}) => 0;
+//                                                 ^
+// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:36:7: Context: This is the overridden method ('method6c').
+//   int method6c({int a, int b}) => 0;
+//       ^
+//
 import self as self;
 import "dart:core" as core;
 import "member_inheritance_from_opt_out_lib.dart" as opt;
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 c8a1961..aea1af9 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
@@ -2,23 +2,29 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:15:6: Warning: Missing required named parameter 's'.
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:15:6: Error: Required named parameter 's' must be provided.
 //   foo();
 //      ^
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:5:6: Context: Found this candidate, but the arguments don't match.
+// void foo({required String s}) {}
+//      ^^^
 //
-// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:16:8: Warning: Missing required named parameter 'x'.
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:16:8: Error: Required named parameter 'x' must be provided.
 //   new A();
 //        ^
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:9:3: Context: Found this candidate, but the arguments don't match.
+//   A({required int x});
+//   ^
 //
-// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:18:8: Warning: Missing required named parameter 'y'.
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:18:8: Error: Required named parameter 'y' must be provided.
 //   a.foo();
 //        ^
 //
-// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:19:6: Warning: Missing required named parameter 's'.
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:19:6: Error: Required named parameter 's' must be provided.
 //   a.f();
 //      ^
 //
-// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:20:4: Warning: Missing required named parameter 's'.
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:20:4: Error: Required named parameter 's' must be provided.
 //   g();
 //    ^
 //
@@ -35,12 +41,22 @@
 static field ({required s: core::String}) → void g = ({required core::String s = #C1}) → core::Null? {};
 static method foo({required core::String s = #C1}) → void {}
 static method bar() → dynamic {
-  self::foo();
-  new self::A::•();
+  invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:15:6: Error: Required named parameter 's' must be provided.
+  foo();
+     ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:16:8: Error: Required named parameter 'x' must be provided.
+  new A();
+       ^";
   self::A a = new self::A::•(x: 42);
-  a.{self::A::foo}();
-  a.{self::A::f}.call();
-  self::g.call();
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:18:8: Error: Required named parameter 'y' must be provided.
+  a.foo();
+       ^" in a.{self::A::foo}();
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:19:6: Error: Required named parameter 's' must be provided.
+  a.f();
+     ^" in a.{self::A::f}.call();
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:20:4: Error: Required named parameter 's' must be provided.
+  g();
+   ^" in self::g.call();
 }
 static method main() → dynamic {}
 
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 c8a1961..aea1af9 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
@@ -2,23 +2,29 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:15:6: Warning: Missing required named parameter 's'.
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:15:6: Error: Required named parameter 's' must be provided.
 //   foo();
 //      ^
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:5:6: Context: Found this candidate, but the arguments don't match.
+// void foo({required String s}) {}
+//      ^^^
 //
-// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:16:8: Warning: Missing required named parameter 'x'.
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:16:8: Error: Required named parameter 'x' must be provided.
 //   new A();
 //        ^
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:9:3: Context: Found this candidate, but the arguments don't match.
+//   A({required int x});
+//   ^
 //
-// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:18:8: Warning: Missing required named parameter 'y'.
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:18:8: Error: Required named parameter 'y' must be provided.
 //   a.foo();
 //        ^
 //
-// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:19:6: Warning: Missing required named parameter 's'.
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:19:6: Error: Required named parameter 's' must be provided.
 //   a.f();
 //      ^
 //
-// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:20:4: Warning: Missing required named parameter 's'.
+// pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:20:4: Error: Required named parameter 's' must be provided.
 //   g();
 //    ^
 //
@@ -35,12 +41,22 @@
 static field ({required s: core::String}) → void g = ({required core::String s = #C1}) → core::Null? {};
 static method foo({required core::String s = #C1}) → void {}
 static method bar() → dynamic {
-  self::foo();
-  new self::A::•();
+  invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:15:6: Error: Required named parameter 's' must be provided.
+  foo();
+     ^";
+  invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:16:8: Error: Required named parameter 'x' must be provided.
+  new A();
+       ^";
   self::A a = new self::A::•(x: 42);
-  a.{self::A::foo}();
-  a.{self::A::f}.call();
-  self::g.call();
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:18:8: Error: Required named parameter 'y' must be provided.
+  a.foo();
+       ^" in a.{self::A::foo}();
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:19:6: Error: Required named parameter 's' must be provided.
+  a.f();
+     ^" in a.{self::A::f}.call();
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/missing_required_named_parameter.dart:20:4: Error: Required named parameter 's' must be provided.
+  g();
+   ^" in self::g.call();
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd/never_opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd/never_opt_out.dart.weak.expect
index ecb173e..83a210a 100644
--- a/pkg/front_end/testcases/nnbd/never_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/never_opt_out.dart.weak.expect
@@ -102,7 +102,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/never_opt_out_lib.dart:19:28: Warning: Assigning value of type 'Type' to a variable of type 'Null?'.
+// pkg/front_end/testcases/nnbd/never_opt_out_lib.dart:19:28: Error: A value of type 'Type' can't be assigned to a variable of type 'Null?'.
 //  - 'Type' is from 'dart:core'.
 //   Null get nullProperty => Null;
 //                            ^
@@ -127,7 +127,10 @@
   method nullMethod(core::Null? value) → core::Null?
     return value;
   get nullProperty() → core::Null?
-    return core::Null? as{TypeError,ForNonNullableByDefault} core::Null?;
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/never_opt_out_lib.dart:19:28: Error: A value of type 'Type' can't be assigned to a variable of type 'Null?'.
+ - 'Type' is from 'dart:core'.
+  Null get nullProperty => Null;
+                           ^" in core::Null? as{TypeError,ForNonNullableByDefault} core::Null?;
   set nullProperty(core::Null? value) → void {}
 }
 static field Never optInNever = self::optOutNever;
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 65d01e2..06d0203 100644
--- a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect
@@ -32,13 +32,8 @@
 //   y(); // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: Can't use an expression of type 'Never' as a function because it's potentially null.
-// Try calling using ?.call instead.
-//   y(); // Error.
-//    ^
-//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The method '+' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //   y++; // Error.
 //    ^
 //
@@ -46,8 +41,8 @@
 //   y++; // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The method '+' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //   y += 1; // Error.
 //     ^
 //
@@ -55,8 +50,8 @@
 //   y += 1; // Error.
 //     ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The method '[]' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
 //   y[42]; // Error.
 //    ^
 //
@@ -64,8 +59,8 @@
 //   y[42]; // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The method '[]=' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
 //   y[42] = 42; // Error.
 //    ^
 //
@@ -111,35 +106,32 @@
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
   y.baz = 42; // Error.
     ^^^";
-  let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: Can't use an expression of type 'Never' as a function because it's potentially null.
-Try calling using ?.call instead.
-  y(); // Error.
-   ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: The method 'call' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: The method 'call' isn't defined for the class 'Never'.
 Try correcting the name to the name of an existing method, or defining a method named 'call'.
   y(); // Error.
    ^";
-  y = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
+  y = (let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
   y++; // Error.
-   ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The method '+' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+   ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
   y++; // Error.
    ^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
-  y = (let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
+  y = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
   y += 1; // Error.
-    ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The method '+' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+    ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
   y += 1; // Error.
     ^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
-  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null.
+  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null.
   y[42]; // Error.
-   ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The method '[]' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+   ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
   y[42]; // Error.
    ^";
-  let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null.
+  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null.
   y[42] = 42; // Error.
-   ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The method '[]=' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+   ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
   y[42] = 42; // Error.
    ^";
 }
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 65d01e2..06d0203 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
@@ -32,13 +32,8 @@
 //   y(); // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: Can't use an expression of type 'Never' as a function because it's potentially null.
-// Try calling using ?.call instead.
-//   y(); // Error.
-//    ^
-//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The method '+' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //   y++; // Error.
 //    ^
 //
@@ -46,8 +41,8 @@
 //   y++; // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The method '+' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //   y += 1; // Error.
 //     ^
 //
@@ -55,8 +50,8 @@
 //   y += 1; // Error.
 //     ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The method '[]' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
 //   y[42]; // Error.
 //    ^
 //
@@ -64,8 +59,8 @@
 //   y[42]; // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The method '[]=' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
 //   y[42] = 42; // Error.
 //    ^
 //
@@ -111,35 +106,32 @@
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
   y.baz = 42; // Error.
     ^^^";
-  let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: Can't use an expression of type 'Never' as a function because it's potentially null.
-Try calling using ?.call instead.
-  y(); // Error.
-   ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: The method 'call' isn't defined for the class 'Never'.
+  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Error: The method 'call' isn't defined for the class 'Never'.
 Try correcting the name to the name of an existing method, or defining a method named 'call'.
   y(); // Error.
    ^";
-  y = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
+  y = (let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
   y++; // Error.
-   ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The method '+' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+   ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
   y++; // Error.
    ^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
-  y = (let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
+  y = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
   y += 1; // Error.
-    ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The method '+' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+    ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
   y += 1; // Error.
     ^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
-  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null.
+  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null.
   y[42]; // Error.
-   ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The method '[]' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+   ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
   y[42]; // Error.
    ^";
-  let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null.
+  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null.
   y[42] = 42; // Error.
-   ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The method '[]=' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+   ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
   y[42] = 42; // Error.
    ^";
 }
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 ae3949b..06d0203 100644
--- a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect
@@ -7,17 +7,12 @@
 //   y.foo(); // Error.
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:24:5: Warning: Method 'foo' is called on 'Never' which is potentially null.
-// Try calling using ?. instead.
-//   y.foo(); // Error.
-//     ^^^
-//
 // pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: The getter 'bar' isn't defined for the class 'Never'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
 //   y.bar; // Error.
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Warning: Property 'bar' is accessed on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null.
 // Try accessing using ?. instead.
 //   y.bar; // Error.
 //     ^^^
@@ -27,7 +22,7 @@
 //   y.baz = 42; // Error.
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Warning: Property 'baz' is accessed on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null.
 // Try accessing using ?. instead.
 //   y.baz = 42; // Error.
 //     ^^^
@@ -37,49 +32,39 @@
 //   y(); // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Warning: Method 'call' is called on 'Never' which is potentially null.
-// Try calling using ?. instead.
-//   y(); // Error.
-//    ^
-//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Warning: Expression of type 'Never' is used as a function, but it's potentially null.
-// Try calling using ?.call instead.
-//   y(); // Error.
-//    ^
-//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The method '+' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //   y++; // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Warning: Operator '+' is called on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
 //   y++; // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The method '+' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //   y += 1; // Error.
 //     ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Warning: Operator '+' is called on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
 //   y += 1; // Error.
 //     ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The method '[]' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
 //   y[42]; // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Warning: Operator '[]' is called on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null.
 //   y[42]; // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The method '[]=' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
 //   y[42] = 42; // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Warning: Operator '[]=' is called on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null.
 //   y[42] = 42; // Error.
 //    ^
 //
@@ -107,11 +92,17 @@
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   y.foo(); // Error.
     ^^^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: The getter 'bar' isn't defined for the class 'Never'.
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null.
+Try accessing using ?. instead.
+  y.bar; // Error.
+    ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: The getter 'bar' isn't defined for the class 'Never'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
   y.bar; // Error.
     ^^^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: The setter 'baz' isn't defined for the class 'Never'.
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null.
+Try accessing using ?. instead.
+  y.baz = 42; // Error.
+    ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: The setter 'baz' isn't defined for the class 'Never'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
   y.baz = 42; // Error.
     ^^^";
@@ -119,20 +110,28 @@
 Try correcting the name to the name of an existing method, or defining a method named 'call'.
   y(); // Error.
    ^";
-  y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The method '+' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+  y = (let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
   y++; // Error.
-   ^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
-  y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The method '+' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+   ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+  y++; // Error.
+   ^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
+  y = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
   y += 1; // Error.
-    ^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The method '[]' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+    ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+  y += 1; // Error.
+    ^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
+  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null.
+  y[42]; // Error.
+   ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
   y[42]; // Error.
    ^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The method '[]=' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null.
+  y[42] = 42; // Error.
+   ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
   y[42] = 42; // Error.
    ^";
 }
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 ae3949b..06d0203 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
@@ -7,17 +7,12 @@
 //   y.foo(); // Error.
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:24:5: Warning: Method 'foo' is called on 'Never' which is potentially null.
-// Try calling using ?. instead.
-//   y.foo(); // Error.
-//     ^^^
-//
 // pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: The getter 'bar' isn't defined for the class 'Never'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
 //   y.bar; // Error.
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Warning: Property 'bar' is accessed on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null.
 // Try accessing using ?. instead.
 //   y.bar; // Error.
 //     ^^^
@@ -27,7 +22,7 @@
 //   y.baz = 42; // Error.
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Warning: Property 'baz' is accessed on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null.
 // Try accessing using ?. instead.
 //   y.baz = 42; // Error.
 //     ^^^
@@ -37,49 +32,39 @@
 //   y(); // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Warning: Method 'call' is called on 'Never' which is potentially null.
-// Try calling using ?. instead.
-//   y(); // Error.
-//    ^
-//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:27:4: Warning: Expression of type 'Never' is used as a function, but it's potentially null.
-// Try calling using ?.call instead.
-//   y(); // Error.
-//    ^
-//
-// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The method '+' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //   y++; // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Warning: Operator '+' is called on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
 //   y++; // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The method '+' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //   y += 1; // Error.
 //     ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Warning: Operator '+' is called on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
 //   y += 1; // Error.
 //     ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The method '[]' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '[]' operator.
 //   y[42]; // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Warning: Operator '[]' is called on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null.
 //   y[42]; // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The method '[]=' isn't defined for the class 'Never'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+// Try correcting the operator to an existing operator, or defining a '[]=' operator.
 //   y[42] = 42; // Error.
 //    ^
 //
-// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Warning: Operator '[]=' is called on 'Never' which is potentially null.
+// pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null.
 //   y[42] = 42; // Error.
 //    ^
 //
@@ -107,11 +92,17 @@
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   y.foo(); // Error.
     ^^^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: The getter 'bar' isn't defined for the class 'Never'.
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: Property 'bar' cannot be accessed on 'Never' because it is potentially null.
+Try accessing using ?. instead.
+  y.bar; // Error.
+    ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:25:5: Error: The getter 'bar' isn't defined for the class 'Never'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'bar'.
   y.bar; // Error.
     ^^^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: The setter 'baz' isn't defined for the class 'Never'.
+  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: Property 'baz' cannot be accessed on 'Never' because it is potentially null.
+Try accessing using ?. instead.
+  y.baz = 42; // Error.
+    ^^^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:26:5: Error: The setter 'baz' isn't defined for the class 'Never'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'baz'.
   y.baz = 42; // Error.
     ^^^";
@@ -119,20 +110,28 @@
 Try correcting the name to the name of an existing method, or defining a method named 'call'.
   y(); // Error.
    ^";
-  y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The method '+' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+  y = (let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
   y++; // Error.
-   ^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
-  y = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The method '+' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+   ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:28:4: Error: The operator '+' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+  y++; // Error.
+   ^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
+  y = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: Operator '+' cannot be called on 'Never' because it is potentially null.
   y += 1; // Error.
-    ^" as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The method '[]' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
+    ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:29:5: Error: The operator '+' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
+  y += 1; // Error.
+    ^") as{TypeError,ForDynamic,ForNonNullableByDefault} Never?;
+  let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: Operator '[]' cannot be called on 'Never' because it is potentially null.
+  y[42]; // Error.
+   ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:4: Error: The operator '[]' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '[]' operator.
   y[42]; // Error.
    ^";
-  invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The method '[]=' isn't defined for the class 'Never'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
+  let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: Operator '[]=' cannot be called on 'Never' because it is potentially null.
+  y[42] = 42; // Error.
+   ^" in invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:31:4: Error: The operator '[]=' isn't defined for the class 'Never'.
+Try correcting the operator to an existing operator, or defining a '[]=' operator.
   y[42] = 42; // Error.
    ^";
 }
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 7f76fc6..bd5dcc7 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
@@ -2,39 +2,39 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:7:5: Warning: Field 'topLevelField' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:7:5: Error: Field 'topLevelField' should be initialized because its type 'int' doesn't allow null.
 // int topLevelField; // Error.
 //     ^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:10:14: Warning: Field 'staticFieldOfA' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:10:14: Error: Field 'staticFieldOfA' should be initialized because its type 'int' doesn't allow null.
 //   static int staticFieldOfA; // Error.
 //              ^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:24:14: Warning: Field 'staticFieldOfM' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:24:14: Error: Field 'staticFieldOfM' should be initialized because its type 'int' doesn't allow null.
 //   static int staticFieldOfM; // Error.
 //              ^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:11:7: Warning: This constructor doesn't initialize field 'fieldOfA' and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:11:7: Error: This constructor should initialize field 'fieldOfA' because its type 'int' doesn't allow null.
 //   int fieldOfA; // Error.
 //       ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:17:5: Warning: This constructor doesn't initialize field 'fieldOfB' and its type 'X' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:17:5: Error: This constructor should initialize field 'fieldOfB' because its type 'X' doesn't allow null.
 //   X fieldOfB; // Error.
 //     ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:18:5: Warning: This constructor doesn't initialize field 'fieldOfB2' and its type 'Y' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:18:5: Error: This constructor should initialize field 'fieldOfB2' because its type 'Y' doesn't allow null.
 //   Y fieldOfB2; // Error.
 //     ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:25:7: Warning: Field 'fieldOfM' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:25:7: Error: Field 'fieldOfM' should be initialized because its type 'int' doesn't allow null.
 //   int fieldOfM; // Error.
 //       ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:29:5: Warning: Field 'fieldOfN' isn't initialized and its type 'X' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:29:5: Error: Field 'fieldOfN' should be initialized because its type 'X' doesn't allow null.
 //   X fieldOfN; // Error.
 //     ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:30:5: Warning: Field 'fieldOfN2' isn't initialized and its type 'Y' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:30:5: Error: Field 'fieldOfN2' should be initialized because its type 'Y' doesn't allow null.
 //   Y fieldOfN2; // Error.
 //     ^^^^^^^^^
 //
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 7f76fc6..bd5dcc7 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
@@ -2,39 +2,39 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:7:5: Warning: Field 'topLevelField' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:7:5: Error: Field 'topLevelField' should be initialized because its type 'int' doesn't allow null.
 // int topLevelField; // Error.
 //     ^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:10:14: Warning: Field 'staticFieldOfA' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:10:14: Error: Field 'staticFieldOfA' should be initialized because its type 'int' doesn't allow null.
 //   static int staticFieldOfA; // Error.
 //              ^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:24:14: Warning: Field 'staticFieldOfM' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:24:14: Error: Field 'staticFieldOfM' should be initialized because its type 'int' doesn't allow null.
 //   static int staticFieldOfM; // Error.
 //              ^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:11:7: Warning: This constructor doesn't initialize field 'fieldOfA' and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:11:7: Error: This constructor should initialize field 'fieldOfA' because its type 'int' doesn't allow null.
 //   int fieldOfA; // Error.
 //       ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:17:5: Warning: This constructor doesn't initialize field 'fieldOfB' and its type 'X' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:17:5: Error: This constructor should initialize field 'fieldOfB' because its type 'X' doesn't allow null.
 //   X fieldOfB; // Error.
 //     ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:18:5: Warning: This constructor doesn't initialize field 'fieldOfB2' and its type 'Y' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:18:5: Error: This constructor should initialize field 'fieldOfB2' because its type 'Y' doesn't allow null.
 //   Y fieldOfB2; // Error.
 //     ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:25:7: Warning: Field 'fieldOfM' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:25:7: Error: Field 'fieldOfM' should be initialized because its type 'int' doesn't allow null.
 //   int fieldOfM; // Error.
 //       ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:29:5: Warning: Field 'fieldOfN' isn't initialized and its type 'X' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:29:5: Error: Field 'fieldOfN' should be initialized because its type 'X' doesn't allow null.
 //   X fieldOfN; // Error.
 //     ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:30:5: Warning: Field 'fieldOfN2' isn't initialized and its type 'Y' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart:30:5: Error: Field 'fieldOfN2' should be initialized because its type 'Y' doesn't allow null.
 //   Y fieldOfN2; // Error.
 //     ^^^^^^^^^
 //
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_optional.dart.weak.expect b/pkg/front_end/testcases/nnbd/non_nullable_optional.dart.weak.expect
index e484f3d..d869c59 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_optional.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_optional.dart.weak.expect
@@ -2,19 +2,19 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/non_nullable_optional.dart:9:14: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_optional.dart:9:14: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
 // method1({int a}) {}
 //              ^
 //
-// pkg/front_end/testcases/nnbd/non_nullable_optional.dart:11:14: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_optional.dart:11:14: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
 // method2([int a]) {}
 //              ^
 //
-// pkg/front_end/testcases/nnbd/non_nullable_optional_part.dart:7:14: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_optional_part.dart:7:14: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
 // method3({int a}) {}
 //              ^
 //
-// pkg/front_end/testcases/nnbd/non_nullable_optional_part.dart:9:14: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_optional_part.dart:9:14: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
 // method4([int a]) {}
 //              ^
 //
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_optional.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/non_nullable_optional.dart.weak.transformed.expect
index e484f3d..d869c59 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_optional.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_optional.dart.weak.transformed.expect
@@ -2,19 +2,19 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/non_nullable_optional.dart:9:14: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_optional.dart:9:14: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
 // method1({int a}) {}
 //              ^
 //
-// pkg/front_end/testcases/nnbd/non_nullable_optional.dart:11:14: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_optional.dart:11:14: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
 // method2([int a]) {}
 //              ^
 //
-// pkg/front_end/testcases/nnbd/non_nullable_optional_part.dart:7:14: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_optional_part.dart:7:14: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
 // method3({int a}) {}
 //              ^
 //
-// pkg/front_end/testcases/nnbd/non_nullable_optional_part.dart:9:14: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/non_nullable_optional_part.dart:9:14: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
 // method4([int a]) {}
 //              ^
 //
diff --git a/pkg/front_end/testcases/nnbd/null_access.dart.strong.expect b/pkg/front_end/testcases/nnbd/null_access.dart.strong.expect
index 3495b4b..066a5f6 100644
--- a/pkg/front_end/testcases/nnbd/null_access.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/null_access.dart.strong.expect
@@ -70,12 +70,6 @@
 //   nullableClass?.nonNullableClass.nonNullableField ??= 0; // ok
 //                                   ^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Method 'call' cannot be called on 'Class?' because it is potentially null.
-//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
-// Try calling using ?. instead.
-//   nullableClass(); // error
-//                ^
-//
 // pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
 //  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 // Try calling using ?.call instead.
@@ -191,12 +185,8 @@
  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 Try calling using ?.call instead.
   nullableClass(); // error
-               ^" in let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Method 'call' cannot be called on 'Class?' because it is potentially null.
- - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
-Try calling using ?. instead.
-  nullableClass(); // error
                ^" in nullableClass.{self::Class::call}();
   nonNullableClass.{self::Class::call}();
-  let final self::Class #t43 = nonNullableClass in #t43.{core::Object::==}(null) ?{self::Class?} null : #t43.{self::Class::nonNullableClass}.{self::Class::call}();
-  let final self::Class #t44 = nonNullableClass in #t44.{core::Object::==}(null) ?{self::Class?} null : #t44.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
+  let final self::Class #t42 = nonNullableClass in #t42.{core::Object::==}(null) ?{self::Class?} null : #t42.{self::Class::nonNullableClass}.{self::Class::call}();
+  let final self::Class #t43 = nonNullableClass in #t43.{core::Object::==}(null) ?{self::Class?} null : #t43.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
 }
diff --git a/pkg/front_end/testcases/nnbd/null_access.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/null_access.dart.strong.transformed.expect
index 3495b4b..066a5f6 100644
--- a/pkg/front_end/testcases/nnbd/null_access.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_access.dart.strong.transformed.expect
@@ -70,12 +70,6 @@
 //   nullableClass?.nonNullableClass.nonNullableField ??= 0; // ok
 //                                   ^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Method 'call' cannot be called on 'Class?' because it is potentially null.
-//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
-// Try calling using ?. instead.
-//   nullableClass(); // error
-//                ^
-//
 // pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
 //  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 // Try calling using ?.call instead.
@@ -191,12 +185,8 @@
  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 Try calling using ?.call instead.
   nullableClass(); // error
-               ^" in let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Method 'call' cannot be called on 'Class?' because it is potentially null.
- - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
-Try calling using ?. instead.
-  nullableClass(); // error
                ^" in nullableClass.{self::Class::call}();
   nonNullableClass.{self::Class::call}();
-  let final self::Class #t43 = nonNullableClass in #t43.{core::Object::==}(null) ?{self::Class?} null : #t43.{self::Class::nonNullableClass}.{self::Class::call}();
-  let final self::Class #t44 = nonNullableClass in #t44.{core::Object::==}(null) ?{self::Class?} null : #t44.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
+  let final self::Class #t42 = nonNullableClass in #t42.{core::Object::==}(null) ?{self::Class?} null : #t42.{self::Class::nonNullableClass}.{self::Class::call}();
+  let final self::Class #t43 = nonNullableClass in #t43.{core::Object::==}(null) ?{self::Class?} null : #t43.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
 }
diff --git a/pkg/front_end/testcases/nnbd/null_access.dart.weak.expect b/pkg/front_end/testcases/nnbd/null_access.dart.weak.expect
index 7a28d30..066a5f6 100644
--- a/pkg/front_end/testcases/nnbd/null_access.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/null_access.dart.weak.expect
@@ -2,67 +2,67 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:24:3: Warning: Operator 'unary-' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:24:3: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
 //   -nullableInt; // error
 //   ^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:25:15: Warning: Operator '+' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:25:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
 //   nullableInt + 2; // error
 //               ^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:26:16: Warning: Operator '[]' is called on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:26:16: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
 //  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 //   nullableClass[nonNullableInt]; // error
 //                ^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:27:16: Warning: Operator '[]=' is called on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:27:16: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
 //  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 //   nullableClass[nonNullableInt] = nonNullableInt; // error
 //                ^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:28:16: Warning: Operator '[]' is called on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:28:16: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
 //  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 //   nullableClass[nonNullableInt] += nonNullableInt; // error
 //                ^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:28:16: Warning: Operator '[]=' is called on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:28:16: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
 //  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 //   nullableClass[nonNullableInt] += nonNullableInt; // error
 //                ^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:29:29: Warning: Operator '[]' is called on 'NullableIndexClass?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:29:29: Error: Operator '[]' cannot be called on 'NullableIndexClass?' because it is potentially null.
 //  - 'NullableIndexClass' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 //   nullableNullableIndexClass[nonNullableInt] ??= nonNullableInt; // error
 //                             ^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:29:29: Warning: Operator '[]=' is called on 'NullableIndexClass?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:29:29: Error: Operator '[]=' cannot be called on 'NullableIndexClass?' because it is potentially null.
 //  - 'NullableIndexClass' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 //   nullableNullableIndexClass[nonNullableInt] ??= nonNullableInt; // error
 //                             ^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:37:17: Warning: Property 'nonNullableField' is accessed on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:37:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
 //  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 // Try accessing using ?. instead.
 //   nullableClass.nonNullableField; // error
 //                 ^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:38:17: Warning: Property 'nonNullableField' is accessed on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:38:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
 //  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 // Try accessing using ?. instead.
 //   nullableClass.nonNullableField = 2; // error
 //                 ^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:39:17: Warning: Property 'nonNullableField' is accessed on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:39:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
 //  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 // Try accessing using ?. instead.
 //   nullableClass.nonNullableField += 2; // error
 //                 ^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:48:34: Warning: Operator '+' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
 //   nonNullableClass.nullableField += 2; // error
 //                                  ^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:49:32: Warning: Operator '+' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
 //   nullableClass?.nullableField += 2; // error
 //                                ^
 //
@@ -70,13 +70,7 @@
 //   nullableClass?.nonNullableClass.nonNullableField ??= 0; // ok
 //                                   ^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:57:16: Warning: Method 'call' is called on 'Class?' which is potentially null.
-//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
-// Try calling using ?. instead.
-//   nullableClass(); // error
-//                ^
-//
-// pkg/front_end/testcases/nnbd/null_access.dart:57:16: Warning: Expression of type 'Class?' is used as a function, but it's potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
 //  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 // Try calling using ?.call instead.
 //   nullableClass(); // error
@@ -121,32 +115,78 @@
 }
 static method main() → dynamic {}
 static method errors(self::Class? nullableClass, self::Class nonNullableClass, core::int? nullableInt, core::int nonNullableInt, self::NullableIndexClass? nullableNullableIndexClass) → dynamic {
-  nullableInt.{core::int::unary-}();
-  nullableInt.{core::num::+}(2);
-  nullableClass.{self::Class::[]}(nonNullableInt);
-  nullableClass.{self::Class::[]=}(nonNullableInt, nonNullableInt);
-  let final self::Class? #t1 = nullableClass in let final core::int #t2 = nonNullableInt in #t1.{self::Class::[]=}(#t2, #t1.{self::Class::[]}(#t2).{core::num::+}(nonNullableInt));
-  let final self::NullableIndexClass? #t3 = nullableNullableIndexClass in let final core::int #t4 = nonNullableInt in #t3.{self::NullableIndexClass::[]}(#t4).{core::num::==}(null) ?{core::int} #t3.{self::NullableIndexClass::[]=}(#t4, nonNullableInt) : null;
-  let final self::Class? #t5 = nullableClass in #t5.{core::Object::==}(null) ?{core::int?} null : #t5{self::Class}.{self::Class::nonNullableClass}.{self::Class::[]}(nonNullableInt);
-  let final self::Class? #t6 = nullableClass in #t6.{core::Object::==}(null) ?{core::int?} null : #t6{self::Class}.{self::Class::nonNullableClass}.{self::Class::[]=}(nonNullableInt, nonNullableInt);
-  let final self::Class? #t7 = nullableClass in #t7.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t8 = #t7{self::Class}.{self::Class::nonNullableClass} in let final core::int #t9 = nonNullableInt in #t8.{self::Class::[]=}(#t9, #t8.{self::Class::[]}(#t9).{core::num::+}(nonNullableInt));
-  let final self::Class? #t10 = nullableClass in #t10.{core::Object::==}(null) ?{core::int?} null : let final self::NullableIndexClass #t11 = #t10{self::Class}.{self::Class::nonNullableNullableIndexClass} in let final core::int #t12 = nonNullableInt in #t11.{self::NullableIndexClass::[]}(#t12).{core::num::==}(null) ?{core::int} #t11.{self::NullableIndexClass::[]=}(#t12, nonNullableInt) : null;
-  nullableClass.{self::Class::nonNullableField};
-  nullableClass.{self::Class::nonNullableField} = 2;
-  let final self::Class? #t13 = nullableClass in #t13.{self::Class::nonNullableField} = #t13.{self::Class::nonNullableField}.{core::num::+}(2);
-  let final self::Class? #t14 = nullableClass in #t14.{core::Object::==}(null) ?{core::int?} null : #t14{self::Class}.{self::Class::nonNullableField};
-  let final self::Class? #t15 = nullableClass in #t15.{core::Object::==}(null) ?{core::int?} null : #t15{self::Class}.{self::Class::nonNullableField} = 2;
-  let final self::Class? #t16 = nullableClass in #t16.{core::Object::==}(null) ?{core::int?} null : #t16.{self::Class::nonNullableField} = #t16.{self::Class::nonNullableField}.{core::num::+}(2);
-  let final self::Class? #t17 = nullableClass in #t17.{core::Object::==}(null) ?{core::int?} null : #t17{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField};
-  let final self::Class? #t18 = nullableClass in #t18.{core::Object::==}(null) ?{core::int?} null : #t18{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField} = 2;
-  let final self::Class #t19 = nonNullableClass in #t19.{self::Class::nullableField} = #t19.{self::Class::nullableField}.{core::num::+}(2);
-  let final self::Class? #t20 = nullableClass in #t20.{core::Object::==}(null) ?{core::int?} null : #t20.{self::Class::nullableField} = #t20.{self::Class::nullableField}.{core::num::+}(2);
-  let final self::Class? #t21 = nullableClass in #t21.{core::Object::==}(null) ?{core::int?} null : #t21.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t21.{self::Class::nonNullableField} = 0 : null;
-  let final self::Class? #t22 = nullableClass in #t22.{core::Object::==}(null) ?{core::int?} null : #t22.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t22.{self::Class::nullableField} = 0 : null;
-  let final self::Class? #t23 = nullableClass in #t23.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t24 = #t23{self::Class}.{self::Class::nonNullableClass} in #t24{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t24{self::Class}.{self::Class::nonNullableField} = 0 : null;
-  let final self::Class? #t25 = nullableClass in #t25.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t26 = #t25{self::Class}.{self::Class::nonNullableClass} in #t26{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t26{self::Class}.{self::Class::nullableField} = 0 : null;
-  nullableClass.{self::Class::call}();
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:24:3: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+  -nullableInt; // error
+  ^" in nullableInt.{core::int::unary-}();
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:25:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  nullableInt + 2; // error
+              ^" in nullableInt.{core::num::+}(2);
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:26:16: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+  nullableClass[nonNullableInt]; // error
+               ^" in nullableClass.{self::Class::[]}(nonNullableInt);
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:27:16: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+  nullableClass[nonNullableInt] = nonNullableInt; // error
+               ^" in nullableClass.{self::Class::[]=}(nonNullableInt, nonNullableInt);
+  let final self::Class? #t5 = nullableClass in let final core::int #t6 = nonNullableInt in let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:28:16: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+  nullableClass[nonNullableInt] += nonNullableInt; // error
+               ^" in #t5.{self::Class::[]=}(#t6, (let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:28:16: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+  nullableClass[nonNullableInt] += nonNullableInt; // error
+               ^" in #t5.{self::Class::[]}(#t6)).{core::num::+}(nonNullableInt));
+  let final self::NullableIndexClass? #t9 = nullableNullableIndexClass in let final core::int #t10 = nonNullableInt in (let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:29:29: Error: Operator '[]' cannot be called on 'NullableIndexClass?' because it is potentially null.
+ - 'NullableIndexClass' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+  nullableNullableIndexClass[nonNullableInt] ??= nonNullableInt; // error
+                            ^" in #t9.{self::NullableIndexClass::[]}(#t10)).{core::num::==}(null) ?{core::int} let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:29:29: Error: Operator '[]=' cannot be called on 'NullableIndexClass?' because it is potentially null.
+ - 'NullableIndexClass' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+  nullableNullableIndexClass[nonNullableInt] ??= nonNullableInt; // error
+                            ^" in #t9.{self::NullableIndexClass::[]=}(#t10, nonNullableInt) : null;
+  let final self::Class? #t13 = nullableClass in #t13.{core::Object::==}(null) ?{core::int?} null : #t13{self::Class}.{self::Class::nonNullableClass}.{self::Class::[]}(nonNullableInt);
+  let final self::Class? #t14 = nullableClass in #t14.{core::Object::==}(null) ?{core::int?} null : #t14{self::Class}.{self::Class::nonNullableClass}.{self::Class::[]=}(nonNullableInt, nonNullableInt);
+  let final self::Class? #t15 = nullableClass in #t15.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t16 = #t15{self::Class}.{self::Class::nonNullableClass} in let final core::int #t17 = nonNullableInt in #t16.{self::Class::[]=}(#t17, #t16.{self::Class::[]}(#t17).{core::num::+}(nonNullableInt));
+  let final self::Class? #t18 = nullableClass in #t18.{core::Object::==}(null) ?{core::int?} null : let final self::NullableIndexClass #t19 = #t18{self::Class}.{self::Class::nonNullableNullableIndexClass} in let final core::int #t20 = nonNullableInt in #t19.{self::NullableIndexClass::[]}(#t20).{core::num::==}(null) ?{core::int} #t19.{self::NullableIndexClass::[]=}(#t20, nonNullableInt) : null;
+  let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:37:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try accessing using ?. instead.
+  nullableClass.nonNullableField; // error
+                ^^^^^^^^^^^^^^^^" in nullableClass.{self::Class::nonNullableField};
+  let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:38:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try accessing using ?. instead.
+  nullableClass.nonNullableField = 2; // error
+                ^^^^^^^^^^^^^^^^" in nullableClass.{self::Class::nonNullableField} = 2;
+  let final self::Class? #t23 = nullableClass in let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:39:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try accessing using ?. instead.
+  nullableClass.nonNullableField += 2; // error
+                ^^^^^^^^^^^^^^^^" in #t23.{self::Class::nonNullableField} = (let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:39:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try accessing using ?. instead.
+  nullableClass.nonNullableField += 2; // error
+                ^^^^^^^^^^^^^^^^" in #t23.{self::Class::nonNullableField}).{core::num::+}(2);
+  let final self::Class? #t26 = nullableClass in #t26.{core::Object::==}(null) ?{core::int?} null : #t26{self::Class}.{self::Class::nonNullableField};
+  let final self::Class? #t27 = nullableClass in #t27.{core::Object::==}(null) ?{core::int?} null : #t27{self::Class}.{self::Class::nonNullableField} = 2;
+  let final self::Class? #t28 = nullableClass in #t28.{core::Object::==}(null) ?{core::int?} null : #t28.{self::Class::nonNullableField} = #t28.{self::Class::nonNullableField}.{core::num::+}(2);
+  let final self::Class? #t29 = nullableClass in #t29.{core::Object::==}(null) ?{core::int?} null : #t29{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField};
+  let final self::Class? #t30 = nullableClass in #t30.{core::Object::==}(null) ?{core::int?} null : #t30{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField} = 2;
+  let final self::Class #t31 = nonNullableClass in #t31.{self::Class::nullableField} = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  nonNullableClass.nullableField += 2; // error
+                                 ^" in #t31.{self::Class::nullableField}.{core::num::+}(2);
+  let final self::Class? #t33 = nullableClass in #t33.{core::Object::==}(null) ?{core::int?} null : #t33.{self::Class::nullableField} = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  nullableClass?.nullableField += 2; // error
+                               ^" in #t33.{self::Class::nullableField}.{core::num::+}(2);
+  let final self::Class? #t35 = nullableClass in #t35.{core::Object::==}(null) ?{core::int?} null : #t35.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t35.{self::Class::nonNullableField} = 0 : null;
+  let final self::Class? #t36 = nullableClass in #t36.{core::Object::==}(null) ?{core::int?} null : #t36.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t36.{self::Class::nullableField} = 0 : null;
+  let final self::Class? #t37 = nullableClass in #t37.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t38 = #t37{self::Class}.{self::Class::nonNullableClass} in #t38{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t38{self::Class}.{self::Class::nonNullableField} = 0 : null;
+  let final self::Class? #t39 = nullableClass in #t39.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t40 = #t39{self::Class}.{self::Class::nonNullableClass} in #t40{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t40{self::Class}.{self::Class::nullableField} = 0 : null;
+  let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try calling using ?.call instead.
+  nullableClass(); // error
+               ^" in nullableClass.{self::Class::call}();
   nonNullableClass.{self::Class::call}();
-  let final self::Class #t27 = nonNullableClass in #t27.{core::Object::==}(null) ?{self::Class?} null : #t27.{self::Class::nonNullableClass}.{self::Class::call}();
-  let final self::Class #t28 = nonNullableClass in #t28.{core::Object::==}(null) ?{self::Class?} null : #t28.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
+  let final self::Class #t42 = nonNullableClass in #t42.{core::Object::==}(null) ?{self::Class?} null : #t42.{self::Class::nonNullableClass}.{self::Class::call}();
+  let final self::Class #t43 = nonNullableClass in #t43.{core::Object::==}(null) ?{self::Class?} null : #t43.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
 }
diff --git a/pkg/front_end/testcases/nnbd/null_access.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/null_access.dart.weak.transformed.expect
index 7a28d30..066a5f6 100644
--- a/pkg/front_end/testcases/nnbd/null_access.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/null_access.dart.weak.transformed.expect
@@ -2,67 +2,67 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:24:3: Warning: Operator 'unary-' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:24:3: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
 //   -nullableInt; // error
 //   ^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:25:15: Warning: Operator '+' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:25:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
 //   nullableInt + 2; // error
 //               ^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:26:16: Warning: Operator '[]' is called on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:26:16: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
 //  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 //   nullableClass[nonNullableInt]; // error
 //                ^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:27:16: Warning: Operator '[]=' is called on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:27:16: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
 //  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 //   nullableClass[nonNullableInt] = nonNullableInt; // error
 //                ^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:28:16: Warning: Operator '[]' is called on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:28:16: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
 //  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 //   nullableClass[nonNullableInt] += nonNullableInt; // error
 //                ^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:28:16: Warning: Operator '[]=' is called on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:28:16: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
 //  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 //   nullableClass[nonNullableInt] += nonNullableInt; // error
 //                ^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:29:29: Warning: Operator '[]' is called on 'NullableIndexClass?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:29:29: Error: Operator '[]' cannot be called on 'NullableIndexClass?' because it is potentially null.
 //  - 'NullableIndexClass' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 //   nullableNullableIndexClass[nonNullableInt] ??= nonNullableInt; // error
 //                             ^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:29:29: Warning: Operator '[]=' is called on 'NullableIndexClass?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:29:29: Error: Operator '[]=' cannot be called on 'NullableIndexClass?' because it is potentially null.
 //  - 'NullableIndexClass' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 //   nullableNullableIndexClass[nonNullableInt] ??= nonNullableInt; // error
 //                             ^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:37:17: Warning: Property 'nonNullableField' is accessed on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:37:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
 //  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 // Try accessing using ?. instead.
 //   nullableClass.nonNullableField; // error
 //                 ^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:38:17: Warning: Property 'nonNullableField' is accessed on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:38:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
 //  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 // Try accessing using ?. instead.
 //   nullableClass.nonNullableField = 2; // error
 //                 ^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:39:17: Warning: Property 'nonNullableField' is accessed on 'Class?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:39:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
 //  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 // Try accessing using ?. instead.
 //   nullableClass.nonNullableField += 2; // error
 //                 ^^^^^^^^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:48:34: Warning: Operator '+' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
 //   nonNullableClass.nullableField += 2; // error
 //                                  ^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:49:32: Warning: Operator '+' is called on 'int?' which is potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
 //   nullableClass?.nullableField += 2; // error
 //                                ^
 //
@@ -70,13 +70,7 @@
 //   nullableClass?.nonNullableClass.nonNullableField ??= 0; // ok
 //                                   ^
 //
-// pkg/front_end/testcases/nnbd/null_access.dart:57:16: Warning: Method 'call' is called on 'Class?' which is potentially null.
-//  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
-// Try calling using ?. instead.
-//   nullableClass(); // error
-//                ^
-//
-// pkg/front_end/testcases/nnbd/null_access.dart:57:16: Warning: Expression of type 'Class?' is used as a function, but it's potentially null.
+// pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
 //  - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
 // Try calling using ?.call instead.
 //   nullableClass(); // error
@@ -121,32 +115,78 @@
 }
 static method main() → dynamic {}
 static method errors(self::Class? nullableClass, self::Class nonNullableClass, core::int? nullableInt, core::int nonNullableInt, self::NullableIndexClass? nullableNullableIndexClass) → dynamic {
-  nullableInt.{core::int::unary-}();
-  nullableInt.{core::num::+}(2);
-  nullableClass.{self::Class::[]}(nonNullableInt);
-  nullableClass.{self::Class::[]=}(nonNullableInt, nonNullableInt);
-  let final self::Class? #t1 = nullableClass in let final core::int #t2 = nonNullableInt in #t1.{self::Class::[]=}(#t2, #t1.{self::Class::[]}(#t2).{core::num::+}(nonNullableInt));
-  let final self::NullableIndexClass? #t3 = nullableNullableIndexClass in let final core::int #t4 = nonNullableInt in #t3.{self::NullableIndexClass::[]}(#t4).{core::num::==}(null) ?{core::int} #t3.{self::NullableIndexClass::[]=}(#t4, nonNullableInt) : null;
-  let final self::Class? #t5 = nullableClass in #t5.{core::Object::==}(null) ?{core::int?} null : #t5{self::Class}.{self::Class::nonNullableClass}.{self::Class::[]}(nonNullableInt);
-  let final self::Class? #t6 = nullableClass in #t6.{core::Object::==}(null) ?{core::int?} null : #t6{self::Class}.{self::Class::nonNullableClass}.{self::Class::[]=}(nonNullableInt, nonNullableInt);
-  let final self::Class? #t7 = nullableClass in #t7.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t8 = #t7{self::Class}.{self::Class::nonNullableClass} in let final core::int #t9 = nonNullableInt in #t8.{self::Class::[]=}(#t9, #t8.{self::Class::[]}(#t9).{core::num::+}(nonNullableInt));
-  let final self::Class? #t10 = nullableClass in #t10.{core::Object::==}(null) ?{core::int?} null : let final self::NullableIndexClass #t11 = #t10{self::Class}.{self::Class::nonNullableNullableIndexClass} in let final core::int #t12 = nonNullableInt in #t11.{self::NullableIndexClass::[]}(#t12).{core::num::==}(null) ?{core::int} #t11.{self::NullableIndexClass::[]=}(#t12, nonNullableInt) : null;
-  nullableClass.{self::Class::nonNullableField};
-  nullableClass.{self::Class::nonNullableField} = 2;
-  let final self::Class? #t13 = nullableClass in #t13.{self::Class::nonNullableField} = #t13.{self::Class::nonNullableField}.{core::num::+}(2);
-  let final self::Class? #t14 = nullableClass in #t14.{core::Object::==}(null) ?{core::int?} null : #t14{self::Class}.{self::Class::nonNullableField};
-  let final self::Class? #t15 = nullableClass in #t15.{core::Object::==}(null) ?{core::int?} null : #t15{self::Class}.{self::Class::nonNullableField} = 2;
-  let final self::Class? #t16 = nullableClass in #t16.{core::Object::==}(null) ?{core::int?} null : #t16.{self::Class::nonNullableField} = #t16.{self::Class::nonNullableField}.{core::num::+}(2);
-  let final self::Class? #t17 = nullableClass in #t17.{core::Object::==}(null) ?{core::int?} null : #t17{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField};
-  let final self::Class? #t18 = nullableClass in #t18.{core::Object::==}(null) ?{core::int?} null : #t18{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField} = 2;
-  let final self::Class #t19 = nonNullableClass in #t19.{self::Class::nullableField} = #t19.{self::Class::nullableField}.{core::num::+}(2);
-  let final self::Class? #t20 = nullableClass in #t20.{core::Object::==}(null) ?{core::int?} null : #t20.{self::Class::nullableField} = #t20.{self::Class::nullableField}.{core::num::+}(2);
-  let final self::Class? #t21 = nullableClass in #t21.{core::Object::==}(null) ?{core::int?} null : #t21.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t21.{self::Class::nonNullableField} = 0 : null;
-  let final self::Class? #t22 = nullableClass in #t22.{core::Object::==}(null) ?{core::int?} null : #t22.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t22.{self::Class::nullableField} = 0 : null;
-  let final self::Class? #t23 = nullableClass in #t23.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t24 = #t23{self::Class}.{self::Class::nonNullableClass} in #t24{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t24{self::Class}.{self::Class::nonNullableField} = 0 : null;
-  let final self::Class? #t25 = nullableClass in #t25.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t26 = #t25{self::Class}.{self::Class::nonNullableClass} in #t26{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t26{self::Class}.{self::Class::nullableField} = 0 : null;
-  nullableClass.{self::Class::call}();
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:24:3: Error: Operator 'unary-' cannot be called on 'int?' because it is potentially null.
+  -nullableInt; // error
+  ^" in nullableInt.{core::int::unary-}();
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:25:15: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  nullableInt + 2; // error
+              ^" in nullableInt.{core::num::+}(2);
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:26:16: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+  nullableClass[nonNullableInt]; // error
+               ^" in nullableClass.{self::Class::[]}(nonNullableInt);
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:27:16: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+  nullableClass[nonNullableInt] = nonNullableInt; // error
+               ^" in nullableClass.{self::Class::[]=}(nonNullableInt, nonNullableInt);
+  let final self::Class? #t5 = nullableClass in let final core::int #t6 = nonNullableInt in let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:28:16: Error: Operator '[]=' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+  nullableClass[nonNullableInt] += nonNullableInt; // error
+               ^" in #t5.{self::Class::[]=}(#t6, (let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:28:16: Error: Operator '[]' cannot be called on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+  nullableClass[nonNullableInt] += nonNullableInt; // error
+               ^" in #t5.{self::Class::[]}(#t6)).{core::num::+}(nonNullableInt));
+  let final self::NullableIndexClass? #t9 = nullableNullableIndexClass in let final core::int #t10 = nonNullableInt in (let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:29:29: Error: Operator '[]' cannot be called on 'NullableIndexClass?' because it is potentially null.
+ - 'NullableIndexClass' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+  nullableNullableIndexClass[nonNullableInt] ??= nonNullableInt; // error
+                            ^" in #t9.{self::NullableIndexClass::[]}(#t10)).{core::num::==}(null) ?{core::int} let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:29:29: Error: Operator '[]=' cannot be called on 'NullableIndexClass?' because it is potentially null.
+ - 'NullableIndexClass' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+  nullableNullableIndexClass[nonNullableInt] ??= nonNullableInt; // error
+                            ^" in #t9.{self::NullableIndexClass::[]=}(#t10, nonNullableInt) : null;
+  let final self::Class? #t13 = nullableClass in #t13.{core::Object::==}(null) ?{core::int?} null : #t13{self::Class}.{self::Class::nonNullableClass}.{self::Class::[]}(nonNullableInt);
+  let final self::Class? #t14 = nullableClass in #t14.{core::Object::==}(null) ?{core::int?} null : #t14{self::Class}.{self::Class::nonNullableClass}.{self::Class::[]=}(nonNullableInt, nonNullableInt);
+  let final self::Class? #t15 = nullableClass in #t15.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t16 = #t15{self::Class}.{self::Class::nonNullableClass} in let final core::int #t17 = nonNullableInt in #t16.{self::Class::[]=}(#t17, #t16.{self::Class::[]}(#t17).{core::num::+}(nonNullableInt));
+  let final self::Class? #t18 = nullableClass in #t18.{core::Object::==}(null) ?{core::int?} null : let final self::NullableIndexClass #t19 = #t18{self::Class}.{self::Class::nonNullableNullableIndexClass} in let final core::int #t20 = nonNullableInt in #t19.{self::NullableIndexClass::[]}(#t20).{core::num::==}(null) ?{core::int} #t19.{self::NullableIndexClass::[]=}(#t20, nonNullableInt) : null;
+  let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:37:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try accessing using ?. instead.
+  nullableClass.nonNullableField; // error
+                ^^^^^^^^^^^^^^^^" in nullableClass.{self::Class::nonNullableField};
+  let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:38:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try accessing using ?. instead.
+  nullableClass.nonNullableField = 2; // error
+                ^^^^^^^^^^^^^^^^" in nullableClass.{self::Class::nonNullableField} = 2;
+  let final self::Class? #t23 = nullableClass in let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:39:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try accessing using ?. instead.
+  nullableClass.nonNullableField += 2; // error
+                ^^^^^^^^^^^^^^^^" in #t23.{self::Class::nonNullableField} = (let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:39:17: Error: Property 'nonNullableField' cannot be accessed on 'Class?' because it is potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try accessing using ?. instead.
+  nullableClass.nonNullableField += 2; // error
+                ^^^^^^^^^^^^^^^^" in #t23.{self::Class::nonNullableField}).{core::num::+}(2);
+  let final self::Class? #t26 = nullableClass in #t26.{core::Object::==}(null) ?{core::int?} null : #t26{self::Class}.{self::Class::nonNullableField};
+  let final self::Class? #t27 = nullableClass in #t27.{core::Object::==}(null) ?{core::int?} null : #t27{self::Class}.{self::Class::nonNullableField} = 2;
+  let final self::Class? #t28 = nullableClass in #t28.{core::Object::==}(null) ?{core::int?} null : #t28.{self::Class::nonNullableField} = #t28.{self::Class::nonNullableField}.{core::num::+}(2);
+  let final self::Class? #t29 = nullableClass in #t29.{core::Object::==}(null) ?{core::int?} null : #t29{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField};
+  let final self::Class? #t30 = nullableClass in #t30.{core::Object::==}(null) ?{core::int?} null : #t30{self::Class}.{self::Class::nonNullableClass}.{self::Class::nonNullableField} = 2;
+  let final self::Class #t31 = nonNullableClass in #t31.{self::Class::nullableField} = let final<BottomType> #t32 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:48:34: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  nonNullableClass.nullableField += 2; // error
+                                 ^" in #t31.{self::Class::nullableField}.{core::num::+}(2);
+  let final self::Class? #t33 = nullableClass in #t33.{core::Object::==}(null) ?{core::int?} null : #t33.{self::Class::nullableField} = let final<BottomType> #t34 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:49:32: Error: Operator '+' cannot be called on 'int?' because it is potentially null.
+  nullableClass?.nullableField += 2; // error
+                               ^" in #t33.{self::Class::nullableField}.{core::num::+}(2);
+  let final self::Class? #t35 = nullableClass in #t35.{core::Object::==}(null) ?{core::int?} null : #t35.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t35.{self::Class::nonNullableField} = 0 : null;
+  let final self::Class? #t36 = nullableClass in #t36.{core::Object::==}(null) ?{core::int?} null : #t36.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t36.{self::Class::nullableField} = 0 : null;
+  let final self::Class? #t37 = nullableClass in #t37.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t38 = #t37{self::Class}.{self::Class::nonNullableClass} in #t38{self::Class}.{self::Class::nonNullableField}.{core::num::==}(null) ?{core::int} #t38{self::Class}.{self::Class::nonNullableField} = 0 : null;
+  let final self::Class? #t39 = nullableClass in #t39.{core::Object::==}(null) ?{core::int?} null : let final self::Class? #t40 = #t39{self::Class}.{self::Class::nonNullableClass} in #t40{self::Class}.{self::Class::nullableField}.{core::num::==}(null) ?{core::int} #t40{self::Class}.{self::Class::nullableField} = 0 : null;
+  let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/nnbd/null_access.dart:57:16: Error: Can't use an expression of type 'Class?' as a function because it's potentially null.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/null_access.dart'.
+Try calling using ?.call instead.
+  nullableClass(); // error
+               ^" in nullableClass.{self::Class::call}();
   nonNullableClass.{self::Class::call}();
-  let final self::Class #t27 = nonNullableClass in #t27.{core::Object::==}(null) ?{self::Class?} null : #t27.{self::Class::nonNullableClass}.{self::Class::call}();
-  let final self::Class #t28 = nonNullableClass in #t28.{core::Object::==}(null) ?{self::Class?} null : #t28.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
+  let final self::Class #t42 = nonNullableClass in #t42.{core::Object::==}(null) ?{self::Class?} null : #t42.{self::Class::nonNullableClass}.{self::Class::call}();
+  let final self::Class #t43 = nonNullableClass in #t43.{core::Object::==}(null) ?{self::Class?} null : #t43.{self::Class::nonNullableClass}.{self::Class::nonNullableClass}.{self::Class::call}();
 }
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 1667166..4b8eb0a 100644
--- a/pkg/front_end/testcases/nnbd/null_shorting.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/null_shorting.dart.weak.expect
@@ -2,24 +2,24 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/null_shorting.dart:87:47: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// 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);
 //                                               ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/null_shorting.dart:88:43: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// 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);
 //                                           ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/null_shorting.dart:220:33: Warning: Operator '+' is called on 'Class1?' which is potentially null.
+// 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);
 //                                 ^
 //
-// pkg/front_end/testcases/nnbd/null_shorting.dart:221:16: Warning: Operator 'unary-' is called on 'Class1?' which is potentially null.
+// 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);
 //                ^
@@ -110,139 +110,153 @@
   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 self::Class1? #t17 = n1 in #t17.{core::Object::==}(null) ?{self::Class1?} null : #t17{self::Class1}.{self::Class1::nullable1} = new self::Class1::•()).{self::Class1::nullable1});
-  self::throws(() → self::Class1? => (let final self::Class1? #t18 = n1 in #t18.{core::Object::==}(null) ?{self::Class1?} null : #t18{self::Class1}.{self::Class1::nonNullable1Method}()).{self::Class1::nullable1});
-  nullable1 = let final self::Class1? #t19 = n1 in #t19.{core::Object::==}(null) ?{self::Class1?} null : #t19{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
-  nullable1 = let final self::Class1? #t20 = n1 in #t20.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t21 = #t20{self::Class1}.{self::Class1::nullable1} in #t21.{core::Object::==}(null) ?{self::Class1?} null : #t21{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
-  nullable1 = let final self::Class1? #t22 = n1 in #t22.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t23 = #t22{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} in #t23.{core::Object::==}(null) ?{self::Class1?} null : #t23{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t24 = n1 in #t24.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t25 = #t24{self::Class1}.{self::Class1::nullable1} in #t25.{core::Object::==}(null) ?{self::Class1?} null : #t25{self::Class1}.{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t26 = n1 in #t26.{core::Object::==}(null) ?{self::Class1?} null : #t26{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
-  nullable1 = let final self::Class1? #t27 = n1 in #t27.{core::Object::==}(null) ?{self::Class1?} null : #t27{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
-  let final self::Class1? #t28 = n1 in #t28.{core::Object::==}(null) ?{self::Class1?} null : #t28{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
-  nullable1 = let final self::Class1? #t29 = n1 in #t29.{core::Object::==}(null) ?{self::Class1?} null : #t29{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t30 = n1 in #t30.{core::Object::==}(null) ?{self::Class1?} null : #t30{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
-  nullable1 = let final self::Class1? #t31 = n1 in #t31.{core::Object::==}(null) ?{self::Class1?} null : #t31{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t32 = n1 in #t32.{core::Object::==}(null) ?{self::Class1?} null : #t32{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
-  let final self::Class1? #t33 = n1 in #t33.{core::Object::==}(null) ?{self::Class1?} null : #t33{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t34 = n1 in #t34.{core::Object::==}(null) ?{self::Class1?} null : #t34{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t35 = n1 in #t35.{core::Object::==}(null) ?{self::Class1?} null : #t35{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1};
-  let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : #t36{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
-  nullable1 = let final self::Class1? #t37 = n1 in #t37.{core::Object::==}(null) ?{self::Class1?} null : #t37{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t38 = n1 in #t38.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t39 = #t38{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} in #t39.{core::Object::==}(null) ?{self::Class1?} null : #t39{self::Class1}.{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t40 = n1 in #t40.{core::Object::==}(null) ?{self::Class1?} null : #t40{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1};
-  nullable1 = let final self::Class1? #t41 = n1 in #t41.{core::Object::==}(null) ?{self::Class1?} null : #t41{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1};
-  let final self::Class1? #t42 = n1 in #t42.{core::Object::==}(null) ?{self::Class1?} null : #t42{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
-  nullable1 = let final self::Class1? #t43 = n1 in #t43.{core::Object::==}(null) ?{self::Class1?} null : #t43{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t44 = n1 in #t44.{core::Object::==}(null) ?{self::Class1?} null : #t44{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
-  nullable1 = let final self::Class1? #t45 = n1 in #t45.{core::Object::==}(null) ?{self::Class1?} null : #t45{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t46 = n1 in #t46.{core::Object::==}(null) ?{self::Class1?} null : #t46{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nullable1};
-  let final self::Class1? #t47 = n1 in #t47.{core::Object::==}(null) ?{self::Class1?} null : #t47{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t48 = n1 in #t48.{core::Object::==}(null) ?{self::Class1?} null : #t48{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t49 = n1 in #t49.{core::Object::==}(null) ?{self::Class1?} null : #t49{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
-  nullable1 = let final self::Class1? #t50 = n1 in #t50.{core::Object::==}(null) ?{self::Class1?} null : #t50{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
-  let final self::Class1? #t51 = n1 in #t51.{core::Object::==}(null) ?{self::Class1?} null : #t51{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
-  nullable1 = let final self::Class1? #t52 = n1 in #t52.{core::Object::==}(null) ?{self::Class1?} null : #t52{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t53 = n1 in #t53.{core::Object::==}(null) ?{self::Class1?} null : #t53{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
-  nullable1 = let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : #t54{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : #t55{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
-  nullable1 = let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : #t56{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
-  let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : #t57{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
-  nullable1 = let final self::Class1? #t58 = n1 in #t58.{core::Object::==}(null) ?{self::Class1?} null : #t58{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t59 = n1 in #t59.{core::Object::==}(null) ?{self::Class1?} null : #t59{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
-  nullable1 = let final self::Class1? #t60 = n1 in #t60.{core::Object::==}(null) ?{self::Class1?} null : #t60{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t61 = n1 in #t61.{core::Object::==}(null) ?{self::Class1?} null : #t61{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
-  nullable1 = let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : #t62{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
-  let final self::Class1? #t63 = n1 in #t63.{core::Object::==}(null) ?{self::Class1?} null : #t63{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
-  nullable1 = let final self::Class1? #t64 = n1 in #t64.{core::Object::==}(null) ?{self::Class1?} null : #t64{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t65 = n1 in #t65.{core::Object::==}(null) ?{self::Class1?} null : #t65{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
-  nullable1 = let final self::Class1? #t66 = n1 in #t66.{core::Object::==}(null) ?{self::Class1?} null : #t66{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t67 = n1 in #t67.{core::Object::==}(null) ?{self::Class1?} null : #t67{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
-  let final self::Class1? #t68 = n1 in #t68.{core::Object::==}(null) ?{self::Class1?} null : #t68{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
-  nullable1 = let final self::Class1? #t69 = n1 in #t69.{core::Object::==}(null) ?{self::Class1?} null : #t69{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t70 = n1 in #t70.{core::Object::==}(null) ?{self::Class1?} null : #t70{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t71 = n1 in #t71.{core::Object::==}(null) ?{self::Class1?} null : #t71{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
-  nullable1 = let final self::Class1? #t72 = n1 in #t72.{core::Object::==}(null) ?{self::Class1?} null : #t72{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
-  let final self::Class1? #t73 = n1 in #t73.{core::Object::==}(null) ?{self::Class1?} null : #t73{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
-  nullable1 = let final self::Class1? #t74 = n1 in #t74.{core::Object::==}(null) ?{self::Class1?} null : #t74{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t75 = n1 in #t75.{core::Object::==}(null) ?{self::Class1?} null : #t75{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
-  nullable1 = let final self::Class1? #t76 = n1 in #t76.{core::Object::==}(null) ?{self::Class1?} null : #t76{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t77 = n1 in #t77.{core::Object::==}(null) ?{self::Class1?} null : #t77{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
-  let final self::Class1? #t78 = n1 in #t78.{core::Object::==}(null) ?{self::Class1?} null : #t78{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t79 = n1 in #t79.{core::Object::==}(null) ?{self::Class1?} null : #t79{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t81 = #t80{self::Class1}.{self::Class1::nonNullable1Method}() in #t81.{core::Object::==}(null) ?{self::Class1?} null : #t81{self::Class1}.{self::Class1::nonNullable1Method}();
+  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.
+ - '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.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
+Try accessing using ?. instead.
+  throws(() => (n1?.nonNullable1Method()).nullable1);
+                                          ^^^^^^^^^" in (let final self::Class1? #t20 = n1 in #t20.{core::Object::==}(null) ?{self::Class1?} null : #t20{self::Class1}.{self::Class1::nonNullable1Method}()).{self::Class1::nullable1});
+  nullable1 = let final self::Class1? #t21 = n1 in #t21.{core::Object::==}(null) ?{self::Class1?} null : #t21{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t22 = n1 in #t22.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t23 = #t22{self::Class1}.{self::Class1::nullable1} in #t23.{core::Object::==}(null) ?{self::Class1?} null : #t23{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t24 = n1 in #t24.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t25 = #t24{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} in #t25.{core::Object::==}(null) ?{self::Class1?} null : #t25{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t26 = n1 in #t26.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t27 = #t26{self::Class1}.{self::Class1::nullable1} in #t27.{core::Object::==}(null) ?{self::Class1?} null : #t27{self::Class1}.{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t28 = n1 in #t28.{core::Object::==}(null) ?{self::Class1?} null : #t28{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+  nullable1 = let final self::Class1? #t29 = n1 in #t29.{core::Object::==}(null) ?{self::Class1?} null : #t29{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+  let final self::Class1? #t30 = n1 in #t30.{core::Object::==}(null) ?{self::Class1?} null : #t30{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t31 = n1 in #t31.{core::Object::==}(null) ?{self::Class1?} null : #t31{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t32 = n1 in #t32.{core::Object::==}(null) ?{self::Class1?} null : #t32{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+  nullable1 = let final self::Class1? #t33 = n1 in #t33.{core::Object::==}(null) ?{self::Class1?} null : #t33{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t34 = n1 in #t34.{core::Object::==}(null) ?{self::Class1?} null : #t34{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
+  let final self::Class1? #t35 = n1 in #t35.{core::Object::==}(null) ?{self::Class1?} null : #t35{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : #t36{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t37 = n1 in #t37.{core::Object::==}(null) ?{self::Class1?} null : #t37{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1};
+  let final self::Class1? #t38 = n1 in #t38.{core::Object::==}(null) ?{self::Class1?} null : #t38{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t39 = n1 in #t39.{core::Object::==}(null) ?{self::Class1?} null : #t39{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t40 = n1 in #t40.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t41 = #t40{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} in #t41.{core::Object::==}(null) ?{self::Class1?} null : #t41{self::Class1}.{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t42 = n1 in #t42.{core::Object::==}(null) ?{self::Class1?} null : #t42{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1};
+  nullable1 = let final self::Class1? #t43 = n1 in #t43.{core::Object::==}(null) ?{self::Class1?} null : #t43{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1};
+  let final self::Class1? #t44 = n1 in #t44.{core::Object::==}(null) ?{self::Class1?} null : #t44{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t45 = n1 in #t45.{core::Object::==}(null) ?{self::Class1?} null : #t45{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t46 = n1 in #t46.{core::Object::==}(null) ?{self::Class1?} null : #t46{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
+  nullable1 = let final self::Class1? #t47 = n1 in #t47.{core::Object::==}(null) ?{self::Class1?} null : #t47{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t48 = n1 in #t48.{core::Object::==}(null) ?{self::Class1?} null : #t48{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nullable1};
+  let final self::Class1? #t49 = n1 in #t49.{core::Object::==}(null) ?{self::Class1?} null : #t49{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t50 = n1 in #t50.{core::Object::==}(null) ?{self::Class1?} null : #t50{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t51 = n1 in #t51.{core::Object::==}(null) ?{self::Class1?} null : #t51{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+  nullable1 = let final self::Class1? #t52 = n1 in #t52.{core::Object::==}(null) ?{self::Class1?} null : #t52{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+  let final self::Class1? #t53 = n1 in #t53.{core::Object::==}(null) ?{self::Class1?} null : #t53{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : #t54{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : #t55{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+  nullable1 = let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : #t56{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : #t57{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+  nullable1 = let final self::Class1? #t58 = n1 in #t58.{core::Object::==}(null) ?{self::Class1?} null : #t58{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+  let final self::Class1? #t59 = n1 in #t59.{core::Object::==}(null) ?{self::Class1?} null : #t59{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t60 = n1 in #t60.{core::Object::==}(null) ?{self::Class1?} null : #t60{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t61 = n1 in #t61.{core::Object::==}(null) ?{self::Class1?} null : #t61{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+  nullable1 = let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : #t62{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t63 = n1 in #t63.{core::Object::==}(null) ?{self::Class1?} null : #t63{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+  nullable1 = let final self::Class1? #t64 = n1 in #t64.{core::Object::==}(null) ?{self::Class1?} null : #t64{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+  let final self::Class1? #t65 = n1 in #t65.{core::Object::==}(null) ?{self::Class1?} null : #t65{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t66 = n1 in #t66.{core::Object::==}(null) ?{self::Class1?} null : #t66{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t67 = n1 in #t67.{core::Object::==}(null) ?{self::Class1?} null : #t67{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+  nullable1 = let final self::Class1? #t68 = n1 in #t68.{core::Object::==}(null) ?{self::Class1?} null : #t68{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t69 = n1 in #t69.{core::Object::==}(null) ?{self::Class1?} null : #t69{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
+  let final self::Class1? #t70 = n1 in #t70.{core::Object::==}(null) ?{self::Class1?} null : #t70{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t71 = n1 in #t71.{core::Object::==}(null) ?{self::Class1?} null : #t71{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t72 = n1 in #t72.{core::Object::==}(null) ?{self::Class1?} null : #t72{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t73 = n1 in #t73.{core::Object::==}(null) ?{self::Class1?} null : #t73{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
+  nullable1 = let final self::Class1? #t74 = n1 in #t74.{core::Object::==}(null) ?{self::Class1?} null : #t74{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
+  let final self::Class1? #t75 = n1 in #t75.{core::Object::==}(null) ?{self::Class1?} null : #t75{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t76 = n1 in #t76.{core::Object::==}(null) ?{self::Class1?} null : #t76{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t77 = n1 in #t77.{core::Object::==}(null) ?{self::Class1?} null : #t77{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
+  nullable1 = let final self::Class1? #t78 = n1 in #t78.{core::Object::==}(null) ?{self::Class1?} null : #t78{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t79 = n1 in #t79.{core::Object::==}(null) ?{self::Class1?} null : #t79{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
+  let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : #t80{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t81 = n1 in #t81.{core::Object::==}(null) ?{self::Class1?} null : #t81{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t83 = #t82{self::Class1}.{self::Class1::nonNullable1Method}() in #t83.{core::Object::==}(null) ?{self::Class1?} null : #t83{self::Class1}.{self::Class1::nonNullable1Method}();
 }
 static method indexAccess(self::Class1? n1, self::Class2? n2, self::Class3? n3) → void {
   self::Class1? nullable1 = n1;
   self::Class2? nullable2 = n2;
   self::Class3? nullable3 = n3;
-  let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : #t82{self::Class1}.{self::Class1::[]}(nullable1);
-  let final self::Class1? #t83 = n1 in #t83.{core::Object::==}(null) ?{self::Class1?} null : #t83{self::Class1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
-  let final self::Class1? #t84 = n1 in #t84.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t85 = #t84{self::Class1}.{self::Class1::[]}(nullable1) in #t85.{core::Object::==}(null) ?{self::Class1?} null : #t85{self::Class1}.{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t86 = n1 in #t86.{core::Object::==}(null) ?{self::Class1?} null : #t86{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]}(nullable1);
-  let final self::Class1? #t87 = n1 in #t87.{core::Object::==}(null) ?{self::Class1?} null : #t87{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
-  nullable1 = let final self::Class1? #t88 = n1 in #t88.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t89 = #t88{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1? #t90 = nullable1 in let final self::Class1 #t91 = new self::Class1::•() in let final void #t92 = #t89.{self::Class1::[]=}(#t90, #t91) in #t91;
-  let final self::Class1? #t93 = n1 in #t93.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t94 = #t93{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]}(nullable1) in #t94.{core::Object::==}(null) ?{self::Class1?} null : #t94{self::Class1}.{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t95 = n1 in #t95.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t96 = #t95{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t97 = nullable2 in #t96.{self::Class2::[]=}(#t97, #t96.{self::Class2::[]}(#t97).{self::Class2::+}(0));
-  nullable2 = let final self::Class1? #t98 = n1 in #t98.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t99 = #t98{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t100 = nullable2 in let final self::Class2 #t101 = #t99.{self::Class2::[]}(#t100).{self::Class2::+}(0) in let final void #t102 = #t99.{self::Class2::[]=}(#t100, #t101) in #t101;
-  let final self::Class1? #t103 = n1 in #t103.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t104 = nullable1 in #t103{self::Class1}.{self::Class1::[]}(#t104).{core::Object::==}(null) ?{self::Class1?} #t103{self::Class1}.{self::Class1::[]=}(#t104, nullable1) : null;
-  nullable1 = let final self::Class1? #t105 = n1 in #t105.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t106 = nullable1 in let final self::Class1? #t107 = #t105{self::Class1}.{self::Class1::[]}(#t106) in #t107.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t108 = nullable1 in let final void #t109 = #t105{self::Class1}.{self::Class1::[]=}(#t106, #t108) in #t108 : #t107{self::Class1};
-  let final self::Class2? #t110 = n2 in #t110.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t111 = nullable2 in #t110{self::Class2}.{self::Class2::[]=}(#t111, #t110{self::Class2}.{self::Class2::[]}(#t111).{self::Class2::+}(0));
-  nullable2 = let final self::Class2? #t112 = n2 in #t112.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t113 = nullable2 in let final self::Class2 #t114 = #t112{self::Class2}.{self::Class2::[]}(#t113).{self::Class2::+}(0) in let final void #t115 = #t112{self::Class2}.{self::Class2::[]=}(#t113, #t114) in #t114;
-  let final self::Class2? #t116 = n2 in #t116.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t117 = nullable2 in #t116{self::Class2}.{self::Class2::[]=}(#t117, #t116{self::Class2}.{self::Class2::[]}(#t117).{self::Class2::+}(0));
-  nullable2 = let final self::Class2? #t118 = n2 in #t118.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t119 = nullable2 in let final self::Class2 #t120 = #t118{self::Class2}.{self::Class2::[]}(#t119).{self::Class2::+}(0) in let final void #t121 = #t118{self::Class2}.{self::Class2::[]=}(#t119, #t120) in #t120;
-  let final self::Class2? #t122 = n2 in #t122.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t123 = nullable2 in #t122{self::Class2}.{self::Class2::[]=}(#t123, #t122{self::Class2}.{self::Class2::[]}(#t123).{self::Class2::+}(1));
-  nullable2 = let final self::Class2? #t124 = n2 in #t124.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t125 = nullable2 in let final self::Class2 #t126 = #t124{self::Class2}.{self::Class2::[]}(#t125) in let final void #t127 = #t124{self::Class2}.{self::Class2::[]=}(#t125, #t126.{self::Class2::+}(1)) in #t126;
-  let final self::Class2? #t128 = n2 in #t128.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t129 = nullable2 in let final self::Class2 #t130 = #t128{self::Class2}.{self::Class2::[]}(#t129).{self::Class2::+}(1) in let final void #t131 = #t128{self::Class2}.{self::Class2::[]=}(#t129, #t130) in #t130;
-  nullable2 = let final self::Class2? #t132 = n2 in #t132.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t133 = nullable2 in let final self::Class2 #t134 = #t132{self::Class2}.{self::Class2::[]}(#t133).{self::Class2::+}(1) in let final void #t135 = #t132{self::Class2}.{self::Class2::[]=}(#t133, #t134) in #t134;
-  let final self::Class1? #t136 = n1 in #t136.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t137 = #t136{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t138 = nullable2 in #t137.{self::Class2::[]=}(#t138, #t137.{self::Class2::[]}(#t138).{self::Class2::+}(1));
-  nullable2 = let final self::Class1? #t139 = n1 in #t139.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t140 = #t139{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t141 = nullable2 in let final self::Class2 #t142 = #t140.{self::Class2::[]}(#t141) in let final void #t143 = #t140.{self::Class2::[]=}(#t141, #t142.{self::Class2::+}(1)) in #t142;
-  let final self::Class1? #t144 = n1 in #t144.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t145 = #t144{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t146 = nullable2 in let final self::Class2 #t147 = #t145.{self::Class2::[]}(#t146).{self::Class2::+}(1) in let final void #t148 = #t145.{self::Class2::[]=}(#t146, #t147) in #t147;
-  nullable2 = let final self::Class1? #t149 = n1 in #t149.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t150 = #t149{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t151 = nullable2 in let final self::Class2 #t152 = #t150.{self::Class2::[]}(#t151).{self::Class2::+}(1) in let final void #t153 = #t150.{self::Class2::[]=}(#t151, #t152) in #t152;
-  let final self::Class1? #t154 = n1 in #t154.{core::Object::==}(null) ?{self::Class2?} null : #t154{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]}(nullable2);
-  let final self::Class1? #t155 = n1 in #t155.{core::Object::==}(null) ?{self::Class2?} null : #t155{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]=}(nullable2, new self::Class2::•());
-  nullable2 = let final self::Class1? #t156 = n1 in #t156.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t157 = #t156{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t158 = nullable2 in let final self::Class2 #t159 = new self::Class2::•() in let final void #t160 = #t157.{self::Class2::[]=}(#t158, #t159) in #t159;
-  let final self::Class1? #t161 = n1 in #t161.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t162 = #t161{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]}(nullable2) in #t162.{core::Object::==}(null) ?{self::Class2?} null : #t162{self::Class2}.{self::Class2::nonNullable2Method}();
-  let final self::Class1? #t163 = n1 in #t163.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t164 = #t163{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t165 = nullable2 in #t164.{self::Class2::[]=}(#t165, #t164.{self::Class2::[]}(#t165).{self::Class2::+}(0));
-  nullable2 = let final self::Class1? #t166 = n1 in #t166.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t167 = #t166{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t168 = nullable2 in let final self::Class2 #t169 = #t167.{self::Class2::[]}(#t168).{self::Class2::+}(0) in let final void #t170 = #t167.{self::Class2::[]=}(#t168, #t169) in #t169;
-  let final self::Class1? #t171 = n1 in #t171.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t172 = #t171{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t173 = nullable2 in #t172.{self::Class2::[]=}(#t173, #t172.{self::Class2::[]}(#t173).{self::Class2::+}(1));
-  nullable2 = let final self::Class1? #t174 = n1 in #t174.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t175 = #t174{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t176 = nullable2 in let final self::Class2 #t177 = #t175.{self::Class2::[]}(#t176) in let final void #t178 = #t175.{self::Class2::[]=}(#t176, #t177.{self::Class2::+}(1)) in #t177;
-  let final self::Class1? #t179 = n1 in #t179.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t180 = #t179{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t181 = nullable2 in let final self::Class2 #t182 = #t180.{self::Class2::[]}(#t181).{self::Class2::+}(1) in let final void #t183 = #t180.{self::Class2::[]=}(#t181, #t182) in #t182;
-  nullable2 = let final self::Class1? #t184 = n1 in #t184.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t185 = #t184{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t186 = nullable2 in let final self::Class2 #t187 = #t185.{self::Class2::[]}(#t186).{self::Class2::+}(1) in let final void #t188 = #t185.{self::Class2::[]=}(#t186, #t187) in #t187;
-  let final self::Class1? #t189 = n1 in #t189.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t190 = #t189{self::Class1}.{self::Class1::[]}(nullable1) in #t190.{core::Object::==}(null) ?{self::Class1?} null : #t190{self::Class1}.{self::Class1::[]}(nullable1);
-  let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = #t191{self::Class1}.{self::Class1::[]}(nullable1) in #t192.{core::Object::==}(null) ?{self::Class1?} null : #t192{self::Class1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
-  nullable1 = let final self::Class1? #t193 = n1 in #t193.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t194 = #t193{self::Class1}.{self::Class1::[]}(nullable1) in #t194.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t195 = nullable1 in let final self::Class1 #t196 = new self::Class1::•() in let final void #t197 = #t194{self::Class1}.{self::Class1::[]=}(#t195, #t196) in #t196;
-  let final self::Class1? #t198 = n1 in #t198.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t199 = #t198{self::Class1}.{self::Class1::[]}(nullable1) in #t199.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t200 = #t199{self::Class1}.{self::Class1::[]}(nullable1) in #t200.{core::Object::==}(null) ?{self::Class1?} null : #t200{self::Class1}.{self::Class1::nonNullable1Method}();
-  nullable1 = let final self::Class1? #t201 = n1 in #t201.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t202 = #t201{self::Class1}.{self::Class1::[]}(nullable1) in #t202.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t203 = #t202{self::Class1}.{self::Class1::[]}(nullable1) in #t203.{core::Object::==}(null) ?{self::Class1?} null : #t203{self::Class1}.{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t204 = n1 in #t204.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t205 = #t204{self::Class1}.{self::Class1::[]}(nullable1) in #t205.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t206 = nullable1 in #t205{self::Class1}.{self::Class1::[]}(#t206).{core::Object::==}(null) ?{self::Class1?} #t205{self::Class1}.{self::Class1::[]=}(#t206, nullable1) : null;
-  nullable1 = let final self::Class1? #t207 = n1 in #t207.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t208 = #t207{self::Class1}.{self::Class1::[]}(nullable1) in #t208.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t209 = nullable1 in let final self::Class1? #t210 = #t208{self::Class1}.{self::Class1::[]}(#t209) in #t210.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t211 = nullable1 in let final void #t212 = #t208{self::Class1}.{self::Class1::[]=}(#t209, #t211) in #t211 : #t210{self::Class1};
-  let final self::Class3? #t213 = n3 in #t213.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t214 = #t213{self::Class3}.{self::Class3::[]}(nullable3) in #t214.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t215 = nullable2 in #t214{self::Class2}.{self::Class2::[]=}(#t215, #t214{self::Class2}.{self::Class2::[]}(#t215).{self::Class2::+}(0));
-  nullable2 = let final self::Class3? #t216 = n3 in #t216.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t217 = #t216{self::Class3}.{self::Class3::[]}(nullable3) in #t217.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t218 = nullable2 in let final self::Class2 #t219 = #t217{self::Class2}.{self::Class2::[]}(#t218).{self::Class2::+}(0) in let final void #t220 = #t217{self::Class2}.{self::Class2::[]=}(#t218, #t219) in #t219;
-  let final self::Class3? #t221 = n3 in #t221.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t222 = #t221{self::Class3}.{self::Class3::[]}(nullable3) in #t222.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t223 = nullable2 in #t222{self::Class2}.{self::Class2::[]=}(#t223, #t222{self::Class2}.{self::Class2::[]}(#t223).{self::Class2::+}(1));
-  nullable2 = let final self::Class3? #t224 = n3 in #t224.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t225 = #t224{self::Class3}.{self::Class3::[]}(nullable3) in #t225.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t226 = nullable2 in let final self::Class2 #t227 = #t225{self::Class2}.{self::Class2::[]}(#t226) in let final void #t228 = #t225{self::Class2}.{self::Class2::[]=}(#t226, #t227.{self::Class2::+}(1)) in #t227;
-  let final self::Class3? #t229 = n3 in #t229.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t230 = #t229{self::Class3}.{self::Class3::[]}(nullable3) in #t230.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t231 = nullable2 in let final self::Class2 #t232 = #t230{self::Class2}.{self::Class2::[]}(#t231).{self::Class2::+}(1) in let final void #t233 = #t230{self::Class2}.{self::Class2::[]=}(#t231, #t232) in #t232;
-  nullable2 = let final self::Class3? #t234 = n3 in #t234.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t235 = #t234{self::Class3}.{self::Class3::[]}(nullable3) in #t235.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t236 = nullable2 in let final self::Class2 #t237 = #t235{self::Class2}.{self::Class2::[]}(#t236).{self::Class2::+}(1) in let final void #t238 = #t235{self::Class2}.{self::Class2::[]=}(#t236, #t237) in #t237;
+  let final self::Class1? #t84 = n1 in #t84.{core::Object::==}(null) ?{self::Class1?} null : #t84{self::Class1}.{self::Class1::[]}(nullable1);
+  let final self::Class1? #t85 = n1 in #t85.{core::Object::==}(null) ?{self::Class1?} null : #t85{self::Class1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
+  let final self::Class1? #t86 = n1 in #t86.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t87 = #t86{self::Class1}.{self::Class1::[]}(nullable1) in #t87.{core::Object::==}(null) ?{self::Class1?} null : #t87{self::Class1}.{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t88 = n1 in #t88.{core::Object::==}(null) ?{self::Class1?} null : #t88{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]}(nullable1);
+  let final self::Class1? #t89 = n1 in #t89.{core::Object::==}(null) ?{self::Class1?} null : #t89{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
+  nullable1 = let final self::Class1? #t90 = n1 in #t90.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t91 = #t90{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1? #t92 = nullable1 in let final self::Class1 #t93 = new self::Class1::•() in let final void #t94 = #t91.{self::Class1::[]=}(#t92, #t93) in #t93;
+  let final self::Class1? #t95 = n1 in #t95.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t96 = #t95{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]}(nullable1) in #t96.{core::Object::==}(null) ?{self::Class1?} null : #t96{self::Class1}.{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t97 = n1 in #t97.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t98 = #t97{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t99 = nullable2 in #t98.{self::Class2::[]=}(#t99, #t98.{self::Class2::[]}(#t99).{self::Class2::+}(0));
+  nullable2 = let final self::Class1? #t100 = n1 in #t100.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t101 = #t100{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t102 = nullable2 in let final self::Class2 #t103 = #t101.{self::Class2::[]}(#t102).{self::Class2::+}(0) in let final void #t104 = #t101.{self::Class2::[]=}(#t102, #t103) in #t103;
+  let final self::Class1? #t105 = n1 in #t105.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t106 = nullable1 in #t105{self::Class1}.{self::Class1::[]}(#t106).{core::Object::==}(null) ?{self::Class1?} #t105{self::Class1}.{self::Class1::[]=}(#t106, nullable1) : null;
+  nullable1 = let final self::Class1? #t107 = n1 in #t107.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t108 = nullable1 in let final self::Class1? #t109 = #t107{self::Class1}.{self::Class1::[]}(#t108) in #t109.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t110 = nullable1 in let final void #t111 = #t107{self::Class1}.{self::Class1::[]=}(#t108, #t110) in #t110 : #t109{self::Class1};
+  let final self::Class2? #t112 = n2 in #t112.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t113 = nullable2 in #t112{self::Class2}.{self::Class2::[]=}(#t113, #t112{self::Class2}.{self::Class2::[]}(#t113).{self::Class2::+}(0));
+  nullable2 = let final self::Class2? #t114 = n2 in #t114.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t115 = nullable2 in let final self::Class2 #t116 = #t114{self::Class2}.{self::Class2::[]}(#t115).{self::Class2::+}(0) in let final void #t117 = #t114{self::Class2}.{self::Class2::[]=}(#t115, #t116) in #t116;
+  let final self::Class2? #t118 = n2 in #t118.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t119 = nullable2 in #t118{self::Class2}.{self::Class2::[]=}(#t119, #t118{self::Class2}.{self::Class2::[]}(#t119).{self::Class2::+}(0));
+  nullable2 = let final self::Class2? #t120 = n2 in #t120.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t121 = nullable2 in let final self::Class2 #t122 = #t120{self::Class2}.{self::Class2::[]}(#t121).{self::Class2::+}(0) in let final void #t123 = #t120{self::Class2}.{self::Class2::[]=}(#t121, #t122) in #t122;
+  let final self::Class2? #t124 = n2 in #t124.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t125 = nullable2 in #t124{self::Class2}.{self::Class2::[]=}(#t125, #t124{self::Class2}.{self::Class2::[]}(#t125).{self::Class2::+}(1));
+  nullable2 = let final self::Class2? #t126 = n2 in #t126.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t127 = nullable2 in let final self::Class2 #t128 = #t126{self::Class2}.{self::Class2::[]}(#t127) in let final void #t129 = #t126{self::Class2}.{self::Class2::[]=}(#t127, #t128.{self::Class2::+}(1)) in #t128;
+  let final self::Class2? #t130 = n2 in #t130.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t131 = nullable2 in let final self::Class2 #t132 = #t130{self::Class2}.{self::Class2::[]}(#t131).{self::Class2::+}(1) in let final void #t133 = #t130{self::Class2}.{self::Class2::[]=}(#t131, #t132) in #t132;
+  nullable2 = let final self::Class2? #t134 = n2 in #t134.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t135 = nullable2 in let final self::Class2 #t136 = #t134{self::Class2}.{self::Class2::[]}(#t135).{self::Class2::+}(1) in let final void #t137 = #t134{self::Class2}.{self::Class2::[]=}(#t135, #t136) in #t136;
+  let final self::Class1? #t138 = n1 in #t138.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t139 = #t138{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t140 = nullable2 in #t139.{self::Class2::[]=}(#t140, #t139.{self::Class2::[]}(#t140).{self::Class2::+}(1));
+  nullable2 = let final self::Class1? #t141 = n1 in #t141.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t142 = #t141{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t143 = nullable2 in let final self::Class2 #t144 = #t142.{self::Class2::[]}(#t143) in let final void #t145 = #t142.{self::Class2::[]=}(#t143, #t144.{self::Class2::+}(1)) in #t144;
+  let final self::Class1? #t146 = n1 in #t146.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t147 = #t146{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t148 = nullable2 in let final self::Class2 #t149 = #t147.{self::Class2::[]}(#t148).{self::Class2::+}(1) in let final void #t150 = #t147.{self::Class2::[]=}(#t148, #t149) in #t149;
+  nullable2 = let final self::Class1? #t151 = n1 in #t151.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t152 = #t151{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t153 = nullable2 in let final self::Class2 #t154 = #t152.{self::Class2::[]}(#t153).{self::Class2::+}(1) in let final void #t155 = #t152.{self::Class2::[]=}(#t153, #t154) in #t154;
+  let final self::Class1? #t156 = n1 in #t156.{core::Object::==}(null) ?{self::Class2?} null : #t156{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]}(nullable2);
+  let final self::Class1? #t157 = n1 in #t157.{core::Object::==}(null) ?{self::Class2?} null : #t157{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]=}(nullable2, new self::Class2::•());
+  nullable2 = let final self::Class1? #t158 = n1 in #t158.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t159 = #t158{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t160 = nullable2 in let final self::Class2 #t161 = new self::Class2::•() in let final void #t162 = #t159.{self::Class2::[]=}(#t160, #t161) in #t161;
+  let final self::Class1? #t163 = n1 in #t163.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t164 = #t163{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]}(nullable2) in #t164.{core::Object::==}(null) ?{self::Class2?} null : #t164{self::Class2}.{self::Class2::nonNullable2Method}();
+  let final self::Class1? #t165 = n1 in #t165.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t166 = #t165{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t167 = nullable2 in #t166.{self::Class2::[]=}(#t167, #t166.{self::Class2::[]}(#t167).{self::Class2::+}(0));
+  nullable2 = let final self::Class1? #t168 = n1 in #t168.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t169 = #t168{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t170 = nullable2 in let final self::Class2 #t171 = #t169.{self::Class2::[]}(#t170).{self::Class2::+}(0) in let final void #t172 = #t169.{self::Class2::[]=}(#t170, #t171) in #t171;
+  let final self::Class1? #t173 = n1 in #t173.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t174 = #t173{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t175 = nullable2 in #t174.{self::Class2::[]=}(#t175, #t174.{self::Class2::[]}(#t175).{self::Class2::+}(1));
+  nullable2 = let final self::Class1? #t176 = n1 in #t176.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t177 = #t176{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t178 = nullable2 in let final self::Class2 #t179 = #t177.{self::Class2::[]}(#t178) in let final void #t180 = #t177.{self::Class2::[]=}(#t178, #t179.{self::Class2::+}(1)) in #t179;
+  let final self::Class1? #t181 = n1 in #t181.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t182 = #t181{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t183 = nullable2 in let final self::Class2 #t184 = #t182.{self::Class2::[]}(#t183).{self::Class2::+}(1) in let final void #t185 = #t182.{self::Class2::[]=}(#t183, #t184) in #t184;
+  nullable2 = let final self::Class1? #t186 = n1 in #t186.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t187 = #t186{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t188 = nullable2 in let final self::Class2 #t189 = #t187.{self::Class2::[]}(#t188).{self::Class2::+}(1) in let final void #t190 = #t187.{self::Class2::[]=}(#t188, #t189) in #t189;
+  let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = #t191{self::Class1}.{self::Class1::[]}(nullable1) in #t192.{core::Object::==}(null) ?{self::Class1?} null : #t192{self::Class1}.{self::Class1::[]}(nullable1);
+  let final self::Class1? #t193 = n1 in #t193.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t194 = #t193{self::Class1}.{self::Class1::[]}(nullable1) in #t194.{core::Object::==}(null) ?{self::Class1?} null : #t194{self::Class1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
+  nullable1 = let final self::Class1? #t195 = n1 in #t195.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t196 = #t195{self::Class1}.{self::Class1::[]}(nullable1) in #t196.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t197 = nullable1 in let final self::Class1 #t198 = new self::Class1::•() in let final void #t199 = #t196{self::Class1}.{self::Class1::[]=}(#t197, #t198) in #t198;
+  let final self::Class1? #t200 = n1 in #t200.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t201 = #t200{self::Class1}.{self::Class1::[]}(nullable1) in #t201.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t202 = #t201{self::Class1}.{self::Class1::[]}(nullable1) in #t202.{core::Object::==}(null) ?{self::Class1?} null : #t202{self::Class1}.{self::Class1::nonNullable1Method}();
+  nullable1 = let final self::Class1? #t203 = n1 in #t203.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t204 = #t203{self::Class1}.{self::Class1::[]}(nullable1) in #t204.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t205 = #t204{self::Class1}.{self::Class1::[]}(nullable1) in #t205.{core::Object::==}(null) ?{self::Class1?} null : #t205{self::Class1}.{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t206 = n1 in #t206.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t207 = #t206{self::Class1}.{self::Class1::[]}(nullable1) in #t207.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t208 = nullable1 in #t207{self::Class1}.{self::Class1::[]}(#t208).{core::Object::==}(null) ?{self::Class1?} #t207{self::Class1}.{self::Class1::[]=}(#t208, nullable1) : null;
+  nullable1 = let final self::Class1? #t209 = n1 in #t209.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t210 = #t209{self::Class1}.{self::Class1::[]}(nullable1) in #t210.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t211 = nullable1 in let final self::Class1? #t212 = #t210{self::Class1}.{self::Class1::[]}(#t211) in #t212.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t213 = nullable1 in let final void #t214 = #t210{self::Class1}.{self::Class1::[]=}(#t211, #t213) in #t213 : #t212{self::Class1};
+  let final self::Class3? #t215 = n3 in #t215.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t216 = #t215{self::Class3}.{self::Class3::[]}(nullable3) in #t216.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t217 = nullable2 in #t216{self::Class2}.{self::Class2::[]=}(#t217, #t216{self::Class2}.{self::Class2::[]}(#t217).{self::Class2::+}(0));
+  nullable2 = let final self::Class3? #t218 = n3 in #t218.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t219 = #t218{self::Class3}.{self::Class3::[]}(nullable3) in #t219.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t220 = nullable2 in let final self::Class2 #t221 = #t219{self::Class2}.{self::Class2::[]}(#t220).{self::Class2::+}(0) in let final void #t222 = #t219{self::Class2}.{self::Class2::[]=}(#t220, #t221) in #t221;
+  let final self::Class3? #t223 = n3 in #t223.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t224 = #t223{self::Class3}.{self::Class3::[]}(nullable3) in #t224.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t225 = nullable2 in #t224{self::Class2}.{self::Class2::[]=}(#t225, #t224{self::Class2}.{self::Class2::[]}(#t225).{self::Class2::+}(1));
+  nullable2 = let final self::Class3? #t226 = n3 in #t226.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t227 = #t226{self::Class3}.{self::Class3::[]}(nullable3) in #t227.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t228 = nullable2 in let final self::Class2 #t229 = #t227{self::Class2}.{self::Class2::[]}(#t228) in let final void #t230 = #t227{self::Class2}.{self::Class2::[]=}(#t228, #t229.{self::Class2::+}(1)) in #t229;
+  let final self::Class3? #t231 = n3 in #t231.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t232 = #t231{self::Class3}.{self::Class3::[]}(nullable3) in #t232.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t233 = nullable2 in let final self::Class2 #t234 = #t232{self::Class2}.{self::Class2::[]}(#t233).{self::Class2::+}(1) in let final void #t235 = #t232{self::Class2}.{self::Class2::[]=}(#t233, #t234) in #t234;
+  nullable2 = let final self::Class3? #t236 = n3 in #t236.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t237 = #t236{self::Class3}.{self::Class3::[]}(nullable3) in #t237.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t238 = nullable2 in let final self::Class2 #t239 = #t237{self::Class2}.{self::Class2::[]}(#t238).{self::Class2::+}(1) in let final void #t240 = #t237{self::Class2}.{self::Class2::[]=}(#t238, #t239) in #t239;
 }
 static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
   self::Class2? nullable2 = n2;
-  self::throws(() → self::Class1? => (let final self::Class1? #t239 = n1 in #t239.{core::Object::==}(null) ?{self::Class1?} null : #t239{self::Class1}.{self::Class1::nonNullable1}).{self::Class1::+}(0));
-  self::throws(() → self::Class1? => (let final self::Class1? #t240 = n1 in #t240.{core::Object::==}(null) ?{self::Class1?} null : #t240{self::Class1}.{self::Class1::nonNullable1}).{self::Class1::unary-}());
-  let final self::Class2? #t241 = n2 in #t241.{core::Object::==}(null) ?{self::Class2?} null : #t241.{self::Class2::nonNullable2} = #t241.{self::Class2::nonNullable2}.{self::Class2::+}(0);
-  nullable2 = let final self::Class2? #t242 = n2 in #t242.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t243 = #t242.{self::Class2::nonNullable2}.{self::Class2::+}(0) in let final void #t244 = #t242.{self::Class2::nonNullable2} = #t243 in #t243;
-  let final self::Class2? #t245 = n2 in #t245.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t246 = #t245{self::Class2}.{self::Class2::nonNullable2} in #t246.{self::Class2::nonNullable2} = #t246.{self::Class2::nonNullable2}.{self::Class2::+}(0);
-  nullable2 = let final self::Class2? #t247 = n2 in #t247.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t248 = #t247{self::Class2}.{self::Class2::nonNullable2} in #t248.{self::Class2::nonNullable2} = #t248.{self::Class2::nonNullable2}.{self::Class2::+}(0);
-  let final self::Class2? #t249 = n2 in #t249.{core::Object::==}(null) ?{self::Class2?} null : #t249.{self::Class2::nonNullable2} = #t249.{self::Class2::nonNullable2}.{self::Class2::+}(1);
-  nullable2 = let final self::Class2? #t250 = n2 in #t250.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t251 = #t250.{self::Class2::nonNullable2} in let final void #t252 = #t250.{self::Class2::nonNullable2} = #t251.{self::Class2::+}(1) in #t251;
-  let final self::Class2? #t253 = n2 in #t253.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t254 = #t253.{self::Class2::nonNullable2}.{self::Class2::+}(1) in let final void #t255 = #t253.{self::Class2::nonNullable2} = #t254 in #t254;
-  nullable2 = let final self::Class2? #t256 = n2 in #t256.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t257 = #t256.{self::Class2::nonNullable2}.{self::Class2::+}(1) in let final void #t258 = #t256.{self::Class2::nonNullable2} = #t257 in #t257;
+  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.
+ - '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.
+ - '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-}());
+  let final self::Class2? #t245 = n2 in #t245.{core::Object::==}(null) ?{self::Class2?} null : #t245.{self::Class2::nonNullable2} = #t245.{self::Class2::nonNullable2}.{self::Class2::+}(0);
+  nullable2 = let final self::Class2? #t246 = n2 in #t246.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t247 = #t246.{self::Class2::nonNullable2}.{self::Class2::+}(0) in let final void #t248 = #t246.{self::Class2::nonNullable2} = #t247 in #t247;
+  let final self::Class2? #t249 = n2 in #t249.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t250 = #t249{self::Class2}.{self::Class2::nonNullable2} in #t250.{self::Class2::nonNullable2} = #t250.{self::Class2::nonNullable2}.{self::Class2::+}(0);
+  nullable2 = let final self::Class2? #t251 = n2 in #t251.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t252 = #t251{self::Class2}.{self::Class2::nonNullable2} in #t252.{self::Class2::nonNullable2} = #t252.{self::Class2::nonNullable2}.{self::Class2::+}(0);
+  let final self::Class2? #t253 = n2 in #t253.{core::Object::==}(null) ?{self::Class2?} null : #t253.{self::Class2::nonNullable2} = #t253.{self::Class2::nonNullable2}.{self::Class2::+}(1);
+  nullable2 = let final self::Class2? #t254 = n2 in #t254.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t255 = #t254.{self::Class2::nonNullable2} in let final void #t256 = #t254.{self::Class2::nonNullable2} = #t255.{self::Class2::+}(1) in #t255;
+  let final self::Class2? #t257 = n2 in #t257.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t258 = #t257.{self::Class2::nonNullable2}.{self::Class2::+}(1) in let final void #t259 = #t257.{self::Class2::nonNullable2} = #t258 in #t258;
+  nullable2 = let final self::Class2? #t260 = n2 in #t260.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t261 = #t260.{self::Class2::nonNullable2}.{self::Class2::+}(1) in let final void #t262 = #t260.{self::Class2::nonNullable2} = #t261 in #t261;
 }
 static method ifNull(self::Class1? n1) → void {
   self::Class1? nullable1 = n1;
-  let final self::Class1? #t259 = n1 in #t259.{core::Object::==}(null) ?{self::Class1?} null : #t259.{self::Class1::nullable1}.{core::Object::==}(null) ?{self::Class1} #t259.{self::Class1::nullable1} = n1{self::Class1} : null;
-  n1 = let final self::Class1? #t260 = n1 in #t260.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t261 = #t260.{self::Class1::nullable1} in #t261.{core::Object::==}(null) ?{self::Class1} #t260.{self::Class1::nullable1} = n1{self::Class1} : #t261{self::Class1};
-  let final self::Class1? #t262 = n1 in #t262.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t263 = #t262{self::Class1}.{self::Class1::nonNullable1} in #t263{self::Class1}.{self::Class1::nullable1}.{core::Object::==}(null) ?{self::Class1} #t263{self::Class1}.{self::Class1::nullable1} = n1{self::Class1} : null;
-  n1 = let final self::Class1? #t264 = n1 in #t264.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t265 = #t264{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1? #t266 = #t265{self::Class1}.{self::Class1::nullable1} in #t266.{core::Object::==}(null) ?{self::Class1} #t265{self::Class1}.{self::Class1::nullable1} = n1{self::Class1} : #t266{self::Class1};
-  let final self::Class1? #t267 = n1 in #t267.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t268 = #t267{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1 #t269 = n1{self::Class1} in #t268.{self::Class1::[]}(#t269).{core::Object::==}(null) ?{self::Class1} #t268.{self::Class1::[]=}(#t269, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t270 = n1 in #t270.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t271 = #t270{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1 #t272 = n1{self::Class1} in let final self::Class1? #t273 = #t271.{self::Class1::[]}(#t272) in #t273.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t274 = n1{self::Class1} in let final void #t275 = #t271.{self::Class1::[]=}(#t272, #t274) in #t274 : #t273{self::Class1};
+  let final self::Class1? #t263 = n1 in #t263.{core::Object::==}(null) ?{self::Class1?} null : #t263.{self::Class1::nullable1}.{core::Object::==}(null) ?{self::Class1} #t263.{self::Class1::nullable1} = n1{self::Class1} : null;
+  n1 = let final self::Class1? #t264 = n1 in #t264.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t265 = #t264.{self::Class1::nullable1} in #t265.{core::Object::==}(null) ?{self::Class1} #t264.{self::Class1::nullable1} = n1{self::Class1} : #t265{self::Class1};
+  let final self::Class1? #t266 = n1 in #t266.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t267 = #t266{self::Class1}.{self::Class1::nonNullable1} in #t267{self::Class1}.{self::Class1::nullable1}.{core::Object::==}(null) ?{self::Class1} #t267{self::Class1}.{self::Class1::nullable1} = n1{self::Class1} : null;
+  n1 = let final self::Class1? #t268 = n1 in #t268.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t269 = #t268{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1? #t270 = #t269{self::Class1}.{self::Class1::nullable1} in #t270.{core::Object::==}(null) ?{self::Class1} #t269{self::Class1}.{self::Class1::nullable1} = n1{self::Class1} : #t270{self::Class1};
+  let final self::Class1? #t271 = n1 in #t271.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t272 = #t271{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1 #t273 = n1{self::Class1} in #t272.{self::Class1::[]}(#t273).{core::Object::==}(null) ?{self::Class1} #t272.{self::Class1::[]=}(#t273, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t274 = n1 in #t274.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t275 = #t274{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1 #t276 = n1{self::Class1} in let final self::Class1? #t277 = #t275.{self::Class1::[]}(#t276) in #t277.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t278 = n1{self::Class1} in let final void #t279 = #t275.{self::Class1::[]=}(#t276, #t278) in #t278 : #t277{self::Class1};
 }
 static method throws(() → void f) → void {
   try {
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 1667166..4b8eb0a 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
@@ -2,24 +2,24 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/null_shorting.dart:87:47: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// 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);
 //                                               ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/null_shorting.dart:88:43: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// 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);
 //                                           ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/null_shorting.dart:220:33: Warning: Operator '+' is called on 'Class1?' which is potentially null.
+// 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);
 //                                 ^
 //
-// pkg/front_end/testcases/nnbd/null_shorting.dart:221:16: Warning: Operator 'unary-' is called on 'Class1?' which is potentially null.
+// 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);
 //                ^
@@ -110,139 +110,153 @@
   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 self::Class1? #t17 = n1 in #t17.{core::Object::==}(null) ?{self::Class1?} null : #t17{self::Class1}.{self::Class1::nullable1} = new self::Class1::•()).{self::Class1::nullable1});
-  self::throws(() → self::Class1? => (let final self::Class1? #t18 = n1 in #t18.{core::Object::==}(null) ?{self::Class1?} null : #t18{self::Class1}.{self::Class1::nonNullable1Method}()).{self::Class1::nullable1});
-  nullable1 = let final self::Class1? #t19 = n1 in #t19.{core::Object::==}(null) ?{self::Class1?} null : #t19{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
-  nullable1 = let final self::Class1? #t20 = n1 in #t20.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t21 = #t20{self::Class1}.{self::Class1::nullable1} in #t21.{core::Object::==}(null) ?{self::Class1?} null : #t21{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
-  nullable1 = let final self::Class1? #t22 = n1 in #t22.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t23 = #t22{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} in #t23.{core::Object::==}(null) ?{self::Class1?} null : #t23{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t24 = n1 in #t24.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t25 = #t24{self::Class1}.{self::Class1::nullable1} in #t25.{core::Object::==}(null) ?{self::Class1?} null : #t25{self::Class1}.{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t26 = n1 in #t26.{core::Object::==}(null) ?{self::Class1?} null : #t26{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
-  nullable1 = let final self::Class1? #t27 = n1 in #t27.{core::Object::==}(null) ?{self::Class1?} null : #t27{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
-  let final self::Class1? #t28 = n1 in #t28.{core::Object::==}(null) ?{self::Class1?} null : #t28{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
-  nullable1 = let final self::Class1? #t29 = n1 in #t29.{core::Object::==}(null) ?{self::Class1?} null : #t29{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t30 = n1 in #t30.{core::Object::==}(null) ?{self::Class1?} null : #t30{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
-  nullable1 = let final self::Class1? #t31 = n1 in #t31.{core::Object::==}(null) ?{self::Class1?} null : #t31{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t32 = n1 in #t32.{core::Object::==}(null) ?{self::Class1?} null : #t32{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
-  let final self::Class1? #t33 = n1 in #t33.{core::Object::==}(null) ?{self::Class1?} null : #t33{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t34 = n1 in #t34.{core::Object::==}(null) ?{self::Class1?} null : #t34{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t35 = n1 in #t35.{core::Object::==}(null) ?{self::Class1?} null : #t35{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1};
-  let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : #t36{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
-  nullable1 = let final self::Class1? #t37 = n1 in #t37.{core::Object::==}(null) ?{self::Class1?} null : #t37{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t38 = n1 in #t38.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t39 = #t38{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} in #t39.{core::Object::==}(null) ?{self::Class1?} null : #t39{self::Class1}.{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t40 = n1 in #t40.{core::Object::==}(null) ?{self::Class1?} null : #t40{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1};
-  nullable1 = let final self::Class1? #t41 = n1 in #t41.{core::Object::==}(null) ?{self::Class1?} null : #t41{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1};
-  let final self::Class1? #t42 = n1 in #t42.{core::Object::==}(null) ?{self::Class1?} null : #t42{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
-  nullable1 = let final self::Class1? #t43 = n1 in #t43.{core::Object::==}(null) ?{self::Class1?} null : #t43{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t44 = n1 in #t44.{core::Object::==}(null) ?{self::Class1?} null : #t44{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
-  nullable1 = let final self::Class1? #t45 = n1 in #t45.{core::Object::==}(null) ?{self::Class1?} null : #t45{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t46 = n1 in #t46.{core::Object::==}(null) ?{self::Class1?} null : #t46{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nullable1};
-  let final self::Class1? #t47 = n1 in #t47.{core::Object::==}(null) ?{self::Class1?} null : #t47{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t48 = n1 in #t48.{core::Object::==}(null) ?{self::Class1?} null : #t48{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t49 = n1 in #t49.{core::Object::==}(null) ?{self::Class1?} null : #t49{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
-  nullable1 = let final self::Class1? #t50 = n1 in #t50.{core::Object::==}(null) ?{self::Class1?} null : #t50{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
-  let final self::Class1? #t51 = n1 in #t51.{core::Object::==}(null) ?{self::Class1?} null : #t51{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
-  nullable1 = let final self::Class1? #t52 = n1 in #t52.{core::Object::==}(null) ?{self::Class1?} null : #t52{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t53 = n1 in #t53.{core::Object::==}(null) ?{self::Class1?} null : #t53{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
-  nullable1 = let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : #t54{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : #t55{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
-  nullable1 = let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : #t56{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
-  let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : #t57{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
-  nullable1 = let final self::Class1? #t58 = n1 in #t58.{core::Object::==}(null) ?{self::Class1?} null : #t58{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t59 = n1 in #t59.{core::Object::==}(null) ?{self::Class1?} null : #t59{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
-  nullable1 = let final self::Class1? #t60 = n1 in #t60.{core::Object::==}(null) ?{self::Class1?} null : #t60{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t61 = n1 in #t61.{core::Object::==}(null) ?{self::Class1?} null : #t61{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
-  nullable1 = let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : #t62{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
-  let final self::Class1? #t63 = n1 in #t63.{core::Object::==}(null) ?{self::Class1?} null : #t63{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
-  nullable1 = let final self::Class1? #t64 = n1 in #t64.{core::Object::==}(null) ?{self::Class1?} null : #t64{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t65 = n1 in #t65.{core::Object::==}(null) ?{self::Class1?} null : #t65{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
-  nullable1 = let final self::Class1? #t66 = n1 in #t66.{core::Object::==}(null) ?{self::Class1?} null : #t66{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t67 = n1 in #t67.{core::Object::==}(null) ?{self::Class1?} null : #t67{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
-  let final self::Class1? #t68 = n1 in #t68.{core::Object::==}(null) ?{self::Class1?} null : #t68{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
-  nullable1 = let final self::Class1? #t69 = n1 in #t69.{core::Object::==}(null) ?{self::Class1?} null : #t69{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t70 = n1 in #t70.{core::Object::==}(null) ?{self::Class1?} null : #t70{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t71 = n1 in #t71.{core::Object::==}(null) ?{self::Class1?} null : #t71{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
-  nullable1 = let final self::Class1? #t72 = n1 in #t72.{core::Object::==}(null) ?{self::Class1?} null : #t72{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
-  let final self::Class1? #t73 = n1 in #t73.{core::Object::==}(null) ?{self::Class1?} null : #t73{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
-  nullable1 = let final self::Class1? #t74 = n1 in #t74.{core::Object::==}(null) ?{self::Class1?} null : #t74{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t75 = n1 in #t75.{core::Object::==}(null) ?{self::Class1?} null : #t75{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
-  nullable1 = let final self::Class1? #t76 = n1 in #t76.{core::Object::==}(null) ?{self::Class1?} null : #t76{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t77 = n1 in #t77.{core::Object::==}(null) ?{self::Class1?} null : #t77{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
-  let final self::Class1? #t78 = n1 in #t78.{core::Object::==}(null) ?{self::Class1?} null : #t78{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
-  let final self::Class1? #t79 = n1 in #t79.{core::Object::==}(null) ?{self::Class1?} null : #t79{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t81 = #t80{self::Class1}.{self::Class1::nonNullable1Method}() in #t81.{core::Object::==}(null) ?{self::Class1?} null : #t81{self::Class1}.{self::Class1::nonNullable1Method}();
+  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.
+ - '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.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting.dart'.
+Try accessing using ?. instead.
+  throws(() => (n1?.nonNullable1Method()).nullable1);
+                                          ^^^^^^^^^" in (let final self::Class1? #t20 = n1 in #t20.{core::Object::==}(null) ?{self::Class1?} null : #t20{self::Class1}.{self::Class1::nonNullable1Method}()).{self::Class1::nullable1});
+  nullable1 = let final self::Class1? #t21 = n1 in #t21.{core::Object::==}(null) ?{self::Class1?} null : #t21{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t22 = n1 in #t22.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t23 = #t22{self::Class1}.{self::Class1::nullable1} in #t23.{core::Object::==}(null) ?{self::Class1?} null : #t23{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t24 = n1 in #t24.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t25 = #t24{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} in #t25.{core::Object::==}(null) ?{self::Class1?} null : #t25{self::Class1}.{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t26 = n1 in #t26.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t27 = #t26{self::Class1}.{self::Class1::nullable1} in #t27.{core::Object::==}(null) ?{self::Class1?} null : #t27{self::Class1}.{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t28 = n1 in #t28.{core::Object::==}(null) ?{self::Class1?} null : #t28{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+  nullable1 = let final self::Class1? #t29 = n1 in #t29.{core::Object::==}(null) ?{self::Class1?} null : #t29{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+  let final self::Class1? #t30 = n1 in #t30.{core::Object::==}(null) ?{self::Class1?} null : #t30{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t31 = n1 in #t31.{core::Object::==}(null) ?{self::Class1?} null : #t31{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t32 = n1 in #t32.{core::Object::==}(null) ?{self::Class1?} null : #t32{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+  nullable1 = let final self::Class1? #t33 = n1 in #t33.{core::Object::==}(null) ?{self::Class1?} null : #t33{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t34 = n1 in #t34.{core::Object::==}(null) ?{self::Class1?} null : #t34{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
+  let final self::Class1? #t35 = n1 in #t35.{core::Object::==}(null) ?{self::Class1?} null : #t35{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : #t36{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t37 = n1 in #t37.{core::Object::==}(null) ?{self::Class1?} null : #t37{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1};
+  let final self::Class1? #t38 = n1 in #t38.{core::Object::==}(null) ?{self::Class1?} null : #t38{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t39 = n1 in #t39.{core::Object::==}(null) ?{self::Class1?} null : #t39{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t40 = n1 in #t40.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t41 = #t40{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} in #t41.{core::Object::==}(null) ?{self::Class1?} null : #t41{self::Class1}.{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t42 = n1 in #t42.{core::Object::==}(null) ?{self::Class1?} null : #t42{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1};
+  nullable1 = let final self::Class1? #t43 = n1 in #t43.{core::Object::==}(null) ?{self::Class1?} null : #t43{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1};
+  let final self::Class1? #t44 = n1 in #t44.{core::Object::==}(null) ?{self::Class1?} null : #t44{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t45 = n1 in #t45.{core::Object::==}(null) ?{self::Class1?} null : #t45{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t46 = n1 in #t46.{core::Object::==}(null) ?{self::Class1?} null : #t46{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
+  nullable1 = let final self::Class1? #t47 = n1 in #t47.{core::Object::==}(null) ?{self::Class1?} null : #t47{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t48 = n1 in #t48.{core::Object::==}(null) ?{self::Class1?} null : #t48{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nullable1};
+  let final self::Class1? #t49 = n1 in #t49.{core::Object::==}(null) ?{self::Class1?} null : #t49{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t50 = n1 in #t50.{core::Object::==}(null) ?{self::Class1?} null : #t50{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t51 = n1 in #t51.{core::Object::==}(null) ?{self::Class1?} null : #t51{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+  nullable1 = let final self::Class1? #t52 = n1 in #t52.{core::Object::==}(null) ?{self::Class1?} null : #t52{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+  let final self::Class1? #t53 = n1 in #t53.{core::Object::==}(null) ?{self::Class1?} null : #t53{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : #t54{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : #t55{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+  nullable1 = let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : #t56{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : #t57{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+  nullable1 = let final self::Class1? #t58 = n1 in #t58.{core::Object::==}(null) ?{self::Class1?} null : #t58{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+  let final self::Class1? #t59 = n1 in #t59.{core::Object::==}(null) ?{self::Class1?} null : #t59{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t60 = n1 in #t60.{core::Object::==}(null) ?{self::Class1?} null : #t60{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t61 = n1 in #t61.{core::Object::==}(null) ?{self::Class1?} null : #t61{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+  nullable1 = let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : #t62{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t63 = n1 in #t63.{core::Object::==}(null) ?{self::Class1?} null : #t63{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+  nullable1 = let final self::Class1? #t64 = n1 in #t64.{core::Object::==}(null) ?{self::Class1?} null : #t64{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1};
+  let final self::Class1? #t65 = n1 in #t65.{core::Object::==}(null) ?{self::Class1?} null : #t65{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t66 = n1 in #t66.{core::Object::==}(null) ?{self::Class1?} null : #t66{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t67 = n1 in #t67.{core::Object::==}(null) ?{self::Class1?} null : #t67{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+  nullable1 = let final self::Class1? #t68 = n1 in #t68.{core::Object::==}(null) ?{self::Class1?} null : #t68{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t69 = n1 in #t69.{core::Object::==}(null) ?{self::Class1?} null : #t69{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
+  let final self::Class1? #t70 = n1 in #t70.{core::Object::==}(null) ?{self::Class1?} null : #t70{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t71 = n1 in #t71.{core::Object::==}(null) ?{self::Class1?} null : #t71{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t72 = n1 in #t72.{core::Object::==}(null) ?{self::Class1?} null : #t72{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t73 = n1 in #t73.{core::Object::==}(null) ?{self::Class1?} null : #t73{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
+  nullable1 = let final self::Class1? #t74 = n1 in #t74.{core::Object::==}(null) ?{self::Class1?} null : #t74{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
+  let final self::Class1? #t75 = n1 in #t75.{core::Object::==}(null) ?{self::Class1?} null : #t75{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+  nullable1 = let final self::Class1? #t76 = n1 in #t76.{core::Object::==}(null) ?{self::Class1?} null : #t76{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t77 = n1 in #t77.{core::Object::==}(null) ?{self::Class1?} null : #t77{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
+  nullable1 = let final self::Class1? #t78 = n1 in #t78.{core::Object::==}(null) ?{self::Class1?} null : #t78{self::Class1}.{self::Class1::nullable1} = new self::Class1::•().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t79 = n1 in #t79.{core::Object::==}(null) ?{self::Class1?} null : #t79{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nullable1};
+  let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : #t80{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nullable1} = new self::Class1::•();
+  let final self::Class1? #t81 = n1 in #t81.{core::Object::==}(null) ?{self::Class1?} null : #t81{self::Class1}.{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}().{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t83 = #t82{self::Class1}.{self::Class1::nonNullable1Method}() in #t83.{core::Object::==}(null) ?{self::Class1?} null : #t83{self::Class1}.{self::Class1::nonNullable1Method}();
 }
 static method indexAccess(self::Class1? n1, self::Class2? n2, self::Class3? n3) → void {
   self::Class1? nullable1 = n1;
   self::Class2? nullable2 = n2;
   self::Class3? nullable3 = n3;
-  let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : #t82{self::Class1}.{self::Class1::[]}(nullable1);
-  let final self::Class1? #t83 = n1 in #t83.{core::Object::==}(null) ?{self::Class1?} null : #t83{self::Class1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
-  let final self::Class1? #t84 = n1 in #t84.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t85 = #t84{self::Class1}.{self::Class1::[]}(nullable1) in #t85.{core::Object::==}(null) ?{self::Class1?} null : #t85{self::Class1}.{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t86 = n1 in #t86.{core::Object::==}(null) ?{self::Class1?} null : #t86{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]}(nullable1);
-  let final self::Class1? #t87 = n1 in #t87.{core::Object::==}(null) ?{self::Class1?} null : #t87{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
-  nullable1 = let final self::Class1? #t88 = n1 in #t88.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t89 = #t88{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1? #t90 = nullable1 in let final self::Class1 #t91 = new self::Class1::•() in let final void #t92 = #t89.{self::Class1::[]=}(#t90, #t91) in #t91;
-  let final self::Class1? #t93 = n1 in #t93.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t94 = #t93{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]}(nullable1) in #t94.{core::Object::==}(null) ?{self::Class1?} null : #t94{self::Class1}.{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t95 = n1 in #t95.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t96 = #t95{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t97 = nullable2 in #t96.{self::Class2::[]=}(#t97, #t96.{self::Class2::[]}(#t97).{self::Class2::+}(0));
-  nullable2 = let final self::Class1? #t98 = n1 in #t98.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t99 = #t98{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t100 = nullable2 in let final self::Class2 #t101 = #t99.{self::Class2::[]}(#t100).{self::Class2::+}(0) in let final void #t102 = #t99.{self::Class2::[]=}(#t100, #t101) in #t101;
-  let final self::Class1? #t103 = n1 in #t103.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t104 = nullable1 in #t103{self::Class1}.{self::Class1::[]}(#t104).{core::Object::==}(null) ?{self::Class1?} #t103{self::Class1}.{self::Class1::[]=}(#t104, nullable1) : null;
-  nullable1 = let final self::Class1? #t105 = n1 in #t105.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t106 = nullable1 in let final self::Class1? #t107 = #t105{self::Class1}.{self::Class1::[]}(#t106) in #t107.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t108 = nullable1 in let final void #t109 = #t105{self::Class1}.{self::Class1::[]=}(#t106, #t108) in #t108 : #t107{self::Class1};
-  let final self::Class2? #t110 = n2 in #t110.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t111 = nullable2 in #t110{self::Class2}.{self::Class2::[]=}(#t111, #t110{self::Class2}.{self::Class2::[]}(#t111).{self::Class2::+}(0));
-  nullable2 = let final self::Class2? #t112 = n2 in #t112.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t113 = nullable2 in let final self::Class2 #t114 = #t112{self::Class2}.{self::Class2::[]}(#t113).{self::Class2::+}(0) in let final void #t115 = #t112{self::Class2}.{self::Class2::[]=}(#t113, #t114) in #t114;
-  let final self::Class2? #t116 = n2 in #t116.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t117 = nullable2 in #t116{self::Class2}.{self::Class2::[]=}(#t117, #t116{self::Class2}.{self::Class2::[]}(#t117).{self::Class2::+}(0));
-  nullable2 = let final self::Class2? #t118 = n2 in #t118.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t119 = nullable2 in let final self::Class2 #t120 = #t118{self::Class2}.{self::Class2::[]}(#t119).{self::Class2::+}(0) in let final void #t121 = #t118{self::Class2}.{self::Class2::[]=}(#t119, #t120) in #t120;
-  let final self::Class2? #t122 = n2 in #t122.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t123 = nullable2 in #t122{self::Class2}.{self::Class2::[]=}(#t123, #t122{self::Class2}.{self::Class2::[]}(#t123).{self::Class2::+}(1));
-  nullable2 = let final self::Class2? #t124 = n2 in #t124.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t125 = nullable2 in let final self::Class2 #t126 = #t124{self::Class2}.{self::Class2::[]}(#t125) in let final void #t127 = #t124{self::Class2}.{self::Class2::[]=}(#t125, #t126.{self::Class2::+}(1)) in #t126;
-  let final self::Class2? #t128 = n2 in #t128.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t129 = nullable2 in let final self::Class2 #t130 = #t128{self::Class2}.{self::Class2::[]}(#t129).{self::Class2::+}(1) in let final void #t131 = #t128{self::Class2}.{self::Class2::[]=}(#t129, #t130) in #t130;
-  nullable2 = let final self::Class2? #t132 = n2 in #t132.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t133 = nullable2 in let final self::Class2 #t134 = #t132{self::Class2}.{self::Class2::[]}(#t133).{self::Class2::+}(1) in let final void #t135 = #t132{self::Class2}.{self::Class2::[]=}(#t133, #t134) in #t134;
-  let final self::Class1? #t136 = n1 in #t136.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t137 = #t136{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t138 = nullable2 in #t137.{self::Class2::[]=}(#t138, #t137.{self::Class2::[]}(#t138).{self::Class2::+}(1));
-  nullable2 = let final self::Class1? #t139 = n1 in #t139.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t140 = #t139{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t141 = nullable2 in let final self::Class2 #t142 = #t140.{self::Class2::[]}(#t141) in let final void #t143 = #t140.{self::Class2::[]=}(#t141, #t142.{self::Class2::+}(1)) in #t142;
-  let final self::Class1? #t144 = n1 in #t144.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t145 = #t144{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t146 = nullable2 in let final self::Class2 #t147 = #t145.{self::Class2::[]}(#t146).{self::Class2::+}(1) in let final void #t148 = #t145.{self::Class2::[]=}(#t146, #t147) in #t147;
-  nullable2 = let final self::Class1? #t149 = n1 in #t149.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t150 = #t149{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t151 = nullable2 in let final self::Class2 #t152 = #t150.{self::Class2::[]}(#t151).{self::Class2::+}(1) in let final void #t153 = #t150.{self::Class2::[]=}(#t151, #t152) in #t152;
-  let final self::Class1? #t154 = n1 in #t154.{core::Object::==}(null) ?{self::Class2?} null : #t154{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]}(nullable2);
-  let final self::Class1? #t155 = n1 in #t155.{core::Object::==}(null) ?{self::Class2?} null : #t155{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]=}(nullable2, new self::Class2::•());
-  nullable2 = let final self::Class1? #t156 = n1 in #t156.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t157 = #t156{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t158 = nullable2 in let final self::Class2 #t159 = new self::Class2::•() in let final void #t160 = #t157.{self::Class2::[]=}(#t158, #t159) in #t159;
-  let final self::Class1? #t161 = n1 in #t161.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t162 = #t161{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]}(nullable2) in #t162.{core::Object::==}(null) ?{self::Class2?} null : #t162{self::Class2}.{self::Class2::nonNullable2Method}();
-  let final self::Class1? #t163 = n1 in #t163.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t164 = #t163{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t165 = nullable2 in #t164.{self::Class2::[]=}(#t165, #t164.{self::Class2::[]}(#t165).{self::Class2::+}(0));
-  nullable2 = let final self::Class1? #t166 = n1 in #t166.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t167 = #t166{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t168 = nullable2 in let final self::Class2 #t169 = #t167.{self::Class2::[]}(#t168).{self::Class2::+}(0) in let final void #t170 = #t167.{self::Class2::[]=}(#t168, #t169) in #t169;
-  let final self::Class1? #t171 = n1 in #t171.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t172 = #t171{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t173 = nullable2 in #t172.{self::Class2::[]=}(#t173, #t172.{self::Class2::[]}(#t173).{self::Class2::+}(1));
-  nullable2 = let final self::Class1? #t174 = n1 in #t174.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t175 = #t174{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t176 = nullable2 in let final self::Class2 #t177 = #t175.{self::Class2::[]}(#t176) in let final void #t178 = #t175.{self::Class2::[]=}(#t176, #t177.{self::Class2::+}(1)) in #t177;
-  let final self::Class1? #t179 = n1 in #t179.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t180 = #t179{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t181 = nullable2 in let final self::Class2 #t182 = #t180.{self::Class2::[]}(#t181).{self::Class2::+}(1) in let final void #t183 = #t180.{self::Class2::[]=}(#t181, #t182) in #t182;
-  nullable2 = let final self::Class1? #t184 = n1 in #t184.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t185 = #t184{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t186 = nullable2 in let final self::Class2 #t187 = #t185.{self::Class2::[]}(#t186).{self::Class2::+}(1) in let final void #t188 = #t185.{self::Class2::[]=}(#t186, #t187) in #t187;
-  let final self::Class1? #t189 = n1 in #t189.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t190 = #t189{self::Class1}.{self::Class1::[]}(nullable1) in #t190.{core::Object::==}(null) ?{self::Class1?} null : #t190{self::Class1}.{self::Class1::[]}(nullable1);
-  let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = #t191{self::Class1}.{self::Class1::[]}(nullable1) in #t192.{core::Object::==}(null) ?{self::Class1?} null : #t192{self::Class1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
-  nullable1 = let final self::Class1? #t193 = n1 in #t193.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t194 = #t193{self::Class1}.{self::Class1::[]}(nullable1) in #t194.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t195 = nullable1 in let final self::Class1 #t196 = new self::Class1::•() in let final void #t197 = #t194{self::Class1}.{self::Class1::[]=}(#t195, #t196) in #t196;
-  let final self::Class1? #t198 = n1 in #t198.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t199 = #t198{self::Class1}.{self::Class1::[]}(nullable1) in #t199.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t200 = #t199{self::Class1}.{self::Class1::[]}(nullable1) in #t200.{core::Object::==}(null) ?{self::Class1?} null : #t200{self::Class1}.{self::Class1::nonNullable1Method}();
-  nullable1 = let final self::Class1? #t201 = n1 in #t201.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t202 = #t201{self::Class1}.{self::Class1::[]}(nullable1) in #t202.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t203 = #t202{self::Class1}.{self::Class1::[]}(nullable1) in #t203.{core::Object::==}(null) ?{self::Class1?} null : #t203{self::Class1}.{self::Class1::nonNullable1Method}();
-  let final self::Class1? #t204 = n1 in #t204.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t205 = #t204{self::Class1}.{self::Class1::[]}(nullable1) in #t205.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t206 = nullable1 in #t205{self::Class1}.{self::Class1::[]}(#t206).{core::Object::==}(null) ?{self::Class1?} #t205{self::Class1}.{self::Class1::[]=}(#t206, nullable1) : null;
-  nullable1 = let final self::Class1? #t207 = n1 in #t207.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t208 = #t207{self::Class1}.{self::Class1::[]}(nullable1) in #t208.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t209 = nullable1 in let final self::Class1? #t210 = #t208{self::Class1}.{self::Class1::[]}(#t209) in #t210.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t211 = nullable1 in let final void #t212 = #t208{self::Class1}.{self::Class1::[]=}(#t209, #t211) in #t211 : #t210{self::Class1};
-  let final self::Class3? #t213 = n3 in #t213.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t214 = #t213{self::Class3}.{self::Class3::[]}(nullable3) in #t214.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t215 = nullable2 in #t214{self::Class2}.{self::Class2::[]=}(#t215, #t214{self::Class2}.{self::Class2::[]}(#t215).{self::Class2::+}(0));
-  nullable2 = let final self::Class3? #t216 = n3 in #t216.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t217 = #t216{self::Class3}.{self::Class3::[]}(nullable3) in #t217.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t218 = nullable2 in let final self::Class2 #t219 = #t217{self::Class2}.{self::Class2::[]}(#t218).{self::Class2::+}(0) in let final void #t220 = #t217{self::Class2}.{self::Class2::[]=}(#t218, #t219) in #t219;
-  let final self::Class3? #t221 = n3 in #t221.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t222 = #t221{self::Class3}.{self::Class3::[]}(nullable3) in #t222.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t223 = nullable2 in #t222{self::Class2}.{self::Class2::[]=}(#t223, #t222{self::Class2}.{self::Class2::[]}(#t223).{self::Class2::+}(1));
-  nullable2 = let final self::Class3? #t224 = n3 in #t224.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t225 = #t224{self::Class3}.{self::Class3::[]}(nullable3) in #t225.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t226 = nullable2 in let final self::Class2 #t227 = #t225{self::Class2}.{self::Class2::[]}(#t226) in let final void #t228 = #t225{self::Class2}.{self::Class2::[]=}(#t226, #t227.{self::Class2::+}(1)) in #t227;
-  let final self::Class3? #t229 = n3 in #t229.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t230 = #t229{self::Class3}.{self::Class3::[]}(nullable3) in #t230.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t231 = nullable2 in let final self::Class2 #t232 = #t230{self::Class2}.{self::Class2::[]}(#t231).{self::Class2::+}(1) in let final void #t233 = #t230{self::Class2}.{self::Class2::[]=}(#t231, #t232) in #t232;
-  nullable2 = let final self::Class3? #t234 = n3 in #t234.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t235 = #t234{self::Class3}.{self::Class3::[]}(nullable3) in #t235.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t236 = nullable2 in let final self::Class2 #t237 = #t235{self::Class2}.{self::Class2::[]}(#t236).{self::Class2::+}(1) in let final void #t238 = #t235{self::Class2}.{self::Class2::[]=}(#t236, #t237) in #t237;
+  let final self::Class1? #t84 = n1 in #t84.{core::Object::==}(null) ?{self::Class1?} null : #t84{self::Class1}.{self::Class1::[]}(nullable1);
+  let final self::Class1? #t85 = n1 in #t85.{core::Object::==}(null) ?{self::Class1?} null : #t85{self::Class1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
+  let final self::Class1? #t86 = n1 in #t86.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t87 = #t86{self::Class1}.{self::Class1::[]}(nullable1) in #t87.{core::Object::==}(null) ?{self::Class1?} null : #t87{self::Class1}.{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t88 = n1 in #t88.{core::Object::==}(null) ?{self::Class1?} null : #t88{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]}(nullable1);
+  let final self::Class1? #t89 = n1 in #t89.{core::Object::==}(null) ?{self::Class1?} null : #t89{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
+  nullable1 = let final self::Class1? #t90 = n1 in #t90.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t91 = #t90{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1? #t92 = nullable1 in let final self::Class1 #t93 = new self::Class1::•() in let final void #t94 = #t91.{self::Class1::[]=}(#t92, #t93) in #t93;
+  let final self::Class1? #t95 = n1 in #t95.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t96 = #t95{self::Class1}.{self::Class1::nonNullable1}.{self::Class1::[]}(nullable1) in #t96.{core::Object::==}(null) ?{self::Class1?} null : #t96{self::Class1}.{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t97 = n1 in #t97.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t98 = #t97{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t99 = nullable2 in #t98.{self::Class2::[]=}(#t99, #t98.{self::Class2::[]}(#t99).{self::Class2::+}(0));
+  nullable2 = let final self::Class1? #t100 = n1 in #t100.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t101 = #t100{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t102 = nullable2 in let final self::Class2 #t103 = #t101.{self::Class2::[]}(#t102).{self::Class2::+}(0) in let final void #t104 = #t101.{self::Class2::[]=}(#t102, #t103) in #t103;
+  let final self::Class1? #t105 = n1 in #t105.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t106 = nullable1 in #t105{self::Class1}.{self::Class1::[]}(#t106).{core::Object::==}(null) ?{self::Class1?} #t105{self::Class1}.{self::Class1::[]=}(#t106, nullable1) : null;
+  nullable1 = let final self::Class1? #t107 = n1 in #t107.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t108 = nullable1 in let final self::Class1? #t109 = #t107{self::Class1}.{self::Class1::[]}(#t108) in #t109.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t110 = nullable1 in let final void #t111 = #t107{self::Class1}.{self::Class1::[]=}(#t108, #t110) in #t110 : #t109{self::Class1};
+  let final self::Class2? #t112 = n2 in #t112.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t113 = nullable2 in #t112{self::Class2}.{self::Class2::[]=}(#t113, #t112{self::Class2}.{self::Class2::[]}(#t113).{self::Class2::+}(0));
+  nullable2 = let final self::Class2? #t114 = n2 in #t114.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t115 = nullable2 in let final self::Class2 #t116 = #t114{self::Class2}.{self::Class2::[]}(#t115).{self::Class2::+}(0) in let final void #t117 = #t114{self::Class2}.{self::Class2::[]=}(#t115, #t116) in #t116;
+  let final self::Class2? #t118 = n2 in #t118.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t119 = nullable2 in #t118{self::Class2}.{self::Class2::[]=}(#t119, #t118{self::Class2}.{self::Class2::[]}(#t119).{self::Class2::+}(0));
+  nullable2 = let final self::Class2? #t120 = n2 in #t120.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t121 = nullable2 in let final self::Class2 #t122 = #t120{self::Class2}.{self::Class2::[]}(#t121).{self::Class2::+}(0) in let final void #t123 = #t120{self::Class2}.{self::Class2::[]=}(#t121, #t122) in #t122;
+  let final self::Class2? #t124 = n2 in #t124.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t125 = nullable2 in #t124{self::Class2}.{self::Class2::[]=}(#t125, #t124{self::Class2}.{self::Class2::[]}(#t125).{self::Class2::+}(1));
+  nullable2 = let final self::Class2? #t126 = n2 in #t126.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t127 = nullable2 in let final self::Class2 #t128 = #t126{self::Class2}.{self::Class2::[]}(#t127) in let final void #t129 = #t126{self::Class2}.{self::Class2::[]=}(#t127, #t128.{self::Class2::+}(1)) in #t128;
+  let final self::Class2? #t130 = n2 in #t130.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t131 = nullable2 in let final self::Class2 #t132 = #t130{self::Class2}.{self::Class2::[]}(#t131).{self::Class2::+}(1) in let final void #t133 = #t130{self::Class2}.{self::Class2::[]=}(#t131, #t132) in #t132;
+  nullable2 = let final self::Class2? #t134 = n2 in #t134.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t135 = nullable2 in let final self::Class2 #t136 = #t134{self::Class2}.{self::Class2::[]}(#t135).{self::Class2::+}(1) in let final void #t137 = #t134{self::Class2}.{self::Class2::[]=}(#t135, #t136) in #t136;
+  let final self::Class1? #t138 = n1 in #t138.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t139 = #t138{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t140 = nullable2 in #t139.{self::Class2::[]=}(#t140, #t139.{self::Class2::[]}(#t140).{self::Class2::+}(1));
+  nullable2 = let final self::Class1? #t141 = n1 in #t141.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t142 = #t141{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t143 = nullable2 in let final self::Class2 #t144 = #t142.{self::Class2::[]}(#t143) in let final void #t145 = #t142.{self::Class2::[]=}(#t143, #t144.{self::Class2::+}(1)) in #t144;
+  let final self::Class1? #t146 = n1 in #t146.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t147 = #t146{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t148 = nullable2 in let final self::Class2 #t149 = #t147.{self::Class2::[]}(#t148).{self::Class2::+}(1) in let final void #t150 = #t147.{self::Class2::[]=}(#t148, #t149) in #t149;
+  nullable2 = let final self::Class1? #t151 = n1 in #t151.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t152 = #t151{self::Class1}.{self::Class1::nonNullable2} in let final self::Class2? #t153 = nullable2 in let final self::Class2 #t154 = #t152.{self::Class2::[]}(#t153).{self::Class2::+}(1) in let final void #t155 = #t152.{self::Class2::[]=}(#t153, #t154) in #t154;
+  let final self::Class1? #t156 = n1 in #t156.{core::Object::==}(null) ?{self::Class2?} null : #t156{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]}(nullable2);
+  let final self::Class1? #t157 = n1 in #t157.{core::Object::==}(null) ?{self::Class2?} null : #t157{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]=}(nullable2, new self::Class2::•());
+  nullable2 = let final self::Class1? #t158 = n1 in #t158.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t159 = #t158{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t160 = nullable2 in let final self::Class2 #t161 = new self::Class2::•() in let final void #t162 = #t159.{self::Class2::[]=}(#t160, #t161) in #t161;
+  let final self::Class1? #t163 = n1 in #t163.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t164 = #t163{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2).{self::Class2::[]}(nullable2) in #t164.{core::Object::==}(null) ?{self::Class2?} null : #t164{self::Class2}.{self::Class2::nonNullable2Method}();
+  let final self::Class1? #t165 = n1 in #t165.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t166 = #t165{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t167 = nullable2 in #t166.{self::Class2::[]=}(#t167, #t166.{self::Class2::[]}(#t167).{self::Class2::+}(0));
+  nullable2 = let final self::Class1? #t168 = n1 in #t168.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t169 = #t168{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t170 = nullable2 in let final self::Class2 #t171 = #t169.{self::Class2::[]}(#t170).{self::Class2::+}(0) in let final void #t172 = #t169.{self::Class2::[]=}(#t170, #t171) in #t171;
+  let final self::Class1? #t173 = n1 in #t173.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t174 = #t173{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t175 = nullable2 in #t174.{self::Class2::[]=}(#t175, #t174.{self::Class2::[]}(#t175).{self::Class2::+}(1));
+  nullable2 = let final self::Class1? #t176 = n1 in #t176.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t177 = #t176{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t178 = nullable2 in let final self::Class2 #t179 = #t177.{self::Class2::[]}(#t178) in let final void #t180 = #t177.{self::Class2::[]=}(#t178, #t179.{self::Class2::+}(1)) in #t179;
+  let final self::Class1? #t181 = n1 in #t181.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t182 = #t181{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t183 = nullable2 in let final self::Class2 #t184 = #t182.{self::Class2::[]}(#t183).{self::Class2::+}(1) in let final void #t185 = #t182.{self::Class2::[]=}(#t183, #t184) in #t184;
+  nullable2 = let final self::Class1? #t186 = n1 in #t186.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t187 = #t186{self::Class1}.{self::Class1::nonNullable2}.{self::Class2::[]}(nullable2) in let final self::Class2? #t188 = nullable2 in let final self::Class2 #t189 = #t187.{self::Class2::[]}(#t188).{self::Class2::+}(1) in let final void #t190 = #t187.{self::Class2::[]=}(#t188, #t189) in #t189;
+  let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = #t191{self::Class1}.{self::Class1::[]}(nullable1) in #t192.{core::Object::==}(null) ?{self::Class1?} null : #t192{self::Class1}.{self::Class1::[]}(nullable1);
+  let final self::Class1? #t193 = n1 in #t193.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t194 = #t193{self::Class1}.{self::Class1::[]}(nullable1) in #t194.{core::Object::==}(null) ?{self::Class1?} null : #t194{self::Class1}.{self::Class1::[]=}(nullable1, new self::Class1::•());
+  nullable1 = let final self::Class1? #t195 = n1 in #t195.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t196 = #t195{self::Class1}.{self::Class1::[]}(nullable1) in #t196.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t197 = nullable1 in let final self::Class1 #t198 = new self::Class1::•() in let final void #t199 = #t196{self::Class1}.{self::Class1::[]=}(#t197, #t198) in #t198;
+  let final self::Class1? #t200 = n1 in #t200.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t201 = #t200{self::Class1}.{self::Class1::[]}(nullable1) in #t201.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t202 = #t201{self::Class1}.{self::Class1::[]}(nullable1) in #t202.{core::Object::==}(null) ?{self::Class1?} null : #t202{self::Class1}.{self::Class1::nonNullable1Method}();
+  nullable1 = let final self::Class1? #t203 = n1 in #t203.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t204 = #t203{self::Class1}.{self::Class1::[]}(nullable1) in #t204.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t205 = #t204{self::Class1}.{self::Class1::[]}(nullable1) in #t205.{core::Object::==}(null) ?{self::Class1?} null : #t205{self::Class1}.{self::Class1::nonNullable1Method}();
+  let final self::Class1? #t206 = n1 in #t206.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t207 = #t206{self::Class1}.{self::Class1::[]}(nullable1) in #t207.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t208 = nullable1 in #t207{self::Class1}.{self::Class1::[]}(#t208).{core::Object::==}(null) ?{self::Class1?} #t207{self::Class1}.{self::Class1::[]=}(#t208, nullable1) : null;
+  nullable1 = let final self::Class1? #t209 = n1 in #t209.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t210 = #t209{self::Class1}.{self::Class1::[]}(nullable1) in #t210.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t211 = nullable1 in let final self::Class1? #t212 = #t210{self::Class1}.{self::Class1::[]}(#t211) in #t212.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t213 = nullable1 in let final void #t214 = #t210{self::Class1}.{self::Class1::[]=}(#t211, #t213) in #t213 : #t212{self::Class1};
+  let final self::Class3? #t215 = n3 in #t215.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t216 = #t215{self::Class3}.{self::Class3::[]}(nullable3) in #t216.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t217 = nullable2 in #t216{self::Class2}.{self::Class2::[]=}(#t217, #t216{self::Class2}.{self::Class2::[]}(#t217).{self::Class2::+}(0));
+  nullable2 = let final self::Class3? #t218 = n3 in #t218.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t219 = #t218{self::Class3}.{self::Class3::[]}(nullable3) in #t219.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t220 = nullable2 in let final self::Class2 #t221 = #t219{self::Class2}.{self::Class2::[]}(#t220).{self::Class2::+}(0) in let final void #t222 = #t219{self::Class2}.{self::Class2::[]=}(#t220, #t221) in #t221;
+  let final self::Class3? #t223 = n3 in #t223.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t224 = #t223{self::Class3}.{self::Class3::[]}(nullable3) in #t224.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t225 = nullable2 in #t224{self::Class2}.{self::Class2::[]=}(#t225, #t224{self::Class2}.{self::Class2::[]}(#t225).{self::Class2::+}(1));
+  nullable2 = let final self::Class3? #t226 = n3 in #t226.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t227 = #t226{self::Class3}.{self::Class3::[]}(nullable3) in #t227.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t228 = nullable2 in let final self::Class2 #t229 = #t227{self::Class2}.{self::Class2::[]}(#t228) in let final void #t230 = #t227{self::Class2}.{self::Class2::[]=}(#t228, #t229.{self::Class2::+}(1)) in #t229;
+  let final self::Class3? #t231 = n3 in #t231.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t232 = #t231{self::Class3}.{self::Class3::[]}(nullable3) in #t232.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t233 = nullable2 in let final self::Class2 #t234 = #t232{self::Class2}.{self::Class2::[]}(#t233).{self::Class2::+}(1) in let final void #t235 = #t232{self::Class2}.{self::Class2::[]=}(#t233, #t234) in #t234;
+  nullable2 = let final self::Class3? #t236 = n3 in #t236.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t237 = #t236{self::Class3}.{self::Class3::[]}(nullable3) in #t237.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t238 = nullable2 in let final self::Class2 #t239 = #t237{self::Class2}.{self::Class2::[]}(#t238).{self::Class2::+}(1) in let final void #t240 = #t237{self::Class2}.{self::Class2::[]=}(#t238, #t239) in #t239;
 }
 static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
   self::Class2? nullable2 = n2;
-  self::throws(() → self::Class1? => (let final self::Class1? #t239 = n1 in #t239.{core::Object::==}(null) ?{self::Class1?} null : #t239{self::Class1}.{self::Class1::nonNullable1}).{self::Class1::+}(0));
-  self::throws(() → self::Class1? => (let final self::Class1? #t240 = n1 in #t240.{core::Object::==}(null) ?{self::Class1?} null : #t240{self::Class1}.{self::Class1::nonNullable1}).{self::Class1::unary-}());
-  let final self::Class2? #t241 = n2 in #t241.{core::Object::==}(null) ?{self::Class2?} null : #t241.{self::Class2::nonNullable2} = #t241.{self::Class2::nonNullable2}.{self::Class2::+}(0);
-  nullable2 = let final self::Class2? #t242 = n2 in #t242.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t243 = #t242.{self::Class2::nonNullable2}.{self::Class2::+}(0) in let final void #t244 = #t242.{self::Class2::nonNullable2} = #t243 in #t243;
-  let final self::Class2? #t245 = n2 in #t245.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t246 = #t245{self::Class2}.{self::Class2::nonNullable2} in #t246.{self::Class2::nonNullable2} = #t246.{self::Class2::nonNullable2}.{self::Class2::+}(0);
-  nullable2 = let final self::Class2? #t247 = n2 in #t247.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t248 = #t247{self::Class2}.{self::Class2::nonNullable2} in #t248.{self::Class2::nonNullable2} = #t248.{self::Class2::nonNullable2}.{self::Class2::+}(0);
-  let final self::Class2? #t249 = n2 in #t249.{core::Object::==}(null) ?{self::Class2?} null : #t249.{self::Class2::nonNullable2} = #t249.{self::Class2::nonNullable2}.{self::Class2::+}(1);
-  nullable2 = let final self::Class2? #t250 = n2 in #t250.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t251 = #t250.{self::Class2::nonNullable2} in let final void #t252 = #t250.{self::Class2::nonNullable2} = #t251.{self::Class2::+}(1) in #t251;
-  let final self::Class2? #t253 = n2 in #t253.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t254 = #t253.{self::Class2::nonNullable2}.{self::Class2::+}(1) in let final void #t255 = #t253.{self::Class2::nonNullable2} = #t254 in #t254;
-  nullable2 = let final self::Class2? #t256 = n2 in #t256.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t257 = #t256.{self::Class2::nonNullable2}.{self::Class2::+}(1) in let final void #t258 = #t256.{self::Class2::nonNullable2} = #t257 in #t257;
+  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.
+ - '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.
+ - '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-}());
+  let final self::Class2? #t245 = n2 in #t245.{core::Object::==}(null) ?{self::Class2?} null : #t245.{self::Class2::nonNullable2} = #t245.{self::Class2::nonNullable2}.{self::Class2::+}(0);
+  nullable2 = let final self::Class2? #t246 = n2 in #t246.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t247 = #t246.{self::Class2::nonNullable2}.{self::Class2::+}(0) in let final void #t248 = #t246.{self::Class2::nonNullable2} = #t247 in #t247;
+  let final self::Class2? #t249 = n2 in #t249.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t250 = #t249{self::Class2}.{self::Class2::nonNullable2} in #t250.{self::Class2::nonNullable2} = #t250.{self::Class2::nonNullable2}.{self::Class2::+}(0);
+  nullable2 = let final self::Class2? #t251 = n2 in #t251.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t252 = #t251{self::Class2}.{self::Class2::nonNullable2} in #t252.{self::Class2::nonNullable2} = #t252.{self::Class2::nonNullable2}.{self::Class2::+}(0);
+  let final self::Class2? #t253 = n2 in #t253.{core::Object::==}(null) ?{self::Class2?} null : #t253.{self::Class2::nonNullable2} = #t253.{self::Class2::nonNullable2}.{self::Class2::+}(1);
+  nullable2 = let final self::Class2? #t254 = n2 in #t254.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t255 = #t254.{self::Class2::nonNullable2} in let final void #t256 = #t254.{self::Class2::nonNullable2} = #t255.{self::Class2::+}(1) in #t255;
+  let final self::Class2? #t257 = n2 in #t257.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t258 = #t257.{self::Class2::nonNullable2}.{self::Class2::+}(1) in let final void #t259 = #t257.{self::Class2::nonNullable2} = #t258 in #t258;
+  nullable2 = let final self::Class2? #t260 = n2 in #t260.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t261 = #t260.{self::Class2::nonNullable2}.{self::Class2::+}(1) in let final void #t262 = #t260.{self::Class2::nonNullable2} = #t261 in #t261;
 }
 static method ifNull(self::Class1? n1) → void {
   self::Class1? nullable1 = n1;
-  let final self::Class1? #t259 = n1 in #t259.{core::Object::==}(null) ?{self::Class1?} null : #t259.{self::Class1::nullable1}.{core::Object::==}(null) ?{self::Class1} #t259.{self::Class1::nullable1} = n1{self::Class1} : null;
-  n1 = let final self::Class1? #t260 = n1 in #t260.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t261 = #t260.{self::Class1::nullable1} in #t261.{core::Object::==}(null) ?{self::Class1} #t260.{self::Class1::nullable1} = n1{self::Class1} : #t261{self::Class1};
-  let final self::Class1? #t262 = n1 in #t262.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t263 = #t262{self::Class1}.{self::Class1::nonNullable1} in #t263{self::Class1}.{self::Class1::nullable1}.{core::Object::==}(null) ?{self::Class1} #t263{self::Class1}.{self::Class1::nullable1} = n1{self::Class1} : null;
-  n1 = let final self::Class1? #t264 = n1 in #t264.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t265 = #t264{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1? #t266 = #t265{self::Class1}.{self::Class1::nullable1} in #t266.{core::Object::==}(null) ?{self::Class1} #t265{self::Class1}.{self::Class1::nullable1} = n1{self::Class1} : #t266{self::Class1};
-  let final self::Class1? #t267 = n1 in #t267.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t268 = #t267{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1 #t269 = n1{self::Class1} in #t268.{self::Class1::[]}(#t269).{core::Object::==}(null) ?{self::Class1} #t268.{self::Class1::[]=}(#t269, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t270 = n1 in #t270.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t271 = #t270{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1 #t272 = n1{self::Class1} in let final self::Class1? #t273 = #t271.{self::Class1::[]}(#t272) in #t273.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t274 = n1{self::Class1} in let final void #t275 = #t271.{self::Class1::[]=}(#t272, #t274) in #t274 : #t273{self::Class1};
+  let final self::Class1? #t263 = n1 in #t263.{core::Object::==}(null) ?{self::Class1?} null : #t263.{self::Class1::nullable1}.{core::Object::==}(null) ?{self::Class1} #t263.{self::Class1::nullable1} = n1{self::Class1} : null;
+  n1 = let final self::Class1? #t264 = n1 in #t264.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t265 = #t264.{self::Class1::nullable1} in #t265.{core::Object::==}(null) ?{self::Class1} #t264.{self::Class1::nullable1} = n1{self::Class1} : #t265{self::Class1};
+  let final self::Class1? #t266 = n1 in #t266.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t267 = #t266{self::Class1}.{self::Class1::nonNullable1} in #t267{self::Class1}.{self::Class1::nullable1}.{core::Object::==}(null) ?{self::Class1} #t267{self::Class1}.{self::Class1::nullable1} = n1{self::Class1} : null;
+  n1 = let final self::Class1? #t268 = n1 in #t268.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t269 = #t268{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1? #t270 = #t269{self::Class1}.{self::Class1::nullable1} in #t270.{core::Object::==}(null) ?{self::Class1} #t269{self::Class1}.{self::Class1::nullable1} = n1{self::Class1} : #t270{self::Class1};
+  let final self::Class1? #t271 = n1 in #t271.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t272 = #t271{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1 #t273 = n1{self::Class1} in #t272.{self::Class1::[]}(#t273).{core::Object::==}(null) ?{self::Class1} #t272.{self::Class1::[]=}(#t273, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t274 = n1 in #t274.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t275 = #t274{self::Class1}.{self::Class1::nonNullable1} in let final self::Class1 #t276 = n1{self::Class1} in let final self::Class1? #t277 = #t275.{self::Class1::[]}(#t276) in #t277.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t278 = n1{self::Class1} in let final void #t279 = #t275.{self::Class1::[]=}(#t276, #t278) in #t278 : #t277{self::Class1};
 }
 static method throws(() → void f) → void {
   try {
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 559dca6..ad010f7 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
@@ -2,24 +2,24 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// 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);
 //                                                           ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:94:55: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// 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);
 //                                                       ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:244:45: Warning: Operator '+' is called on 'Class1?' which is potentially null.
+// 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);
 //                                             ^
 //
-// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:245:16: Warning: Operator 'unary-' is called on 'Class1?' which is potentially null.
+// 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);
 //                ^
@@ -139,139 +139,153 @@
   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? => self::Extension1|get#nullable1(let final self::Class1? #t19 = n1 in #t19.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t20 = new self::Class1::•() in let final void #t21 = self::Extension1|set#nullable1(#t19{self::Class1}, #t20) in #t20));
-  self::throws(() → self::Class1? => self::Extension1|get#nullable1(let final self::Class1? #t22 = n1 in #t22.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t22{self::Class1})));
-  nullable1 = let final self::Class1? #t23 = n1 in #t23.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t24 = new self::Class1::•() in let final void #t25 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t23{self::Class1}), #t24) in #t24;
-  nullable1 = let final self::Class1? #t26 = n1 in #t26.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t27 = self::Extension1|get#nullable1(#t26{self::Class1}) in #t27.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t28 = new self::Class1::•() in let final void #t29 = self::Extension1|set#nullable1(#t27{self::Class1}, #t28) in #t28;
-  nullable1 = let final self::Class1? #t30 = n1 in #t30.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t31 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t30{self::Class1})) in #t31.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t32 = new self::Class1::•() in let final void #t33 = self::Extension1|set#nullable1(#t31{self::Class1}, #t32) in #t32;
-  let final self::Class1? #t34 = n1 in #t34.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t35 = self::Extension1|get#nullable1(#t34{self::Class1}) in #t35.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t35{self::Class1});
-  let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t36{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t37 = n1 in #t37.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t38 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t39 = self::Extension1|set#nullable1(#t37{self::Class1}, #t38) in #t38;
-  let final self::Class1? #t40 = n1 in #t40.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t40{self::Class1}, let final self::Class1 #t41 = new self::Class1::•() in let final void #t42 = self::Extension1|set#nullable1(new self::Class1::•(), #t41) in #t41);
-  nullable1 = let final self::Class1? #t43 = n1 in #t43.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t44 = let final self::Class1 #t45 = new self::Class1::•() in let final void #t46 = self::Extension1|set#nullable1(new self::Class1::•(), #t45) in #t45 in let final void #t47 = self::Extension1|set#nullable1(#t43{self::Class1}, #t44) in #t44;
-  let final self::Class1? #t48 = n1 in #t48.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t49 = n1 in #t49.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t50 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t51 = self::Extension1|set#nullable1(#t49{self::Class1}, #t50) in #t50;
-  let final self::Class1? #t52 = n1 in #t52.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t52{self::Class1}));
-  let final self::Class1? #t53 = n1 in #t53.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
-  let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t54{self::Class1}));
-  let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t55{self::Class1})));
-  let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
-  nullable1 = let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t58 = new self::Class1::•() in let final void #t59 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})), #t58) in #t58;
-  let final self::Class1? #t60 = n1 in #t60.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t61 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t60{self::Class1})) in #t61.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t61{self::Class1});
-  let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
-  nullable1 = let final self::Class1? #t63 = n1 in #t63.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t64 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t65 = self::Extension1|set#nullable1(#t63{self::Class1}, #t64) in #t64;
-  let final self::Class1? #t66 = n1 in #t66.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t66{self::Class1}, let final self::Class1 #t67 = new self::Class1::•() in let final void #t68 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t67) in #t67);
-  nullable1 = let final self::Class1? #t69 = n1 in #t69.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t70 = let final self::Class1 #t71 = new self::Class1::•() in let final void #t72 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t71) in #t71 in let final void #t73 = self::Extension1|set#nullable1(#t69{self::Class1}, #t70) in #t70;
-  let final self::Class1? #t74 = n1 in #t74.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
-  nullable1 = let final self::Class1? #t75 = n1 in #t75.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t76 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t77 = self::Extension1|set#nullable1(#t75{self::Class1}, #t76) in #t76;
-  let final self::Class1? #t78 = n1 in #t78.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t78{self::Class1})));
-  let final self::Class1? #t79 = n1 in #t79.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
-  let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
-  let final self::Class1? #t81 = n1 in #t81.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t83 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t84 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t82{self::Class1}), #t83) in #t83;
-  let final self::Class1? #t85 = n1 in #t85.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
-  nullable1 = let final self::Class1? #t88 = n1 in #t88.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t89 = let final self::Class1 #t90 = new self::Class1::•() in let final void #t91 = self::Extension1|set#nullable1(new self::Class1::•(), #t90) in #t90 in let final void #t92 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t88{self::Class1}), #t89) in #t89;
-  let final self::Class1? #t93 = n1 in #t93.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t94 = n1 in #t94.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t95 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t96 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t94{self::Class1}), #t95) in #t95;
-  let final self::Class1? #t97 = n1 in #t97.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
-  nullable1 = let final self::Class1? #t100 = n1 in #t100.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t101 = let final self::Class1? #t102 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t103 = self::Extension1|set#nullable1(new self::Class1::•(), #t102) in #t102 in let final void #t104 = self::Extension1|set#nullable1(#t100{self::Class1}, #t101) in #t101;
-  let final self::Class1? #t105 = n1 in #t105.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t105{self::Class1}, let final self::Class1 #t106 = let final self::Class1 #t107 = new self::Class1::•() in let final void #t108 = self::Extension1|set#nullable1(new self::Class1::•(), #t107) in #t107 in let final void #t109 = self::Extension1|set#nullable1(new self::Class1::•(), #t106) in #t106);
-  nullable1 = let final self::Class1? #t110 = n1 in #t110.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t111 = let final self::Class1 #t112 = let final self::Class1 #t113 = new self::Class1::•() in let final void #t114 = self::Extension1|set#nullable1(new self::Class1::•(), #t113) in #t113 in let final void #t115 = self::Extension1|set#nullable1(new self::Class1::•(), #t112) in #t112 in let final void #t116 = self::Extension1|set#nullable1(#t110{self::Class1}, #t111) in #t111;
-  let final self::Class1? #t117 = n1 in #t117.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
-  nullable1 = let final self::Class1? #t120 = n1 in #t120.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t121 = let final self::Class1 #t122 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t123 = self::Extension1|set#nullable1(new self::Class1::•(), #t122) in #t122 in let final void #t124 = self::Extension1|set#nullable1(#t120{self::Class1}, #t121) in #t121;
-  let final self::Class1? #t125 = n1 in #t125.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t126 = n1 in #t126.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t127 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t128 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t126{self::Class1}), #t127) in #t127;
-  let final self::Class1? #t129 = n1 in #t129.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
-  nullable1 = let final self::Class1? #t132 = n1 in #t132.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t133 = let final self::Class1 #t134 = new self::Class1::•() in let final void #t135 = self::Extension1|set#nullable1(new self::Class1::•(), #t134) in #t134 in let final void #t136 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t132{self::Class1}), #t133) in #t133;
-  let final self::Class1? #t137 = n1 in #t137.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t138 = n1 in #t138.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t139 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t140 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t138{self::Class1}), #t139) in #t139;
-  let final self::Class1? #t141 = n1 in #t141.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t141{self::Class1})));
-  let final self::Class1? #t142 = n1 in #t142.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
-  nullable1 = let final self::Class1? #t143 = n1 in #t143.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t144 = new self::Class1::•() in let final void #t145 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})), #t144) in #t144;
-  let final self::Class1? #t146 = n1 in #t146.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t146{self::Class1})));
-  let final self::Class1? #t147 = n1 in #t147.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
-  nullable1 = let final self::Class1? #t148 = n1 in #t148.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t149 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t150 = self::Extension1|set#nullable1(#t148{self::Class1}, #t149) in #t149;
-  let final self::Class1? #t151 = n1 in #t151.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t151{self::Class1}, let final self::Class1 #t152 = new self::Class1::•() in let final void #t153 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t152) in #t152);
-  nullable1 = let final self::Class1? #t154 = n1 in #t154.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t155 = let final self::Class1 #t156 = new self::Class1::•() in let final void #t157 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t156) in #t156 in let final void #t158 = self::Extension1|set#nullable1(#t154{self::Class1}, #t155) in #t155;
-  let final self::Class1? #t159 = n1 in #t159.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
-  nullable1 = let final self::Class1? #t160 = n1 in #t160.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t161 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t162 = self::Extension1|set#nullable1(#t160{self::Class1}, #t161) in #t161;
-  let final self::Class1? #t163 = n1 in #t163.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t163{self::Class1})));
-  let final self::Class1? #t164 = n1 in #t164.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
-  let final self::Class1? #t165 = n1 in #t165.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
-  let final self::Class1? #t166 = n1 in #t166.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t167 = self::Extension1|nonNullable1Method(#t166{self::Class1}) in #t167.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t167{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.
+ - '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.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
+Try accessing using ?. instead.
+  throws(() => (Extension1(n1)?.nonNullable1Method()).nullable1);
+                                                      ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t24 = n1 in #t24.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t24{self::Class1})));
+  nullable1 = let final self::Class1? #t25 = n1 in #t25.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t26 = new self::Class1::•() in let final void #t27 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t25{self::Class1}), #t26) in #t26;
+  nullable1 = let final self::Class1? #t28 = n1 in #t28.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t29 = self::Extension1|get#nullable1(#t28{self::Class1}) in #t29.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t30 = new self::Class1::•() in let final void #t31 = self::Extension1|set#nullable1(#t29{self::Class1}, #t30) in #t30;
+  nullable1 = let final self::Class1? #t32 = n1 in #t32.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t33 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t32{self::Class1})) in #t33.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t34 = new self::Class1::•() in let final void #t35 = self::Extension1|set#nullable1(#t33{self::Class1}, #t34) in #t34;
+  let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t37 = self::Extension1|get#nullable1(#t36{self::Class1}) in #t37.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t37{self::Class1});
+  let final self::Class1? #t38 = n1 in #t38.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t38{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t39 = n1 in #t39.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t40 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t41 = self::Extension1|set#nullable1(#t39{self::Class1}, #t40) in #t40;
+  let final self::Class1? #t42 = n1 in #t42.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t42{self::Class1}, let final self::Class1 #t43 = new self::Class1::•() in let final void #t44 = self::Extension1|set#nullable1(new self::Class1::•(), #t43) in #t43);
+  nullable1 = let final self::Class1? #t45 = n1 in #t45.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t46 = let final self::Class1 #t47 = new self::Class1::•() in let final void #t48 = self::Extension1|set#nullable1(new self::Class1::•(), #t47) in #t47 in let final void #t49 = self::Extension1|set#nullable1(#t45{self::Class1}, #t46) in #t46;
+  let final self::Class1? #t50 = n1 in #t50.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t50{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t51 = n1 in #t51.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t52 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t53 = self::Extension1|set#nullable1(#t51{self::Class1}, #t52) in #t52;
+  let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t54{self::Class1}));
+  let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t55{self::Class1}), new self::Class1::•());
+  let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t56{self::Class1}));
+  let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})));
+  let final self::Class1? #t58 = n1 in #t58.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t58{self::Class1})), new self::Class1::•());
+  nullable1 = let final self::Class1? #t59 = n1 in #t59.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t60 = new self::Class1::•() in let final void #t61 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t59{self::Class1})), #t60) in #t60;
+  let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t63 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t62{self::Class1})) in #t63.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t63{self::Class1});
+  let final self::Class1? #t64 = n1 in #t64.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t64{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t65 = n1 in #t65.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t66 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t67 = self::Extension1|set#nullable1(#t65{self::Class1}, #t66) in #t66;
+  let final self::Class1? #t68 = n1 in #t68.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t68{self::Class1}, let final self::Class1 #t69 = new self::Class1::•() in let final void #t70 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t69) in #t69);
+  nullable1 = let final self::Class1? #t71 = n1 in #t71.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t72 = let final self::Class1 #t73 = new self::Class1::•() in let final void #t74 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t73) in #t73 in let final void #t75 = self::Extension1|set#nullable1(#t71{self::Class1}, #t72) in #t72;
+  let final self::Class1? #t76 = n1 in #t76.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t76{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t77 = n1 in #t77.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t78 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t79 = self::Extension1|set#nullable1(#t77{self::Class1}, #t78) in #t78;
+  let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
+  let final self::Class1? #t81 = n1 in #t81.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t81{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t82{self::Class1})));
+  let final self::Class1? #t83 = n1 in #t83.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t83{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t84 = n1 in #t84.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t85 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t86 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t84{self::Class1}), #t85) in #t85;
+  let final self::Class1? #t87 = n1 in #t87.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t87{self::Class1}), let final self::Class1 #t88 = new self::Class1::•() in let final void #t89 = self::Extension1|set#nullable1(new self::Class1::•(), #t88) in #t88);
+  nullable1 = let final self::Class1? #t90 = n1 in #t90.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t91 = let final self::Class1 #t92 = new self::Class1::•() in let final void #t93 = self::Extension1|set#nullable1(new self::Class1::•(), #t92) in #t92 in let final void #t94 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t90{self::Class1}), #t91) in #t91;
+  let final self::Class1? #t95 = n1 in #t95.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t95{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t96 = n1 in #t96.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t97 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t98 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t96{self::Class1}), #t97) in #t97;
+  let final self::Class1? #t99 = n1 in #t99.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t99{self::Class1}, let final self::Class1? #t100 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t101 = self::Extension1|set#nullable1(new self::Class1::•(), #t100) in #t100);
+  nullable1 = let final self::Class1? #t102 = n1 in #t102.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t103 = let final self::Class1? #t104 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t105 = self::Extension1|set#nullable1(new self::Class1::•(), #t104) in #t104 in let final void #t106 = self::Extension1|set#nullable1(#t102{self::Class1}, #t103) in #t103;
+  let final self::Class1? #t107 = n1 in #t107.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t107{self::Class1}, let final self::Class1 #t108 = let final self::Class1 #t109 = new self::Class1::•() in let final void #t110 = self::Extension1|set#nullable1(new self::Class1::•(), #t109) in #t109 in let final void #t111 = self::Extension1|set#nullable1(new self::Class1::•(), #t108) in #t108);
+  nullable1 = let final self::Class1? #t112 = n1 in #t112.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t113 = let final self::Class1 #t114 = let final self::Class1 #t115 = new self::Class1::•() in let final void #t116 = self::Extension1|set#nullable1(new self::Class1::•(), #t115) in #t115 in let final void #t117 = self::Extension1|set#nullable1(new self::Class1::•(), #t114) in #t114 in let final void #t118 = self::Extension1|set#nullable1(#t112{self::Class1}, #t113) in #t113;
+  let final self::Class1? #t119 = n1 in #t119.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t119{self::Class1}, let final self::Class1 #t120 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t121 = self::Extension1|set#nullable1(new self::Class1::•(), #t120) in #t120);
+  nullable1 = let final self::Class1? #t122 = n1 in #t122.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t123 = let final self::Class1 #t124 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t125 = self::Extension1|set#nullable1(new self::Class1::•(), #t124) in #t124 in let final void #t126 = self::Extension1|set#nullable1(#t122{self::Class1}, #t123) in #t123;
+  let final self::Class1? #t127 = n1 in #t127.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t127{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t128 = n1 in #t128.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t129 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t130 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t128{self::Class1}), #t129) in #t129;
+  let final self::Class1? #t131 = n1 in #t131.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t131{self::Class1}), let final self::Class1 #t132 = new self::Class1::•() in let final void #t133 = self::Extension1|set#nullable1(new self::Class1::•(), #t132) in #t132);
+  nullable1 = let final self::Class1? #t134 = n1 in #t134.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t135 = let final self::Class1 #t136 = new self::Class1::•() in let final void #t137 = self::Extension1|set#nullable1(new self::Class1::•(), #t136) in #t136 in let final void #t138 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t134{self::Class1}), #t135) in #t135;
+  let final self::Class1? #t139 = n1 in #t139.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t139{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t140 = n1 in #t140.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t141 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t142 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t140{self::Class1}), #t141) in #t141;
+  let final self::Class1? #t143 = n1 in #t143.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})));
+  let final self::Class1? #t144 = n1 in #t144.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t144{self::Class1})), new self::Class1::•());
+  nullable1 = let final self::Class1? #t145 = n1 in #t145.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t146 = new self::Class1::•() in let final void #t147 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t145{self::Class1})), #t146) in #t146;
+  let final self::Class1? #t148 = n1 in #t148.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t148{self::Class1})));
+  let final self::Class1? #t149 = n1 in #t149.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t149{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t150 = n1 in #t150.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t151 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t152 = self::Extension1|set#nullable1(#t150{self::Class1}, #t151) in #t151;
+  let final self::Class1? #t153 = n1 in #t153.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t153{self::Class1}, let final self::Class1 #t154 = new self::Class1::•() in let final void #t155 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t154) in #t154);
+  nullable1 = let final self::Class1? #t156 = n1 in #t156.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t157 = let final self::Class1 #t158 = new self::Class1::•() in let final void #t159 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t158) in #t158 in let final void #t160 = self::Extension1|set#nullable1(#t156{self::Class1}, #t157) in #t157;
+  let final self::Class1? #t161 = n1 in #t161.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t161{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t162 = n1 in #t162.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t163 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t164 = self::Extension1|set#nullable1(#t162{self::Class1}, #t163) in #t163;
+  let final self::Class1? #t165 = n1 in #t165.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
+  let final self::Class1? #t166 = n1 in #t166.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t166{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t167 = n1 in #t167.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t167{self::Class1})));
+  let final self::Class1? #t168 = n1 in #t168.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t169 = self::Extension1|nonNullable1Method(#t168{self::Class1}) in #t169.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t169{self::Class1});
 }
 static method indexAccess(self::Class1? n1, self::Class2? n2, self::Class3? n3) → void {
   self::Class1? nullable1 = n1;
   self::Class2? nullable2 = n2;
   self::Class3? nullable3 = n3;
-  let final self::Class1? #t168 = n1 in #t168.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t168{self::Class1}, nullable1);
-  let final self::Class1? #t169 = n1 in #t169.{core::Object::==}(null) ?{void} null : self::Extension1|[]=(#t169{self::Class1}, nullable1, new self::Class1::•());
-  let final self::Class1? #t170 = n1 in #t170.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t171 = self::Extension1|[](#t170{self::Class1}, nullable1) in #t171.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t171{self::Class1});
-  let final self::Class1? #t172 = n1 in #t172.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](self::Extension1|get#nonNullable1(#t172{self::Class1}), nullable1);
-  let final self::Class1? #t173 = n1 in #t173.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(self::Extension1|get#nonNullable1(#t173{self::Class1}), nullable1, new self::Class1::•());
-  nullable1 = let final self::Class1? #t174 = n1 in #t174.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t175 = self::Extension1|get#nonNullable1(#t174{self::Class1}) in let final self::Class1? #t176 = nullable1 in let final self::Class1 #t177 = new self::Class1::•() in let final void #t178 = self::Extension1|[]=(#t175, #t176, #t177) in #t177;
-  let final self::Class1? #t179 = n1 in #t179.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t180 = self::Extension1|[](self::Extension1|get#nonNullable1(#t179{self::Class1}), nullable1) in #t180.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t180{self::Class1});
-  let final self::Class1? #t181 = n1 in #t181.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t182 = self::Extension1|get#nonNullable2(#t181{self::Class1}) in let final self::Class2? #t183 = nullable2 in self::Extension2|[]=(#t182, #t183, self::Extension2|+(self::Extension2|[](#t182, #t183), 0));
-  nullable2 = let final self::Class1? #t184 = n1 in #t184.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t185 = self::Extension1|get#nonNullable2(#t184{self::Class1}) in let final self::Class2? #t186 = nullable2 in let final self::Class2 #t187 = self::Extension2|+(self::Extension2|[](#t185, #t186), 0) in let final void #t188 = self::Extension2|[]=(#t185, #t186, #t187) in #t187;
-  let final self::Class1? #t189 = n1 in #t189.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t190 = nullable1 in self::Extension1|[](#t189{self::Class1}, #t190).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t189{self::Class1}, #t190, nullable1) : null;
-  nullable1 = let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = nullable1 in let final self::Class1? #t193 = self::Extension1|[](#t191{self::Class1}, #t192) in #t193.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t194 = nullable1 in let final void #t195 = self::Extension1|[]=(#t191{self::Class1}, #t192, #t194) in #t194 : #t193{self::Class1};
-  let final self::Class2? #t196 = n2 in #t196.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t197 = nullable2 in self::Extension2|[]=(#t196{self::Class2}, #t197, self::Extension2|+(self::Extension2|[](#t196{self::Class2}, #t197), 0));
-  nullable2 = let final self::Class2? #t198 = n2 in #t198.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t199 = nullable2 in let final self::Class2 #t200 = self::Extension2|+(self::Extension2|[](#t198{self::Class2}, #t199), 0) in let final void #t201 = self::Extension2|[]=(#t198{self::Class2}, #t199, #t200) in #t200;
-  let final self::Class2? #t202 = n2 in #t202.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t203 = nullable2 in self::Extension2|[]=(#t202{self::Class2}, #t203, self::Extension2|+(self::Extension2|[](#t202{self::Class2}, #t203), 0));
-  nullable2 = let final self::Class2? #t204 = n2 in #t204.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t205 = nullable2 in let final self::Class2 #t206 = self::Extension2|+(self::Extension2|[](#t204{self::Class2}, #t205), 0) in let final void #t207 = self::Extension2|[]=(#t204{self::Class2}, #t205, #t206) in #t206;
-  let final self::Class2? #t208 = n2 in #t208.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t209 = nullable2 in self::Extension2|[]=(#t208{self::Class2}, #t209, self::Extension2|+(self::Extension2|[](#t208{self::Class2}, #t209), 1));
-  nullable2 = let final self::Class2? #t210 = n2 in #t210.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t211 = nullable2 in let final self::Class2 #t212 = self::Extension2|[](#t210{self::Class2}, #t211) in let final void #t213 = self::Extension2|[]=(#t210{self::Class2}, #t211, self::Extension2|+(#t212, 1)) in #t212;
-  let final self::Class2? #t214 = n2 in #t214.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t215 = nullable2 in let final self::Class2 #t216 = self::Extension2|+(self::Extension2|[](#t214{self::Class2}, #t215), 1) in let final void #t217 = self::Extension2|[]=(#t214{self::Class2}, #t215, #t216) in #t216;
-  nullable2 = let final self::Class2? #t218 = n2 in #t218.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t219 = nullable2 in let final self::Class2 #t220 = self::Extension2|+(self::Extension2|[](#t218{self::Class2}, #t219), 1) in let final void #t221 = self::Extension2|[]=(#t218{self::Class2}, #t219, #t220) in #t220;
-  let final self::Class1? #t222 = n1 in #t222.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t223 = self::Extension1|get#nonNullable2(#t222{self::Class1}) in let final self::Class2? #t224 = nullable2 in self::Extension2|[]=(#t223, #t224, self::Extension2|+(self::Extension2|[](#t223, #t224), 1));
-  nullable2 = let final self::Class1? #t225 = n1 in #t225.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t226 = self::Extension1|get#nonNullable2(#t225{self::Class1}) in let final self::Class2? #t227 = nullable2 in let final self::Class2 #t228 = self::Extension2|[](#t226, #t227) in let final void #t229 = self::Extension2|[]=(#t226, #t227, self::Extension2|+(#t228, 1)) in #t228;
-  let final self::Class1? #t230 = n1 in #t230.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t231 = self::Extension1|get#nonNullable2(#t230{self::Class1}) in let final self::Class2? #t232 = nullable2 in let final self::Class2 #t233 = self::Extension2|+(self::Extension2|[](#t231, #t232), 1) in let final void #t234 = self::Extension2|[]=(#t231, #t232, #t233) in #t233;
-  nullable2 = let final self::Class1? #t235 = n1 in #t235.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t236 = self::Extension1|get#nonNullable2(#t235{self::Class1}) in let final self::Class2? #t237 = nullable2 in let final self::Class2 #t238 = self::Extension2|+(self::Extension2|[](#t236, #t237), 1) in let final void #t239 = self::Extension2|[]=(#t236, #t237, #t238) in #t238;
-  let final self::Class1? #t240 = n1 in #t240.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t240{self::Class1}), nullable2), nullable2);
-  let final self::Class1? #t241 = n1 in #t241.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[]=(self::Extension2|[](self::Extension1|get#nonNullable2(#t241{self::Class1}), nullable2), nullable2, new self::Class2::•());
-  nullable2 = let final self::Class1? #t242 = n1 in #t242.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t243 = self::Extension2|[](self::Extension1|get#nonNullable2(#t242{self::Class1}), nullable2) in let final self::Class2? #t244 = nullable2 in let final self::Class2 #t245 = new self::Class2::•() in let final void #t246 = self::Extension2|[]=(#t243, #t244, #t245) in #t245;
-  let final self::Class1? #t247 = n1 in #t247.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t248 = self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t247{self::Class1}), nullable2), nullable2) in #t248.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|nonNullable2Method(#t248{self::Class2});
-  let final self::Class1? #t249 = n1 in #t249.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t250 = self::Extension2|[](self::Extension1|get#nonNullable2(#t249{self::Class1}), nullable2) in let final self::Class2? #t251 = nullable2 in self::Extension2|[]=(#t250, #t251, self::Extension2|+(self::Extension2|[](#t250, #t251), 0));
-  nullable2 = let final self::Class1? #t252 = n1 in #t252.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t253 = self::Extension2|[](self::Extension1|get#nonNullable2(#t252{self::Class1}), nullable2) in let final self::Class2? #t254 = nullable2 in let final self::Class2 #t255 = self::Extension2|+(self::Extension2|[](#t253, #t254), 0) in let final void #t256 = self::Extension2|[]=(#t253, #t254, #t255) in #t255;
-  let final self::Class1? #t257 = n1 in #t257.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t258 = self::Extension2|[](self::Extension1|get#nonNullable2(#t257{self::Class1}), nullable2) in let final self::Class2? #t259 = nullable2 in self::Extension2|[]=(#t258, #t259, self::Extension2|+(self::Extension2|[](#t258, #t259), 1));
-  nullable2 = let final self::Class1? #t260 = n1 in #t260.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t261 = self::Extension2|[](self::Extension1|get#nonNullable2(#t260{self::Class1}), nullable2) in let final self::Class2? #t262 = nullable2 in let final self::Class2 #t263 = self::Extension2|[](#t261, #t262) in let final void #t264 = self::Extension2|[]=(#t261, #t262, self::Extension2|+(#t263, 1)) in #t263;
-  let final self::Class1? #t265 = n1 in #t265.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t266 = self::Extension2|[](self::Extension1|get#nonNullable2(#t265{self::Class1}), nullable2) in let final self::Class2? #t267 = nullable2 in let final self::Class2 #t268 = self::Extension2|+(self::Extension2|[](#t266, #t267), 1) in let final void #t269 = self::Extension2|[]=(#t266, #t267, #t268) in #t268;
-  nullable2 = let final self::Class1? #t270 = n1 in #t270.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t271 = self::Extension2|[](self::Extension1|get#nonNullable2(#t270{self::Class1}), nullable2) in let final self::Class2? #t272 = nullable2 in let final self::Class2 #t273 = self::Extension2|+(self::Extension2|[](#t271, #t272), 1) in let final void #t274 = self::Extension2|[]=(#t271, #t272, #t273) in #t273;
-  let final self::Class1? #t275 = n1 in #t275.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t276 = self::Extension1|[](#t275{self::Class1}, nullable1) in #t276.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t276{self::Class1}, nullable1);
-  let final self::Class1? #t277 = n1 in #t277.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t278 = self::Extension1|[](#t277{self::Class1}, nullable1) in #t278.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t278{self::Class1}, nullable1, new self::Class1::•());
-  nullable1 = let final self::Class1? #t279 = n1 in #t279.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t280 = self::Extension1|[](#t279{self::Class1}, nullable1) in #t280.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t281 = nullable1 in let final self::Class1 #t282 = new self::Class1::•() in let final void #t283 = self::Extension1|[]=(#t280{self::Class1}, #t281, #t282) in #t282;
-  let final self::Class1? #t284 = n1 in #t284.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t285 = self::Extension1|[](#t284{self::Class1}, nullable1) in #t285.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t286 = self::Extension1|[](#t285{self::Class1}, nullable1) in #t286.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t286{self::Class1});
-  nullable1 = let final self::Class1? #t287 = n1 in #t287.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t288 = self::Extension1|[](#t287{self::Class1}, nullable1) in #t288.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t289 = self::Extension1|[](#t288{self::Class1}, nullable1) in #t289.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t289{self::Class1});
-  let final self::Class1? #t290 = n1 in #t290.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t291 = self::Extension1|[](#t290{self::Class1}, nullable1) in #t291.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t292 = nullable1 in self::Extension1|[](#t291{self::Class1}, #t292).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t291{self::Class1}, #t292, nullable1) : null;
-  nullable1 = let final self::Class1? #t293 = n1 in #t293.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t294 = self::Extension1|[](#t293{self::Class1}, nullable1) in #t294.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t295 = nullable1 in let final self::Class1? #t296 = self::Extension1|[](#t294{self::Class1}, #t295) in #t296.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t297 = nullable1 in let final void #t298 = self::Extension1|[]=(#t294{self::Class1}, #t295, #t297) in #t297 : #t296{self::Class1};
-  let final self::Class3? #t299 = n3 in #t299.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t300 = self::Extension3|[](#t299{self::Class3}, nullable3) in #t300.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t301 = nullable2 in self::Extension2|[]=(#t300{self::Class2}, #t301, self::Extension2|+(self::Extension2|[](#t300{self::Class2}, #t301), 0));
-  nullable2 = let final self::Class3? #t302 = n3 in #t302.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t303 = self::Extension3|[](#t302{self::Class3}, nullable3) in #t303.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t304 = nullable2 in let final self::Class2 #t305 = self::Extension2|+(self::Extension2|[](#t303{self::Class2}, #t304), 0) in let final void #t306 = self::Extension2|[]=(#t303{self::Class2}, #t304, #t305) in #t305;
-  let final self::Class3? #t307 = n3 in #t307.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t308 = self::Extension3|[](#t307{self::Class3}, nullable3) in #t308.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t309 = nullable2 in self::Extension2|[]=(#t308{self::Class2}, #t309, self::Extension2|+(self::Extension2|[](#t308{self::Class2}, #t309), 1));
-  nullable2 = let final self::Class3? #t310 = n3 in #t310.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t311 = self::Extension3|[](#t310{self::Class3}, nullable3) in #t311.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t312 = nullable2 in let final self::Class2 #t313 = self::Extension2|[](#t311{self::Class2}, #t312) in let final void #t314 = self::Extension2|[]=(#t311{self::Class2}, #t312, self::Extension2|+(#t313, 1)) in #t313;
-  let final self::Class3? #t315 = n3 in #t315.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t316 = self::Extension3|[](#t315{self::Class3}, nullable3) in #t316.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t317 = nullable2 in let final self::Class2 #t318 = self::Extension2|+(self::Extension2|[](#t316{self::Class2}, #t317), 1) in let final void #t319 = self::Extension2|[]=(#t316{self::Class2}, #t317, #t318) in #t318;
-  nullable2 = let final self::Class3? #t320 = n3 in #t320.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t321 = self::Extension3|[](#t320{self::Class3}, nullable3) in #t321.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t322 = nullable2 in let final self::Class2 #t323 = self::Extension2|+(self::Extension2|[](#t321{self::Class2}, #t322), 1) in let final void #t324 = self::Extension2|[]=(#t321{self::Class2}, #t322, #t323) in #t323;
+  let final self::Class1? #t170 = n1 in #t170.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t170{self::Class1}, nullable1);
+  let final self::Class1? #t171 = n1 in #t171.{core::Object::==}(null) ?{void} null : self::Extension1|[]=(#t171{self::Class1}, nullable1, new self::Class1::•());
+  let final self::Class1? #t172 = n1 in #t172.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t173 = self::Extension1|[](#t172{self::Class1}, nullable1) in #t173.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t173{self::Class1});
+  let final self::Class1? #t174 = n1 in #t174.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](self::Extension1|get#nonNullable1(#t174{self::Class1}), nullable1);
+  let final self::Class1? #t175 = n1 in #t175.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(self::Extension1|get#nonNullable1(#t175{self::Class1}), nullable1, new self::Class1::•());
+  nullable1 = let final self::Class1? #t176 = n1 in #t176.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t177 = self::Extension1|get#nonNullable1(#t176{self::Class1}) in let final self::Class1? #t178 = nullable1 in let final self::Class1 #t179 = new self::Class1::•() in let final void #t180 = self::Extension1|[]=(#t177, #t178, #t179) in #t179;
+  let final self::Class1? #t181 = n1 in #t181.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t182 = self::Extension1|[](self::Extension1|get#nonNullable1(#t181{self::Class1}), nullable1) in #t182.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t182{self::Class1});
+  let final self::Class1? #t183 = n1 in #t183.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t184 = self::Extension1|get#nonNullable2(#t183{self::Class1}) in let final self::Class2? #t185 = nullable2 in self::Extension2|[]=(#t184, #t185, self::Extension2|+(self::Extension2|[](#t184, #t185), 0));
+  nullable2 = let final self::Class1? #t186 = n1 in #t186.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t187 = self::Extension1|get#nonNullable2(#t186{self::Class1}) in let final self::Class2? #t188 = nullable2 in let final self::Class2 #t189 = self::Extension2|+(self::Extension2|[](#t187, #t188), 0) in let final void #t190 = self::Extension2|[]=(#t187, #t188, #t189) in #t189;
+  let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = nullable1 in self::Extension1|[](#t191{self::Class1}, #t192).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t191{self::Class1}, #t192, nullable1) : null;
+  nullable1 = let final self::Class1? #t193 = n1 in #t193.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t194 = nullable1 in let final self::Class1? #t195 = self::Extension1|[](#t193{self::Class1}, #t194) in #t195.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t196 = nullable1 in let final void #t197 = self::Extension1|[]=(#t193{self::Class1}, #t194, #t196) in #t196 : #t195{self::Class1};
+  let final self::Class2? #t198 = n2 in #t198.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t199 = nullable2 in self::Extension2|[]=(#t198{self::Class2}, #t199, self::Extension2|+(self::Extension2|[](#t198{self::Class2}, #t199), 0));
+  nullable2 = let final self::Class2? #t200 = n2 in #t200.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t201 = nullable2 in let final self::Class2 #t202 = self::Extension2|+(self::Extension2|[](#t200{self::Class2}, #t201), 0) in let final void #t203 = self::Extension2|[]=(#t200{self::Class2}, #t201, #t202) in #t202;
+  let final self::Class2? #t204 = n2 in #t204.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t205 = nullable2 in self::Extension2|[]=(#t204{self::Class2}, #t205, self::Extension2|+(self::Extension2|[](#t204{self::Class2}, #t205), 0));
+  nullable2 = let final self::Class2? #t206 = n2 in #t206.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t207 = nullable2 in let final self::Class2 #t208 = self::Extension2|+(self::Extension2|[](#t206{self::Class2}, #t207), 0) in let final void #t209 = self::Extension2|[]=(#t206{self::Class2}, #t207, #t208) in #t208;
+  let final self::Class2? #t210 = n2 in #t210.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t211 = nullable2 in self::Extension2|[]=(#t210{self::Class2}, #t211, self::Extension2|+(self::Extension2|[](#t210{self::Class2}, #t211), 1));
+  nullable2 = let final self::Class2? #t212 = n2 in #t212.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t213 = nullable2 in let final self::Class2 #t214 = self::Extension2|[](#t212{self::Class2}, #t213) in let final void #t215 = self::Extension2|[]=(#t212{self::Class2}, #t213, self::Extension2|+(#t214, 1)) in #t214;
+  let final self::Class2? #t216 = n2 in #t216.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t217 = nullable2 in let final self::Class2 #t218 = self::Extension2|+(self::Extension2|[](#t216{self::Class2}, #t217), 1) in let final void #t219 = self::Extension2|[]=(#t216{self::Class2}, #t217, #t218) in #t218;
+  nullable2 = let final self::Class2? #t220 = n2 in #t220.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t221 = nullable2 in let final self::Class2 #t222 = self::Extension2|+(self::Extension2|[](#t220{self::Class2}, #t221), 1) in let final void #t223 = self::Extension2|[]=(#t220{self::Class2}, #t221, #t222) in #t222;
+  let final self::Class1? #t224 = n1 in #t224.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t225 = self::Extension1|get#nonNullable2(#t224{self::Class1}) in let final self::Class2? #t226 = nullable2 in self::Extension2|[]=(#t225, #t226, self::Extension2|+(self::Extension2|[](#t225, #t226), 1));
+  nullable2 = let final self::Class1? #t227 = n1 in #t227.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t228 = self::Extension1|get#nonNullable2(#t227{self::Class1}) in let final self::Class2? #t229 = nullable2 in let final self::Class2 #t230 = self::Extension2|[](#t228, #t229) in let final void #t231 = self::Extension2|[]=(#t228, #t229, self::Extension2|+(#t230, 1)) in #t230;
+  let final self::Class1? #t232 = n1 in #t232.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t233 = self::Extension1|get#nonNullable2(#t232{self::Class1}) in let final self::Class2? #t234 = nullable2 in let final self::Class2 #t235 = self::Extension2|+(self::Extension2|[](#t233, #t234), 1) in let final void #t236 = self::Extension2|[]=(#t233, #t234, #t235) in #t235;
+  nullable2 = let final self::Class1? #t237 = n1 in #t237.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t238 = self::Extension1|get#nonNullable2(#t237{self::Class1}) in let final self::Class2? #t239 = nullable2 in let final self::Class2 #t240 = self::Extension2|+(self::Extension2|[](#t238, #t239), 1) in let final void #t241 = self::Extension2|[]=(#t238, #t239, #t240) in #t240;
+  let final self::Class1? #t242 = n1 in #t242.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t242{self::Class1}), nullable2), nullable2);
+  let final self::Class1? #t243 = n1 in #t243.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[]=(self::Extension2|[](self::Extension1|get#nonNullable2(#t243{self::Class1}), nullable2), nullable2, new self::Class2::•());
+  nullable2 = let final self::Class1? #t244 = n1 in #t244.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t245 = self::Extension2|[](self::Extension1|get#nonNullable2(#t244{self::Class1}), nullable2) in let final self::Class2? #t246 = nullable2 in let final self::Class2 #t247 = new self::Class2::•() in let final void #t248 = self::Extension2|[]=(#t245, #t246, #t247) in #t247;
+  let final self::Class1? #t249 = n1 in #t249.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t250 = self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t249{self::Class1}), nullable2), nullable2) in #t250.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|nonNullable2Method(#t250{self::Class2});
+  let final self::Class1? #t251 = n1 in #t251.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t252 = self::Extension2|[](self::Extension1|get#nonNullable2(#t251{self::Class1}), nullable2) in let final self::Class2? #t253 = nullable2 in self::Extension2|[]=(#t252, #t253, self::Extension2|+(self::Extension2|[](#t252, #t253), 0));
+  nullable2 = let final self::Class1? #t254 = n1 in #t254.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t255 = self::Extension2|[](self::Extension1|get#nonNullable2(#t254{self::Class1}), nullable2) in let final self::Class2? #t256 = nullable2 in let final self::Class2 #t257 = self::Extension2|+(self::Extension2|[](#t255, #t256), 0) in let final void #t258 = self::Extension2|[]=(#t255, #t256, #t257) in #t257;
+  let final self::Class1? #t259 = n1 in #t259.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t260 = self::Extension2|[](self::Extension1|get#nonNullable2(#t259{self::Class1}), nullable2) in let final self::Class2? #t261 = nullable2 in self::Extension2|[]=(#t260, #t261, self::Extension2|+(self::Extension2|[](#t260, #t261), 1));
+  nullable2 = let final self::Class1? #t262 = n1 in #t262.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t263 = self::Extension2|[](self::Extension1|get#nonNullable2(#t262{self::Class1}), nullable2) in let final self::Class2? #t264 = nullable2 in let final self::Class2 #t265 = self::Extension2|[](#t263, #t264) in let final void #t266 = self::Extension2|[]=(#t263, #t264, self::Extension2|+(#t265, 1)) in #t265;
+  let final self::Class1? #t267 = n1 in #t267.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t268 = self::Extension2|[](self::Extension1|get#nonNullable2(#t267{self::Class1}), nullable2) in let final self::Class2? #t269 = nullable2 in let final self::Class2 #t270 = self::Extension2|+(self::Extension2|[](#t268, #t269), 1) in let final void #t271 = self::Extension2|[]=(#t268, #t269, #t270) in #t270;
+  nullable2 = let final self::Class1? #t272 = n1 in #t272.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t273 = self::Extension2|[](self::Extension1|get#nonNullable2(#t272{self::Class1}), nullable2) in let final self::Class2? #t274 = nullable2 in let final self::Class2 #t275 = self::Extension2|+(self::Extension2|[](#t273, #t274), 1) in let final void #t276 = self::Extension2|[]=(#t273, #t274, #t275) in #t275;
+  let final self::Class1? #t277 = n1 in #t277.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t278 = self::Extension1|[](#t277{self::Class1}, nullable1) in #t278.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t278{self::Class1}, nullable1);
+  let final self::Class1? #t279 = n1 in #t279.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t280 = self::Extension1|[](#t279{self::Class1}, nullable1) in #t280.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t280{self::Class1}, nullable1, new self::Class1::•());
+  nullable1 = let final self::Class1? #t281 = n1 in #t281.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t282 = self::Extension1|[](#t281{self::Class1}, nullable1) in #t282.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t283 = nullable1 in let final self::Class1 #t284 = new self::Class1::•() in let final void #t285 = self::Extension1|[]=(#t282{self::Class1}, #t283, #t284) in #t284;
+  let final self::Class1? #t286 = n1 in #t286.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t287 = self::Extension1|[](#t286{self::Class1}, nullable1) in #t287.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t288 = self::Extension1|[](#t287{self::Class1}, nullable1) in #t288.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t288{self::Class1});
+  nullable1 = let final self::Class1? #t289 = n1 in #t289.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t290 = self::Extension1|[](#t289{self::Class1}, nullable1) in #t290.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t291 = self::Extension1|[](#t290{self::Class1}, nullable1) in #t291.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t291{self::Class1});
+  let final self::Class1? #t292 = n1 in #t292.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t293 = self::Extension1|[](#t292{self::Class1}, nullable1) in #t293.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t294 = nullable1 in self::Extension1|[](#t293{self::Class1}, #t294).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t293{self::Class1}, #t294, nullable1) : null;
+  nullable1 = let final self::Class1? #t295 = n1 in #t295.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t296 = self::Extension1|[](#t295{self::Class1}, nullable1) in #t296.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t297 = nullable1 in let final self::Class1? #t298 = self::Extension1|[](#t296{self::Class1}, #t297) in #t298.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t299 = nullable1 in let final void #t300 = self::Extension1|[]=(#t296{self::Class1}, #t297, #t299) in #t299 : #t298{self::Class1};
+  let final self::Class3? #t301 = n3 in #t301.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t302 = self::Extension3|[](#t301{self::Class3}, nullable3) in #t302.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t303 = nullable2 in self::Extension2|[]=(#t302{self::Class2}, #t303, self::Extension2|+(self::Extension2|[](#t302{self::Class2}, #t303), 0));
+  nullable2 = let final self::Class3? #t304 = n3 in #t304.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t305 = self::Extension3|[](#t304{self::Class3}, nullable3) in #t305.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t306 = nullable2 in let final self::Class2 #t307 = self::Extension2|+(self::Extension2|[](#t305{self::Class2}, #t306), 0) in let final void #t308 = self::Extension2|[]=(#t305{self::Class2}, #t306, #t307) in #t307;
+  let final self::Class3? #t309 = n3 in #t309.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t310 = self::Extension3|[](#t309{self::Class3}, nullable3) in #t310.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t311 = nullable2 in self::Extension2|[]=(#t310{self::Class2}, #t311, self::Extension2|+(self::Extension2|[](#t310{self::Class2}, #t311), 1));
+  nullable2 = let final self::Class3? #t312 = n3 in #t312.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t313 = self::Extension3|[](#t312{self::Class3}, nullable3) in #t313.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t314 = nullable2 in let final self::Class2 #t315 = self::Extension2|[](#t313{self::Class2}, #t314) in let final void #t316 = self::Extension2|[]=(#t313{self::Class2}, #t314, self::Extension2|+(#t315, 1)) in #t315;
+  let final self::Class3? #t317 = n3 in #t317.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t318 = self::Extension3|[](#t317{self::Class3}, nullable3) in #t318.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t319 = nullable2 in let final self::Class2 #t320 = self::Extension2|+(self::Extension2|[](#t318{self::Class2}, #t319), 1) in let final void #t321 = self::Extension2|[]=(#t318{self::Class2}, #t319, #t320) in #t320;
+  nullable2 = let final self::Class3? #t322 = n3 in #t322.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t323 = self::Extension3|[](#t322{self::Class3}, nullable3) in #t323.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t324 = nullable2 in let final self::Class2 #t325 = self::Extension2|+(self::Extension2|[](#t323{self::Class2}, #t324), 1) in let final void #t326 = self::Extension2|[]=(#t323{self::Class2}, #t324, #t325) in #t325;
 }
 static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
   self::Class2? nullable2 = n2;
-  self::throws(() → self::Class1? => self::Extension1|+(let final self::Class1? #t325 = n1 in #t325.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t325{self::Class1}), 0));
-  self::throws(() → self::Class1? => self::Extension1|unary-(let final self::Class1? #t326 = n1 in #t326.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t326{self::Class1})));
-  let final self::Class2? #t327 = n2 in #t327.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t327{self::Class2}, self::Extension2|+(self::Extension2|get#nonNullable2(#t327{self::Class2}), 0));
-  nullable2 = let final self::Class2? #t328 = n2 in #t328.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t329 = self::Extension2|+(self::Extension2|get#nonNullable2(#t328{self::Class2}), 0) in let final void #t330 = self::Extension2|set#nonNullable2(#t328{self::Class2}, #t329) in #t329;
-  let final self::Class2? #t331 = n2 in #t331.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t332 = self::Extension2|get#nonNullable2(#t331{self::Class2}) in self::Extension2|set#nonNullable2(#t332, self::Extension2|+(self::Extension2|get#nonNullable2(#t332), 0));
-  nullable2 = let final self::Class2? #t333 = n2 in #t333.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t334 = self::Extension2|get#nonNullable2(#t333{self::Class2}) in let final self::Class2 #t335 = self::Extension2|+(self::Extension2|get#nonNullable2(#t334), 0) in let final void #t336 = self::Extension2|set#nonNullable2(#t334, #t335) in #t335;
-  let final self::Class2? #t337 = n2 in #t337.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t337{self::Class2}, self::Extension2|+(self::Extension2|get#nonNullable2(#t337{self::Class2}), 1));
-  nullable2 = let final self::Class2? #t338 = n2 in #t338.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t339 = self::Extension2|get#nonNullable2(#t338{self::Class2}) in let final self::Class2 #t340 = let final self::Class2 #t341 = self::Extension2|+(#t339, 1) in let final void #t342 = self::Extension2|set#nonNullable2(#t338{self::Class2}, #t341) in #t341 in #t339;
-  let final self::Class2? #t343 = n2 in #t343.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t344 = self::Extension2|+(self::Extension2|get#nonNullable2(#t343{self::Class2}), 1) in let final void #t345 = self::Extension2|set#nonNullable2(#t343{self::Class2}, #t344) in #t344;
-  nullable2 = let final self::Class2? #t346 = n2 in #t346.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t347 = self::Extension2|+(self::Extension2|get#nonNullable2(#t346{self::Class2}), 1) in let final void #t348 = self::Extension2|set#nonNullable2(#t346{self::Class2}, #t347) in #t347;
+  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.
+ - '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.
+ - '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})));
+  let final self::Class2? #t331 = n2 in #t331.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t331{self::Class2}, self::Extension2|+(self::Extension2|get#nonNullable2(#t331{self::Class2}), 0));
+  nullable2 = let final self::Class2? #t332 = n2 in #t332.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t333 = self::Extension2|+(self::Extension2|get#nonNullable2(#t332{self::Class2}), 0) in let final void #t334 = self::Extension2|set#nonNullable2(#t332{self::Class2}, #t333) in #t333;
+  let final self::Class2? #t335 = n2 in #t335.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t336 = self::Extension2|get#nonNullable2(#t335{self::Class2}) in self::Extension2|set#nonNullable2(#t336, self::Extension2|+(self::Extension2|get#nonNullable2(#t336), 0));
+  nullable2 = let final self::Class2? #t337 = n2 in #t337.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t338 = self::Extension2|get#nonNullable2(#t337{self::Class2}) in let final self::Class2 #t339 = self::Extension2|+(self::Extension2|get#nonNullable2(#t338), 0) in let final void #t340 = self::Extension2|set#nonNullable2(#t338, #t339) in #t339;
+  let final self::Class2? #t341 = n2 in #t341.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t341{self::Class2}, self::Extension2|+(self::Extension2|get#nonNullable2(#t341{self::Class2}), 1));
+  nullable2 = let final self::Class2? #t342 = n2 in #t342.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t343 = self::Extension2|get#nonNullable2(#t342{self::Class2}) in let final self::Class2 #t344 = let final self::Class2 #t345 = self::Extension2|+(#t343, 1) in let final void #t346 = self::Extension2|set#nonNullable2(#t342{self::Class2}, #t345) in #t345 in #t343;
+  let final self::Class2? #t347 = n2 in #t347.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t348 = self::Extension2|+(self::Extension2|get#nonNullable2(#t347{self::Class2}), 1) in let final void #t349 = self::Extension2|set#nonNullable2(#t347{self::Class2}, #t348) in #t348;
+  nullable2 = let final self::Class2? #t350 = n2 in #t350.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t351 = self::Extension2|+(self::Extension2|get#nonNullable2(#t350{self::Class2}), 1) in let final void #t352 = self::Extension2|set#nonNullable2(#t350{self::Class2}, #t351) in #t351;
 }
 static method ifNull(self::Class1? n1) → void {
   self::Class1? nullable1 = n1;
-  let final self::Class1? #t349 = n1 in #t349.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t349).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t349, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t350 = n1 in #t350.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t351 = self::Extension1|get#nullable1(#t350) in #t351.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t352 = n1{self::Class1} in let final void #t353 = self::Extension1|set#nullable1(#t350, #t352) in #t352 : #t351{self::Class1};
-  let final self::Class1? #t354 = n1 in #t354.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t355 = self::Extension1|get#nonNullable1(#t354{self::Class1}) in self::Extension1|get#nullable1(#t355{self::Class1}).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t355{self::Class1}, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t356 = n1 in #t356.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t357 = self::Extension1|get#nonNullable1(#t356{self::Class1}) in let final self::Class1? #t358 = self::Extension1|get#nullable1(#t357{self::Class1}) in #t358.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t359 = n1{self::Class1} in let final void #t360 = self::Extension1|set#nullable1(#t357{self::Class1}, #t359) in #t359 : #t358{self::Class1};
-  let final self::Class1? #t361 = n1 in #t361.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t362 = self::Extension1|get#nonNullable1(#t361{self::Class1}) in let final self::Class1 #t363 = n1{self::Class1} in self::Extension1|[](#t362, #t363).{core::Object::==}(null) ?{self::Class1} self::Extension1|[]=(#t362, #t363, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t364 = n1 in #t364.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t365 = self::Extension1|get#nonNullable1(#t364{self::Class1}) in let final self::Class1 #t366 = n1{self::Class1} in let final self::Class1? #t367 = self::Extension1|[](#t365, #t366) in #t367.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t368 = n1{self::Class1} in let final void #t369 = self::Extension1|[]=(#t365, #t366, #t368) in #t368 : #t367{self::Class1};
+  let final self::Class1? #t353 = n1 in #t353.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t353).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t353, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t354 = n1 in #t354.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t355 = self::Extension1|get#nullable1(#t354) in #t355.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t356 = n1{self::Class1} in let final void #t357 = self::Extension1|set#nullable1(#t354, #t356) in #t356 : #t355{self::Class1};
+  let final self::Class1? #t358 = n1 in #t358.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t359 = self::Extension1|get#nonNullable1(#t358{self::Class1}) in self::Extension1|get#nullable1(#t359{self::Class1}).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t359{self::Class1}, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t360 = n1 in #t360.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t361 = self::Extension1|get#nonNullable1(#t360{self::Class1}) in let final self::Class1? #t362 = self::Extension1|get#nullable1(#t361{self::Class1}) in #t362.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t363 = n1{self::Class1} in let final void #t364 = self::Extension1|set#nullable1(#t361{self::Class1}, #t363) in #t363 : #t362{self::Class1};
+  let final self::Class1? #t365 = n1 in #t365.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t366 = self::Extension1|get#nonNullable1(#t365{self::Class1}) in let final self::Class1 #t367 = n1{self::Class1} in self::Extension1|[](#t366, #t367).{core::Object::==}(null) ?{self::Class1} self::Extension1|[]=(#t366, #t367, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t368 = n1 in #t368.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t369 = self::Extension1|get#nonNullable1(#t368{self::Class1}) in let final self::Class1 #t370 = n1{self::Class1} in let final self::Class1? #t371 = self::Extension1|[](#t369, #t370) in #t371.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t372 = n1{self::Class1} in let final void #t373 = self::Extension1|[]=(#t369, #t370, #t372) in #t372 : #t371{self::Class1};
 }
 static method throws(() → void f) → void {
   try {
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 559dca6..ad010f7 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
@@ -2,24 +2,24 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// 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);
 //                                                           ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:94:55: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// 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);
 //                                                       ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:244:45: Warning: Operator '+' is called on 'Class1?' which is potentially null.
+// 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);
 //                                             ^
 //
-// pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:245:16: Warning: Operator 'unary-' is called on 'Class1?' which is potentially null.
+// 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);
 //                ^
@@ -139,139 +139,153 @@
   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? => self::Extension1|get#nullable1(let final self::Class1? #t19 = n1 in #t19.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t20 = new self::Class1::•() in let final void #t21 = self::Extension1|set#nullable1(#t19{self::Class1}, #t20) in #t20));
-  self::throws(() → self::Class1? => self::Extension1|get#nullable1(let final self::Class1? #t22 = n1 in #t22.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t22{self::Class1})));
-  nullable1 = let final self::Class1? #t23 = n1 in #t23.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t24 = new self::Class1::•() in let final void #t25 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t23{self::Class1}), #t24) in #t24;
-  nullable1 = let final self::Class1? #t26 = n1 in #t26.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t27 = self::Extension1|get#nullable1(#t26{self::Class1}) in #t27.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t28 = new self::Class1::•() in let final void #t29 = self::Extension1|set#nullable1(#t27{self::Class1}, #t28) in #t28;
-  nullable1 = let final self::Class1? #t30 = n1 in #t30.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t31 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t30{self::Class1})) in #t31.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t32 = new self::Class1::•() in let final void #t33 = self::Extension1|set#nullable1(#t31{self::Class1}, #t32) in #t32;
-  let final self::Class1? #t34 = n1 in #t34.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t35 = self::Extension1|get#nullable1(#t34{self::Class1}) in #t35.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t35{self::Class1});
-  let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t36{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t37 = n1 in #t37.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t38 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t39 = self::Extension1|set#nullable1(#t37{self::Class1}, #t38) in #t38;
-  let final self::Class1? #t40 = n1 in #t40.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t40{self::Class1}, let final self::Class1 #t41 = new self::Class1::•() in let final void #t42 = self::Extension1|set#nullable1(new self::Class1::•(), #t41) in #t41);
-  nullable1 = let final self::Class1? #t43 = n1 in #t43.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t44 = let final self::Class1 #t45 = new self::Class1::•() in let final void #t46 = self::Extension1|set#nullable1(new self::Class1::•(), #t45) in #t45 in let final void #t47 = self::Extension1|set#nullable1(#t43{self::Class1}, #t44) in #t44;
-  let final self::Class1? #t48 = n1 in #t48.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t49 = n1 in #t49.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t50 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t51 = self::Extension1|set#nullable1(#t49{self::Class1}, #t50) in #t50;
-  let final self::Class1? #t52 = n1 in #t52.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t52{self::Class1}));
-  let final self::Class1? #t53 = n1 in #t53.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
-  let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t54{self::Class1}));
-  let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t55{self::Class1})));
-  let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
-  nullable1 = let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t58 = new self::Class1::•() in let final void #t59 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})), #t58) in #t58;
-  let final self::Class1? #t60 = n1 in #t60.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t61 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t60{self::Class1})) in #t61.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t61{self::Class1});
-  let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
-  nullable1 = let final self::Class1? #t63 = n1 in #t63.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t64 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t65 = self::Extension1|set#nullable1(#t63{self::Class1}, #t64) in #t64;
-  let final self::Class1? #t66 = n1 in #t66.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t66{self::Class1}, let final self::Class1 #t67 = new self::Class1::•() in let final void #t68 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t67) in #t67);
-  nullable1 = let final self::Class1? #t69 = n1 in #t69.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t70 = let final self::Class1 #t71 = new self::Class1::•() in let final void #t72 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t71) in #t71 in let final void #t73 = self::Extension1|set#nullable1(#t69{self::Class1}, #t70) in #t70;
-  let final self::Class1? #t74 = n1 in #t74.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
-  nullable1 = let final self::Class1? #t75 = n1 in #t75.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t76 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t77 = self::Extension1|set#nullable1(#t75{self::Class1}, #t76) in #t76;
-  let final self::Class1? #t78 = n1 in #t78.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t78{self::Class1})));
-  let final self::Class1? #t79 = n1 in #t79.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
-  let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
-  let final self::Class1? #t81 = n1 in #t81.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t83 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t84 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t82{self::Class1}), #t83) in #t83;
-  let final self::Class1? #t85 = n1 in #t85.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
-  nullable1 = let final self::Class1? #t88 = n1 in #t88.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t89 = let final self::Class1 #t90 = new self::Class1::•() in let final void #t91 = self::Extension1|set#nullable1(new self::Class1::•(), #t90) in #t90 in let final void #t92 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t88{self::Class1}), #t89) in #t89;
-  let final self::Class1? #t93 = n1 in #t93.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t94 = n1 in #t94.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t95 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t96 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t94{self::Class1}), #t95) in #t95;
-  let final self::Class1? #t97 = n1 in #t97.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
-  nullable1 = let final self::Class1? #t100 = n1 in #t100.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t101 = let final self::Class1? #t102 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t103 = self::Extension1|set#nullable1(new self::Class1::•(), #t102) in #t102 in let final void #t104 = self::Extension1|set#nullable1(#t100{self::Class1}, #t101) in #t101;
-  let final self::Class1? #t105 = n1 in #t105.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t105{self::Class1}, let final self::Class1 #t106 = let final self::Class1 #t107 = new self::Class1::•() in let final void #t108 = self::Extension1|set#nullable1(new self::Class1::•(), #t107) in #t107 in let final void #t109 = self::Extension1|set#nullable1(new self::Class1::•(), #t106) in #t106);
-  nullable1 = let final self::Class1? #t110 = n1 in #t110.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t111 = let final self::Class1 #t112 = let final self::Class1 #t113 = new self::Class1::•() in let final void #t114 = self::Extension1|set#nullable1(new self::Class1::•(), #t113) in #t113 in let final void #t115 = self::Extension1|set#nullable1(new self::Class1::•(), #t112) in #t112 in let final void #t116 = self::Extension1|set#nullable1(#t110{self::Class1}, #t111) in #t111;
-  let final self::Class1? #t117 = n1 in #t117.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
-  nullable1 = let final self::Class1? #t120 = n1 in #t120.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t121 = let final self::Class1 #t122 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t123 = self::Extension1|set#nullable1(new self::Class1::•(), #t122) in #t122 in let final void #t124 = self::Extension1|set#nullable1(#t120{self::Class1}, #t121) in #t121;
-  let final self::Class1? #t125 = n1 in #t125.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t126 = n1 in #t126.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t127 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t128 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t126{self::Class1}), #t127) in #t127;
-  let final self::Class1? #t129 = n1 in #t129.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
-  nullable1 = let final self::Class1? #t132 = n1 in #t132.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t133 = let final self::Class1 #t134 = new self::Class1::•() in let final void #t135 = self::Extension1|set#nullable1(new self::Class1::•(), #t134) in #t134 in let final void #t136 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t132{self::Class1}), #t133) in #t133;
-  let final self::Class1? #t137 = n1 in #t137.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t138 = n1 in #t138.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t139 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t140 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t138{self::Class1}), #t139) in #t139;
-  let final self::Class1? #t141 = n1 in #t141.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t141{self::Class1})));
-  let final self::Class1? #t142 = n1 in #t142.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
-  nullable1 = let final self::Class1? #t143 = n1 in #t143.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t144 = new self::Class1::•() in let final void #t145 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})), #t144) in #t144;
-  let final self::Class1? #t146 = n1 in #t146.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t146{self::Class1})));
-  let final self::Class1? #t147 = n1 in #t147.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
-  nullable1 = let final self::Class1? #t148 = n1 in #t148.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t149 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t150 = self::Extension1|set#nullable1(#t148{self::Class1}, #t149) in #t149;
-  let final self::Class1? #t151 = n1 in #t151.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t151{self::Class1}, let final self::Class1 #t152 = new self::Class1::•() in let final void #t153 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t152) in #t152);
-  nullable1 = let final self::Class1? #t154 = n1 in #t154.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t155 = let final self::Class1 #t156 = new self::Class1::•() in let final void #t157 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t156) in #t156 in let final void #t158 = self::Extension1|set#nullable1(#t154{self::Class1}, #t155) in #t155;
-  let final self::Class1? #t159 = n1 in #t159.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
-  nullable1 = let final self::Class1? #t160 = n1 in #t160.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t161 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t162 = self::Extension1|set#nullable1(#t160{self::Class1}, #t161) in #t161;
-  let final self::Class1? #t163 = n1 in #t163.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t163{self::Class1})));
-  let final self::Class1? #t164 = n1 in #t164.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
-  let final self::Class1? #t165 = n1 in #t165.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
-  let final self::Class1? #t166 = n1 in #t166.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t167 = self::Extension1|nonNullable1Method(#t166{self::Class1}) in #t167.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t167{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.
+ - '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.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
+Try accessing using ?. instead.
+  throws(() => (Extension1(n1)?.nonNullable1Method()).nullable1);
+                                                      ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t24 = n1 in #t24.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t24{self::Class1})));
+  nullable1 = let final self::Class1? #t25 = n1 in #t25.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t26 = new self::Class1::•() in let final void #t27 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t25{self::Class1}), #t26) in #t26;
+  nullable1 = let final self::Class1? #t28 = n1 in #t28.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t29 = self::Extension1|get#nullable1(#t28{self::Class1}) in #t29.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t30 = new self::Class1::•() in let final void #t31 = self::Extension1|set#nullable1(#t29{self::Class1}, #t30) in #t30;
+  nullable1 = let final self::Class1? #t32 = n1 in #t32.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t33 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t32{self::Class1})) in #t33.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t34 = new self::Class1::•() in let final void #t35 = self::Extension1|set#nullable1(#t33{self::Class1}, #t34) in #t34;
+  let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t37 = self::Extension1|get#nullable1(#t36{self::Class1}) in #t37.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t37{self::Class1});
+  let final self::Class1? #t38 = n1 in #t38.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t38{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t39 = n1 in #t39.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t40 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t41 = self::Extension1|set#nullable1(#t39{self::Class1}, #t40) in #t40;
+  let final self::Class1? #t42 = n1 in #t42.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t42{self::Class1}, let final self::Class1 #t43 = new self::Class1::•() in let final void #t44 = self::Extension1|set#nullable1(new self::Class1::•(), #t43) in #t43);
+  nullable1 = let final self::Class1? #t45 = n1 in #t45.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t46 = let final self::Class1 #t47 = new self::Class1::•() in let final void #t48 = self::Extension1|set#nullable1(new self::Class1::•(), #t47) in #t47 in let final void #t49 = self::Extension1|set#nullable1(#t45{self::Class1}, #t46) in #t46;
+  let final self::Class1? #t50 = n1 in #t50.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t50{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t51 = n1 in #t51.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t52 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t53 = self::Extension1|set#nullable1(#t51{self::Class1}, #t52) in #t52;
+  let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t54{self::Class1}));
+  let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t55{self::Class1}), new self::Class1::•());
+  let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t56{self::Class1}));
+  let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})));
+  let final self::Class1? #t58 = n1 in #t58.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t58{self::Class1})), new self::Class1::•());
+  nullable1 = let final self::Class1? #t59 = n1 in #t59.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t60 = new self::Class1::•() in let final void #t61 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t59{self::Class1})), #t60) in #t60;
+  let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t63 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t62{self::Class1})) in #t63.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t63{self::Class1});
+  let final self::Class1? #t64 = n1 in #t64.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t64{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t65 = n1 in #t65.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t66 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t67 = self::Extension1|set#nullable1(#t65{self::Class1}, #t66) in #t66;
+  let final self::Class1? #t68 = n1 in #t68.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t68{self::Class1}, let final self::Class1 #t69 = new self::Class1::•() in let final void #t70 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t69) in #t69);
+  nullable1 = let final self::Class1? #t71 = n1 in #t71.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t72 = let final self::Class1 #t73 = new self::Class1::•() in let final void #t74 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t73) in #t73 in let final void #t75 = self::Extension1|set#nullable1(#t71{self::Class1}, #t72) in #t72;
+  let final self::Class1? #t76 = n1 in #t76.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t76{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t77 = n1 in #t77.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t78 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t79 = self::Extension1|set#nullable1(#t77{self::Class1}, #t78) in #t78;
+  let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
+  let final self::Class1? #t81 = n1 in #t81.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t81{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t82{self::Class1})));
+  let final self::Class1? #t83 = n1 in #t83.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t83{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t84 = n1 in #t84.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t85 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t86 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t84{self::Class1}), #t85) in #t85;
+  let final self::Class1? #t87 = n1 in #t87.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t87{self::Class1}), let final self::Class1 #t88 = new self::Class1::•() in let final void #t89 = self::Extension1|set#nullable1(new self::Class1::•(), #t88) in #t88);
+  nullable1 = let final self::Class1? #t90 = n1 in #t90.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t91 = let final self::Class1 #t92 = new self::Class1::•() in let final void #t93 = self::Extension1|set#nullable1(new self::Class1::•(), #t92) in #t92 in let final void #t94 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t90{self::Class1}), #t91) in #t91;
+  let final self::Class1? #t95 = n1 in #t95.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t95{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t96 = n1 in #t96.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t97 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t98 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t96{self::Class1}), #t97) in #t97;
+  let final self::Class1? #t99 = n1 in #t99.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t99{self::Class1}, let final self::Class1? #t100 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t101 = self::Extension1|set#nullable1(new self::Class1::•(), #t100) in #t100);
+  nullable1 = let final self::Class1? #t102 = n1 in #t102.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t103 = let final self::Class1? #t104 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t105 = self::Extension1|set#nullable1(new self::Class1::•(), #t104) in #t104 in let final void #t106 = self::Extension1|set#nullable1(#t102{self::Class1}, #t103) in #t103;
+  let final self::Class1? #t107 = n1 in #t107.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t107{self::Class1}, let final self::Class1 #t108 = let final self::Class1 #t109 = new self::Class1::•() in let final void #t110 = self::Extension1|set#nullable1(new self::Class1::•(), #t109) in #t109 in let final void #t111 = self::Extension1|set#nullable1(new self::Class1::•(), #t108) in #t108);
+  nullable1 = let final self::Class1? #t112 = n1 in #t112.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t113 = let final self::Class1 #t114 = let final self::Class1 #t115 = new self::Class1::•() in let final void #t116 = self::Extension1|set#nullable1(new self::Class1::•(), #t115) in #t115 in let final void #t117 = self::Extension1|set#nullable1(new self::Class1::•(), #t114) in #t114 in let final void #t118 = self::Extension1|set#nullable1(#t112{self::Class1}, #t113) in #t113;
+  let final self::Class1? #t119 = n1 in #t119.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t119{self::Class1}, let final self::Class1 #t120 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t121 = self::Extension1|set#nullable1(new self::Class1::•(), #t120) in #t120);
+  nullable1 = let final self::Class1? #t122 = n1 in #t122.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t123 = let final self::Class1 #t124 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t125 = self::Extension1|set#nullable1(new self::Class1::•(), #t124) in #t124 in let final void #t126 = self::Extension1|set#nullable1(#t122{self::Class1}, #t123) in #t123;
+  let final self::Class1? #t127 = n1 in #t127.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t127{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t128 = n1 in #t128.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t129 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t130 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t128{self::Class1}), #t129) in #t129;
+  let final self::Class1? #t131 = n1 in #t131.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t131{self::Class1}), let final self::Class1 #t132 = new self::Class1::•() in let final void #t133 = self::Extension1|set#nullable1(new self::Class1::•(), #t132) in #t132);
+  nullable1 = let final self::Class1? #t134 = n1 in #t134.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t135 = let final self::Class1 #t136 = new self::Class1::•() in let final void #t137 = self::Extension1|set#nullable1(new self::Class1::•(), #t136) in #t136 in let final void #t138 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t134{self::Class1}), #t135) in #t135;
+  let final self::Class1? #t139 = n1 in #t139.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t139{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t140 = n1 in #t140.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t141 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t142 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t140{self::Class1}), #t141) in #t141;
+  let final self::Class1? #t143 = n1 in #t143.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})));
+  let final self::Class1? #t144 = n1 in #t144.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t144{self::Class1})), new self::Class1::•());
+  nullable1 = let final self::Class1? #t145 = n1 in #t145.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t146 = new self::Class1::•() in let final void #t147 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t145{self::Class1})), #t146) in #t146;
+  let final self::Class1? #t148 = n1 in #t148.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t148{self::Class1})));
+  let final self::Class1? #t149 = n1 in #t149.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t149{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t150 = n1 in #t150.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t151 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t152 = self::Extension1|set#nullable1(#t150{self::Class1}, #t151) in #t151;
+  let final self::Class1? #t153 = n1 in #t153.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t153{self::Class1}, let final self::Class1 #t154 = new self::Class1::•() in let final void #t155 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t154) in #t154);
+  nullable1 = let final self::Class1? #t156 = n1 in #t156.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t157 = let final self::Class1 #t158 = new self::Class1::•() in let final void #t159 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t158) in #t158 in let final void #t160 = self::Extension1|set#nullable1(#t156{self::Class1}, #t157) in #t157;
+  let final self::Class1? #t161 = n1 in #t161.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t161{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t162 = n1 in #t162.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t163 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t164 = self::Extension1|set#nullable1(#t162{self::Class1}, #t163) in #t163;
+  let final self::Class1? #t165 = n1 in #t165.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
+  let final self::Class1? #t166 = n1 in #t166.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t166{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t167 = n1 in #t167.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t167{self::Class1})));
+  let final self::Class1? #t168 = n1 in #t168.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t169 = self::Extension1|nonNullable1Method(#t168{self::Class1}) in #t169.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t169{self::Class1});
 }
 static method indexAccess(self::Class1? n1, self::Class2? n2, self::Class3? n3) → void {
   self::Class1? nullable1 = n1;
   self::Class2? nullable2 = n2;
   self::Class3? nullable3 = n3;
-  let final self::Class1? #t168 = n1 in #t168.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t168{self::Class1}, nullable1);
-  let final self::Class1? #t169 = n1 in #t169.{core::Object::==}(null) ?{void} null : self::Extension1|[]=(#t169{self::Class1}, nullable1, new self::Class1::•());
-  let final self::Class1? #t170 = n1 in #t170.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t171 = self::Extension1|[](#t170{self::Class1}, nullable1) in #t171.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t171{self::Class1});
-  let final self::Class1? #t172 = n1 in #t172.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](self::Extension1|get#nonNullable1(#t172{self::Class1}), nullable1);
-  let final self::Class1? #t173 = n1 in #t173.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(self::Extension1|get#nonNullable1(#t173{self::Class1}), nullable1, new self::Class1::•());
-  nullable1 = let final self::Class1? #t174 = n1 in #t174.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t175 = self::Extension1|get#nonNullable1(#t174{self::Class1}) in let final self::Class1? #t176 = nullable1 in let final self::Class1 #t177 = new self::Class1::•() in let final void #t178 = self::Extension1|[]=(#t175, #t176, #t177) in #t177;
-  let final self::Class1? #t179 = n1 in #t179.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t180 = self::Extension1|[](self::Extension1|get#nonNullable1(#t179{self::Class1}), nullable1) in #t180.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t180{self::Class1});
-  let final self::Class1? #t181 = n1 in #t181.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t182 = self::Extension1|get#nonNullable2(#t181{self::Class1}) in let final self::Class2? #t183 = nullable2 in self::Extension2|[]=(#t182, #t183, self::Extension2|+(self::Extension2|[](#t182, #t183), 0));
-  nullable2 = let final self::Class1? #t184 = n1 in #t184.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t185 = self::Extension1|get#nonNullable2(#t184{self::Class1}) in let final self::Class2? #t186 = nullable2 in let final self::Class2 #t187 = self::Extension2|+(self::Extension2|[](#t185, #t186), 0) in let final void #t188 = self::Extension2|[]=(#t185, #t186, #t187) in #t187;
-  let final self::Class1? #t189 = n1 in #t189.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t190 = nullable1 in self::Extension1|[](#t189{self::Class1}, #t190).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t189{self::Class1}, #t190, nullable1) : null;
-  nullable1 = let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = nullable1 in let final self::Class1? #t193 = self::Extension1|[](#t191{self::Class1}, #t192) in #t193.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t194 = nullable1 in let final void #t195 = self::Extension1|[]=(#t191{self::Class1}, #t192, #t194) in #t194 : #t193{self::Class1};
-  let final self::Class2? #t196 = n2 in #t196.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t197 = nullable2 in self::Extension2|[]=(#t196{self::Class2}, #t197, self::Extension2|+(self::Extension2|[](#t196{self::Class2}, #t197), 0));
-  nullable2 = let final self::Class2? #t198 = n2 in #t198.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t199 = nullable2 in let final self::Class2 #t200 = self::Extension2|+(self::Extension2|[](#t198{self::Class2}, #t199), 0) in let final void #t201 = self::Extension2|[]=(#t198{self::Class2}, #t199, #t200) in #t200;
-  let final self::Class2? #t202 = n2 in #t202.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t203 = nullable2 in self::Extension2|[]=(#t202{self::Class2}, #t203, self::Extension2|+(self::Extension2|[](#t202{self::Class2}, #t203), 0));
-  nullable2 = let final self::Class2? #t204 = n2 in #t204.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t205 = nullable2 in let final self::Class2 #t206 = self::Extension2|+(self::Extension2|[](#t204{self::Class2}, #t205), 0) in let final void #t207 = self::Extension2|[]=(#t204{self::Class2}, #t205, #t206) in #t206;
-  let final self::Class2? #t208 = n2 in #t208.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t209 = nullable2 in self::Extension2|[]=(#t208{self::Class2}, #t209, self::Extension2|+(self::Extension2|[](#t208{self::Class2}, #t209), 1));
-  nullable2 = let final self::Class2? #t210 = n2 in #t210.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t211 = nullable2 in let final self::Class2 #t212 = self::Extension2|[](#t210{self::Class2}, #t211) in let final void #t213 = self::Extension2|[]=(#t210{self::Class2}, #t211, self::Extension2|+(#t212, 1)) in #t212;
-  let final self::Class2? #t214 = n2 in #t214.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t215 = nullable2 in let final self::Class2 #t216 = self::Extension2|+(self::Extension2|[](#t214{self::Class2}, #t215), 1) in let final void #t217 = self::Extension2|[]=(#t214{self::Class2}, #t215, #t216) in #t216;
-  nullable2 = let final self::Class2? #t218 = n2 in #t218.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t219 = nullable2 in let final self::Class2 #t220 = self::Extension2|+(self::Extension2|[](#t218{self::Class2}, #t219), 1) in let final void #t221 = self::Extension2|[]=(#t218{self::Class2}, #t219, #t220) in #t220;
-  let final self::Class1? #t222 = n1 in #t222.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t223 = self::Extension1|get#nonNullable2(#t222{self::Class1}) in let final self::Class2? #t224 = nullable2 in self::Extension2|[]=(#t223, #t224, self::Extension2|+(self::Extension2|[](#t223, #t224), 1));
-  nullable2 = let final self::Class1? #t225 = n1 in #t225.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t226 = self::Extension1|get#nonNullable2(#t225{self::Class1}) in let final self::Class2? #t227 = nullable2 in let final self::Class2 #t228 = self::Extension2|[](#t226, #t227) in let final void #t229 = self::Extension2|[]=(#t226, #t227, self::Extension2|+(#t228, 1)) in #t228;
-  let final self::Class1? #t230 = n1 in #t230.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t231 = self::Extension1|get#nonNullable2(#t230{self::Class1}) in let final self::Class2? #t232 = nullable2 in let final self::Class2 #t233 = self::Extension2|+(self::Extension2|[](#t231, #t232), 1) in let final void #t234 = self::Extension2|[]=(#t231, #t232, #t233) in #t233;
-  nullable2 = let final self::Class1? #t235 = n1 in #t235.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t236 = self::Extension1|get#nonNullable2(#t235{self::Class1}) in let final self::Class2? #t237 = nullable2 in let final self::Class2 #t238 = self::Extension2|+(self::Extension2|[](#t236, #t237), 1) in let final void #t239 = self::Extension2|[]=(#t236, #t237, #t238) in #t238;
-  let final self::Class1? #t240 = n1 in #t240.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t240{self::Class1}), nullable2), nullable2);
-  let final self::Class1? #t241 = n1 in #t241.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[]=(self::Extension2|[](self::Extension1|get#nonNullable2(#t241{self::Class1}), nullable2), nullable2, new self::Class2::•());
-  nullable2 = let final self::Class1? #t242 = n1 in #t242.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t243 = self::Extension2|[](self::Extension1|get#nonNullable2(#t242{self::Class1}), nullable2) in let final self::Class2? #t244 = nullable2 in let final self::Class2 #t245 = new self::Class2::•() in let final void #t246 = self::Extension2|[]=(#t243, #t244, #t245) in #t245;
-  let final self::Class1? #t247 = n1 in #t247.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t248 = self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t247{self::Class1}), nullable2), nullable2) in #t248.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|nonNullable2Method(#t248{self::Class2});
-  let final self::Class1? #t249 = n1 in #t249.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t250 = self::Extension2|[](self::Extension1|get#nonNullable2(#t249{self::Class1}), nullable2) in let final self::Class2? #t251 = nullable2 in self::Extension2|[]=(#t250, #t251, self::Extension2|+(self::Extension2|[](#t250, #t251), 0));
-  nullable2 = let final self::Class1? #t252 = n1 in #t252.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t253 = self::Extension2|[](self::Extension1|get#nonNullable2(#t252{self::Class1}), nullable2) in let final self::Class2? #t254 = nullable2 in let final self::Class2 #t255 = self::Extension2|+(self::Extension2|[](#t253, #t254), 0) in let final void #t256 = self::Extension2|[]=(#t253, #t254, #t255) in #t255;
-  let final self::Class1? #t257 = n1 in #t257.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t258 = self::Extension2|[](self::Extension1|get#nonNullable2(#t257{self::Class1}), nullable2) in let final self::Class2? #t259 = nullable2 in self::Extension2|[]=(#t258, #t259, self::Extension2|+(self::Extension2|[](#t258, #t259), 1));
-  nullable2 = let final self::Class1? #t260 = n1 in #t260.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t261 = self::Extension2|[](self::Extension1|get#nonNullable2(#t260{self::Class1}), nullable2) in let final self::Class2? #t262 = nullable2 in let final self::Class2 #t263 = self::Extension2|[](#t261, #t262) in let final void #t264 = self::Extension2|[]=(#t261, #t262, self::Extension2|+(#t263, 1)) in #t263;
-  let final self::Class1? #t265 = n1 in #t265.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t266 = self::Extension2|[](self::Extension1|get#nonNullable2(#t265{self::Class1}), nullable2) in let final self::Class2? #t267 = nullable2 in let final self::Class2 #t268 = self::Extension2|+(self::Extension2|[](#t266, #t267), 1) in let final void #t269 = self::Extension2|[]=(#t266, #t267, #t268) in #t268;
-  nullable2 = let final self::Class1? #t270 = n1 in #t270.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t271 = self::Extension2|[](self::Extension1|get#nonNullable2(#t270{self::Class1}), nullable2) in let final self::Class2? #t272 = nullable2 in let final self::Class2 #t273 = self::Extension2|+(self::Extension2|[](#t271, #t272), 1) in let final void #t274 = self::Extension2|[]=(#t271, #t272, #t273) in #t273;
-  let final self::Class1? #t275 = n1 in #t275.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t276 = self::Extension1|[](#t275{self::Class1}, nullable1) in #t276.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t276{self::Class1}, nullable1);
-  let final self::Class1? #t277 = n1 in #t277.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t278 = self::Extension1|[](#t277{self::Class1}, nullable1) in #t278.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t278{self::Class1}, nullable1, new self::Class1::•());
-  nullable1 = let final self::Class1? #t279 = n1 in #t279.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t280 = self::Extension1|[](#t279{self::Class1}, nullable1) in #t280.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t281 = nullable1 in let final self::Class1 #t282 = new self::Class1::•() in let final void #t283 = self::Extension1|[]=(#t280{self::Class1}, #t281, #t282) in #t282;
-  let final self::Class1? #t284 = n1 in #t284.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t285 = self::Extension1|[](#t284{self::Class1}, nullable1) in #t285.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t286 = self::Extension1|[](#t285{self::Class1}, nullable1) in #t286.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t286{self::Class1});
-  nullable1 = let final self::Class1? #t287 = n1 in #t287.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t288 = self::Extension1|[](#t287{self::Class1}, nullable1) in #t288.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t289 = self::Extension1|[](#t288{self::Class1}, nullable1) in #t289.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t289{self::Class1});
-  let final self::Class1? #t290 = n1 in #t290.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t291 = self::Extension1|[](#t290{self::Class1}, nullable1) in #t291.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t292 = nullable1 in self::Extension1|[](#t291{self::Class1}, #t292).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t291{self::Class1}, #t292, nullable1) : null;
-  nullable1 = let final self::Class1? #t293 = n1 in #t293.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t294 = self::Extension1|[](#t293{self::Class1}, nullable1) in #t294.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t295 = nullable1 in let final self::Class1? #t296 = self::Extension1|[](#t294{self::Class1}, #t295) in #t296.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t297 = nullable1 in let final void #t298 = self::Extension1|[]=(#t294{self::Class1}, #t295, #t297) in #t297 : #t296{self::Class1};
-  let final self::Class3? #t299 = n3 in #t299.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t300 = self::Extension3|[](#t299{self::Class3}, nullable3) in #t300.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t301 = nullable2 in self::Extension2|[]=(#t300{self::Class2}, #t301, self::Extension2|+(self::Extension2|[](#t300{self::Class2}, #t301), 0));
-  nullable2 = let final self::Class3? #t302 = n3 in #t302.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t303 = self::Extension3|[](#t302{self::Class3}, nullable3) in #t303.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t304 = nullable2 in let final self::Class2 #t305 = self::Extension2|+(self::Extension2|[](#t303{self::Class2}, #t304), 0) in let final void #t306 = self::Extension2|[]=(#t303{self::Class2}, #t304, #t305) in #t305;
-  let final self::Class3? #t307 = n3 in #t307.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t308 = self::Extension3|[](#t307{self::Class3}, nullable3) in #t308.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t309 = nullable2 in self::Extension2|[]=(#t308{self::Class2}, #t309, self::Extension2|+(self::Extension2|[](#t308{self::Class2}, #t309), 1));
-  nullable2 = let final self::Class3? #t310 = n3 in #t310.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t311 = self::Extension3|[](#t310{self::Class3}, nullable3) in #t311.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t312 = nullable2 in let final self::Class2 #t313 = self::Extension2|[](#t311{self::Class2}, #t312) in let final void #t314 = self::Extension2|[]=(#t311{self::Class2}, #t312, self::Extension2|+(#t313, 1)) in #t313;
-  let final self::Class3? #t315 = n3 in #t315.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t316 = self::Extension3|[](#t315{self::Class3}, nullable3) in #t316.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t317 = nullable2 in let final self::Class2 #t318 = self::Extension2|+(self::Extension2|[](#t316{self::Class2}, #t317), 1) in let final void #t319 = self::Extension2|[]=(#t316{self::Class2}, #t317, #t318) in #t318;
-  nullable2 = let final self::Class3? #t320 = n3 in #t320.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t321 = self::Extension3|[](#t320{self::Class3}, nullable3) in #t321.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t322 = nullable2 in let final self::Class2 #t323 = self::Extension2|+(self::Extension2|[](#t321{self::Class2}, #t322), 1) in let final void #t324 = self::Extension2|[]=(#t321{self::Class2}, #t322, #t323) in #t323;
+  let final self::Class1? #t170 = n1 in #t170.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t170{self::Class1}, nullable1);
+  let final self::Class1? #t171 = n1 in #t171.{core::Object::==}(null) ?{void} null : self::Extension1|[]=(#t171{self::Class1}, nullable1, new self::Class1::•());
+  let final self::Class1? #t172 = n1 in #t172.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t173 = self::Extension1|[](#t172{self::Class1}, nullable1) in #t173.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t173{self::Class1});
+  let final self::Class1? #t174 = n1 in #t174.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](self::Extension1|get#nonNullable1(#t174{self::Class1}), nullable1);
+  let final self::Class1? #t175 = n1 in #t175.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(self::Extension1|get#nonNullable1(#t175{self::Class1}), nullable1, new self::Class1::•());
+  nullable1 = let final self::Class1? #t176 = n1 in #t176.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t177 = self::Extension1|get#nonNullable1(#t176{self::Class1}) in let final self::Class1? #t178 = nullable1 in let final self::Class1 #t179 = new self::Class1::•() in let final void #t180 = self::Extension1|[]=(#t177, #t178, #t179) in #t179;
+  let final self::Class1? #t181 = n1 in #t181.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t182 = self::Extension1|[](self::Extension1|get#nonNullable1(#t181{self::Class1}), nullable1) in #t182.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t182{self::Class1});
+  let final self::Class1? #t183 = n1 in #t183.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t184 = self::Extension1|get#nonNullable2(#t183{self::Class1}) in let final self::Class2? #t185 = nullable2 in self::Extension2|[]=(#t184, #t185, self::Extension2|+(self::Extension2|[](#t184, #t185), 0));
+  nullable2 = let final self::Class1? #t186 = n1 in #t186.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t187 = self::Extension1|get#nonNullable2(#t186{self::Class1}) in let final self::Class2? #t188 = nullable2 in let final self::Class2 #t189 = self::Extension2|+(self::Extension2|[](#t187, #t188), 0) in let final void #t190 = self::Extension2|[]=(#t187, #t188, #t189) in #t189;
+  let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = nullable1 in self::Extension1|[](#t191{self::Class1}, #t192).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t191{self::Class1}, #t192, nullable1) : null;
+  nullable1 = let final self::Class1? #t193 = n1 in #t193.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t194 = nullable1 in let final self::Class1? #t195 = self::Extension1|[](#t193{self::Class1}, #t194) in #t195.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t196 = nullable1 in let final void #t197 = self::Extension1|[]=(#t193{self::Class1}, #t194, #t196) in #t196 : #t195{self::Class1};
+  let final self::Class2? #t198 = n2 in #t198.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t199 = nullable2 in self::Extension2|[]=(#t198{self::Class2}, #t199, self::Extension2|+(self::Extension2|[](#t198{self::Class2}, #t199), 0));
+  nullable2 = let final self::Class2? #t200 = n2 in #t200.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t201 = nullable2 in let final self::Class2 #t202 = self::Extension2|+(self::Extension2|[](#t200{self::Class2}, #t201), 0) in let final void #t203 = self::Extension2|[]=(#t200{self::Class2}, #t201, #t202) in #t202;
+  let final self::Class2? #t204 = n2 in #t204.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t205 = nullable2 in self::Extension2|[]=(#t204{self::Class2}, #t205, self::Extension2|+(self::Extension2|[](#t204{self::Class2}, #t205), 0));
+  nullable2 = let final self::Class2? #t206 = n2 in #t206.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t207 = nullable2 in let final self::Class2 #t208 = self::Extension2|+(self::Extension2|[](#t206{self::Class2}, #t207), 0) in let final void #t209 = self::Extension2|[]=(#t206{self::Class2}, #t207, #t208) in #t208;
+  let final self::Class2? #t210 = n2 in #t210.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t211 = nullable2 in self::Extension2|[]=(#t210{self::Class2}, #t211, self::Extension2|+(self::Extension2|[](#t210{self::Class2}, #t211), 1));
+  nullable2 = let final self::Class2? #t212 = n2 in #t212.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t213 = nullable2 in let final self::Class2 #t214 = self::Extension2|[](#t212{self::Class2}, #t213) in let final void #t215 = self::Extension2|[]=(#t212{self::Class2}, #t213, self::Extension2|+(#t214, 1)) in #t214;
+  let final self::Class2? #t216 = n2 in #t216.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t217 = nullable2 in let final self::Class2 #t218 = self::Extension2|+(self::Extension2|[](#t216{self::Class2}, #t217), 1) in let final void #t219 = self::Extension2|[]=(#t216{self::Class2}, #t217, #t218) in #t218;
+  nullable2 = let final self::Class2? #t220 = n2 in #t220.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t221 = nullable2 in let final self::Class2 #t222 = self::Extension2|+(self::Extension2|[](#t220{self::Class2}, #t221), 1) in let final void #t223 = self::Extension2|[]=(#t220{self::Class2}, #t221, #t222) in #t222;
+  let final self::Class1? #t224 = n1 in #t224.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t225 = self::Extension1|get#nonNullable2(#t224{self::Class1}) in let final self::Class2? #t226 = nullable2 in self::Extension2|[]=(#t225, #t226, self::Extension2|+(self::Extension2|[](#t225, #t226), 1));
+  nullable2 = let final self::Class1? #t227 = n1 in #t227.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t228 = self::Extension1|get#nonNullable2(#t227{self::Class1}) in let final self::Class2? #t229 = nullable2 in let final self::Class2 #t230 = self::Extension2|[](#t228, #t229) in let final void #t231 = self::Extension2|[]=(#t228, #t229, self::Extension2|+(#t230, 1)) in #t230;
+  let final self::Class1? #t232 = n1 in #t232.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t233 = self::Extension1|get#nonNullable2(#t232{self::Class1}) in let final self::Class2? #t234 = nullable2 in let final self::Class2 #t235 = self::Extension2|+(self::Extension2|[](#t233, #t234), 1) in let final void #t236 = self::Extension2|[]=(#t233, #t234, #t235) in #t235;
+  nullable2 = let final self::Class1? #t237 = n1 in #t237.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t238 = self::Extension1|get#nonNullable2(#t237{self::Class1}) in let final self::Class2? #t239 = nullable2 in let final self::Class2 #t240 = self::Extension2|+(self::Extension2|[](#t238, #t239), 1) in let final void #t241 = self::Extension2|[]=(#t238, #t239, #t240) in #t240;
+  let final self::Class1? #t242 = n1 in #t242.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t242{self::Class1}), nullable2), nullable2);
+  let final self::Class1? #t243 = n1 in #t243.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[]=(self::Extension2|[](self::Extension1|get#nonNullable2(#t243{self::Class1}), nullable2), nullable2, new self::Class2::•());
+  nullable2 = let final self::Class1? #t244 = n1 in #t244.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t245 = self::Extension2|[](self::Extension1|get#nonNullable2(#t244{self::Class1}), nullable2) in let final self::Class2? #t246 = nullable2 in let final self::Class2 #t247 = new self::Class2::•() in let final void #t248 = self::Extension2|[]=(#t245, #t246, #t247) in #t247;
+  let final self::Class1? #t249 = n1 in #t249.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t250 = self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t249{self::Class1}), nullable2), nullable2) in #t250.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|nonNullable2Method(#t250{self::Class2});
+  let final self::Class1? #t251 = n1 in #t251.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t252 = self::Extension2|[](self::Extension1|get#nonNullable2(#t251{self::Class1}), nullable2) in let final self::Class2? #t253 = nullable2 in self::Extension2|[]=(#t252, #t253, self::Extension2|+(self::Extension2|[](#t252, #t253), 0));
+  nullable2 = let final self::Class1? #t254 = n1 in #t254.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t255 = self::Extension2|[](self::Extension1|get#nonNullable2(#t254{self::Class1}), nullable2) in let final self::Class2? #t256 = nullable2 in let final self::Class2 #t257 = self::Extension2|+(self::Extension2|[](#t255, #t256), 0) in let final void #t258 = self::Extension2|[]=(#t255, #t256, #t257) in #t257;
+  let final self::Class1? #t259 = n1 in #t259.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t260 = self::Extension2|[](self::Extension1|get#nonNullable2(#t259{self::Class1}), nullable2) in let final self::Class2? #t261 = nullable2 in self::Extension2|[]=(#t260, #t261, self::Extension2|+(self::Extension2|[](#t260, #t261), 1));
+  nullable2 = let final self::Class1? #t262 = n1 in #t262.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t263 = self::Extension2|[](self::Extension1|get#nonNullable2(#t262{self::Class1}), nullable2) in let final self::Class2? #t264 = nullable2 in let final self::Class2 #t265 = self::Extension2|[](#t263, #t264) in let final void #t266 = self::Extension2|[]=(#t263, #t264, self::Extension2|+(#t265, 1)) in #t265;
+  let final self::Class1? #t267 = n1 in #t267.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t268 = self::Extension2|[](self::Extension1|get#nonNullable2(#t267{self::Class1}), nullable2) in let final self::Class2? #t269 = nullable2 in let final self::Class2 #t270 = self::Extension2|+(self::Extension2|[](#t268, #t269), 1) in let final void #t271 = self::Extension2|[]=(#t268, #t269, #t270) in #t270;
+  nullable2 = let final self::Class1? #t272 = n1 in #t272.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t273 = self::Extension2|[](self::Extension1|get#nonNullable2(#t272{self::Class1}), nullable2) in let final self::Class2? #t274 = nullable2 in let final self::Class2 #t275 = self::Extension2|+(self::Extension2|[](#t273, #t274), 1) in let final void #t276 = self::Extension2|[]=(#t273, #t274, #t275) in #t275;
+  let final self::Class1? #t277 = n1 in #t277.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t278 = self::Extension1|[](#t277{self::Class1}, nullable1) in #t278.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t278{self::Class1}, nullable1);
+  let final self::Class1? #t279 = n1 in #t279.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t280 = self::Extension1|[](#t279{self::Class1}, nullable1) in #t280.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t280{self::Class1}, nullable1, new self::Class1::•());
+  nullable1 = let final self::Class1? #t281 = n1 in #t281.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t282 = self::Extension1|[](#t281{self::Class1}, nullable1) in #t282.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t283 = nullable1 in let final self::Class1 #t284 = new self::Class1::•() in let final void #t285 = self::Extension1|[]=(#t282{self::Class1}, #t283, #t284) in #t284;
+  let final self::Class1? #t286 = n1 in #t286.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t287 = self::Extension1|[](#t286{self::Class1}, nullable1) in #t287.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t288 = self::Extension1|[](#t287{self::Class1}, nullable1) in #t288.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t288{self::Class1});
+  nullable1 = let final self::Class1? #t289 = n1 in #t289.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t290 = self::Extension1|[](#t289{self::Class1}, nullable1) in #t290.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t291 = self::Extension1|[](#t290{self::Class1}, nullable1) in #t291.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t291{self::Class1});
+  let final self::Class1? #t292 = n1 in #t292.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t293 = self::Extension1|[](#t292{self::Class1}, nullable1) in #t293.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t294 = nullable1 in self::Extension1|[](#t293{self::Class1}, #t294).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t293{self::Class1}, #t294, nullable1) : null;
+  nullable1 = let final self::Class1? #t295 = n1 in #t295.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t296 = self::Extension1|[](#t295{self::Class1}, nullable1) in #t296.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t297 = nullable1 in let final self::Class1? #t298 = self::Extension1|[](#t296{self::Class1}, #t297) in #t298.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t299 = nullable1 in let final void #t300 = self::Extension1|[]=(#t296{self::Class1}, #t297, #t299) in #t299 : #t298{self::Class1};
+  let final self::Class3? #t301 = n3 in #t301.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t302 = self::Extension3|[](#t301{self::Class3}, nullable3) in #t302.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t303 = nullable2 in self::Extension2|[]=(#t302{self::Class2}, #t303, self::Extension2|+(self::Extension2|[](#t302{self::Class2}, #t303), 0));
+  nullable2 = let final self::Class3? #t304 = n3 in #t304.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t305 = self::Extension3|[](#t304{self::Class3}, nullable3) in #t305.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t306 = nullable2 in let final self::Class2 #t307 = self::Extension2|+(self::Extension2|[](#t305{self::Class2}, #t306), 0) in let final void #t308 = self::Extension2|[]=(#t305{self::Class2}, #t306, #t307) in #t307;
+  let final self::Class3? #t309 = n3 in #t309.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t310 = self::Extension3|[](#t309{self::Class3}, nullable3) in #t310.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t311 = nullable2 in self::Extension2|[]=(#t310{self::Class2}, #t311, self::Extension2|+(self::Extension2|[](#t310{self::Class2}, #t311), 1));
+  nullable2 = let final self::Class3? #t312 = n3 in #t312.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t313 = self::Extension3|[](#t312{self::Class3}, nullable3) in #t313.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t314 = nullable2 in let final self::Class2 #t315 = self::Extension2|[](#t313{self::Class2}, #t314) in let final void #t316 = self::Extension2|[]=(#t313{self::Class2}, #t314, self::Extension2|+(#t315, 1)) in #t315;
+  let final self::Class3? #t317 = n3 in #t317.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t318 = self::Extension3|[](#t317{self::Class3}, nullable3) in #t318.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t319 = nullable2 in let final self::Class2 #t320 = self::Extension2|+(self::Extension2|[](#t318{self::Class2}, #t319), 1) in let final void #t321 = self::Extension2|[]=(#t318{self::Class2}, #t319, #t320) in #t320;
+  nullable2 = let final self::Class3? #t322 = n3 in #t322.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t323 = self::Extension3|[](#t322{self::Class3}, nullable3) in #t323.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t324 = nullable2 in let final self::Class2 #t325 = self::Extension2|+(self::Extension2|[](#t323{self::Class2}, #t324), 1) in let final void #t326 = self::Extension2|[]=(#t323{self::Class2}, #t324, #t325) in #t325;
 }
 static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
   self::Class2? nullable2 = n2;
-  self::throws(() → self::Class1? => self::Extension1|+(let final self::Class1? #t325 = n1 in #t325.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t325{self::Class1}), 0));
-  self::throws(() → self::Class1? => self::Extension1|unary-(let final self::Class1? #t326 = n1 in #t326.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t326{self::Class1})));
-  let final self::Class2? #t327 = n2 in #t327.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t327{self::Class2}, self::Extension2|+(self::Extension2|get#nonNullable2(#t327{self::Class2}), 0));
-  nullable2 = let final self::Class2? #t328 = n2 in #t328.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t329 = self::Extension2|+(self::Extension2|get#nonNullable2(#t328{self::Class2}), 0) in let final void #t330 = self::Extension2|set#nonNullable2(#t328{self::Class2}, #t329) in #t329;
-  let final self::Class2? #t331 = n2 in #t331.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t332 = self::Extension2|get#nonNullable2(#t331{self::Class2}) in self::Extension2|set#nonNullable2(#t332, self::Extension2|+(self::Extension2|get#nonNullable2(#t332), 0));
-  nullable2 = let final self::Class2? #t333 = n2 in #t333.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t334 = self::Extension2|get#nonNullable2(#t333{self::Class2}) in let final self::Class2 #t335 = self::Extension2|+(self::Extension2|get#nonNullable2(#t334), 0) in let final void #t336 = self::Extension2|set#nonNullable2(#t334, #t335) in #t335;
-  let final self::Class2? #t337 = n2 in #t337.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t337{self::Class2}, self::Extension2|+(self::Extension2|get#nonNullable2(#t337{self::Class2}), 1));
-  nullable2 = let final self::Class2? #t338 = n2 in #t338.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t339 = self::Extension2|get#nonNullable2(#t338{self::Class2}) in let final self::Class2 #t340 = let final self::Class2 #t341 = self::Extension2|+(#t339, 1) in let final void #t342 = self::Extension2|set#nonNullable2(#t338{self::Class2}, #t341) in #t341 in #t339;
-  let final self::Class2? #t343 = n2 in #t343.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t344 = self::Extension2|+(self::Extension2|get#nonNullable2(#t343{self::Class2}), 1) in let final void #t345 = self::Extension2|set#nonNullable2(#t343{self::Class2}, #t344) in #t344;
-  nullable2 = let final self::Class2? #t346 = n2 in #t346.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t347 = self::Extension2|+(self::Extension2|get#nonNullable2(#t346{self::Class2}), 1) in let final void #t348 = self::Extension2|set#nonNullable2(#t346{self::Class2}, #t347) in #t347;
+  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.
+ - '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.
+ - '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})));
+  let final self::Class2? #t331 = n2 in #t331.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t331{self::Class2}, self::Extension2|+(self::Extension2|get#nonNullable2(#t331{self::Class2}), 0));
+  nullable2 = let final self::Class2? #t332 = n2 in #t332.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t333 = self::Extension2|+(self::Extension2|get#nonNullable2(#t332{self::Class2}), 0) in let final void #t334 = self::Extension2|set#nonNullable2(#t332{self::Class2}, #t333) in #t333;
+  let final self::Class2? #t335 = n2 in #t335.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t336 = self::Extension2|get#nonNullable2(#t335{self::Class2}) in self::Extension2|set#nonNullable2(#t336, self::Extension2|+(self::Extension2|get#nonNullable2(#t336), 0));
+  nullable2 = let final self::Class2? #t337 = n2 in #t337.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t338 = self::Extension2|get#nonNullable2(#t337{self::Class2}) in let final self::Class2 #t339 = self::Extension2|+(self::Extension2|get#nonNullable2(#t338), 0) in let final void #t340 = self::Extension2|set#nonNullable2(#t338, #t339) in #t339;
+  let final self::Class2? #t341 = n2 in #t341.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t341{self::Class2}, self::Extension2|+(self::Extension2|get#nonNullable2(#t341{self::Class2}), 1));
+  nullable2 = let final self::Class2? #t342 = n2 in #t342.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t343 = self::Extension2|get#nonNullable2(#t342{self::Class2}) in let final self::Class2 #t344 = let final self::Class2 #t345 = self::Extension2|+(#t343, 1) in let final void #t346 = self::Extension2|set#nonNullable2(#t342{self::Class2}, #t345) in #t345 in #t343;
+  let final self::Class2? #t347 = n2 in #t347.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t348 = self::Extension2|+(self::Extension2|get#nonNullable2(#t347{self::Class2}), 1) in let final void #t349 = self::Extension2|set#nonNullable2(#t347{self::Class2}, #t348) in #t348;
+  nullable2 = let final self::Class2? #t350 = n2 in #t350.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t351 = self::Extension2|+(self::Extension2|get#nonNullable2(#t350{self::Class2}), 1) in let final void #t352 = self::Extension2|set#nonNullable2(#t350{self::Class2}, #t351) in #t351;
 }
 static method ifNull(self::Class1? n1) → void {
   self::Class1? nullable1 = n1;
-  let final self::Class1? #t349 = n1 in #t349.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t349).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t349, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t350 = n1 in #t350.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t351 = self::Extension1|get#nullable1(#t350) in #t351.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t352 = n1{self::Class1} in let final void #t353 = self::Extension1|set#nullable1(#t350, #t352) in #t352 : #t351{self::Class1};
-  let final self::Class1? #t354 = n1 in #t354.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t355 = self::Extension1|get#nonNullable1(#t354{self::Class1}) in self::Extension1|get#nullable1(#t355{self::Class1}).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t355{self::Class1}, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t356 = n1 in #t356.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t357 = self::Extension1|get#nonNullable1(#t356{self::Class1}) in let final self::Class1? #t358 = self::Extension1|get#nullable1(#t357{self::Class1}) in #t358.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t359 = n1{self::Class1} in let final void #t360 = self::Extension1|set#nullable1(#t357{self::Class1}, #t359) in #t359 : #t358{self::Class1};
-  let final self::Class1? #t361 = n1 in #t361.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t362 = self::Extension1|get#nonNullable1(#t361{self::Class1}) in let final self::Class1 #t363 = n1{self::Class1} in self::Extension1|[](#t362, #t363).{core::Object::==}(null) ?{self::Class1} self::Extension1|[]=(#t362, #t363, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t364 = n1 in #t364.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t365 = self::Extension1|get#nonNullable1(#t364{self::Class1}) in let final self::Class1 #t366 = n1{self::Class1} in let final self::Class1? #t367 = self::Extension1|[](#t365, #t366) in #t367.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t368 = n1{self::Class1} in let final void #t369 = self::Extension1|[]=(#t365, #t366, #t368) in #t368 : #t367{self::Class1};
+  let final self::Class1? #t353 = n1 in #t353.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t353).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t353, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t354 = n1 in #t354.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t355 = self::Extension1|get#nullable1(#t354) in #t355.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t356 = n1{self::Class1} in let final void #t357 = self::Extension1|set#nullable1(#t354, #t356) in #t356 : #t355{self::Class1};
+  let final self::Class1? #t358 = n1 in #t358.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t359 = self::Extension1|get#nonNullable1(#t358{self::Class1}) in self::Extension1|get#nullable1(#t359{self::Class1}).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t359{self::Class1}, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t360 = n1 in #t360.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t361 = self::Extension1|get#nonNullable1(#t360{self::Class1}) in let final self::Class1? #t362 = self::Extension1|get#nullable1(#t361{self::Class1}) in #t362.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t363 = n1{self::Class1} in let final void #t364 = self::Extension1|set#nullable1(#t361{self::Class1}, #t363) in #t363 : #t362{self::Class1};
+  let final self::Class1? #t365 = n1 in #t365.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t366 = self::Extension1|get#nonNullable1(#t365{self::Class1}) in let final self::Class1 #t367 = n1{self::Class1} in self::Extension1|[](#t366, #t367).{core::Object::==}(null) ?{self::Class1} self::Extension1|[]=(#t366, #t367, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t368 = n1 in #t368.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t369 = self::Extension1|get#nonNullable1(#t368{self::Class1}) in let final self::Class1 #t370 = n1{self::Class1} in let final self::Class1? #t371 = self::Extension1|[](#t369, #t370) in #t371.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t372 = n1{self::Class1} in let final void #t373 = self::Extension1|[]=(#t369, #t370, #t372) in #t372 : #t371{self::Class1};
 }
 static method throws(() → void f) → void {
   try {
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 dce5931..51808db 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
@@ -2,24 +2,24 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// 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);
 //                                               ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:94:43: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// 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);
 //                                           ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:226:33: Warning: Operator '+' is called on 'Class1?' which is potentially null.
+// 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);
 //                                 ^
 //
-// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:227:16: Warning: Operator 'unary-' is called on 'Class1?' which is potentially null.
+// 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);
 //                ^
@@ -139,139 +139,153 @@
   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? => self::Extension1|get#nullable1(let final self::Class1? #t19 = n1 in #t19.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t20 = new self::Class1::•() in let final void #t21 = self::Extension1|set#nullable1(#t19{self::Class1}, #t20) in #t20));
-  self::throws(() → self::Class1? => self::Extension1|get#nullable1(let final self::Class1? #t22 = n1 in #t22.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t22{self::Class1})));
-  nullable1 = let final self::Class1? #t23 = n1 in #t23.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t24 = new self::Class1::•() in let final void #t25 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t23{self::Class1}), #t24) in #t24;
-  nullable1 = let final self::Class1? #t26 = n1 in #t26.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t27 = self::Extension1|get#nullable1(#t26{self::Class1}) in #t27.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t28 = new self::Class1::•() in let final void #t29 = self::Extension1|set#nullable1(#t27{self::Class1}, #t28) in #t28;
-  nullable1 = let final self::Class1? #t30 = n1 in #t30.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t31 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t30{self::Class1})) in #t31.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t32 = new self::Class1::•() in let final void #t33 = self::Extension1|set#nullable1(#t31{self::Class1}, #t32) in #t32;
-  let final self::Class1? #t34 = n1 in #t34.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t35 = self::Extension1|get#nullable1(#t34{self::Class1}) in #t35.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t35{self::Class1});
-  let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t36{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t37 = n1 in #t37.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t38 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t39 = self::Extension1|set#nullable1(#t37{self::Class1}, #t38) in #t38;
-  let final self::Class1? #t40 = n1 in #t40.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t40{self::Class1}, let final self::Class1 #t41 = new self::Class1::•() in let final void #t42 = self::Extension1|set#nullable1(new self::Class1::•(), #t41) in #t41);
-  nullable1 = let final self::Class1? #t43 = n1 in #t43.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t44 = let final self::Class1 #t45 = new self::Class1::•() in let final void #t46 = self::Extension1|set#nullable1(new self::Class1::•(), #t45) in #t45 in let final void #t47 = self::Extension1|set#nullable1(#t43{self::Class1}, #t44) in #t44;
-  let final self::Class1? #t48 = n1 in #t48.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t49 = n1 in #t49.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t50 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t51 = self::Extension1|set#nullable1(#t49{self::Class1}, #t50) in #t50;
-  let final self::Class1? #t52 = n1 in #t52.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t52{self::Class1}));
-  let final self::Class1? #t53 = n1 in #t53.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
-  let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t54{self::Class1}));
-  let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t55{self::Class1})));
-  let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
-  nullable1 = let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t58 = new self::Class1::•() in let final void #t59 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})), #t58) in #t58;
-  let final self::Class1? #t60 = n1 in #t60.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t61 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t60{self::Class1})) in #t61.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t61{self::Class1});
-  let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
-  nullable1 = let final self::Class1? #t63 = n1 in #t63.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t64 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t65 = self::Extension1|set#nullable1(#t63{self::Class1}, #t64) in #t64;
-  let final self::Class1? #t66 = n1 in #t66.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t66{self::Class1}, let final self::Class1 #t67 = new self::Class1::•() in let final void #t68 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t67) in #t67);
-  nullable1 = let final self::Class1? #t69 = n1 in #t69.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t70 = let final self::Class1 #t71 = new self::Class1::•() in let final void #t72 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t71) in #t71 in let final void #t73 = self::Extension1|set#nullable1(#t69{self::Class1}, #t70) in #t70;
-  let final self::Class1? #t74 = n1 in #t74.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
-  nullable1 = let final self::Class1? #t75 = n1 in #t75.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t76 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t77 = self::Extension1|set#nullable1(#t75{self::Class1}, #t76) in #t76;
-  let final self::Class1? #t78 = n1 in #t78.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t78{self::Class1})));
-  let final self::Class1? #t79 = n1 in #t79.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
-  let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
-  let final self::Class1? #t81 = n1 in #t81.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t83 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t84 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t82{self::Class1}), #t83) in #t83;
-  let final self::Class1? #t85 = n1 in #t85.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
-  nullable1 = let final self::Class1? #t88 = n1 in #t88.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t89 = let final self::Class1 #t90 = new self::Class1::•() in let final void #t91 = self::Extension1|set#nullable1(new self::Class1::•(), #t90) in #t90 in let final void #t92 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t88{self::Class1}), #t89) in #t89;
-  let final self::Class1? #t93 = n1 in #t93.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t94 = n1 in #t94.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t95 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t96 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t94{self::Class1}), #t95) in #t95;
-  let final self::Class1? #t97 = n1 in #t97.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
-  nullable1 = let final self::Class1? #t100 = n1 in #t100.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t101 = let final self::Class1? #t102 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t103 = self::Extension1|set#nullable1(new self::Class1::•(), #t102) in #t102 in let final void #t104 = self::Extension1|set#nullable1(#t100{self::Class1}, #t101) in #t101;
-  let final self::Class1? #t105 = n1 in #t105.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t105{self::Class1}, let final self::Class1 #t106 = let final self::Class1 #t107 = new self::Class1::•() in let final void #t108 = self::Extension1|set#nullable1(new self::Class1::•(), #t107) in #t107 in let final void #t109 = self::Extension1|set#nullable1(new self::Class1::•(), #t106) in #t106);
-  nullable1 = let final self::Class1? #t110 = n1 in #t110.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t111 = let final self::Class1 #t112 = let final self::Class1 #t113 = new self::Class1::•() in let final void #t114 = self::Extension1|set#nullable1(new self::Class1::•(), #t113) in #t113 in let final void #t115 = self::Extension1|set#nullable1(new self::Class1::•(), #t112) in #t112 in let final void #t116 = self::Extension1|set#nullable1(#t110{self::Class1}, #t111) in #t111;
-  let final self::Class1? #t117 = n1 in #t117.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
-  nullable1 = let final self::Class1? #t120 = n1 in #t120.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t121 = let final self::Class1 #t122 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t123 = self::Extension1|set#nullable1(new self::Class1::•(), #t122) in #t122 in let final void #t124 = self::Extension1|set#nullable1(#t120{self::Class1}, #t121) in #t121;
-  let final self::Class1? #t125 = n1 in #t125.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t126 = n1 in #t126.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t127 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t128 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t126{self::Class1}), #t127) in #t127;
-  let final self::Class1? #t129 = n1 in #t129.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
-  nullable1 = let final self::Class1? #t132 = n1 in #t132.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t133 = let final self::Class1 #t134 = new self::Class1::•() in let final void #t135 = self::Extension1|set#nullable1(new self::Class1::•(), #t134) in #t134 in let final void #t136 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t132{self::Class1}), #t133) in #t133;
-  let final self::Class1? #t137 = n1 in #t137.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t138 = n1 in #t138.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t139 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t140 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t138{self::Class1}), #t139) in #t139;
-  let final self::Class1? #t141 = n1 in #t141.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t141{self::Class1})));
-  let final self::Class1? #t142 = n1 in #t142.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
-  nullable1 = let final self::Class1? #t143 = n1 in #t143.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t144 = new self::Class1::•() in let final void #t145 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})), #t144) in #t144;
-  let final self::Class1? #t146 = n1 in #t146.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t146{self::Class1})));
-  let final self::Class1? #t147 = n1 in #t147.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
-  nullable1 = let final self::Class1? #t148 = n1 in #t148.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t149 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t150 = self::Extension1|set#nullable1(#t148{self::Class1}, #t149) in #t149;
-  let final self::Class1? #t151 = n1 in #t151.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t151{self::Class1}, let final self::Class1 #t152 = new self::Class1::•() in let final void #t153 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t152) in #t152);
-  nullable1 = let final self::Class1? #t154 = n1 in #t154.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t155 = let final self::Class1 #t156 = new self::Class1::•() in let final void #t157 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t156) in #t156 in let final void #t158 = self::Extension1|set#nullable1(#t154{self::Class1}, #t155) in #t155;
-  let final self::Class1? #t159 = n1 in #t159.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
-  nullable1 = let final self::Class1? #t160 = n1 in #t160.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t161 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t162 = self::Extension1|set#nullable1(#t160{self::Class1}, #t161) in #t161;
-  let final self::Class1? #t163 = n1 in #t163.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t163{self::Class1})));
-  let final self::Class1? #t164 = n1 in #t164.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
-  let final self::Class1? #t165 = n1 in #t165.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
-  let final self::Class1? #t166 = n1 in #t166.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t167 = self::Extension1|nonNullable1Method(#t166{self::Class1}) in #t167.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t167{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.
+ - '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.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
+Try accessing using ?. instead.
+  throws(() => (n1?.nonNullable1Method()).nullable1);
+                                          ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t24 = n1 in #t24.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t24{self::Class1})));
+  nullable1 = let final self::Class1? #t25 = n1 in #t25.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t26 = new self::Class1::•() in let final void #t27 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t25{self::Class1}), #t26) in #t26;
+  nullable1 = let final self::Class1? #t28 = n1 in #t28.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t29 = self::Extension1|get#nullable1(#t28{self::Class1}) in #t29.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t30 = new self::Class1::•() in let final void #t31 = self::Extension1|set#nullable1(#t29{self::Class1}, #t30) in #t30;
+  nullable1 = let final self::Class1? #t32 = n1 in #t32.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t33 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t32{self::Class1})) in #t33.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t34 = new self::Class1::•() in let final void #t35 = self::Extension1|set#nullable1(#t33{self::Class1}, #t34) in #t34;
+  let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t37 = self::Extension1|get#nullable1(#t36{self::Class1}) in #t37.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t37{self::Class1});
+  let final self::Class1? #t38 = n1 in #t38.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t38{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t39 = n1 in #t39.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t40 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t41 = self::Extension1|set#nullable1(#t39{self::Class1}, #t40) in #t40;
+  let final self::Class1? #t42 = n1 in #t42.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t42{self::Class1}, let final self::Class1 #t43 = new self::Class1::•() in let final void #t44 = self::Extension1|set#nullable1(new self::Class1::•(), #t43) in #t43);
+  nullable1 = let final self::Class1? #t45 = n1 in #t45.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t46 = let final self::Class1 #t47 = new self::Class1::•() in let final void #t48 = self::Extension1|set#nullable1(new self::Class1::•(), #t47) in #t47 in let final void #t49 = self::Extension1|set#nullable1(#t45{self::Class1}, #t46) in #t46;
+  let final self::Class1? #t50 = n1 in #t50.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t50{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t51 = n1 in #t51.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t52 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t53 = self::Extension1|set#nullable1(#t51{self::Class1}, #t52) in #t52;
+  let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t54{self::Class1}));
+  let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t55{self::Class1}), new self::Class1::•());
+  let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t56{self::Class1}));
+  let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})));
+  let final self::Class1? #t58 = n1 in #t58.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t58{self::Class1})), new self::Class1::•());
+  nullable1 = let final self::Class1? #t59 = n1 in #t59.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t60 = new self::Class1::•() in let final void #t61 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t59{self::Class1})), #t60) in #t60;
+  let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t63 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t62{self::Class1})) in #t63.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t63{self::Class1});
+  let final self::Class1? #t64 = n1 in #t64.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t64{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t65 = n1 in #t65.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t66 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t67 = self::Extension1|set#nullable1(#t65{self::Class1}, #t66) in #t66;
+  let final self::Class1? #t68 = n1 in #t68.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t68{self::Class1}, let final self::Class1 #t69 = new self::Class1::•() in let final void #t70 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t69) in #t69);
+  nullable1 = let final self::Class1? #t71 = n1 in #t71.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t72 = let final self::Class1 #t73 = new self::Class1::•() in let final void #t74 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t73) in #t73 in let final void #t75 = self::Extension1|set#nullable1(#t71{self::Class1}, #t72) in #t72;
+  let final self::Class1? #t76 = n1 in #t76.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t76{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t77 = n1 in #t77.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t78 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t79 = self::Extension1|set#nullable1(#t77{self::Class1}, #t78) in #t78;
+  let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
+  let final self::Class1? #t81 = n1 in #t81.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t81{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t82{self::Class1})));
+  let final self::Class1? #t83 = n1 in #t83.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t83{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t84 = n1 in #t84.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t85 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t86 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t84{self::Class1}), #t85) in #t85;
+  let final self::Class1? #t87 = n1 in #t87.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t87{self::Class1}), let final self::Class1 #t88 = new self::Class1::•() in let final void #t89 = self::Extension1|set#nullable1(new self::Class1::•(), #t88) in #t88);
+  nullable1 = let final self::Class1? #t90 = n1 in #t90.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t91 = let final self::Class1 #t92 = new self::Class1::•() in let final void #t93 = self::Extension1|set#nullable1(new self::Class1::•(), #t92) in #t92 in let final void #t94 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t90{self::Class1}), #t91) in #t91;
+  let final self::Class1? #t95 = n1 in #t95.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t95{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t96 = n1 in #t96.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t97 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t98 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t96{self::Class1}), #t97) in #t97;
+  let final self::Class1? #t99 = n1 in #t99.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t99{self::Class1}, let final self::Class1? #t100 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t101 = self::Extension1|set#nullable1(new self::Class1::•(), #t100) in #t100);
+  nullable1 = let final self::Class1? #t102 = n1 in #t102.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t103 = let final self::Class1? #t104 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t105 = self::Extension1|set#nullable1(new self::Class1::•(), #t104) in #t104 in let final void #t106 = self::Extension1|set#nullable1(#t102{self::Class1}, #t103) in #t103;
+  let final self::Class1? #t107 = n1 in #t107.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t107{self::Class1}, let final self::Class1 #t108 = let final self::Class1 #t109 = new self::Class1::•() in let final void #t110 = self::Extension1|set#nullable1(new self::Class1::•(), #t109) in #t109 in let final void #t111 = self::Extension1|set#nullable1(new self::Class1::•(), #t108) in #t108);
+  nullable1 = let final self::Class1? #t112 = n1 in #t112.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t113 = let final self::Class1 #t114 = let final self::Class1 #t115 = new self::Class1::•() in let final void #t116 = self::Extension1|set#nullable1(new self::Class1::•(), #t115) in #t115 in let final void #t117 = self::Extension1|set#nullable1(new self::Class1::•(), #t114) in #t114 in let final void #t118 = self::Extension1|set#nullable1(#t112{self::Class1}, #t113) in #t113;
+  let final self::Class1? #t119 = n1 in #t119.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t119{self::Class1}, let final self::Class1 #t120 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t121 = self::Extension1|set#nullable1(new self::Class1::•(), #t120) in #t120);
+  nullable1 = let final self::Class1? #t122 = n1 in #t122.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t123 = let final self::Class1 #t124 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t125 = self::Extension1|set#nullable1(new self::Class1::•(), #t124) in #t124 in let final void #t126 = self::Extension1|set#nullable1(#t122{self::Class1}, #t123) in #t123;
+  let final self::Class1? #t127 = n1 in #t127.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t127{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t128 = n1 in #t128.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t129 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t130 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t128{self::Class1}), #t129) in #t129;
+  let final self::Class1? #t131 = n1 in #t131.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t131{self::Class1}), let final self::Class1 #t132 = new self::Class1::•() in let final void #t133 = self::Extension1|set#nullable1(new self::Class1::•(), #t132) in #t132);
+  nullable1 = let final self::Class1? #t134 = n1 in #t134.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t135 = let final self::Class1 #t136 = new self::Class1::•() in let final void #t137 = self::Extension1|set#nullable1(new self::Class1::•(), #t136) in #t136 in let final void #t138 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t134{self::Class1}), #t135) in #t135;
+  let final self::Class1? #t139 = n1 in #t139.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t139{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t140 = n1 in #t140.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t141 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t142 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t140{self::Class1}), #t141) in #t141;
+  let final self::Class1? #t143 = n1 in #t143.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})));
+  let final self::Class1? #t144 = n1 in #t144.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t144{self::Class1})), new self::Class1::•());
+  nullable1 = let final self::Class1? #t145 = n1 in #t145.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t146 = new self::Class1::•() in let final void #t147 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t145{self::Class1})), #t146) in #t146;
+  let final self::Class1? #t148 = n1 in #t148.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t148{self::Class1})));
+  let final self::Class1? #t149 = n1 in #t149.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t149{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t150 = n1 in #t150.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t151 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t152 = self::Extension1|set#nullable1(#t150{self::Class1}, #t151) in #t151;
+  let final self::Class1? #t153 = n1 in #t153.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t153{self::Class1}, let final self::Class1 #t154 = new self::Class1::•() in let final void #t155 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t154) in #t154);
+  nullable1 = let final self::Class1? #t156 = n1 in #t156.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t157 = let final self::Class1 #t158 = new self::Class1::•() in let final void #t159 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t158) in #t158 in let final void #t160 = self::Extension1|set#nullable1(#t156{self::Class1}, #t157) in #t157;
+  let final self::Class1? #t161 = n1 in #t161.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t161{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t162 = n1 in #t162.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t163 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t164 = self::Extension1|set#nullable1(#t162{self::Class1}, #t163) in #t163;
+  let final self::Class1? #t165 = n1 in #t165.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
+  let final self::Class1? #t166 = n1 in #t166.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t166{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t167 = n1 in #t167.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t167{self::Class1})));
+  let final self::Class1? #t168 = n1 in #t168.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t169 = self::Extension1|nonNullable1Method(#t168{self::Class1}) in #t169.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t169{self::Class1});
 }
 static method indexAccess(self::Class1? n1, self::Class2? n2, self::Class3? n3) → void {
   self::Class1? nullable1 = n1;
   self::Class2? nullable2 = n2;
   self::Class3? nullable3 = n3;
-  let final self::Class1? #t168 = n1 in #t168.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t168{self::Class1}, nullable1);
-  let final self::Class1? #t169 = n1 in #t169.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t169{self::Class1}, nullable1, new self::Class1::•());
-  let final self::Class1? #t170 = n1 in #t170.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t171 = self::Extension1|[](#t170{self::Class1}, nullable1) in #t171.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t171{self::Class1});
-  let final self::Class1? #t172 = n1 in #t172.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](self::Extension1|get#nonNullable1(#t172{self::Class1}), nullable1);
-  let final self::Class1? #t173 = n1 in #t173.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(self::Extension1|get#nonNullable1(#t173{self::Class1}), nullable1, new self::Class1::•());
-  nullable1 = let final self::Class1? #t174 = n1 in #t174.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t175 = self::Extension1|get#nonNullable1(#t174{self::Class1}) in let final self::Class1? #t176 = nullable1 in let final self::Class1 #t177 = new self::Class1::•() in let final void #t178 = self::Extension1|[]=(#t175, #t176, #t177) in #t177;
-  let final self::Class1? #t179 = n1 in #t179.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t180 = self::Extension1|[](self::Extension1|get#nonNullable1(#t179{self::Class1}), nullable1) in #t180.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t180{self::Class1});
-  let final self::Class1? #t181 = n1 in #t181.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t182 = self::Extension1|get#nonNullable2(#t181{self::Class1}) in let final self::Class2? #t183 = nullable2 in self::Extension2|[]=(#t182, #t183, self::Extension2|+(self::Extension2|[](#t182, #t183), 0));
-  nullable2 = let final self::Class1? #t184 = n1 in #t184.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t185 = self::Extension1|get#nonNullable2(#t184{self::Class1}) in let final self::Class2? #t186 = nullable2 in let final self::Class2 #t187 = self::Extension2|+(self::Extension2|[](#t185, #t186), 0) in let final void #t188 = self::Extension2|[]=(#t185, #t186, #t187) in #t187;
-  let final self::Class1? #t189 = n1 in #t189.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t190 = nullable1 in self::Extension1|[](#t189{self::Class1}, #t190).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t189{self::Class1}, #t190, nullable1) : null;
-  nullable1 = let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = nullable1 in let final self::Class1? #t193 = self::Extension1|[](#t191{self::Class1}, #t192) in #t193.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t194 = nullable1 in let final void #t195 = self::Extension1|[]=(#t191{self::Class1}, #t192, #t194) in #t194 : #t193{self::Class1};
-  let final self::Class2? #t196 = n2 in #t196.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t197 = nullable2 in self::Extension2|[]=(#t196{self::Class2}, #t197, self::Extension2|+(self::Extension2|[](#t196{self::Class2}, #t197), 0));
-  nullable2 = let final self::Class2? #t198 = n2 in #t198.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t199 = nullable2 in let final self::Class2 #t200 = self::Extension2|+(self::Extension2|[](#t198{self::Class2}, #t199), 0) in let final void #t201 = self::Extension2|[]=(#t198{self::Class2}, #t199, #t200) in #t200;
-  let final self::Class2? #t202 = n2 in #t202.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t203 = nullable2 in self::Extension2|[]=(#t202{self::Class2}, #t203, self::Extension2|+(self::Extension2|[](#t202{self::Class2}, #t203), 0));
-  nullable2 = let final self::Class2? #t204 = n2 in #t204.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t205 = nullable2 in let final self::Class2 #t206 = self::Extension2|+(self::Extension2|[](#t204{self::Class2}, #t205), 0) in let final void #t207 = self::Extension2|[]=(#t204{self::Class2}, #t205, #t206) in #t206;
-  let final self::Class2? #t208 = n2 in #t208.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t209 = nullable2 in self::Extension2|[]=(#t208{self::Class2}, #t209, self::Extension2|+(self::Extension2|[](#t208{self::Class2}, #t209), 1));
-  nullable2 = let final self::Class2? #t210 = n2 in #t210.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t211 = nullable2 in let final self::Class2 #t212 = self::Extension2|[](#t210{self::Class2}, #t211) in let final void #t213 = self::Extension2|[]=(#t210{self::Class2}, #t211, self::Extension2|+(#t212, 1)) in #t212;
-  let final self::Class2? #t214 = n2 in #t214.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t215 = nullable2 in let final self::Class2 #t216 = self::Extension2|+(self::Extension2|[](#t214{self::Class2}, #t215), 1) in let final void #t217 = self::Extension2|[]=(#t214{self::Class2}, #t215, #t216) in #t216;
-  nullable2 = let final self::Class2? #t218 = n2 in #t218.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t219 = nullable2 in let final self::Class2 #t220 = self::Extension2|+(self::Extension2|[](#t218{self::Class2}, #t219), 1) in let final void #t221 = self::Extension2|[]=(#t218{self::Class2}, #t219, #t220) in #t220;
-  let final self::Class1? #t222 = n1 in #t222.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t223 = self::Extension1|get#nonNullable2(#t222{self::Class1}) in let final self::Class2? #t224 = nullable2 in self::Extension2|[]=(#t223, #t224, self::Extension2|+(self::Extension2|[](#t223, #t224), 1));
-  nullable2 = let final self::Class1? #t225 = n1 in #t225.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t226 = self::Extension1|get#nonNullable2(#t225{self::Class1}) in let final self::Class2? #t227 = nullable2 in let final self::Class2 #t228 = self::Extension2|[](#t226, #t227) in let final void #t229 = self::Extension2|[]=(#t226, #t227, self::Extension2|+(#t228, 1)) in #t228;
-  let final self::Class1? #t230 = n1 in #t230.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t231 = self::Extension1|get#nonNullable2(#t230{self::Class1}) in let final self::Class2? #t232 = nullable2 in let final self::Class2 #t233 = self::Extension2|+(self::Extension2|[](#t231, #t232), 1) in let final void #t234 = self::Extension2|[]=(#t231, #t232, #t233) in #t233;
-  nullable2 = let final self::Class1? #t235 = n1 in #t235.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t236 = self::Extension1|get#nonNullable2(#t235{self::Class1}) in let final self::Class2? #t237 = nullable2 in let final self::Class2 #t238 = self::Extension2|+(self::Extension2|[](#t236, #t237), 1) in let final void #t239 = self::Extension2|[]=(#t236, #t237, #t238) in #t238;
-  let final self::Class1? #t240 = n1 in #t240.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t240{self::Class1}), nullable2), nullable2);
-  let final self::Class1? #t241 = n1 in #t241.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[]=(self::Extension2|[](self::Extension1|get#nonNullable2(#t241{self::Class1}), nullable2), nullable2, new self::Class2::•());
-  nullable2 = let final self::Class1? #t242 = n1 in #t242.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t243 = self::Extension2|[](self::Extension1|get#nonNullable2(#t242{self::Class1}), nullable2) in let final self::Class2? #t244 = nullable2 in let final self::Class2 #t245 = new self::Class2::•() in let final void #t246 = self::Extension2|[]=(#t243, #t244, #t245) in #t245;
-  let final self::Class1? #t247 = n1 in #t247.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t248 = self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t247{self::Class1}), nullable2), nullable2) in #t248.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|nonNullable2Method(#t248{self::Class2});
-  let final self::Class1? #t249 = n1 in #t249.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t250 = self::Extension2|[](self::Extension1|get#nonNullable2(#t249{self::Class1}), nullable2) in let final self::Class2? #t251 = nullable2 in self::Extension2|[]=(#t250, #t251, self::Extension2|+(self::Extension2|[](#t250, #t251), 0));
-  nullable2 = let final self::Class1? #t252 = n1 in #t252.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t253 = self::Extension2|[](self::Extension1|get#nonNullable2(#t252{self::Class1}), nullable2) in let final self::Class2? #t254 = nullable2 in let final self::Class2 #t255 = self::Extension2|+(self::Extension2|[](#t253, #t254), 0) in let final void #t256 = self::Extension2|[]=(#t253, #t254, #t255) in #t255;
-  let final self::Class1? #t257 = n1 in #t257.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t258 = self::Extension2|[](self::Extension1|get#nonNullable2(#t257{self::Class1}), nullable2) in let final self::Class2? #t259 = nullable2 in self::Extension2|[]=(#t258, #t259, self::Extension2|+(self::Extension2|[](#t258, #t259), 1));
-  nullable2 = let final self::Class1? #t260 = n1 in #t260.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t261 = self::Extension2|[](self::Extension1|get#nonNullable2(#t260{self::Class1}), nullable2) in let final self::Class2? #t262 = nullable2 in let final self::Class2 #t263 = self::Extension2|[](#t261, #t262) in let final void #t264 = self::Extension2|[]=(#t261, #t262, self::Extension2|+(#t263, 1)) in #t263;
-  let final self::Class1? #t265 = n1 in #t265.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t266 = self::Extension2|[](self::Extension1|get#nonNullable2(#t265{self::Class1}), nullable2) in let final self::Class2? #t267 = nullable2 in let final self::Class2 #t268 = self::Extension2|+(self::Extension2|[](#t266, #t267), 1) in let final void #t269 = self::Extension2|[]=(#t266, #t267, #t268) in #t268;
-  nullable2 = let final self::Class1? #t270 = n1 in #t270.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t271 = self::Extension2|[](self::Extension1|get#nonNullable2(#t270{self::Class1}), nullable2) in let final self::Class2? #t272 = nullable2 in let final self::Class2 #t273 = self::Extension2|+(self::Extension2|[](#t271, #t272), 1) in let final void #t274 = self::Extension2|[]=(#t271, #t272, #t273) in #t273;
-  let final self::Class1? #t275 = n1 in #t275.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t276 = self::Extension1|[](#t275{self::Class1}, nullable1) in #t276.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t276{self::Class1}, nullable1);
-  let final self::Class1? #t277 = n1 in #t277.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t278 = self::Extension1|[](#t277{self::Class1}, nullable1) in #t278.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t278{self::Class1}, nullable1, new self::Class1::•());
-  nullable1 = let final self::Class1? #t279 = n1 in #t279.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t280 = self::Extension1|[](#t279{self::Class1}, nullable1) in #t280.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t281 = nullable1 in let final self::Class1 #t282 = new self::Class1::•() in let final void #t283 = self::Extension1|[]=(#t280{self::Class1}, #t281, #t282) in #t282;
-  let final self::Class1? #t284 = n1 in #t284.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t285 = self::Extension1|[](#t284{self::Class1}, nullable1) in #t285.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t286 = self::Extension1|[](#t285{self::Class1}, nullable1) in #t286.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t286{self::Class1});
-  nullable1 = let final self::Class1? #t287 = n1 in #t287.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t288 = self::Extension1|[](#t287{self::Class1}, nullable1) in #t288.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t289 = self::Extension1|[](#t288{self::Class1}, nullable1) in #t289.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t289{self::Class1});
-  let final self::Class1? #t290 = n1 in #t290.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t291 = self::Extension1|[](#t290{self::Class1}, nullable1) in #t291.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t292 = nullable1 in self::Extension1|[](#t291{self::Class1}, #t292).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t291{self::Class1}, #t292, nullable1) : null;
-  nullable1 = let final self::Class1? #t293 = n1 in #t293.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t294 = self::Extension1|[](#t293{self::Class1}, nullable1) in #t294.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t295 = nullable1 in let final self::Class1? #t296 = self::Extension1|[](#t294{self::Class1}, #t295) in #t296.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t297 = nullable1 in let final void #t298 = self::Extension1|[]=(#t294{self::Class1}, #t295, #t297) in #t297 : #t296{self::Class1};
-  let final self::Class3? #t299 = n3 in #t299.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t300 = self::Extension3|[](#t299{self::Class3}, nullable3) in #t300.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t301 = nullable2 in self::Extension2|[]=(#t300{self::Class2}, #t301, self::Extension2|+(self::Extension2|[](#t300{self::Class2}, #t301), 0));
-  nullable2 = let final self::Class3? #t302 = n3 in #t302.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t303 = self::Extension3|[](#t302{self::Class3}, nullable3) in #t303.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t304 = nullable2 in let final self::Class2 #t305 = self::Extension2|+(self::Extension2|[](#t303{self::Class2}, #t304), 0) in let final void #t306 = self::Extension2|[]=(#t303{self::Class2}, #t304, #t305) in #t305;
-  let final self::Class3? #t307 = n3 in #t307.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t308 = self::Extension3|[](#t307{self::Class3}, nullable3) in #t308.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t309 = nullable2 in self::Extension2|[]=(#t308{self::Class2}, #t309, self::Extension2|+(self::Extension2|[](#t308{self::Class2}, #t309), 1));
-  nullable2 = let final self::Class3? #t310 = n3 in #t310.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t311 = self::Extension3|[](#t310{self::Class3}, nullable3) in #t311.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t312 = nullable2 in let final self::Class2 #t313 = self::Extension2|[](#t311{self::Class2}, #t312) in let final void #t314 = self::Extension2|[]=(#t311{self::Class2}, #t312, self::Extension2|+(#t313, 1)) in #t313;
-  let final self::Class3? #t315 = n3 in #t315.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t316 = self::Extension3|[](#t315{self::Class3}, nullable3) in #t316.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t317 = nullable2 in let final self::Class2 #t318 = self::Extension2|+(self::Extension2|[](#t316{self::Class2}, #t317), 1) in let final void #t319 = self::Extension2|[]=(#t316{self::Class2}, #t317, #t318) in #t318;
-  nullable2 = let final self::Class3? #t320 = n3 in #t320.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t321 = self::Extension3|[](#t320{self::Class3}, nullable3) in #t321.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t322 = nullable2 in let final self::Class2 #t323 = self::Extension2|+(self::Extension2|[](#t321{self::Class2}, #t322), 1) in let final void #t324 = self::Extension2|[]=(#t321{self::Class2}, #t322, #t323) in #t323;
+  let final self::Class1? #t170 = n1 in #t170.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t170{self::Class1}, nullable1);
+  let final self::Class1? #t171 = n1 in #t171.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t171{self::Class1}, nullable1, new self::Class1::•());
+  let final self::Class1? #t172 = n1 in #t172.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t173 = self::Extension1|[](#t172{self::Class1}, nullable1) in #t173.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t173{self::Class1});
+  let final self::Class1? #t174 = n1 in #t174.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](self::Extension1|get#nonNullable1(#t174{self::Class1}), nullable1);
+  let final self::Class1? #t175 = n1 in #t175.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(self::Extension1|get#nonNullable1(#t175{self::Class1}), nullable1, new self::Class1::•());
+  nullable1 = let final self::Class1? #t176 = n1 in #t176.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t177 = self::Extension1|get#nonNullable1(#t176{self::Class1}) in let final self::Class1? #t178 = nullable1 in let final self::Class1 #t179 = new self::Class1::•() in let final void #t180 = self::Extension1|[]=(#t177, #t178, #t179) in #t179;
+  let final self::Class1? #t181 = n1 in #t181.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t182 = self::Extension1|[](self::Extension1|get#nonNullable1(#t181{self::Class1}), nullable1) in #t182.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t182{self::Class1});
+  let final self::Class1? #t183 = n1 in #t183.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t184 = self::Extension1|get#nonNullable2(#t183{self::Class1}) in let final self::Class2? #t185 = nullable2 in self::Extension2|[]=(#t184, #t185, self::Extension2|+(self::Extension2|[](#t184, #t185), 0));
+  nullable2 = let final self::Class1? #t186 = n1 in #t186.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t187 = self::Extension1|get#nonNullable2(#t186{self::Class1}) in let final self::Class2? #t188 = nullable2 in let final self::Class2 #t189 = self::Extension2|+(self::Extension2|[](#t187, #t188), 0) in let final void #t190 = self::Extension2|[]=(#t187, #t188, #t189) in #t189;
+  let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = nullable1 in self::Extension1|[](#t191{self::Class1}, #t192).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t191{self::Class1}, #t192, nullable1) : null;
+  nullable1 = let final self::Class1? #t193 = n1 in #t193.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t194 = nullable1 in let final self::Class1? #t195 = self::Extension1|[](#t193{self::Class1}, #t194) in #t195.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t196 = nullable1 in let final void #t197 = self::Extension1|[]=(#t193{self::Class1}, #t194, #t196) in #t196 : #t195{self::Class1};
+  let final self::Class2? #t198 = n2 in #t198.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t199 = nullable2 in self::Extension2|[]=(#t198{self::Class2}, #t199, self::Extension2|+(self::Extension2|[](#t198{self::Class2}, #t199), 0));
+  nullable2 = let final self::Class2? #t200 = n2 in #t200.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t201 = nullable2 in let final self::Class2 #t202 = self::Extension2|+(self::Extension2|[](#t200{self::Class2}, #t201), 0) in let final void #t203 = self::Extension2|[]=(#t200{self::Class2}, #t201, #t202) in #t202;
+  let final self::Class2? #t204 = n2 in #t204.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t205 = nullable2 in self::Extension2|[]=(#t204{self::Class2}, #t205, self::Extension2|+(self::Extension2|[](#t204{self::Class2}, #t205), 0));
+  nullable2 = let final self::Class2? #t206 = n2 in #t206.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t207 = nullable2 in let final self::Class2 #t208 = self::Extension2|+(self::Extension2|[](#t206{self::Class2}, #t207), 0) in let final void #t209 = self::Extension2|[]=(#t206{self::Class2}, #t207, #t208) in #t208;
+  let final self::Class2? #t210 = n2 in #t210.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t211 = nullable2 in self::Extension2|[]=(#t210{self::Class2}, #t211, self::Extension2|+(self::Extension2|[](#t210{self::Class2}, #t211), 1));
+  nullable2 = let final self::Class2? #t212 = n2 in #t212.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t213 = nullable2 in let final self::Class2 #t214 = self::Extension2|[](#t212{self::Class2}, #t213) in let final void #t215 = self::Extension2|[]=(#t212{self::Class2}, #t213, self::Extension2|+(#t214, 1)) in #t214;
+  let final self::Class2? #t216 = n2 in #t216.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t217 = nullable2 in let final self::Class2 #t218 = self::Extension2|+(self::Extension2|[](#t216{self::Class2}, #t217), 1) in let final void #t219 = self::Extension2|[]=(#t216{self::Class2}, #t217, #t218) in #t218;
+  nullable2 = let final self::Class2? #t220 = n2 in #t220.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t221 = nullable2 in let final self::Class2 #t222 = self::Extension2|+(self::Extension2|[](#t220{self::Class2}, #t221), 1) in let final void #t223 = self::Extension2|[]=(#t220{self::Class2}, #t221, #t222) in #t222;
+  let final self::Class1? #t224 = n1 in #t224.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t225 = self::Extension1|get#nonNullable2(#t224{self::Class1}) in let final self::Class2? #t226 = nullable2 in self::Extension2|[]=(#t225, #t226, self::Extension2|+(self::Extension2|[](#t225, #t226), 1));
+  nullable2 = let final self::Class1? #t227 = n1 in #t227.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t228 = self::Extension1|get#nonNullable2(#t227{self::Class1}) in let final self::Class2? #t229 = nullable2 in let final self::Class2 #t230 = self::Extension2|[](#t228, #t229) in let final void #t231 = self::Extension2|[]=(#t228, #t229, self::Extension2|+(#t230, 1)) in #t230;
+  let final self::Class1? #t232 = n1 in #t232.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t233 = self::Extension1|get#nonNullable2(#t232{self::Class1}) in let final self::Class2? #t234 = nullable2 in let final self::Class2 #t235 = self::Extension2|+(self::Extension2|[](#t233, #t234), 1) in let final void #t236 = self::Extension2|[]=(#t233, #t234, #t235) in #t235;
+  nullable2 = let final self::Class1? #t237 = n1 in #t237.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t238 = self::Extension1|get#nonNullable2(#t237{self::Class1}) in let final self::Class2? #t239 = nullable2 in let final self::Class2 #t240 = self::Extension2|+(self::Extension2|[](#t238, #t239), 1) in let final void #t241 = self::Extension2|[]=(#t238, #t239, #t240) in #t240;
+  let final self::Class1? #t242 = n1 in #t242.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t242{self::Class1}), nullable2), nullable2);
+  let final self::Class1? #t243 = n1 in #t243.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[]=(self::Extension2|[](self::Extension1|get#nonNullable2(#t243{self::Class1}), nullable2), nullable2, new self::Class2::•());
+  nullable2 = let final self::Class1? #t244 = n1 in #t244.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t245 = self::Extension2|[](self::Extension1|get#nonNullable2(#t244{self::Class1}), nullable2) in let final self::Class2? #t246 = nullable2 in let final self::Class2 #t247 = new self::Class2::•() in let final void #t248 = self::Extension2|[]=(#t245, #t246, #t247) in #t247;
+  let final self::Class1? #t249 = n1 in #t249.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t250 = self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t249{self::Class1}), nullable2), nullable2) in #t250.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|nonNullable2Method(#t250{self::Class2});
+  let final self::Class1? #t251 = n1 in #t251.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t252 = self::Extension2|[](self::Extension1|get#nonNullable2(#t251{self::Class1}), nullable2) in let final self::Class2? #t253 = nullable2 in self::Extension2|[]=(#t252, #t253, self::Extension2|+(self::Extension2|[](#t252, #t253), 0));
+  nullable2 = let final self::Class1? #t254 = n1 in #t254.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t255 = self::Extension2|[](self::Extension1|get#nonNullable2(#t254{self::Class1}), nullable2) in let final self::Class2? #t256 = nullable2 in let final self::Class2 #t257 = self::Extension2|+(self::Extension2|[](#t255, #t256), 0) in let final void #t258 = self::Extension2|[]=(#t255, #t256, #t257) in #t257;
+  let final self::Class1? #t259 = n1 in #t259.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t260 = self::Extension2|[](self::Extension1|get#nonNullable2(#t259{self::Class1}), nullable2) in let final self::Class2? #t261 = nullable2 in self::Extension2|[]=(#t260, #t261, self::Extension2|+(self::Extension2|[](#t260, #t261), 1));
+  nullable2 = let final self::Class1? #t262 = n1 in #t262.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t263 = self::Extension2|[](self::Extension1|get#nonNullable2(#t262{self::Class1}), nullable2) in let final self::Class2? #t264 = nullable2 in let final self::Class2 #t265 = self::Extension2|[](#t263, #t264) in let final void #t266 = self::Extension2|[]=(#t263, #t264, self::Extension2|+(#t265, 1)) in #t265;
+  let final self::Class1? #t267 = n1 in #t267.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t268 = self::Extension2|[](self::Extension1|get#nonNullable2(#t267{self::Class1}), nullable2) in let final self::Class2? #t269 = nullable2 in let final self::Class2 #t270 = self::Extension2|+(self::Extension2|[](#t268, #t269), 1) in let final void #t271 = self::Extension2|[]=(#t268, #t269, #t270) in #t270;
+  nullable2 = let final self::Class1? #t272 = n1 in #t272.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t273 = self::Extension2|[](self::Extension1|get#nonNullable2(#t272{self::Class1}), nullable2) in let final self::Class2? #t274 = nullable2 in let final self::Class2 #t275 = self::Extension2|+(self::Extension2|[](#t273, #t274), 1) in let final void #t276 = self::Extension2|[]=(#t273, #t274, #t275) in #t275;
+  let final self::Class1? #t277 = n1 in #t277.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t278 = self::Extension1|[](#t277{self::Class1}, nullable1) in #t278.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t278{self::Class1}, nullable1);
+  let final self::Class1? #t279 = n1 in #t279.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t280 = self::Extension1|[](#t279{self::Class1}, nullable1) in #t280.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t280{self::Class1}, nullable1, new self::Class1::•());
+  nullable1 = let final self::Class1? #t281 = n1 in #t281.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t282 = self::Extension1|[](#t281{self::Class1}, nullable1) in #t282.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t283 = nullable1 in let final self::Class1 #t284 = new self::Class1::•() in let final void #t285 = self::Extension1|[]=(#t282{self::Class1}, #t283, #t284) in #t284;
+  let final self::Class1? #t286 = n1 in #t286.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t287 = self::Extension1|[](#t286{self::Class1}, nullable1) in #t287.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t288 = self::Extension1|[](#t287{self::Class1}, nullable1) in #t288.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t288{self::Class1});
+  nullable1 = let final self::Class1? #t289 = n1 in #t289.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t290 = self::Extension1|[](#t289{self::Class1}, nullable1) in #t290.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t291 = self::Extension1|[](#t290{self::Class1}, nullable1) in #t291.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t291{self::Class1});
+  let final self::Class1? #t292 = n1 in #t292.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t293 = self::Extension1|[](#t292{self::Class1}, nullable1) in #t293.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t294 = nullable1 in self::Extension1|[](#t293{self::Class1}, #t294).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t293{self::Class1}, #t294, nullable1) : null;
+  nullable1 = let final self::Class1? #t295 = n1 in #t295.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t296 = self::Extension1|[](#t295{self::Class1}, nullable1) in #t296.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t297 = nullable1 in let final self::Class1? #t298 = self::Extension1|[](#t296{self::Class1}, #t297) in #t298.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t299 = nullable1 in let final void #t300 = self::Extension1|[]=(#t296{self::Class1}, #t297, #t299) in #t299 : #t298{self::Class1};
+  let final self::Class3? #t301 = n3 in #t301.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t302 = self::Extension3|[](#t301{self::Class3}, nullable3) in #t302.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t303 = nullable2 in self::Extension2|[]=(#t302{self::Class2}, #t303, self::Extension2|+(self::Extension2|[](#t302{self::Class2}, #t303), 0));
+  nullable2 = let final self::Class3? #t304 = n3 in #t304.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t305 = self::Extension3|[](#t304{self::Class3}, nullable3) in #t305.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t306 = nullable2 in let final self::Class2 #t307 = self::Extension2|+(self::Extension2|[](#t305{self::Class2}, #t306), 0) in let final void #t308 = self::Extension2|[]=(#t305{self::Class2}, #t306, #t307) in #t307;
+  let final self::Class3? #t309 = n3 in #t309.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t310 = self::Extension3|[](#t309{self::Class3}, nullable3) in #t310.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t311 = nullable2 in self::Extension2|[]=(#t310{self::Class2}, #t311, self::Extension2|+(self::Extension2|[](#t310{self::Class2}, #t311), 1));
+  nullable2 = let final self::Class3? #t312 = n3 in #t312.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t313 = self::Extension3|[](#t312{self::Class3}, nullable3) in #t313.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t314 = nullable2 in let final self::Class2 #t315 = self::Extension2|[](#t313{self::Class2}, #t314) in let final void #t316 = self::Extension2|[]=(#t313{self::Class2}, #t314, self::Extension2|+(#t315, 1)) in #t315;
+  let final self::Class3? #t317 = n3 in #t317.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t318 = self::Extension3|[](#t317{self::Class3}, nullable3) in #t318.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t319 = nullable2 in let final self::Class2 #t320 = self::Extension2|+(self::Extension2|[](#t318{self::Class2}, #t319), 1) in let final void #t321 = self::Extension2|[]=(#t318{self::Class2}, #t319, #t320) in #t320;
+  nullable2 = let final self::Class3? #t322 = n3 in #t322.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t323 = self::Extension3|[](#t322{self::Class3}, nullable3) in #t323.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t324 = nullable2 in let final self::Class2 #t325 = self::Extension2|+(self::Extension2|[](#t323{self::Class2}, #t324), 1) in let final void #t326 = self::Extension2|[]=(#t323{self::Class2}, #t324, #t325) in #t325;
 }
 static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
   self::Class2? nullable2 = n2;
-  self::throws(() → self::Class1? => self::Extension1|+(let final self::Class1? #t325 = n1 in #t325.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t325{self::Class1}), 0));
-  self::throws(() → self::Class1? => self::Extension1|unary-(let final self::Class1? #t326 = n1 in #t326.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t326{self::Class1})));
-  let final self::Class2? #t327 = n2 in #t327.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t327, self::Extension2|+(self::Extension2|get#nonNullable2(#t327), 0));
-  nullable2 = let final self::Class2? #t328 = n2 in #t328.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t329 = self::Extension2|+(self::Extension2|get#nonNullable2(#t328), 0) in let final void #t330 = self::Extension2|set#nonNullable2(#t328, #t329) in #t329;
-  let final self::Class2? #t331 = n2 in #t331.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t332 = self::Extension2|get#nonNullable2(#t331{self::Class2}) in self::Extension2|set#nonNullable2(#t332, self::Extension2|+(self::Extension2|get#nonNullable2(#t332), 0));
-  nullable2 = let final self::Class2? #t333 = n2 in #t333.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t334 = self::Extension2|get#nonNullable2(#t333{self::Class2}) in let final self::Class2 #t335 = self::Extension2|+(self::Extension2|get#nonNullable2(#t334), 0) in let final void #t336 = self::Extension2|set#nonNullable2(#t334, #t335) in #t335;
-  let final self::Class2? #t337 = n2 in #t337.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t337, self::Extension2|+(self::Extension2|get#nonNullable2(#t337), 1));
-  nullable2 = let final self::Class2? #t338 = n2 in #t338.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t339 = self::Extension2|get#nonNullable2(#t338) in let final void #t340 = self::Extension2|set#nonNullable2(#t338, self::Extension2|+(#t339, 1)) in #t339;
-  let final self::Class2? #t341 = n2 in #t341.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t342 = self::Extension2|+(self::Extension2|get#nonNullable2(#t341), 1) in let final void #t343 = self::Extension2|set#nonNullable2(#t341, #t342) in #t342;
-  nullable2 = let final self::Class2? #t344 = n2 in #t344.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t345 = self::Extension2|+(self::Extension2|get#nonNullable2(#t344), 1) in let final void #t346 = self::Extension2|set#nonNullable2(#t344, #t345) in #t345;
+  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.
+ - '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.
+ - '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})));
+  let final self::Class2? #t331 = n2 in #t331.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t331, self::Extension2|+(self::Extension2|get#nonNullable2(#t331), 0));
+  nullable2 = let final self::Class2? #t332 = n2 in #t332.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t333 = self::Extension2|+(self::Extension2|get#nonNullable2(#t332), 0) in let final void #t334 = self::Extension2|set#nonNullable2(#t332, #t333) in #t333;
+  let final self::Class2? #t335 = n2 in #t335.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t336 = self::Extension2|get#nonNullable2(#t335{self::Class2}) in self::Extension2|set#nonNullable2(#t336, self::Extension2|+(self::Extension2|get#nonNullable2(#t336), 0));
+  nullable2 = let final self::Class2? #t337 = n2 in #t337.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t338 = self::Extension2|get#nonNullable2(#t337{self::Class2}) in let final self::Class2 #t339 = self::Extension2|+(self::Extension2|get#nonNullable2(#t338), 0) in let final void #t340 = self::Extension2|set#nonNullable2(#t338, #t339) in #t339;
+  let final self::Class2? #t341 = n2 in #t341.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t341, self::Extension2|+(self::Extension2|get#nonNullable2(#t341), 1));
+  nullable2 = let final self::Class2? #t342 = n2 in #t342.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t343 = self::Extension2|get#nonNullable2(#t342) in let final void #t344 = self::Extension2|set#nonNullable2(#t342, self::Extension2|+(#t343, 1)) in #t343;
+  let final self::Class2? #t345 = n2 in #t345.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t346 = self::Extension2|+(self::Extension2|get#nonNullable2(#t345), 1) in let final void #t347 = self::Extension2|set#nonNullable2(#t345, #t346) in #t346;
+  nullable2 = let final self::Class2? #t348 = n2 in #t348.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t349 = self::Extension2|+(self::Extension2|get#nonNullable2(#t348), 1) in let final void #t350 = self::Extension2|set#nonNullable2(#t348, #t349) in #t349;
 }
 static method ifNull(self::Class1? n1) → void {
   self::Class1? nullable1 = n1;
-  let final self::Class1? #t347 = n1 in #t347.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t347).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t347, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t348 = n1 in #t348.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t349 = self::Extension1|get#nullable1(#t348) in #t349.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t350 = n1{self::Class1} in let final void #t351 = self::Extension1|set#nullable1(#t348, #t350) in #t350 : #t349{self::Class1};
-  let final self::Class1? #t352 = n1 in #t352.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t353 = self::Extension1|get#nonNullable1(#t352{self::Class1}) in self::Extension1|get#nullable1(#t353{self::Class1}).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t353{self::Class1}, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t354 = n1 in #t354.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t355 = self::Extension1|get#nonNullable1(#t354{self::Class1}) in let final self::Class1? #t356 = self::Extension1|get#nullable1(#t355{self::Class1}) in #t356.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t357 = n1{self::Class1} in let final void #t358 = self::Extension1|set#nullable1(#t355{self::Class1}, #t357) in #t357 : #t356{self::Class1};
-  let final self::Class1? #t359 = n1 in #t359.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t360 = self::Extension1|get#nonNullable1(#t359{self::Class1}) in let final self::Class1 #t361 = n1{self::Class1} in self::Extension1|[](#t360, #t361).{core::Object::==}(null) ?{self::Class1} self::Extension1|[]=(#t360, #t361, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t362 = n1 in #t362.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t363 = self::Extension1|get#nonNullable1(#t362{self::Class1}) in let final self::Class1 #t364 = n1{self::Class1} in let final self::Class1? #t365 = self::Extension1|[](#t363, #t364) in #t365.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t366 = n1{self::Class1} in let final void #t367 = self::Extension1|[]=(#t363, #t364, #t366) in #t366 : #t365{self::Class1};
+  let final self::Class1? #t351 = n1 in #t351.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t351).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t351, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t352 = n1 in #t352.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t353 = self::Extension1|get#nullable1(#t352) in #t353.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t354 = n1{self::Class1} in let final void #t355 = self::Extension1|set#nullable1(#t352, #t354) in #t354 : #t353{self::Class1};
+  let final self::Class1? #t356 = n1 in #t356.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t357 = self::Extension1|get#nonNullable1(#t356{self::Class1}) in self::Extension1|get#nullable1(#t357{self::Class1}).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t357{self::Class1}, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t358 = n1 in #t358.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t359 = self::Extension1|get#nonNullable1(#t358{self::Class1}) in let final self::Class1? #t360 = self::Extension1|get#nullable1(#t359{self::Class1}) in #t360.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t361 = n1{self::Class1} in let final void #t362 = self::Extension1|set#nullable1(#t359{self::Class1}, #t361) in #t361 : #t360{self::Class1};
+  let final self::Class1? #t363 = n1 in #t363.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t364 = self::Extension1|get#nonNullable1(#t363{self::Class1}) in let final self::Class1 #t365 = n1{self::Class1} in self::Extension1|[](#t364, #t365).{core::Object::==}(null) ?{self::Class1} self::Extension1|[]=(#t364, #t365, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t366 = n1 in #t366.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t367 = self::Extension1|get#nonNullable1(#t366{self::Class1}) in let final self::Class1 #t368 = n1{self::Class1} in let final self::Class1? #t369 = self::Extension1|[](#t367, #t368) in #t369.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t370 = n1{self::Class1} in let final void #t371 = self::Extension1|[]=(#t367, #t368, #t370) in #t370 : #t369{self::Class1};
 }
 static method throws(() → void f) → void {
   try {
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 dce5931..51808db 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
@@ -2,24 +2,24 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// 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);
 //                                               ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:94:43: Warning: Property 'nullable1' is accessed on 'Class1?' which is potentially null.
+// 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);
 //                                           ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:226:33: Warning: Operator '+' is called on 'Class1?' which is potentially null.
+// 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);
 //                                 ^
 //
-// pkg/front_end/testcases/nnbd/null_shorting_extension.dart:227:16: Warning: Operator 'unary-' is called on 'Class1?' which is potentially null.
+// 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);
 //                ^
@@ -139,139 +139,153 @@
   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? => self::Extension1|get#nullable1(let final self::Class1? #t19 = n1 in #t19.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t20 = new self::Class1::•() in let final void #t21 = self::Extension1|set#nullable1(#t19{self::Class1}, #t20) in #t20));
-  self::throws(() → self::Class1? => self::Extension1|get#nullable1(let final self::Class1? #t22 = n1 in #t22.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t22{self::Class1})));
-  nullable1 = let final self::Class1? #t23 = n1 in #t23.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t24 = new self::Class1::•() in let final void #t25 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t23{self::Class1}), #t24) in #t24;
-  nullable1 = let final self::Class1? #t26 = n1 in #t26.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t27 = self::Extension1|get#nullable1(#t26{self::Class1}) in #t27.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t28 = new self::Class1::•() in let final void #t29 = self::Extension1|set#nullable1(#t27{self::Class1}, #t28) in #t28;
-  nullable1 = let final self::Class1? #t30 = n1 in #t30.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t31 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t30{self::Class1})) in #t31.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t32 = new self::Class1::•() in let final void #t33 = self::Extension1|set#nullable1(#t31{self::Class1}, #t32) in #t32;
-  let final self::Class1? #t34 = n1 in #t34.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t35 = self::Extension1|get#nullable1(#t34{self::Class1}) in #t35.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t35{self::Class1});
-  let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t36{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t37 = n1 in #t37.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t38 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t39 = self::Extension1|set#nullable1(#t37{self::Class1}, #t38) in #t38;
-  let final self::Class1? #t40 = n1 in #t40.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t40{self::Class1}, let final self::Class1 #t41 = new self::Class1::•() in let final void #t42 = self::Extension1|set#nullable1(new self::Class1::•(), #t41) in #t41);
-  nullable1 = let final self::Class1? #t43 = n1 in #t43.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t44 = let final self::Class1 #t45 = new self::Class1::•() in let final void #t46 = self::Extension1|set#nullable1(new self::Class1::•(), #t45) in #t45 in let final void #t47 = self::Extension1|set#nullable1(#t43{self::Class1}, #t44) in #t44;
-  let final self::Class1? #t48 = n1 in #t48.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t49 = n1 in #t49.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t50 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t51 = self::Extension1|set#nullable1(#t49{self::Class1}, #t50) in #t50;
-  let final self::Class1? #t52 = n1 in #t52.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t52{self::Class1}));
-  let final self::Class1? #t53 = n1 in #t53.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
-  let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t54{self::Class1}));
-  let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t55{self::Class1})));
-  let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
-  nullable1 = let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t58 = new self::Class1::•() in let final void #t59 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})), #t58) in #t58;
-  let final self::Class1? #t60 = n1 in #t60.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t61 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t60{self::Class1})) in #t61.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t61{self::Class1});
-  let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
-  nullable1 = let final self::Class1? #t63 = n1 in #t63.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t64 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t65 = self::Extension1|set#nullable1(#t63{self::Class1}, #t64) in #t64;
-  let final self::Class1? #t66 = n1 in #t66.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t66{self::Class1}, let final self::Class1 #t67 = new self::Class1::•() in let final void #t68 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t67) in #t67);
-  nullable1 = let final self::Class1? #t69 = n1 in #t69.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t70 = let final self::Class1 #t71 = new self::Class1::•() in let final void #t72 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t71) in #t71 in let final void #t73 = self::Extension1|set#nullable1(#t69{self::Class1}, #t70) in #t70;
-  let final self::Class1? #t74 = n1 in #t74.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
-  nullable1 = let final self::Class1? #t75 = n1 in #t75.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t76 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t77 = self::Extension1|set#nullable1(#t75{self::Class1}, #t76) in #t76;
-  let final self::Class1? #t78 = n1 in #t78.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t78{self::Class1})));
-  let final self::Class1? #t79 = n1 in #t79.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
-  let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
-  let final self::Class1? #t81 = n1 in #t81.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t83 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t84 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t82{self::Class1}), #t83) in #t83;
-  let final self::Class1? #t85 = n1 in #t85.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
-  nullable1 = let final self::Class1? #t88 = n1 in #t88.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t89 = let final self::Class1 #t90 = new self::Class1::•() in let final void #t91 = self::Extension1|set#nullable1(new self::Class1::•(), #t90) in #t90 in let final void #t92 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t88{self::Class1}), #t89) in #t89;
-  let final self::Class1? #t93 = n1 in #t93.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t94 = n1 in #t94.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t95 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t96 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t94{self::Class1}), #t95) in #t95;
-  let final self::Class1? #t97 = n1 in #t97.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
-  nullable1 = let final self::Class1? #t100 = n1 in #t100.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t101 = let final self::Class1? #t102 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t103 = self::Extension1|set#nullable1(new self::Class1::•(), #t102) in #t102 in let final void #t104 = self::Extension1|set#nullable1(#t100{self::Class1}, #t101) in #t101;
-  let final self::Class1? #t105 = n1 in #t105.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t105{self::Class1}, let final self::Class1 #t106 = let final self::Class1 #t107 = new self::Class1::•() in let final void #t108 = self::Extension1|set#nullable1(new self::Class1::•(), #t107) in #t107 in let final void #t109 = self::Extension1|set#nullable1(new self::Class1::•(), #t106) in #t106);
-  nullable1 = let final self::Class1? #t110 = n1 in #t110.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t111 = let final self::Class1 #t112 = let final self::Class1 #t113 = new self::Class1::•() in let final void #t114 = self::Extension1|set#nullable1(new self::Class1::•(), #t113) in #t113 in let final void #t115 = self::Extension1|set#nullable1(new self::Class1::•(), #t112) in #t112 in let final void #t116 = self::Extension1|set#nullable1(#t110{self::Class1}, #t111) in #t111;
-  let final self::Class1? #t117 = n1 in #t117.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
-  nullable1 = let final self::Class1? #t120 = n1 in #t120.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t121 = let final self::Class1 #t122 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t123 = self::Extension1|set#nullable1(new self::Class1::•(), #t122) in #t122 in let final void #t124 = self::Extension1|set#nullable1(#t120{self::Class1}, #t121) in #t121;
-  let final self::Class1? #t125 = n1 in #t125.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t126 = n1 in #t126.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t127 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t128 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t126{self::Class1}), #t127) in #t127;
-  let final self::Class1? #t129 = n1 in #t129.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
-  nullable1 = let final self::Class1? #t132 = n1 in #t132.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t133 = let final self::Class1 #t134 = new self::Class1::•() in let final void #t135 = self::Extension1|set#nullable1(new self::Class1::•(), #t134) in #t134 in let final void #t136 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t132{self::Class1}), #t133) in #t133;
-  let final self::Class1? #t137 = n1 in #t137.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
-  nullable1 = let final self::Class1? #t138 = n1 in #t138.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t139 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t140 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t138{self::Class1}), #t139) in #t139;
-  let final self::Class1? #t141 = n1 in #t141.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t141{self::Class1})));
-  let final self::Class1? #t142 = n1 in #t142.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
-  nullable1 = let final self::Class1? #t143 = n1 in #t143.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t144 = new self::Class1::•() in let final void #t145 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})), #t144) in #t144;
-  let final self::Class1? #t146 = n1 in #t146.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t146{self::Class1})));
-  let final self::Class1? #t147 = n1 in #t147.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
-  nullable1 = let final self::Class1? #t148 = n1 in #t148.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t149 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t150 = self::Extension1|set#nullable1(#t148{self::Class1}, #t149) in #t149;
-  let final self::Class1? #t151 = n1 in #t151.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t151{self::Class1}, let final self::Class1 #t152 = new self::Class1::•() in let final void #t153 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t152) in #t152);
-  nullable1 = let final self::Class1? #t154 = n1 in #t154.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t155 = let final self::Class1 #t156 = new self::Class1::•() in let final void #t157 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t156) in #t156 in let final void #t158 = self::Extension1|set#nullable1(#t154{self::Class1}, #t155) in #t155;
-  let final self::Class1? #t159 = n1 in #t159.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
-  nullable1 = let final self::Class1? #t160 = n1 in #t160.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t161 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t162 = self::Extension1|set#nullable1(#t160{self::Class1}, #t161) in #t161;
-  let final self::Class1? #t163 = n1 in #t163.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t163{self::Class1})));
-  let final self::Class1? #t164 = n1 in #t164.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
-  let final self::Class1? #t165 = n1 in #t165.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
-  let final self::Class1? #t166 = n1 in #t166.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t167 = self::Extension1|nonNullable1Method(#t166{self::Class1}) in #t167.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t167{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.
+ - '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.
+ - 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
+Try accessing using ?. instead.
+  throws(() => (n1?.nonNullable1Method()).nullable1);
+                                          ^^^^^^^^^" in self::Extension1|get#nullable1(let final self::Class1? #t24 = n1 in #t24.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t24{self::Class1})));
+  nullable1 = let final self::Class1? #t25 = n1 in #t25.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t26 = new self::Class1::•() in let final void #t27 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t25{self::Class1}), #t26) in #t26;
+  nullable1 = let final self::Class1? #t28 = n1 in #t28.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t29 = self::Extension1|get#nullable1(#t28{self::Class1}) in #t29.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t30 = new self::Class1::•() in let final void #t31 = self::Extension1|set#nullable1(#t29{self::Class1}, #t30) in #t30;
+  nullable1 = let final self::Class1? #t32 = n1 in #t32.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t33 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t32{self::Class1})) in #t33.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t34 = new self::Class1::•() in let final void #t35 = self::Extension1|set#nullable1(#t33{self::Class1}, #t34) in #t34;
+  let final self::Class1? #t36 = n1 in #t36.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t37 = self::Extension1|get#nullable1(#t36{self::Class1}) in #t37.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t37{self::Class1});
+  let final self::Class1? #t38 = n1 in #t38.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t38{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t39 = n1 in #t39.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t40 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t41 = self::Extension1|set#nullable1(#t39{self::Class1}, #t40) in #t40;
+  let final self::Class1? #t42 = n1 in #t42.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t42{self::Class1}, let final self::Class1 #t43 = new self::Class1::•() in let final void #t44 = self::Extension1|set#nullable1(new self::Class1::•(), #t43) in #t43);
+  nullable1 = let final self::Class1? #t45 = n1 in #t45.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t46 = let final self::Class1 #t47 = new self::Class1::•() in let final void #t48 = self::Extension1|set#nullable1(new self::Class1::•(), #t47) in #t47 in let final void #t49 = self::Extension1|set#nullable1(#t45{self::Class1}, #t46) in #t46;
+  let final self::Class1? #t50 = n1 in #t50.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t50{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t51 = n1 in #t51.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t52 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t53 = self::Extension1|set#nullable1(#t51{self::Class1}, #t52) in #t52;
+  let final self::Class1? #t54 = n1 in #t54.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t54{self::Class1}));
+  let final self::Class1? #t55 = n1 in #t55.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t55{self::Class1}), new self::Class1::•());
+  let final self::Class1? #t56 = n1 in #t56.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t56{self::Class1}));
+  let final self::Class1? #t57 = n1 in #t57.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})));
+  let final self::Class1? #t58 = n1 in #t58.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t58{self::Class1})), new self::Class1::•());
+  nullable1 = let final self::Class1? #t59 = n1 in #t59.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t60 = new self::Class1::•() in let final void #t61 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t59{self::Class1})), #t60) in #t60;
+  let final self::Class1? #t62 = n1 in #t62.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t63 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t62{self::Class1})) in #t63.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t63{self::Class1});
+  let final self::Class1? #t64 = n1 in #t64.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t64{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t65 = n1 in #t65.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t66 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t67 = self::Extension1|set#nullable1(#t65{self::Class1}, #t66) in #t66;
+  let final self::Class1? #t68 = n1 in #t68.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t68{self::Class1}, let final self::Class1 #t69 = new self::Class1::•() in let final void #t70 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t69) in #t69);
+  nullable1 = let final self::Class1? #t71 = n1 in #t71.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t72 = let final self::Class1 #t73 = new self::Class1::•() in let final void #t74 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t73) in #t73 in let final void #t75 = self::Extension1|set#nullable1(#t71{self::Class1}, #t72) in #t72;
+  let final self::Class1? #t76 = n1 in #t76.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t76{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t77 = n1 in #t77.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t78 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t79 = self::Extension1|set#nullable1(#t77{self::Class1}, #t78) in #t78;
+  let final self::Class1? #t80 = n1 in #t80.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
+  let final self::Class1? #t81 = n1 in #t81.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t81{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t82 = n1 in #t82.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t82{self::Class1})));
+  let final self::Class1? #t83 = n1 in #t83.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t83{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t84 = n1 in #t84.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t85 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t86 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t84{self::Class1}), #t85) in #t85;
+  let final self::Class1? #t87 = n1 in #t87.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t87{self::Class1}), let final self::Class1 #t88 = new self::Class1::•() in let final void #t89 = self::Extension1|set#nullable1(new self::Class1::•(), #t88) in #t88);
+  nullable1 = let final self::Class1? #t90 = n1 in #t90.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t91 = let final self::Class1 #t92 = new self::Class1::•() in let final void #t93 = self::Extension1|set#nullable1(new self::Class1::•(), #t92) in #t92 in let final void #t94 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t90{self::Class1}), #t91) in #t91;
+  let final self::Class1? #t95 = n1 in #t95.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t95{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t96 = n1 in #t96.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t97 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t98 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t96{self::Class1}), #t97) in #t97;
+  let final self::Class1? #t99 = n1 in #t99.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t99{self::Class1}, let final self::Class1? #t100 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t101 = self::Extension1|set#nullable1(new self::Class1::•(), #t100) in #t100);
+  nullable1 = let final self::Class1? #t102 = n1 in #t102.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t103 = let final self::Class1? #t104 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t105 = self::Extension1|set#nullable1(new self::Class1::•(), #t104) in #t104 in let final void #t106 = self::Extension1|set#nullable1(#t102{self::Class1}, #t103) in #t103;
+  let final self::Class1? #t107 = n1 in #t107.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t107{self::Class1}, let final self::Class1 #t108 = let final self::Class1 #t109 = new self::Class1::•() in let final void #t110 = self::Extension1|set#nullable1(new self::Class1::•(), #t109) in #t109 in let final void #t111 = self::Extension1|set#nullable1(new self::Class1::•(), #t108) in #t108);
+  nullable1 = let final self::Class1? #t112 = n1 in #t112.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t113 = let final self::Class1 #t114 = let final self::Class1 #t115 = new self::Class1::•() in let final void #t116 = self::Extension1|set#nullable1(new self::Class1::•(), #t115) in #t115 in let final void #t117 = self::Extension1|set#nullable1(new self::Class1::•(), #t114) in #t114 in let final void #t118 = self::Extension1|set#nullable1(#t112{self::Class1}, #t113) in #t113;
+  let final self::Class1? #t119 = n1 in #t119.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t119{self::Class1}, let final self::Class1 #t120 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t121 = self::Extension1|set#nullable1(new self::Class1::•(), #t120) in #t120);
+  nullable1 = let final self::Class1? #t122 = n1 in #t122.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t123 = let final self::Class1 #t124 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t125 = self::Extension1|set#nullable1(new self::Class1::•(), #t124) in #t124 in let final void #t126 = self::Extension1|set#nullable1(#t122{self::Class1}, #t123) in #t123;
+  let final self::Class1? #t127 = n1 in #t127.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t127{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t128 = n1 in #t128.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t129 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t130 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t128{self::Class1}), #t129) in #t129;
+  let final self::Class1? #t131 = n1 in #t131.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t131{self::Class1}), let final self::Class1 #t132 = new self::Class1::•() in let final void #t133 = self::Extension1|set#nullable1(new self::Class1::•(), #t132) in #t132);
+  nullable1 = let final self::Class1? #t134 = n1 in #t134.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t135 = let final self::Class1 #t136 = new self::Class1::•() in let final void #t137 = self::Extension1|set#nullable1(new self::Class1::•(), #t136) in #t136 in let final void #t138 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t134{self::Class1}), #t135) in #t135;
+  let final self::Class1? #t139 = n1 in #t139.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t139{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
+  nullable1 = let final self::Class1? #t140 = n1 in #t140.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t141 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t142 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t140{self::Class1}), #t141) in #t141;
+  let final self::Class1? #t143 = n1 in #t143.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})));
+  let final self::Class1? #t144 = n1 in #t144.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t144{self::Class1})), new self::Class1::•());
+  nullable1 = let final self::Class1? #t145 = n1 in #t145.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t146 = new self::Class1::•() in let final void #t147 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t145{self::Class1})), #t146) in #t146;
+  let final self::Class1? #t148 = n1 in #t148.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t148{self::Class1})));
+  let final self::Class1? #t149 = n1 in #t149.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t149{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t150 = n1 in #t150.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t151 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t152 = self::Extension1|set#nullable1(#t150{self::Class1}, #t151) in #t151;
+  let final self::Class1? #t153 = n1 in #t153.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t153{self::Class1}, let final self::Class1 #t154 = new self::Class1::•() in let final void #t155 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t154) in #t154);
+  nullable1 = let final self::Class1? #t156 = n1 in #t156.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t157 = let final self::Class1 #t158 = new self::Class1::•() in let final void #t159 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t158) in #t158 in let final void #t160 = self::Extension1|set#nullable1(#t156{self::Class1}, #t157) in #t157;
+  let final self::Class1? #t161 = n1 in #t161.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(#t161{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
+  nullable1 = let final self::Class1? #t162 = n1 in #t162.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t163 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t164 = self::Extension1|set#nullable1(#t162{self::Class1}, #t163) in #t163;
+  let final self::Class1? #t165 = n1 in #t165.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
+  let final self::Class1? #t166 = n1 in #t166.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t166{self::Class1})), new self::Class1::•());
+  let final self::Class1? #t167 = n1 in #t167.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t167{self::Class1})));
+  let final self::Class1? #t168 = n1 in #t168.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t169 = self::Extension1|nonNullable1Method(#t168{self::Class1}) in #t169.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t169{self::Class1});
 }
 static method indexAccess(self::Class1? n1, self::Class2? n2, self::Class3? n3) → void {
   self::Class1? nullable1 = n1;
   self::Class2? nullable2 = n2;
   self::Class3? nullable3 = n3;
-  let final self::Class1? #t168 = n1 in #t168.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t168{self::Class1}, nullable1);
-  let final self::Class1? #t169 = n1 in #t169.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t169{self::Class1}, nullable1, new self::Class1::•());
-  let final self::Class1? #t170 = n1 in #t170.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t171 = self::Extension1|[](#t170{self::Class1}, nullable1) in #t171.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t171{self::Class1});
-  let final self::Class1? #t172 = n1 in #t172.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](self::Extension1|get#nonNullable1(#t172{self::Class1}), nullable1);
-  let final self::Class1? #t173 = n1 in #t173.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(self::Extension1|get#nonNullable1(#t173{self::Class1}), nullable1, new self::Class1::•());
-  nullable1 = let final self::Class1? #t174 = n1 in #t174.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t175 = self::Extension1|get#nonNullable1(#t174{self::Class1}) in let final self::Class1? #t176 = nullable1 in let final self::Class1 #t177 = new self::Class1::•() in let final void #t178 = self::Extension1|[]=(#t175, #t176, #t177) in #t177;
-  let final self::Class1? #t179 = n1 in #t179.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t180 = self::Extension1|[](self::Extension1|get#nonNullable1(#t179{self::Class1}), nullable1) in #t180.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t180{self::Class1});
-  let final self::Class1? #t181 = n1 in #t181.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t182 = self::Extension1|get#nonNullable2(#t181{self::Class1}) in let final self::Class2? #t183 = nullable2 in self::Extension2|[]=(#t182, #t183, self::Extension2|+(self::Extension2|[](#t182, #t183), 0));
-  nullable2 = let final self::Class1? #t184 = n1 in #t184.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t185 = self::Extension1|get#nonNullable2(#t184{self::Class1}) in let final self::Class2? #t186 = nullable2 in let final self::Class2 #t187 = self::Extension2|+(self::Extension2|[](#t185, #t186), 0) in let final void #t188 = self::Extension2|[]=(#t185, #t186, #t187) in #t187;
-  let final self::Class1? #t189 = n1 in #t189.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t190 = nullable1 in self::Extension1|[](#t189{self::Class1}, #t190).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t189{self::Class1}, #t190, nullable1) : null;
-  nullable1 = let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = nullable1 in let final self::Class1? #t193 = self::Extension1|[](#t191{self::Class1}, #t192) in #t193.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t194 = nullable1 in let final void #t195 = self::Extension1|[]=(#t191{self::Class1}, #t192, #t194) in #t194 : #t193{self::Class1};
-  let final self::Class2? #t196 = n2 in #t196.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t197 = nullable2 in self::Extension2|[]=(#t196{self::Class2}, #t197, self::Extension2|+(self::Extension2|[](#t196{self::Class2}, #t197), 0));
-  nullable2 = let final self::Class2? #t198 = n2 in #t198.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t199 = nullable2 in let final self::Class2 #t200 = self::Extension2|+(self::Extension2|[](#t198{self::Class2}, #t199), 0) in let final void #t201 = self::Extension2|[]=(#t198{self::Class2}, #t199, #t200) in #t200;
-  let final self::Class2? #t202 = n2 in #t202.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t203 = nullable2 in self::Extension2|[]=(#t202{self::Class2}, #t203, self::Extension2|+(self::Extension2|[](#t202{self::Class2}, #t203), 0));
-  nullable2 = let final self::Class2? #t204 = n2 in #t204.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t205 = nullable2 in let final self::Class2 #t206 = self::Extension2|+(self::Extension2|[](#t204{self::Class2}, #t205), 0) in let final void #t207 = self::Extension2|[]=(#t204{self::Class2}, #t205, #t206) in #t206;
-  let final self::Class2? #t208 = n2 in #t208.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t209 = nullable2 in self::Extension2|[]=(#t208{self::Class2}, #t209, self::Extension2|+(self::Extension2|[](#t208{self::Class2}, #t209), 1));
-  nullable2 = let final self::Class2? #t210 = n2 in #t210.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t211 = nullable2 in let final self::Class2 #t212 = self::Extension2|[](#t210{self::Class2}, #t211) in let final void #t213 = self::Extension2|[]=(#t210{self::Class2}, #t211, self::Extension2|+(#t212, 1)) in #t212;
-  let final self::Class2? #t214 = n2 in #t214.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t215 = nullable2 in let final self::Class2 #t216 = self::Extension2|+(self::Extension2|[](#t214{self::Class2}, #t215), 1) in let final void #t217 = self::Extension2|[]=(#t214{self::Class2}, #t215, #t216) in #t216;
-  nullable2 = let final self::Class2? #t218 = n2 in #t218.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t219 = nullable2 in let final self::Class2 #t220 = self::Extension2|+(self::Extension2|[](#t218{self::Class2}, #t219), 1) in let final void #t221 = self::Extension2|[]=(#t218{self::Class2}, #t219, #t220) in #t220;
-  let final self::Class1? #t222 = n1 in #t222.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t223 = self::Extension1|get#nonNullable2(#t222{self::Class1}) in let final self::Class2? #t224 = nullable2 in self::Extension2|[]=(#t223, #t224, self::Extension2|+(self::Extension2|[](#t223, #t224), 1));
-  nullable2 = let final self::Class1? #t225 = n1 in #t225.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t226 = self::Extension1|get#nonNullable2(#t225{self::Class1}) in let final self::Class2? #t227 = nullable2 in let final self::Class2 #t228 = self::Extension2|[](#t226, #t227) in let final void #t229 = self::Extension2|[]=(#t226, #t227, self::Extension2|+(#t228, 1)) in #t228;
-  let final self::Class1? #t230 = n1 in #t230.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t231 = self::Extension1|get#nonNullable2(#t230{self::Class1}) in let final self::Class2? #t232 = nullable2 in let final self::Class2 #t233 = self::Extension2|+(self::Extension2|[](#t231, #t232), 1) in let final void #t234 = self::Extension2|[]=(#t231, #t232, #t233) in #t233;
-  nullable2 = let final self::Class1? #t235 = n1 in #t235.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t236 = self::Extension1|get#nonNullable2(#t235{self::Class1}) in let final self::Class2? #t237 = nullable2 in let final self::Class2 #t238 = self::Extension2|+(self::Extension2|[](#t236, #t237), 1) in let final void #t239 = self::Extension2|[]=(#t236, #t237, #t238) in #t238;
-  let final self::Class1? #t240 = n1 in #t240.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t240{self::Class1}), nullable2), nullable2);
-  let final self::Class1? #t241 = n1 in #t241.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[]=(self::Extension2|[](self::Extension1|get#nonNullable2(#t241{self::Class1}), nullable2), nullable2, new self::Class2::•());
-  nullable2 = let final self::Class1? #t242 = n1 in #t242.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t243 = self::Extension2|[](self::Extension1|get#nonNullable2(#t242{self::Class1}), nullable2) in let final self::Class2? #t244 = nullable2 in let final self::Class2 #t245 = new self::Class2::•() in let final void #t246 = self::Extension2|[]=(#t243, #t244, #t245) in #t245;
-  let final self::Class1? #t247 = n1 in #t247.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t248 = self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t247{self::Class1}), nullable2), nullable2) in #t248.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|nonNullable2Method(#t248{self::Class2});
-  let final self::Class1? #t249 = n1 in #t249.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t250 = self::Extension2|[](self::Extension1|get#nonNullable2(#t249{self::Class1}), nullable2) in let final self::Class2? #t251 = nullable2 in self::Extension2|[]=(#t250, #t251, self::Extension2|+(self::Extension2|[](#t250, #t251), 0));
-  nullable2 = let final self::Class1? #t252 = n1 in #t252.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t253 = self::Extension2|[](self::Extension1|get#nonNullable2(#t252{self::Class1}), nullable2) in let final self::Class2? #t254 = nullable2 in let final self::Class2 #t255 = self::Extension2|+(self::Extension2|[](#t253, #t254), 0) in let final void #t256 = self::Extension2|[]=(#t253, #t254, #t255) in #t255;
-  let final self::Class1? #t257 = n1 in #t257.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t258 = self::Extension2|[](self::Extension1|get#nonNullable2(#t257{self::Class1}), nullable2) in let final self::Class2? #t259 = nullable2 in self::Extension2|[]=(#t258, #t259, self::Extension2|+(self::Extension2|[](#t258, #t259), 1));
-  nullable2 = let final self::Class1? #t260 = n1 in #t260.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t261 = self::Extension2|[](self::Extension1|get#nonNullable2(#t260{self::Class1}), nullable2) in let final self::Class2? #t262 = nullable2 in let final self::Class2 #t263 = self::Extension2|[](#t261, #t262) in let final void #t264 = self::Extension2|[]=(#t261, #t262, self::Extension2|+(#t263, 1)) in #t263;
-  let final self::Class1? #t265 = n1 in #t265.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t266 = self::Extension2|[](self::Extension1|get#nonNullable2(#t265{self::Class1}), nullable2) in let final self::Class2? #t267 = nullable2 in let final self::Class2 #t268 = self::Extension2|+(self::Extension2|[](#t266, #t267), 1) in let final void #t269 = self::Extension2|[]=(#t266, #t267, #t268) in #t268;
-  nullable2 = let final self::Class1? #t270 = n1 in #t270.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t271 = self::Extension2|[](self::Extension1|get#nonNullable2(#t270{self::Class1}), nullable2) in let final self::Class2? #t272 = nullable2 in let final self::Class2 #t273 = self::Extension2|+(self::Extension2|[](#t271, #t272), 1) in let final void #t274 = self::Extension2|[]=(#t271, #t272, #t273) in #t273;
-  let final self::Class1? #t275 = n1 in #t275.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t276 = self::Extension1|[](#t275{self::Class1}, nullable1) in #t276.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t276{self::Class1}, nullable1);
-  let final self::Class1? #t277 = n1 in #t277.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t278 = self::Extension1|[](#t277{self::Class1}, nullable1) in #t278.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t278{self::Class1}, nullable1, new self::Class1::•());
-  nullable1 = let final self::Class1? #t279 = n1 in #t279.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t280 = self::Extension1|[](#t279{self::Class1}, nullable1) in #t280.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t281 = nullable1 in let final self::Class1 #t282 = new self::Class1::•() in let final void #t283 = self::Extension1|[]=(#t280{self::Class1}, #t281, #t282) in #t282;
-  let final self::Class1? #t284 = n1 in #t284.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t285 = self::Extension1|[](#t284{self::Class1}, nullable1) in #t285.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t286 = self::Extension1|[](#t285{self::Class1}, nullable1) in #t286.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t286{self::Class1});
-  nullable1 = let final self::Class1? #t287 = n1 in #t287.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t288 = self::Extension1|[](#t287{self::Class1}, nullable1) in #t288.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t289 = self::Extension1|[](#t288{self::Class1}, nullable1) in #t289.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t289{self::Class1});
-  let final self::Class1? #t290 = n1 in #t290.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t291 = self::Extension1|[](#t290{self::Class1}, nullable1) in #t291.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t292 = nullable1 in self::Extension1|[](#t291{self::Class1}, #t292).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t291{self::Class1}, #t292, nullable1) : null;
-  nullable1 = let final self::Class1? #t293 = n1 in #t293.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t294 = self::Extension1|[](#t293{self::Class1}, nullable1) in #t294.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t295 = nullable1 in let final self::Class1? #t296 = self::Extension1|[](#t294{self::Class1}, #t295) in #t296.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t297 = nullable1 in let final void #t298 = self::Extension1|[]=(#t294{self::Class1}, #t295, #t297) in #t297 : #t296{self::Class1};
-  let final self::Class3? #t299 = n3 in #t299.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t300 = self::Extension3|[](#t299{self::Class3}, nullable3) in #t300.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t301 = nullable2 in self::Extension2|[]=(#t300{self::Class2}, #t301, self::Extension2|+(self::Extension2|[](#t300{self::Class2}, #t301), 0));
-  nullable2 = let final self::Class3? #t302 = n3 in #t302.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t303 = self::Extension3|[](#t302{self::Class3}, nullable3) in #t303.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t304 = nullable2 in let final self::Class2 #t305 = self::Extension2|+(self::Extension2|[](#t303{self::Class2}, #t304), 0) in let final void #t306 = self::Extension2|[]=(#t303{self::Class2}, #t304, #t305) in #t305;
-  let final self::Class3? #t307 = n3 in #t307.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t308 = self::Extension3|[](#t307{self::Class3}, nullable3) in #t308.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t309 = nullable2 in self::Extension2|[]=(#t308{self::Class2}, #t309, self::Extension2|+(self::Extension2|[](#t308{self::Class2}, #t309), 1));
-  nullable2 = let final self::Class3? #t310 = n3 in #t310.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t311 = self::Extension3|[](#t310{self::Class3}, nullable3) in #t311.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t312 = nullable2 in let final self::Class2 #t313 = self::Extension2|[](#t311{self::Class2}, #t312) in let final void #t314 = self::Extension2|[]=(#t311{self::Class2}, #t312, self::Extension2|+(#t313, 1)) in #t313;
-  let final self::Class3? #t315 = n3 in #t315.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t316 = self::Extension3|[](#t315{self::Class3}, nullable3) in #t316.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t317 = nullable2 in let final self::Class2 #t318 = self::Extension2|+(self::Extension2|[](#t316{self::Class2}, #t317), 1) in let final void #t319 = self::Extension2|[]=(#t316{self::Class2}, #t317, #t318) in #t318;
-  nullable2 = let final self::Class3? #t320 = n3 in #t320.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t321 = self::Extension3|[](#t320{self::Class3}, nullable3) in #t321.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t322 = nullable2 in let final self::Class2 #t323 = self::Extension2|+(self::Extension2|[](#t321{self::Class2}, #t322), 1) in let final void #t324 = self::Extension2|[]=(#t321{self::Class2}, #t322, #t323) in #t323;
+  let final self::Class1? #t170 = n1 in #t170.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t170{self::Class1}, nullable1);
+  let final self::Class1? #t171 = n1 in #t171.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t171{self::Class1}, nullable1, new self::Class1::•());
+  let final self::Class1? #t172 = n1 in #t172.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t173 = self::Extension1|[](#t172{self::Class1}, nullable1) in #t173.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t173{self::Class1});
+  let final self::Class1? #t174 = n1 in #t174.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](self::Extension1|get#nonNullable1(#t174{self::Class1}), nullable1);
+  let final self::Class1? #t175 = n1 in #t175.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(self::Extension1|get#nonNullable1(#t175{self::Class1}), nullable1, new self::Class1::•());
+  nullable1 = let final self::Class1? #t176 = n1 in #t176.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t177 = self::Extension1|get#nonNullable1(#t176{self::Class1}) in let final self::Class1? #t178 = nullable1 in let final self::Class1 #t179 = new self::Class1::•() in let final void #t180 = self::Extension1|[]=(#t177, #t178, #t179) in #t179;
+  let final self::Class1? #t181 = n1 in #t181.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t182 = self::Extension1|[](self::Extension1|get#nonNullable1(#t181{self::Class1}), nullable1) in #t182.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t182{self::Class1});
+  let final self::Class1? #t183 = n1 in #t183.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t184 = self::Extension1|get#nonNullable2(#t183{self::Class1}) in let final self::Class2? #t185 = nullable2 in self::Extension2|[]=(#t184, #t185, self::Extension2|+(self::Extension2|[](#t184, #t185), 0));
+  nullable2 = let final self::Class1? #t186 = n1 in #t186.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t187 = self::Extension1|get#nonNullable2(#t186{self::Class1}) in let final self::Class2? #t188 = nullable2 in let final self::Class2 #t189 = self::Extension2|+(self::Extension2|[](#t187, #t188), 0) in let final void #t190 = self::Extension2|[]=(#t187, #t188, #t189) in #t189;
+  let final self::Class1? #t191 = n1 in #t191.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t192 = nullable1 in self::Extension1|[](#t191{self::Class1}, #t192).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t191{self::Class1}, #t192, nullable1) : null;
+  nullable1 = let final self::Class1? #t193 = n1 in #t193.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t194 = nullable1 in let final self::Class1? #t195 = self::Extension1|[](#t193{self::Class1}, #t194) in #t195.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t196 = nullable1 in let final void #t197 = self::Extension1|[]=(#t193{self::Class1}, #t194, #t196) in #t196 : #t195{self::Class1};
+  let final self::Class2? #t198 = n2 in #t198.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t199 = nullable2 in self::Extension2|[]=(#t198{self::Class2}, #t199, self::Extension2|+(self::Extension2|[](#t198{self::Class2}, #t199), 0));
+  nullable2 = let final self::Class2? #t200 = n2 in #t200.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t201 = nullable2 in let final self::Class2 #t202 = self::Extension2|+(self::Extension2|[](#t200{self::Class2}, #t201), 0) in let final void #t203 = self::Extension2|[]=(#t200{self::Class2}, #t201, #t202) in #t202;
+  let final self::Class2? #t204 = n2 in #t204.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t205 = nullable2 in self::Extension2|[]=(#t204{self::Class2}, #t205, self::Extension2|+(self::Extension2|[](#t204{self::Class2}, #t205), 0));
+  nullable2 = let final self::Class2? #t206 = n2 in #t206.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t207 = nullable2 in let final self::Class2 #t208 = self::Extension2|+(self::Extension2|[](#t206{self::Class2}, #t207), 0) in let final void #t209 = self::Extension2|[]=(#t206{self::Class2}, #t207, #t208) in #t208;
+  let final self::Class2? #t210 = n2 in #t210.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t211 = nullable2 in self::Extension2|[]=(#t210{self::Class2}, #t211, self::Extension2|+(self::Extension2|[](#t210{self::Class2}, #t211), 1));
+  nullable2 = let final self::Class2? #t212 = n2 in #t212.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t213 = nullable2 in let final self::Class2 #t214 = self::Extension2|[](#t212{self::Class2}, #t213) in let final void #t215 = self::Extension2|[]=(#t212{self::Class2}, #t213, self::Extension2|+(#t214, 1)) in #t214;
+  let final self::Class2? #t216 = n2 in #t216.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t217 = nullable2 in let final self::Class2 #t218 = self::Extension2|+(self::Extension2|[](#t216{self::Class2}, #t217), 1) in let final void #t219 = self::Extension2|[]=(#t216{self::Class2}, #t217, #t218) in #t218;
+  nullable2 = let final self::Class2? #t220 = n2 in #t220.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t221 = nullable2 in let final self::Class2 #t222 = self::Extension2|+(self::Extension2|[](#t220{self::Class2}, #t221), 1) in let final void #t223 = self::Extension2|[]=(#t220{self::Class2}, #t221, #t222) in #t222;
+  let final self::Class1? #t224 = n1 in #t224.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t225 = self::Extension1|get#nonNullable2(#t224{self::Class1}) in let final self::Class2? #t226 = nullable2 in self::Extension2|[]=(#t225, #t226, self::Extension2|+(self::Extension2|[](#t225, #t226), 1));
+  nullable2 = let final self::Class1? #t227 = n1 in #t227.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t228 = self::Extension1|get#nonNullable2(#t227{self::Class1}) in let final self::Class2? #t229 = nullable2 in let final self::Class2 #t230 = self::Extension2|[](#t228, #t229) in let final void #t231 = self::Extension2|[]=(#t228, #t229, self::Extension2|+(#t230, 1)) in #t230;
+  let final self::Class1? #t232 = n1 in #t232.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t233 = self::Extension1|get#nonNullable2(#t232{self::Class1}) in let final self::Class2? #t234 = nullable2 in let final self::Class2 #t235 = self::Extension2|+(self::Extension2|[](#t233, #t234), 1) in let final void #t236 = self::Extension2|[]=(#t233, #t234, #t235) in #t235;
+  nullable2 = let final self::Class1? #t237 = n1 in #t237.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t238 = self::Extension1|get#nonNullable2(#t237{self::Class1}) in let final self::Class2? #t239 = nullable2 in let final self::Class2 #t240 = self::Extension2|+(self::Extension2|[](#t238, #t239), 1) in let final void #t241 = self::Extension2|[]=(#t238, #t239, #t240) in #t240;
+  let final self::Class1? #t242 = n1 in #t242.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t242{self::Class1}), nullable2), nullable2);
+  let final self::Class1? #t243 = n1 in #t243.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|[]=(self::Extension2|[](self::Extension1|get#nonNullable2(#t243{self::Class1}), nullable2), nullable2, new self::Class2::•());
+  nullable2 = let final self::Class1? #t244 = n1 in #t244.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t245 = self::Extension2|[](self::Extension1|get#nonNullable2(#t244{self::Class1}), nullable2) in let final self::Class2? #t246 = nullable2 in let final self::Class2 #t247 = new self::Class2::•() in let final void #t248 = self::Extension2|[]=(#t245, #t246, #t247) in #t247;
+  let final self::Class1? #t249 = n1 in #t249.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t250 = self::Extension2|[](self::Extension2|[](self::Extension1|get#nonNullable2(#t249{self::Class1}), nullable2), nullable2) in #t250.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|nonNullable2Method(#t250{self::Class2});
+  let final self::Class1? #t251 = n1 in #t251.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t252 = self::Extension2|[](self::Extension1|get#nonNullable2(#t251{self::Class1}), nullable2) in let final self::Class2? #t253 = nullable2 in self::Extension2|[]=(#t252, #t253, self::Extension2|+(self::Extension2|[](#t252, #t253), 0));
+  nullable2 = let final self::Class1? #t254 = n1 in #t254.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t255 = self::Extension2|[](self::Extension1|get#nonNullable2(#t254{self::Class1}), nullable2) in let final self::Class2? #t256 = nullable2 in let final self::Class2 #t257 = self::Extension2|+(self::Extension2|[](#t255, #t256), 0) in let final void #t258 = self::Extension2|[]=(#t255, #t256, #t257) in #t257;
+  let final self::Class1? #t259 = n1 in #t259.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t260 = self::Extension2|[](self::Extension1|get#nonNullable2(#t259{self::Class1}), nullable2) in let final self::Class2? #t261 = nullable2 in self::Extension2|[]=(#t260, #t261, self::Extension2|+(self::Extension2|[](#t260, #t261), 1));
+  nullable2 = let final self::Class1? #t262 = n1 in #t262.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t263 = self::Extension2|[](self::Extension1|get#nonNullable2(#t262{self::Class1}), nullable2) in let final self::Class2? #t264 = nullable2 in let final self::Class2 #t265 = self::Extension2|[](#t263, #t264) in let final void #t266 = self::Extension2|[]=(#t263, #t264, self::Extension2|+(#t265, 1)) in #t265;
+  let final self::Class1? #t267 = n1 in #t267.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t268 = self::Extension2|[](self::Extension1|get#nonNullable2(#t267{self::Class1}), nullable2) in let final self::Class2? #t269 = nullable2 in let final self::Class2 #t270 = self::Extension2|+(self::Extension2|[](#t268, #t269), 1) in let final void #t271 = self::Extension2|[]=(#t268, #t269, #t270) in #t270;
+  nullable2 = let final self::Class1? #t272 = n1 in #t272.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t273 = self::Extension2|[](self::Extension1|get#nonNullable2(#t272{self::Class1}), nullable2) in let final self::Class2? #t274 = nullable2 in let final self::Class2 #t275 = self::Extension2|+(self::Extension2|[](#t273, #t274), 1) in let final void #t276 = self::Extension2|[]=(#t273, #t274, #t275) in #t275;
+  let final self::Class1? #t277 = n1 in #t277.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t278 = self::Extension1|[](#t277{self::Class1}, nullable1) in #t278.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[](#t278{self::Class1}, nullable1);
+  let final self::Class1? #t279 = n1 in #t279.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t280 = self::Extension1|[](#t279{self::Class1}, nullable1) in #t280.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|[]=(#t280{self::Class1}, nullable1, new self::Class1::•());
+  nullable1 = let final self::Class1? #t281 = n1 in #t281.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t282 = self::Extension1|[](#t281{self::Class1}, nullable1) in #t282.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t283 = nullable1 in let final self::Class1 #t284 = new self::Class1::•() in let final void #t285 = self::Extension1|[]=(#t282{self::Class1}, #t283, #t284) in #t284;
+  let final self::Class1? #t286 = n1 in #t286.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t287 = self::Extension1|[](#t286{self::Class1}, nullable1) in #t287.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t288 = self::Extension1|[](#t287{self::Class1}, nullable1) in #t288.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t288{self::Class1});
+  nullable1 = let final self::Class1? #t289 = n1 in #t289.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t290 = self::Extension1|[](#t289{self::Class1}, nullable1) in #t290.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t291 = self::Extension1|[](#t290{self::Class1}, nullable1) in #t291.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t291{self::Class1});
+  let final self::Class1? #t292 = n1 in #t292.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t293 = self::Extension1|[](#t292{self::Class1}, nullable1) in #t293.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t294 = nullable1 in self::Extension1|[](#t293{self::Class1}, #t294).{core::Object::==}(null) ?{self::Class1?} self::Extension1|[]=(#t293{self::Class1}, #t294, nullable1) : null;
+  nullable1 = let final self::Class1? #t295 = n1 in #t295.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t296 = self::Extension1|[](#t295{self::Class1}, nullable1) in #t296.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t297 = nullable1 in let final self::Class1? #t298 = self::Extension1|[](#t296{self::Class1}, #t297) in #t298.{core::Object::==}(null) ?{self::Class1?} let final self::Class1? #t299 = nullable1 in let final void #t300 = self::Extension1|[]=(#t296{self::Class1}, #t297, #t299) in #t299 : #t298{self::Class1};
+  let final self::Class3? #t301 = n3 in #t301.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t302 = self::Extension3|[](#t301{self::Class3}, nullable3) in #t302.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t303 = nullable2 in self::Extension2|[]=(#t302{self::Class2}, #t303, self::Extension2|+(self::Extension2|[](#t302{self::Class2}, #t303), 0));
+  nullable2 = let final self::Class3? #t304 = n3 in #t304.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t305 = self::Extension3|[](#t304{self::Class3}, nullable3) in #t305.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t306 = nullable2 in let final self::Class2 #t307 = self::Extension2|+(self::Extension2|[](#t305{self::Class2}, #t306), 0) in let final void #t308 = self::Extension2|[]=(#t305{self::Class2}, #t306, #t307) in #t307;
+  let final self::Class3? #t309 = n3 in #t309.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t310 = self::Extension3|[](#t309{self::Class3}, nullable3) in #t310.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t311 = nullable2 in self::Extension2|[]=(#t310{self::Class2}, #t311, self::Extension2|+(self::Extension2|[](#t310{self::Class2}, #t311), 1));
+  nullable2 = let final self::Class3? #t312 = n3 in #t312.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t313 = self::Extension3|[](#t312{self::Class3}, nullable3) in #t313.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t314 = nullable2 in let final self::Class2 #t315 = self::Extension2|[](#t313{self::Class2}, #t314) in let final void #t316 = self::Extension2|[]=(#t313{self::Class2}, #t314, self::Extension2|+(#t315, 1)) in #t315;
+  let final self::Class3? #t317 = n3 in #t317.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t318 = self::Extension3|[](#t317{self::Class3}, nullable3) in #t318.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t319 = nullable2 in let final self::Class2 #t320 = self::Extension2|+(self::Extension2|[](#t318{self::Class2}, #t319), 1) in let final void #t321 = self::Extension2|[]=(#t318{self::Class2}, #t319, #t320) in #t320;
+  nullable2 = let final self::Class3? #t322 = n3 in #t322.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t323 = self::Extension3|[](#t322{self::Class3}, nullable3) in #t323.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2? #t324 = nullable2 in let final self::Class2 #t325 = self::Extension2|+(self::Extension2|[](#t323{self::Class2}, #t324), 1) in let final void #t326 = self::Extension2|[]=(#t323{self::Class2}, #t324, #t325) in #t325;
 }
 static method operatorAccess(self::Class1? n1, self::Class2? n2) → void {
   self::Class2? nullable2 = n2;
-  self::throws(() → self::Class1? => self::Extension1|+(let final self::Class1? #t325 = n1 in #t325.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t325{self::Class1}), 0));
-  self::throws(() → self::Class1? => self::Extension1|unary-(let final self::Class1? #t326 = n1 in #t326.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nonNullable1(#t326{self::Class1})));
-  let final self::Class2? #t327 = n2 in #t327.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t327, self::Extension2|+(self::Extension2|get#nonNullable2(#t327), 0));
-  nullable2 = let final self::Class2? #t328 = n2 in #t328.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t329 = self::Extension2|+(self::Extension2|get#nonNullable2(#t328), 0) in let final void #t330 = self::Extension2|set#nonNullable2(#t328, #t329) in #t329;
-  let final self::Class2? #t331 = n2 in #t331.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t332 = self::Extension2|get#nonNullable2(#t331{self::Class2}) in self::Extension2|set#nonNullable2(#t332, self::Extension2|+(self::Extension2|get#nonNullable2(#t332), 0));
-  nullable2 = let final self::Class2? #t333 = n2 in #t333.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t334 = self::Extension2|get#nonNullable2(#t333{self::Class2}) in let final self::Class2 #t335 = self::Extension2|+(self::Extension2|get#nonNullable2(#t334), 0) in let final void #t336 = self::Extension2|set#nonNullable2(#t334, #t335) in #t335;
-  let final self::Class2? #t337 = n2 in #t337.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t337, self::Extension2|+(self::Extension2|get#nonNullable2(#t337), 1));
-  nullable2 = let final self::Class2? #t338 = n2 in #t338.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t339 = self::Extension2|get#nonNullable2(#t338) in let final void #t340 = self::Extension2|set#nonNullable2(#t338, self::Extension2|+(#t339, 1)) in #t339;
-  let final self::Class2? #t341 = n2 in #t341.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t342 = self::Extension2|+(self::Extension2|get#nonNullable2(#t341), 1) in let final void #t343 = self::Extension2|set#nonNullable2(#t341, #t342) in #t342;
-  nullable2 = let final self::Class2? #t344 = n2 in #t344.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t345 = self::Extension2|+(self::Extension2|get#nonNullable2(#t344), 1) in let final void #t346 = self::Extension2|set#nonNullable2(#t344, #t345) in #t345;
+  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.
+ - '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.
+ - '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})));
+  let final self::Class2? #t331 = n2 in #t331.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t331, self::Extension2|+(self::Extension2|get#nonNullable2(#t331), 0));
+  nullable2 = let final self::Class2? #t332 = n2 in #t332.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t333 = self::Extension2|+(self::Extension2|get#nonNullable2(#t332), 0) in let final void #t334 = self::Extension2|set#nonNullable2(#t332, #t333) in #t333;
+  let final self::Class2? #t335 = n2 in #t335.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t336 = self::Extension2|get#nonNullable2(#t335{self::Class2}) in self::Extension2|set#nonNullable2(#t336, self::Extension2|+(self::Extension2|get#nonNullable2(#t336), 0));
+  nullable2 = let final self::Class2? #t337 = n2 in #t337.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t338 = self::Extension2|get#nonNullable2(#t337{self::Class2}) in let final self::Class2 #t339 = self::Extension2|+(self::Extension2|get#nonNullable2(#t338), 0) in let final void #t340 = self::Extension2|set#nonNullable2(#t338, #t339) in #t339;
+  let final self::Class2? #t341 = n2 in #t341.{core::Object::==}(null) ?{self::Class2?} null : self::Extension2|set#nonNullable2(#t341, self::Extension2|+(self::Extension2|get#nonNullable2(#t341), 1));
+  nullable2 = let final self::Class2? #t342 = n2 in #t342.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t343 = self::Extension2|get#nonNullable2(#t342) in let final void #t344 = self::Extension2|set#nonNullable2(#t342, self::Extension2|+(#t343, 1)) in #t343;
+  let final self::Class2? #t345 = n2 in #t345.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t346 = self::Extension2|+(self::Extension2|get#nonNullable2(#t345), 1) in let final void #t347 = self::Extension2|set#nonNullable2(#t345, #t346) in #t346;
+  nullable2 = let final self::Class2? #t348 = n2 in #t348.{core::Object::==}(null) ?{self::Class2?} null : let final self::Class2 #t349 = self::Extension2|+(self::Extension2|get#nonNullable2(#t348), 1) in let final void #t350 = self::Extension2|set#nonNullable2(#t348, #t349) in #t349;
 }
 static method ifNull(self::Class1? n1) → void {
   self::Class1? nullable1 = n1;
-  let final self::Class1? #t347 = n1 in #t347.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t347).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t347, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t348 = n1 in #t348.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t349 = self::Extension1|get#nullable1(#t348) in #t349.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t350 = n1{self::Class1} in let final void #t351 = self::Extension1|set#nullable1(#t348, #t350) in #t350 : #t349{self::Class1};
-  let final self::Class1? #t352 = n1 in #t352.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t353 = self::Extension1|get#nonNullable1(#t352{self::Class1}) in self::Extension1|get#nullable1(#t353{self::Class1}).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t353{self::Class1}, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t354 = n1 in #t354.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t355 = self::Extension1|get#nonNullable1(#t354{self::Class1}) in let final self::Class1? #t356 = self::Extension1|get#nullable1(#t355{self::Class1}) in #t356.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t357 = n1{self::Class1} in let final void #t358 = self::Extension1|set#nullable1(#t355{self::Class1}, #t357) in #t357 : #t356{self::Class1};
-  let final self::Class1? #t359 = n1 in #t359.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t360 = self::Extension1|get#nonNullable1(#t359{self::Class1}) in let final self::Class1 #t361 = n1{self::Class1} in self::Extension1|[](#t360, #t361).{core::Object::==}(null) ?{self::Class1} self::Extension1|[]=(#t360, #t361, n1{self::Class1}) : null;
-  n1 = let final self::Class1? #t362 = n1 in #t362.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t363 = self::Extension1|get#nonNullable1(#t362{self::Class1}) in let final self::Class1 #t364 = n1{self::Class1} in let final self::Class1? #t365 = self::Extension1|[](#t363, #t364) in #t365.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t366 = n1{self::Class1} in let final void #t367 = self::Extension1|[]=(#t363, #t364, #t366) in #t366 : #t365{self::Class1};
+  let final self::Class1? #t351 = n1 in #t351.{core::Object::==}(null) ?{self::Class1?} null : self::Extension1|get#nullable1(#t351).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t351, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t352 = n1 in #t352.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t353 = self::Extension1|get#nullable1(#t352) in #t353.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t354 = n1{self::Class1} in let final void #t355 = self::Extension1|set#nullable1(#t352, #t354) in #t354 : #t353{self::Class1};
+  let final self::Class1? #t356 = n1 in #t356.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t357 = self::Extension1|get#nonNullable1(#t356{self::Class1}) in self::Extension1|get#nullable1(#t357{self::Class1}).{core::Object::==}(null) ?{self::Class1} self::Extension1|set#nullable1(#t357{self::Class1}, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t358 = n1 in #t358.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1? #t359 = self::Extension1|get#nonNullable1(#t358{self::Class1}) in let final self::Class1? #t360 = self::Extension1|get#nullable1(#t359{self::Class1}) in #t360.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t361 = n1{self::Class1} in let final void #t362 = self::Extension1|set#nullable1(#t359{self::Class1}, #t361) in #t361 : #t360{self::Class1};
+  let final self::Class1? #t363 = n1 in #t363.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t364 = self::Extension1|get#nonNullable1(#t363{self::Class1}) in let final self::Class1 #t365 = n1{self::Class1} in self::Extension1|[](#t364, #t365).{core::Object::==}(null) ?{self::Class1} self::Extension1|[]=(#t364, #t365, n1{self::Class1}) : null;
+  n1 = let final self::Class1? #t366 = n1 in #t366.{core::Object::==}(null) ?{self::Class1?} null : let final self::Class1 #t367 = self::Extension1|get#nonNullable1(#t366{self::Class1}) in let final self::Class1 #t368 = n1{self::Class1} in let final self::Class1? #t369 = self::Extension1|[](#t367, #t368) in #t369.{core::Object::==}(null) ?{self::Class1} let final self::Class1 #t370 = n1{self::Class1} in let final void #t371 = self::Extension1|[]=(#t367, #t368, #t370) in #t370 : #t369{self::Class1};
 }
 static method throws(() → void f) → void {
   try {
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 dc3992f..9699336 100644
--- a/pkg/front_end/testcases/nnbd/nullable_access.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_access.dart.weak.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/nullable_access.dart:23:18: Warning: Property 'nonNullableField' is accessed on 'Class?' which is potentially null.
+// 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);
@@ -33,9 +33,13 @@
 }
 static method main() → dynamic {
   self::Class? c;
-  self::throws(() → self::A => c.{self::Class::nonNullableField});
-  self::expect(null, let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{self::A?} null : #t1{self::Class}.{self::Class::nonNullableField});
-  self::expect(null, let final self::Class? #t2 = c in #t2.{core::Object::==}(null) ?{self::A?} null : #t2{self::Class}.{self::Class::nonNullableField}.{self::A::nonNullableProperty});
+  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.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/nullable_access.dart'.
+Try accessing using ?. instead.
+  throws(() => c.nonNullableField);
+                 ^^^^^^^^^^^^^^^^" in c.{self::Class::nonNullableField});
+  self::expect(null, let final self::Class? #t2 = c in #t2.{core::Object::==}(null) ?{self::A?} null : #t2{self::Class}.{self::Class::nonNullableField});
+  self::expect(null, let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{self::A?} null : #t3{self::Class}.{self::Class::nonNullableField}.{self::A::nonNullableProperty});
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
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 dc3992f..9699336 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
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/nullable_access.dart:23:18: Warning: Property 'nonNullableField' is accessed on 'Class?' which is potentially null.
+// 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);
@@ -33,9 +33,13 @@
 }
 static method main() → dynamic {
   self::Class? c;
-  self::throws(() → self::A => c.{self::Class::nonNullableField});
-  self::expect(null, let final self::Class? #t1 = c in #t1.{core::Object::==}(null) ?{self::A?} null : #t1{self::Class}.{self::Class::nonNullableField});
-  self::expect(null, let final self::Class? #t2 = c in #t2.{core::Object::==}(null) ?{self::A?} null : #t2{self::Class}.{self::Class::nonNullableField}.{self::A::nonNullableProperty});
+  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.
+ - 'Class' is from 'pkg/front_end/testcases/nnbd/nullable_access.dart'.
+Try accessing using ?. instead.
+  throws(() => c.nonNullableField);
+                 ^^^^^^^^^^^^^^^^" in c.{self::Class::nonNullableField});
+  self::expect(null, let final self::Class? #t2 = c in #t2.{core::Object::==}(null) ?{self::A?} null : #t2{self::Class}.{self::Class::nonNullableField});
+  self::expect(null, let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{self::A?} null : #t3{self::Class}.{self::Class::nonNullableField}.{self::A::nonNullableProperty});
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual))
diff --git a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.expect b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.expect
index a326cf2..24d5f3d 100644
--- a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.expect
@@ -30,12 +30,6 @@
 //   a.baz = 42;
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Method 'call' cannot be called on 'A?' because it is potentially null.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try calling using ?. instead.
-//   a();
-//    ^
-//
 // pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Can't use an expression of type 'A?' as a function because it's potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try calling using ?.call instead.
@@ -108,23 +102,19 @@
  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 Try calling using ?.call instead.
   a();
-   ^" in let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Method 'call' cannot be called on 'A?' because it is potentially null.
- - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-Try calling using ?. instead.
-  a();
    ^" in a.{self::A::call}();
-  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Error: Method 'toString' cannot be called on 'B?' because it is potentially null.
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Error: Method 'toString' cannot be called on 'B?' because it is potentially null.
  - 'B' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 Try calling using ?. instead.
   b.toString(0);
     ^^^^^^^^" in b.{self::B::toString}(0);
-  core::Function f1 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:17: Error: Can't tear off method 'call' from a potentially null value.
+  core::Function f1 = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:17: Error: Can't tear off method 'call' from a potentially null value.
   Function f1 = a;
                 ^" in a as{TypeError} core::Function;
-  () → void f2 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:24: Error: Can't tear off method 'call' from a potentially null value.
+  () → void f2 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:24: Error: Can't tear off method 'call' from a potentially null value.
   void Function() f2 = a;
                        ^" in a as{TypeError} () → void;
-  () →? void f3 = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:31:25: Error: Can't tear off method 'call' from a potentially null value.
+  () →? void f3 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:31:25: Error: Can't tear off method 'call' from a potentially null value.
   void Function()? f3 = a;
                         ^" in a as{TypeError} () →? void;
 }
diff --git a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.transformed.expect
index a326cf2..24d5f3d 100644
--- a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.strong.transformed.expect
@@ -30,12 +30,6 @@
 //   a.baz = 42;
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Method 'call' cannot be called on 'A?' because it is potentially null.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try calling using ?. instead.
-//   a();
-//    ^
-//
 // pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Can't use an expression of type 'A?' as a function because it's potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try calling using ?.call instead.
@@ -108,23 +102,19 @@
  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 Try calling using ?.call instead.
   a();
-   ^" in let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Method 'call' cannot be called on 'A?' because it is potentially null.
- - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-Try calling using ?. instead.
-  a();
    ^" in a.{self::A::call}();
-  let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Error: Method 'toString' cannot be called on 'B?' because it is potentially null.
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Error: Method 'toString' cannot be called on 'B?' because it is potentially null.
  - 'B' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 Try calling using ?. instead.
   b.toString(0);
     ^^^^^^^^" in b.{self::B::toString}(0);
-  core::Function f1 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:17: Error: Can't tear off method 'call' from a potentially null value.
+  core::Function f1 = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:17: Error: Can't tear off method 'call' from a potentially null value.
   Function f1 = a;
                 ^" in a as{TypeError} core::Function;
-  () → void f2 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:24: Error: Can't tear off method 'call' from a potentially null value.
+  () → void f2 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:24: Error: Can't tear off method 'call' from a potentially null value.
   void Function() f2 = a;
                        ^" in a as{TypeError} () → void;
-  () →? void f3 = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:31:25: Error: Can't tear off method 'call' from a potentially null value.
+  () →? void f3 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:31:25: Error: Can't tear off method 'call' from a potentially null value.
   void Function()? f3 = a;
                         ^" in a as{TypeError} () →? void;
 }
diff --git a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.expect b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.expect
index a00b574..24d5f3d 100644
--- a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.expect
@@ -2,61 +2,55 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Warning: Property 'length' is accessed on 'String?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
 // Try accessing using ?. instead.
 //   s.length;
 //     ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Warning: Method 'substring' is called on 'String?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Error: Method 'substring' cannot be called on 'String?' because it is potentially null.
 // Try calling using ?. instead.
 //   s.substring(1, 1);
 //     ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:23:5: Warning: Method 'foo' is called on 'A?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:23:5: Error: Method 'foo' cannot be called on 'A?' because it is potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try calling using ?. instead.
 //   a.foo();
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:5: Warning: Property 'bar' is accessed on 'A?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:5: Error: Property 'bar' cannot be accessed on 'A?' because it is potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try accessing using ?. instead.
 //   a.bar;
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:5: Warning: Property 'baz' is accessed on 'A?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:5: Error: Property 'baz' cannot be accessed on 'A?' because it is potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try accessing using ?. instead.
 //   a.baz = 42;
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Warning: Method 'call' is called on 'A?' which is potentially null.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try calling using ?. instead.
-//   a();
-//    ^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Warning: Expression of type 'A?' is used as a function, but it's potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Can't use an expression of type 'A?' as a function because it's potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try calling using ?.call instead.
 //   a();
 //    ^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Warning: Method 'toString' is called on 'B?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Error: Method 'toString' cannot be called on 'B?' because it is potentially null.
 //  - 'B' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try calling using ?. instead.
 //   b.toString(0);
 //     ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:17: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:17: Error: Can't tear off method 'call' from a potentially null value.
 //   Function f1 = a;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:24: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:24: Error: Can't tear off method 'call' from a potentially null value.
 //   void Function() f2 = a;
 //                        ^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:31:25: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:31:25: Error: Can't tear off method 'call' from a potentially null value.
 //   void Function()? f3 = a;
 //                         ^
 //
@@ -81,16 +75,48 @@
     return super.{core::Object::toString}();
 }
 static method error(core::String? s, self::A? a, self::B? b) → dynamic {
-  s.{core::String::length};
-  s.{core::String::substring}(1, 1);
-  a.{self::A::foo}();
-  a.{self::A::bar};
-  a.{self::A::baz} = 42;
-  a.{self::A::call}();
-  b.{self::B::toString}(0);
-  core::Function f1 = a as{TypeError} core::Function;
-  () → void f2 = a as{TypeError} () → void;
-  () →? void f3 = a as{TypeError} () →? void;
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
+Try accessing using ?. instead.
+  s.length;
+    ^^^^^^" in s.{core::String::length};
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Error: Method 'substring' cannot be called on 'String?' because it is potentially null.
+Try calling using ?. instead.
+  s.substring(1, 1);
+    ^^^^^^^^^" in s.{core::String::substring}(1, 1);
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:23:5: Error: Method 'foo' cannot be called on 'A?' because it is potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try calling using ?. instead.
+  a.foo();
+    ^^^" in a.{self::A::foo}();
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:5: Error: Property 'bar' cannot be accessed on 'A?' because it is potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try accessing using ?. instead.
+  a.bar;
+    ^^^" in a.{self::A::bar};
+  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:5: Error: Property 'baz' cannot be accessed on 'A?' because it is potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try accessing using ?. instead.
+  a.baz = 42;
+    ^^^" in a.{self::A::baz} = 42;
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Can't use an expression of type 'A?' as a function because it's potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try calling using ?.call instead.
+  a();
+   ^" in a.{self::A::call}();
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Error: Method 'toString' cannot be called on 'B?' because it is potentially null.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try calling using ?. instead.
+  b.toString(0);
+    ^^^^^^^^" in b.{self::B::toString}(0);
+  core::Function f1 = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:17: Error: Can't tear off method 'call' from a potentially null value.
+  Function f1 = a;
+                ^" in a as{TypeError} core::Function;
+  () → void f2 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:24: Error: Can't tear off method 'call' from a potentially null value.
+  void Function() f2 = a;
+                       ^" in a as{TypeError} () → void;
+  () →? void f3 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:31:25: Error: Can't tear off method 'call' from a potentially null value.
+  void Function()? f3 = a;
+                        ^" in a as{TypeError} () →? void;
 }
 static method ok<T extends core::Object? = core::Object?>(core::String? s, self::A? a, self::ok::T% t, self::B? b, core::Invocation i) → dynamic {
   s.{core::String::==}(s);
diff --git a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.transformed.expect
index a00b574..24d5f3d 100644
--- a/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_receiver.dart.weak.transformed.expect
@@ -2,61 +2,55 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Warning: Property 'length' is accessed on 'String?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
 // Try accessing using ?. instead.
 //   s.length;
 //     ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Warning: Method 'substring' is called on 'String?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Error: Method 'substring' cannot be called on 'String?' because it is potentially null.
 // Try calling using ?. instead.
 //   s.substring(1, 1);
 //     ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:23:5: Warning: Method 'foo' is called on 'A?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:23:5: Error: Method 'foo' cannot be called on 'A?' because it is potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try calling using ?. instead.
 //   a.foo();
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:5: Warning: Property 'bar' is accessed on 'A?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:5: Error: Property 'bar' cannot be accessed on 'A?' because it is potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try accessing using ?. instead.
 //   a.bar;
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:5: Warning: Property 'baz' is accessed on 'A?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:5: Error: Property 'baz' cannot be accessed on 'A?' because it is potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try accessing using ?. instead.
 //   a.baz = 42;
 //     ^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Warning: Method 'call' is called on 'A?' which is potentially null.
-//  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
-// Try calling using ?. instead.
-//   a();
-//    ^
-//
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Warning: Expression of type 'A?' is used as a function, but it's potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Can't use an expression of type 'A?' as a function because it's potentially null.
 //  - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try calling using ?.call instead.
 //   a();
 //    ^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Warning: Method 'toString' is called on 'B?' which is potentially null.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Error: Method 'toString' cannot be called on 'B?' because it is potentially null.
 //  - 'B' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
 // Try calling using ?. instead.
 //   b.toString(0);
 //     ^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:17: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:17: Error: Can't tear off method 'call' from a potentially null value.
 //   Function f1 = a;
 //                 ^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:24: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:24: Error: Can't tear off method 'call' from a potentially null value.
 //   void Function() f2 = a;
 //                        ^
 //
-// pkg/front_end/testcases/nnbd/nullable_receiver.dart:31:25: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/nullable_receiver.dart:31:25: Error: Can't tear off method 'call' from a potentially null value.
 //   void Function()? f3 = a;
 //                         ^
 //
@@ -81,16 +75,48 @@
     return super.{core::Object::toString}();
 }
 static method error(core::String? s, self::A? a, self::B? b) → dynamic {
-  s.{core::String::length};
-  s.{core::String::substring}(1, 1);
-  a.{self::A::foo}();
-  a.{self::A::bar};
-  a.{self::A::baz} = 42;
-  a.{self::A::call}();
-  b.{self::B::toString}(0);
-  core::Function f1 = a as{TypeError} core::Function;
-  () → void f2 = a as{TypeError} () → void;
-  () →? void f3 = a as{TypeError} () →? void;
+  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:20:5: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
+Try accessing using ?. instead.
+  s.length;
+    ^^^^^^" in s.{core::String::length};
+  let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:21:5: Error: Method 'substring' cannot be called on 'String?' because it is potentially null.
+Try calling using ?. instead.
+  s.substring(1, 1);
+    ^^^^^^^^^" in s.{core::String::substring}(1, 1);
+  let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:23:5: Error: Method 'foo' cannot be called on 'A?' because it is potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try calling using ?. instead.
+  a.foo();
+    ^^^" in a.{self::A::foo}();
+  let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:24:5: Error: Property 'bar' cannot be accessed on 'A?' because it is potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try accessing using ?. instead.
+  a.bar;
+    ^^^" in a.{self::A::bar};
+  let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:25:5: Error: Property 'baz' cannot be accessed on 'A?' because it is potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try accessing using ?. instead.
+  a.baz = 42;
+    ^^^" in a.{self::A::baz} = 42;
+  let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:26:4: Error: Can't use an expression of type 'A?' as a function because it's potentially null.
+ - 'A' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try calling using ?.call instead.
+  a();
+   ^" in a.{self::A::call}();
+  let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:27:5: Error: Method 'toString' cannot be called on 'B?' because it is potentially null.
+ - 'B' is from 'pkg/front_end/testcases/nnbd/nullable_receiver.dart'.
+Try calling using ?. instead.
+  b.toString(0);
+    ^^^^^^^^" in b.{self::B::toString}(0);
+  core::Function f1 = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:29:17: Error: Can't tear off method 'call' from a potentially null value.
+  Function f1 = a;
+                ^" in a as{TypeError} core::Function;
+  () → void f2 = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:30:24: Error: Can't tear off method 'call' from a potentially null value.
+  void Function() f2 = a;
+                       ^" in a as{TypeError} () → void;
+  () →? void f3 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/nullable_receiver.dart:31:25: Error: Can't tear off method 'call' from a potentially null value.
+  void Function()? f3 = a;
+                        ^" in a as{TypeError} () →? void;
 }
 static method ok<T extends core::Object? = core::Object?>(core::String? s, self::A? a, self::ok::T% t, self::B? b, core::Invocation i) → dynamic {
   s.{core::String::==}(s);
diff --git a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.outline.expect b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.outline.expect
index 3429c36..4c7e4f3 100644
--- a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.outline.expect
@@ -1,12 +1,19 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart:5:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+//           ^
+//
 import self as self;
 
-typedef F = () →? void;
+typedef F = invalid-type;
 static method foo(() → void x) → void
   ;
-static method bar(() →? void x) → void
+static method bar(invalid-type x) → void
   ;
-static method baz(() →? void x) → void
+static method baz(invalid-type x) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.strong.expect b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.strong.expect
index 425f791..8c42147 100644
--- a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.strong.expect
@@ -1,13 +1,20 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart:5:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+//           ^
+//
 import self as self;
 
-typedef F = () →? void;
+typedef F = invalid-type;
 static method foo(() → void x) → void {
-  self::bar(x);
+  self::bar(x as{TypeError,ForNonNullableByDefault} invalid-type);
   self::bar(null);
-  self::baz(x);
+  self::baz(x as{TypeError,ForNonNullableByDefault} invalid-type);
   self::baz(null);
 }
-static method bar(() →? void x) → void {}
-static method baz(() →? void x) → void {}
+static method bar(invalid-type x) → void {}
+static method baz(invalid-type x) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.strong.transformed.expect
index 425f791..8c42147 100644
--- a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.strong.transformed.expect
@@ -1,13 +1,20 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart:5:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+//           ^
+//
 import self as self;
 
-typedef F = () →? void;
+typedef F = invalid-type;
 static method foo(() → void x) → void {
-  self::bar(x);
+  self::bar(x as{TypeError,ForNonNullableByDefault} invalid-type);
   self::bar(null);
-  self::baz(x);
+  self::baz(x as{TypeError,ForNonNullableByDefault} invalid-type);
   self::baz(null);
 }
-static method bar(() →? void x) → void {}
-static method baz(() →? void x) → void {}
+static method bar(invalid-type x) → void {}
+static method baz(invalid-type x) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.expect b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.expect
index 425f791..8c42147 100644
--- a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.expect
@@ -1,13 +1,20 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart:5:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+//           ^
+//
 import self as self;
 
-typedef F = () →? void;
+typedef F = invalid-type;
 static method foo(() → void x) → void {
-  self::bar(x);
+  self::bar(x as{TypeError,ForNonNullableByDefault} invalid-type);
   self::bar(null);
-  self::baz(x);
+  self::baz(x as{TypeError,ForNonNullableByDefault} invalid-type);
   self::baz(null);
 }
-static method bar(() →? void x) → void {}
-static method baz(() →? void x) → void {}
+static method bar(invalid-type x) → void {}
+static method baz(invalid-type x) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.transformed.expect
index 425f791..8c42147 100644
--- a/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart.weak.transformed.expect
@@ -1,13 +1,20 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/nullable_rhs_of_typedef.dart:5:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+//           ^
+//
 import self as self;
 
-typedef F = () →? void;
+typedef F = invalid-type;
 static method foo(() → void x) → void {
-  self::bar(x);
+  self::bar(x as{TypeError,ForNonNullableByDefault} invalid-type);
   self::bar(null);
-  self::baz(x);
+  self::baz(x as{TypeError,ForNonNullableByDefault} invalid-type);
   self::baz(null);
 }
-static method bar(() →? void x) → void {}
-static method baz(() →? void x) → void {}
+static method bar(invalid-type x) → void {}
+static method baz(invalid-type x) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/opt_out.dart.outline.expect b/pkg/front_end/testcases/nnbd/opt_out.dart.outline.expect
index 7361e96..49acd75 100644
--- a/pkg/front_end/testcases/nnbd/opt_out.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/opt_out.dart.outline.expect
@@ -1,10 +1,17 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/opt_out.dart:16:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+//           ^
+//
 import self as self;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///opt_out_lib.dart";
 
-typedef F = () →? void;
+typedef F = invalid-type;
 class A<T extends core::Object? = dynamic> extends core::Object {
   late field core::int field;
   synthetic constructor •() → self::A<self::A::T%>
@@ -45,6 +52,10 @@
 // // @dart=2.5
 // ^^^^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/opt_out_lib.dart:20:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+//           ^
+//
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:22:12: Error: Null safety features are disabled for this library.
 // Try removing the `@dart=` annotation or setting the language version higher.
 // List<String?> l = [];
@@ -80,7 +91,7 @@
 import self as self2;
 import "dart:core" as core;
 
-typedef F = () →? void;
+typedef F = invalid-type;
 class A<T extends core::Object* = dynamic> extends core::Object {
   field core::int* field;
   synthetic constructor •() → self2::A<self2::A::T*>*
diff --git a/pkg/front_end/testcases/nnbd/opt_out.dart.strong.expect b/pkg/front_end/testcases/nnbd/opt_out.dart.strong.expect
index 66a160f..a4191d5 100644
--- a/pkg/front_end/testcases/nnbd/opt_out.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/opt_out.dart.strong.expect
@@ -1,10 +1,17 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/opt_out.dart:16:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+//           ^
+//
 import self as self;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///opt_out_lib.dart";
 
-typedef F = () →? void;
+typedef F = invalid-type;
 class A<T extends core::Object? = dynamic> extends core::Object {
   late field core::int field = 42;
   synthetic constructor •() → self::A<self::A::T%>
@@ -50,6 +57,10 @@
 // // @dart=2.5
 // ^^^^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/opt_out_lib.dart:20:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+//           ^
+//
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:22:12: Error: Null safety features are disabled for this library.
 // Try removing the `@dart=` annotation or setting the language version higher.
 // List<String?> l = [];
@@ -121,7 +132,7 @@
 import self as self2;
 import "dart:core" as core;
 
-typedef F = () →? void;
+typedef F = invalid-type;
 class A<T extends core::Object* = dynamic> extends core::Object {
   field core::int* field = 42;
   synthetic constructor •() → self2::A<self2::A::T*>*
diff --git a/pkg/front_end/testcases/nnbd/opt_out.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/opt_out.dart.strong.transformed.expect
index 66a160f..a4191d5 100644
--- a/pkg/front_end/testcases/nnbd/opt_out.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/opt_out.dart.strong.transformed.expect
@@ -1,10 +1,17 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/opt_out.dart:16:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+//           ^
+//
 import self as self;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///opt_out_lib.dart";
 
-typedef F = () →? void;
+typedef F = invalid-type;
 class A<T extends core::Object? = dynamic> extends core::Object {
   late field core::int field = 42;
   synthetic constructor •() → self::A<self::A::T%>
@@ -50,6 +57,10 @@
 // // @dart=2.5
 // ^^^^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/opt_out_lib.dart:20:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+//           ^
+//
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:22:12: Error: Null safety features are disabled for this library.
 // Try removing the `@dart=` annotation or setting the language version higher.
 // List<String?> l = [];
@@ -121,7 +132,7 @@
 import self as self2;
 import "dart:core" as core;
 
-typedef F = () →? void;
+typedef F = invalid-type;
 class A<T extends core::Object* = dynamic> extends core::Object {
   field core::int* field = 42;
   synthetic constructor •() → self2::A<self2::A::T*>*
diff --git a/pkg/front_end/testcases/nnbd/opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd/opt_out.dart.weak.expect
index 66a160f..a4191d5 100644
--- a/pkg/front_end/testcases/nnbd/opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/opt_out.dart.weak.expect
@@ -1,10 +1,17 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/opt_out.dart:16:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+//           ^
+//
 import self as self;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///opt_out_lib.dart";
 
-typedef F = () →? void;
+typedef F = invalid-type;
 class A<T extends core::Object? = dynamic> extends core::Object {
   late field core::int field = 42;
   synthetic constructor •() → self::A<self::A::T%>
@@ -50,6 +57,10 @@
 // // @dart=2.5
 // ^^^^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/opt_out_lib.dart:20:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+//           ^
+//
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:22:12: Error: Null safety features are disabled for this library.
 // Try removing the `@dart=` annotation or setting the language version higher.
 // List<String?> l = [];
@@ -121,7 +132,7 @@
 import self as self2;
 import "dart:core" as core;
 
-typedef F = () →? void;
+typedef F = invalid-type;
 class A<T extends core::Object* = dynamic> extends core::Object {
   field core::int* field = 42;
   synthetic constructor •() → self2::A<self2::A::T*>*
diff --git a/pkg/front_end/testcases/nnbd/opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/opt_out.dart.weak.transformed.expect
index 66a160f..a4191d5 100644
--- a/pkg/front_end/testcases/nnbd/opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/opt_out.dart.weak.transformed.expect
@@ -1,10 +1,17 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/opt_out.dart:16:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+//           ^
+//
 import self as self;
 import "dart:core" as core;
 
 import "org-dartlang-testcase:///opt_out_lib.dart";
 
-typedef F = () →? void;
+typedef F = invalid-type;
 class A<T extends core::Object? = dynamic> extends core::Object {
   late field core::int field = 42;
   synthetic constructor •() → self::A<self::A::T%>
@@ -50,6 +57,10 @@
 // // @dart=2.5
 // ^^^^^^^^^^^^
 //
+// pkg/front_end/testcases/nnbd/opt_out_lib.dart:20:11: Error: Can't create typedef from nullable type.
+// typedef F = void Function()?;
+//           ^
+//
 // pkg/front_end/testcases/nnbd/opt_out_lib.dart:22:12: Error: Null safety features are disabled for this library.
 // Try removing the `@dart=` annotation or setting the language version higher.
 // List<String?> l = [];
@@ -121,7 +132,7 @@
 import self as self2;
 import "dart:core" as core;
 
-typedef F = () →? void;
+typedef F = invalid-type;
 class A<T extends core::Object* = dynamic> extends core::Object {
   field core::int* field = 42;
   synthetic constructor •() → self2::A<self2::A::T*>*
diff --git a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.expect b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.expect
index 4749c02..0c70778 100644
--- a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.expect
@@ -7,14 +7,14 @@
 //   factory C1 = C2<int?>; // Error in strong mode and Warning in weak mode.
 //              ^
 //
-// pkg/front_end/testcases/nnbd/override_checks.dart:14:7: Warning: The field 'B2.bar' has type 'num', which does not match the corresponding type, 'num?', in the overridden setter, 'B1.bar'.
+// pkg/front_end/testcases/nnbd/override_checks.dart:14:7: Error: The field 'B2.bar' has type 'num', which does not match the corresponding type, 'num?', in the overridden setter, 'B1.bar'.
 //   num bar = 3.14; // Error in strong mode and Warning in weak mode.
 //       ^
 // pkg/front_end/testcases/nnbd/override_checks.dart:8:12: Context: This is the overridden method ('bar').
 //   void set bar(num? value) {}
 //            ^
 //
-// pkg/front_end/testcases/nnbd/override_checks.dart:15:12: Warning: The return type of the method 'B2.baz' is 'num?', which does not match the return type, 'num', of the overridden method, 'B1.baz'.
+// pkg/front_end/testcases/nnbd/override_checks.dart:15:12: Error: The return type of the method 'B2.baz' is 'num?', which does not match the return type, 'num', of the overridden method, 'B1.baz'.
 // Change to a subtype of 'num'.
 //   num? get baz => null; // Error in strong mode and Warning in weak mode.
 //            ^
@@ -22,7 +22,7 @@
 //   num get baz => 42;
 //           ^
 //
-// pkg/front_end/testcases/nnbd/override_checks.dart:16:17: Warning: The parameter 'value' of the method 'B2.hest' has type 'num', which does not match the corresponding type, 'num?', in the overridden method, 'B1.hest'.
+// pkg/front_end/testcases/nnbd/override_checks.dart:16:17: Error: The parameter 'value' of the method 'B2.hest' has type 'num', which does not match the corresponding type, 'num?', in the overridden method, 'B1.hest'.
 // Change to a supertype of 'num?', or, for a covariant parameter, a subtype.
 //   void hest(num value) {} // Error in strong mode and Warning in weak mode.
 //                 ^
@@ -30,12 +30,12 @@
 //   void hest(num? value) {}
 //        ^
 //
-// pkg/front_end/testcases/nnbd/override_checks.dart:20:16: Warning: The type 'int?' doesn't extend 'int'.
+// pkg/front_end/testcases/nnbd/override_checks.dart:20:16: Error: The type 'int?' doesn't extend 'int'.
 // Try using a different type as argument.
 //   factory C1 = C2<int?>; // Error in strong mode and Warning in weak mode.
 //                ^
 //
-// pkg/front_end/testcases/nnbd/override_checks.dart:27:27: Warning: The constructor function type 'D Function(num)' isn't a subtype of 'D Function(num?)'.
+// pkg/front_end/testcases/nnbd/override_checks.dart:27:27: Error: The constructor function type 'D Function(num)' isn't a subtype of 'D Function(num?)'.
 //  - 'D' is from 'pkg/front_end/testcases/nnbd/override_checks.dart'.
 //   factory D.bar(num? x) = D.foo; // Error in strong mode and Warning in weak mode.
 //                           ^
diff --git a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.transformed.expect
index 8670b98..1387d52 100644
--- a/pkg/front_end/testcases/nnbd/override_checks.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/override_checks.dart.weak.transformed.expect
@@ -7,14 +7,14 @@
 //   factory C1 = C2<int?>; // Error in strong mode and Warning in weak mode.
 //              ^
 //
-// pkg/front_end/testcases/nnbd/override_checks.dart:14:7: Warning: The field 'B2.bar' has type 'num', which does not match the corresponding type, 'num?', in the overridden setter, 'B1.bar'.
+// pkg/front_end/testcases/nnbd/override_checks.dart:14:7: Error: The field 'B2.bar' has type 'num', which does not match the corresponding type, 'num?', in the overridden setter, 'B1.bar'.
 //   num bar = 3.14; // Error in strong mode and Warning in weak mode.
 //       ^
 // pkg/front_end/testcases/nnbd/override_checks.dart:8:12: Context: This is the overridden method ('bar').
 //   void set bar(num? value) {}
 //            ^
 //
-// pkg/front_end/testcases/nnbd/override_checks.dart:15:12: Warning: The return type of the method 'B2.baz' is 'num?', which does not match the return type, 'num', of the overridden method, 'B1.baz'.
+// pkg/front_end/testcases/nnbd/override_checks.dart:15:12: Error: The return type of the method 'B2.baz' is 'num?', which does not match the return type, 'num', of the overridden method, 'B1.baz'.
 // Change to a subtype of 'num'.
 //   num? get baz => null; // Error in strong mode and Warning in weak mode.
 //            ^
@@ -22,7 +22,7 @@
 //   num get baz => 42;
 //           ^
 //
-// pkg/front_end/testcases/nnbd/override_checks.dart:16:17: Warning: The parameter 'value' of the method 'B2.hest' has type 'num', which does not match the corresponding type, 'num?', in the overridden method, 'B1.hest'.
+// pkg/front_end/testcases/nnbd/override_checks.dart:16:17: Error: The parameter 'value' of the method 'B2.hest' has type 'num', which does not match the corresponding type, 'num?', in the overridden method, 'B1.hest'.
 // Change to a supertype of 'num?', or, for a covariant parameter, a subtype.
 //   void hest(num value) {} // Error in strong mode and Warning in weak mode.
 //                 ^
@@ -30,12 +30,12 @@
 //   void hest(num? value) {}
 //        ^
 //
-// pkg/front_end/testcases/nnbd/override_checks.dart:20:16: Warning: The type 'int?' doesn't extend 'int'.
+// pkg/front_end/testcases/nnbd/override_checks.dart:20:16: Error: The type 'int?' doesn't extend 'int'.
 // Try using a different type as argument.
 //   factory C1 = C2<int?>; // Error in strong mode and Warning in weak mode.
 //                ^
 //
-// pkg/front_end/testcases/nnbd/override_checks.dart:27:27: Warning: The constructor function type 'D Function(num)' isn't a subtype of 'D Function(num?)'.
+// pkg/front_end/testcases/nnbd/override_checks.dart:27:27: Error: The constructor function type 'D Function(num)' isn't a subtype of 'D Function(num?)'.
 //  - 'D' is from 'pkg/front_end/testcases/nnbd/override_checks.dart'.
 //   factory D.bar(num? x) = D.foo; // Error in strong mode and Warning in weak mode.
 //                           ^
diff --git a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.expect b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.expect
index 560b2ef..7a5255b 100644
--- a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.expect
@@ -76,47 +76,47 @@
   method method(core::int a) → core::int {
     core::int k;
     core::int j = a;
-    return (let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
+    return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
     return k;
-           ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+           ^" in k;
   }
   @#C1
   method /* from org-dartlang-testcase:///patch_lib.dart */ patchedMethod(core::int i) → core::int {
     core::int k;
     core::int j = i;
-    return (let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
+    return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
     return k;
-           ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+           ^" in k;
   }
   method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int {
     core::int k;
     core::int j = i;
-    return (let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
+    return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
     return k;
-           ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+           ^" in k;
   }
 }
 static method method(core::int a) → core::int {
   core::int k;
   core::int j = a;
-  return (let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
+  return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
   return k;
-         ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+         ^" in k;
 }
 @#C1
 static method /* from org-dartlang-testcase:///patch_lib.dart */ patchedMethod(core::int i) → core::int {
   core::int k;
   core::int j = i;
-  return (let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
+  return let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
   return k;
-         ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+         ^" in k;
 }
 static method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int {
   core::int k;
   core::int j = i;
-  return (let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
+  return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
   return k;
-         ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+         ^" in k;
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.transformed.expect
index 560b2ef..7a5255b 100644
--- a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.strong.transformed.expect
@@ -76,47 +76,47 @@
   method method(core::int a) → core::int {
     core::int k;
     core::int j = a;
-    return (let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
+    return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
     return k;
-           ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+           ^" in k;
   }
   @#C1
   method /* from org-dartlang-testcase:///patch_lib.dart */ patchedMethod(core::int i) → core::int {
     core::int k;
     core::int j = i;
-    return (let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
+    return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
     return k;
-           ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+           ^" in k;
   }
   method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int {
     core::int k;
     core::int j = i;
-    return (let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
+    return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
     return k;
-           ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+           ^" in k;
   }
 }
 static method method(core::int a) → core::int {
   core::int k;
   core::int j = a;
-  return (let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
+  return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
   return k;
-         ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+         ^" in k;
 }
 @#C1
 static method /* from org-dartlang-testcase:///patch_lib.dart */ patchedMethod(core::int i) → core::int {
   core::int k;
   core::int j = i;
-  return (let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
+  return let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
   return k;
-         ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+         ^" in k;
 }
 static method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int {
   core::int k;
   core::int j = i;
-  return (let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
+  return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
   return k;
-         ^" in k) as{TypeError,ForNonNullableByDefault} core::int;
+         ^" in k;
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.expect b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.expect
index 08205c5..7a5255b 100644
--- a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.expect
@@ -13,35 +13,35 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:15:5: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:15:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
 //     k;
 //     ^
 //
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
 //     return k;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
 //     return k;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
 //   return k;
 //          ^
 //
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
 //   return k;
 //          ^
 //
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:17:5: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:17:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
 //     k;
 //     ^
 //
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
 //     return k;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
 //   return k;
 //          ^
 //
@@ -61,46 +61,62 @@
   constructor constructor(core::int a, test::Class::T b) → test::Class<test::Class::T>
     : test::Class::a = a, test::Class::b = b, super core::Object::•() {
     core::int k;
+    let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:17:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
     k;
+    ^" in k;
   }
   @#C1
   constructor patchedConstructor(core::int i, test::Class::T j) → test::Class<test::Class::T>
     : test::Class::a = i, test::Class::b = j, super core::Object::•() {
     core::int k;
+    let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:15:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
     k;
+    ^" in k;
   }
   method method(core::int a) → core::int {
     core::int k;
     core::int j = a;
+    return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
     return k;
+           ^" in k;
   }
   @#C1
   method /* from org-dartlang-testcase:///patch_lib.dart */ patchedMethod(core::int i) → core::int {
     core::int k;
     core::int j = i;
+    return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
     return k;
+           ^" in k;
   }
   method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int {
     core::int k;
     core::int j = i;
+    return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
     return k;
+           ^" in k;
   }
 }
 static method method(core::int a) → core::int {
   core::int k;
   core::int j = a;
+  return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
   return k;
+         ^" in k;
 }
 @#C1
 static method /* from org-dartlang-testcase:///patch_lib.dart */ patchedMethod(core::int i) → core::int {
   core::int k;
   core::int j = i;
+  return let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
   return k;
+         ^" in k;
 }
 static method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int {
   core::int k;
   core::int j = i;
+  return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
   return k;
+         ^" in k;
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.transformed.expect
index 08205c5..7a5255b 100644
--- a/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/platform_definite_assignment/main.dart.weak.transformed.expect
@@ -13,35 +13,35 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:15:5: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:15:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
 //     k;
 //     ^
 //
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
 //     return k;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
 //     return k;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
 //   return k;
 //          ^
 //
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
 //   return k;
 //          ^
 //
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:17:5: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:17:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
 //     k;
 //     ^
 //
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
 //     return k;
 //            ^
 //
-// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Warning: Non-nullable variable 'k' is used before it's assigned.
+// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
 //   return k;
 //          ^
 //
@@ -61,46 +61,62 @@
   constructor constructor(core::int a, test::Class::T b) → test::Class<test::Class::T>
     : test::Class::a = a, test::Class::b = b, super core::Object::•() {
     core::int k;
+    let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:17:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
     k;
+    ^" in k;
   }
   @#C1
   constructor patchedConstructor(core::int i, test::Class::T j) → test::Class<test::Class::T>
     : test::Class::a = i, test::Class::b = j, super core::Object::•() {
     core::int k;
+    let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:15:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
     k;
+    ^" in k;
   }
   method method(core::int a) → core::int {
     core::int k;
     core::int j = a;
+    return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
     return k;
+           ^" in k;
   }
   @#C1
   method /* from org-dartlang-testcase:///patch_lib.dart */ patchedMethod(core::int i) → core::int {
     core::int k;
     core::int j = i;
+    return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
     return k;
+           ^" in k;
   }
   method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int {
     core::int k;
     core::int j = i;
+    return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
     return k;
+           ^" in k;
   }
 }
 static method method(core::int a) → core::int {
   core::int k;
   core::int j = a;
+  return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
   return k;
+         ^" in k;
 }
 @#C1
 static method /* from org-dartlang-testcase:///patch_lib.dart */ patchedMethod(core::int i) → core::int {
   core::int k;
   core::int j = i;
+  return let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
   return k;
+         ^" in k;
 }
 static method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int {
   core::int k;
   core::int j = i;
+  return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
   return k;
+         ^" in k;
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.weak.expect b/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.weak.expect
index 56c3e97..d823eb3 100644
--- a/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.weak.expect
@@ -13,11 +13,11 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/platform_nonnullable_fields/patch_lib.dart:10:7: Warning: Field 'field' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_nonnullable_fields/patch_lib.dart:10:7: Error: Field 'field' should be initialized because its type 'int' doesn't allow null.
 //   int field;
 //       ^^^^^
 //
-// pkg/front_end/testcases/nnbd/platform_nonnullable_fields/patch_lib.dart:15:7: Warning: This constructor doesn't initialize field 'field' and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_nonnullable_fields/patch_lib.dart:15:7: Error: This constructor should initialize field 'field' because its type 'int' doesn't allow null.
 //   int field;
 //       ^^^^^
 //
diff --git a/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.weak.transformed.expect
index 56c3e97..d823eb3 100644
--- a/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/platform_nonnullable_fields/main.dart.weak.transformed.expect
@@ -13,11 +13,11 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/platform_nonnullable_fields/patch_lib.dart:10:7: Warning: Field 'field' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_nonnullable_fields/patch_lib.dart:10:7: Error: Field 'field' should be initialized because its type 'int' doesn't allow null.
 //   int field;
 //       ^^^^^
 //
-// pkg/front_end/testcases/nnbd/platform_nonnullable_fields/patch_lib.dart:15:7: Warning: This constructor doesn't initialize field 'field' and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_nonnullable_fields/patch_lib.dart:15:7: Error: This constructor should initialize field 'field' because its type 'int' doesn't allow null.
 //   int field;
 //       ^^^^^
 //
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.expect
index 0faff12..9a4131e 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.expect
@@ -12,35 +12,35 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:11:27: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:11:27: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
 //   void patchedMethod([int i]) {}
 //                           ^
 //
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:13:29: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:13:29: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
 //   void _injectedMethod([int i]) {}
 //                             ^
 //
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:17:25: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:17:25: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
 // void patchedMethod([int i]) {}
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:19:27: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:19:27: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
 // void _injectedMethod([int i]) {}
 //                           ^
 //
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:6:20: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:6:20: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
 //   void method([int i]) {}
 //                    ^
 //
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:8:36: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:8:36: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
 //   external void patchedMethod([int i]);
 //                                    ^
 //
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:11:18: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:11:18: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
 // void method([int i]) {}
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:13:34: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:13:34: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
 // external void patchedMethod([int i]);
 //                                  ^
 //
diff --git a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.transformed.expect
index 0faff12..9a4131e 100644
--- a/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/platform_optional_parameters/main.dart.weak.transformed.expect
@@ -12,35 +12,35 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:11:27: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:11:27: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
 //   void patchedMethod([int i]) {}
 //                           ^
 //
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:13:29: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:13:29: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
 //   void _injectedMethod([int i]) {}
 //                             ^
 //
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:17:25: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:17:25: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
 // void patchedMethod([int i]) {}
 //                         ^
 //
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:19:27: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/patch_lib.dart:19:27: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
 // void _injectedMethod([int i]) {}
 //                           ^
 //
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:6:20: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:6:20: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
 //   void method([int i]) {}
 //                    ^
 //
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:8:36: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:8:36: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
 //   external void patchedMethod([int i]);
 //                                    ^
 //
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:11:18: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:11:18: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
 // void method([int i]) {}
 //                  ^
 //
-// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:13:34: Warning: Optional parameter 'i' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/platform_optional_parameters/origin_lib.dart:13:34: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
 // external void patchedMethod([int i]);
 //                                  ^
 //
diff --git a/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.expect b/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.expect
index 0b34a21..ac1c56b 100644
--- a/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.expect
@@ -2,19 +2,19 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:8:5: Warning: Field 'x' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:8:5: Error: Field 'x' should be initialized because its type 'int' doesn't allow null.
 // int x; // Error.
 //     ^
 //
-// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:13:14: Warning: Field 'x' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:13:14: Error: Field 'x' should be initialized because its type 'int' doesn't allow null.
 //   static int x; // Error.
 //              ^
 //
-// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:17:7: Warning: Field 'lx' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:17:7: Error: Field 'lx' should be initialized because its type 'int' doesn't allow null.
 //   int lx; // Error.
 //       ^^
 //
-// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:23:5: Warning: Field 'lt' isn't initialized and its type 'T' doesn't allow null.
+// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:23:5: Error: Field 'lt' should be initialized because its type 'T' doesn't allow null.
 //   T lt; // Error.
 //     ^^
 //
diff --git a/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.transformed.expect
index 0b34a21..ac1c56b 100644
--- a/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart.weak.transformed.expect
@@ -2,19 +2,19 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:8:5: Warning: Field 'x' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:8:5: Error: Field 'x' should be initialized because its type 'int' doesn't allow null.
 // int x; // Error.
 //     ^
 //
-// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:13:14: Warning: Field 'x' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:13:14: Error: Field 'x' should be initialized because its type 'int' doesn't allow null.
 //   static int x; // Error.
 //              ^
 //
-// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:17:7: Warning: Field 'lx' isn't initialized and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:17:7: Error: Field 'lx' should be initialized because its type 'int' doesn't allow null.
 //   int lx; // Error.
 //       ^^
 //
-// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:23:5: Warning: Field 'lt' isn't initialized and its type 'T' doesn't allow null.
+// pkg/front_end/testcases/nnbd/potentially_non_nullable_field.dart:23:5: Error: Field 'lt' should be initialized because its type 'T' doesn't allow null.
 //   T lt; // Error.
 //     ^^
 //
diff --git a/pkg/front_end/testcases/nnbd/required.dart.weak.expect b/pkg/front_end/testcases/nnbd/required.dart.weak.expect
index 4c8f81d..ed0ee8e 100644
--- a/pkg/front_end/testcases/nnbd/required.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/required.dart.weak.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/required.dart:29:8: Warning: Optional parameter 'x' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required.dart:29:8: Error: Optional parameter 'x' should have a default value because its type 'int' doesn't allow null.
 //   foo({x}) {}
 //        ^
 //
@@ -21,27 +21,27 @@
 //   f2 = (int a = 42, [int b]) {};
 //               ^
 //
-// pkg/front_end/testcases/nnbd/required.dart:48:15: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required.dart:48:15: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
 //   void g({int a, required int b = 42}) {}
 //               ^
 //
-// pkg/front_end/testcases/nnbd/required.dart:48:31: Warning: Named parameter 'b' is required and has a default value.
+// pkg/front_end/testcases/nnbd/required.dart:48:31: Error: Named parameter 'b' is required and can't have a default value.
 //   void g({int a, required int b = 42}) {}
 //                               ^
 //
-// pkg/front_end/testcases/nnbd/required.dart:49:13: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required.dart:49:13: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
 //   f = ({int a, required int b = 42}) {};
 //             ^
 //
-// pkg/front_end/testcases/nnbd/required.dart:49:29: Warning: Named parameter 'b' is required and has a default value.
+// pkg/front_end/testcases/nnbd/required.dart:49:29: Error: Named parameter 'b' is required and can't have a default value.
 //   f = ({int a, required int b = 42}) {};
 //                             ^
 //
-// pkg/front_end/testcases/nnbd/required.dart:52:28: Warning: Optional parameter 'b' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required.dart:52:28: Error: Optional parameter 'b' should have a default value because its type 'int' doesn't allow null.
 //   void g2(int a = 42, [int b]) {}
 //                            ^
 //
-// pkg/front_end/testcases/nnbd/required.dart:53:26: Warning: Optional parameter 'b' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required.dart:53:26: Error: Optional parameter 'b' should have a default value because its type 'int' doesn't allow null.
 //   f2 = (int a = 42, [int b]) {};
 //                          ^
 //
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 4c8f81d..ed0ee8e 100644
--- a/pkg/front_end/testcases/nnbd/required.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/required.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/required.dart:29:8: Warning: Optional parameter 'x' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required.dart:29:8: Error: Optional parameter 'x' should have a default value because its type 'int' doesn't allow null.
 //   foo({x}) {}
 //        ^
 //
@@ -21,27 +21,27 @@
 //   f2 = (int a = 42, [int b]) {};
 //               ^
 //
-// pkg/front_end/testcases/nnbd/required.dart:48:15: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required.dart:48:15: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
 //   void g({int a, required int b = 42}) {}
 //               ^
 //
-// pkg/front_end/testcases/nnbd/required.dart:48:31: Warning: Named parameter 'b' is required and has a default value.
+// pkg/front_end/testcases/nnbd/required.dart:48:31: Error: Named parameter 'b' is required and can't have a default value.
 //   void g({int a, required int b = 42}) {}
 //                               ^
 //
-// pkg/front_end/testcases/nnbd/required.dart:49:13: Warning: Optional parameter 'a' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required.dart:49:13: Error: Optional parameter 'a' should have a default value because its type 'int' doesn't allow null.
 //   f = ({int a, required int b = 42}) {};
 //             ^
 //
-// pkg/front_end/testcases/nnbd/required.dart:49:29: Warning: Named parameter 'b' is required and has a default value.
+// pkg/front_end/testcases/nnbd/required.dart:49:29: Error: Named parameter 'b' is required and can't have a default value.
 //   f = ({int a, required int b = 42}) {};
 //                             ^
 //
-// pkg/front_end/testcases/nnbd/required.dart:52:28: Warning: Optional parameter 'b' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required.dart:52:28: Error: Optional parameter 'b' should have a default value because its type 'int' doesn't allow null.
 //   void g2(int a = 42, [int b]) {}
 //                            ^
 //
-// pkg/front_end/testcases/nnbd/required.dart:53:26: Warning: Optional parameter 'b' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required.dart:53:26: Error: Optional parameter 'b' should have a default value because its type 'int' doesn't allow null.
 //   f2 = (int a = 42, [int b]) {};
 //                          ^
 //
diff --git a/pkg/front_end/testcases/nnbd/required_name_override.dart b/pkg/front_end/testcases/nnbd/required_name_override.dart
new file mode 100644
index 0000000..ed0b0526
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/required_name_override.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.
+
+import 'required_name_override_lib.dart';
+
+class B {
+  void test_default({int? i}) {}
+  void test_nondefault({int? i = 1}) {}
+}
+
+class A extends B implements C {
+  void test_default({required int? i}) {}
+  void test_nondefault({required int? i}) {}
+  void test_legacy({required int? i}) {}
+}
+
+main() {
+  A().test_default(i: 1);
+  A().test_nondefault(i: 1);
+  A().test_legacy(i: 1);
+}
diff --git a/pkg/front_end/testcases/nnbd/required_name_override.dart.outline.expect b/pkg/front_end/testcases/nnbd/required_name_override.dart.outline.expect
new file mode 100644
index 0000000..a35314d
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/required_name_override.dart.outline.expect
@@ -0,0 +1,62 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:13:36: Error: The required named parameter 'i' in method 'A.test_default' is not required in overridden method 'B.test_default'.
+//   void test_default({required int? i}) {}
+//                                    ^
+// pkg/front_end/testcases/nnbd/required_name_override.dart:8:8: Context: This is the overridden method ('test_default').
+//   void test_default({int? i}) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:14:39: Error: The required named parameter 'i' in method 'A.test_nondefault' is not required in overridden method 'B.test_nondefault'.
+//   void test_nondefault({required int? i}) {}
+//                                       ^
+// pkg/front_end/testcases/nnbd/required_name_override.dart:9:8: Context: This is the overridden method ('test_nondefault').
+//   void test_nondefault({int? i = 1}) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:15:35: Error: The required named parameter 'i' in method 'A.test_legacy' is not required in overridden method 'C.test_legacy'.
+//   void test_legacy({required int? i}) {}
+//                                   ^
+// pkg/front_end/testcases/nnbd/required_name_override_lib.dart:8:8: Context: This is the overridden method ('test_legacy').
+//   void test_legacy({int i}) {}
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+import "required_name_override_lib.dart" as req;
+
+import "org-dartlang-testcase:///required_name_override_lib.dart";
+
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    ;
+  method test_default({core::int? i}) → void
+    ;
+  method test_nondefault({core::int? i = 1}) → void
+    ;
+}
+class A extends self::B implements req::C {
+  synthetic constructor •() → self::A
+    ;
+  method test_default({required core::int? i}) → void
+    ;
+  method test_nondefault({required core::int? i}) → void
+    ;
+  method test_legacy({required core::int? i}) → void
+    ;
+}
+static method main() → dynamic
+  ;
+
+library;
+import self as req;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → req::C*
+    ;
+  method test_legacy({core::int* i}) → void
+    ;
+}
diff --git a/pkg/front_end/testcases/nnbd/required_name_override.dart.strong.expect b/pkg/front_end/testcases/nnbd/required_name_override.dart.strong.expect
new file mode 100644
index 0000000..201e23a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/required_name_override.dart.strong.expect
@@ -0,0 +1,67 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:13:36: Error: The required named parameter 'i' in method 'A.test_default' is not required in overridden method 'B.test_default'.
+//   void test_default({required int? i}) {}
+//                                    ^
+// pkg/front_end/testcases/nnbd/required_name_override.dart:8:8: Context: This is the overridden method ('test_default').
+//   void test_default({int? i}) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:14:39: Error: The required named parameter 'i' in method 'A.test_nondefault' is not required in overridden method 'B.test_nondefault'.
+//   void test_nondefault({required int? i}) {}
+//                                       ^
+// pkg/front_end/testcases/nnbd/required_name_override.dart:9:8: Context: This is the overridden method ('test_nondefault').
+//   void test_nondefault({int? i = 1}) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:15:35: Error: The required named parameter 'i' in method 'A.test_legacy' is not required in overridden method 'C.test_legacy'.
+//   void test_legacy({required int? i}) {}
+//                                   ^
+// pkg/front_end/testcases/nnbd/required_name_override_lib.dart:8:8: Context: This is the overridden method ('test_legacy').
+//   void test_legacy({int i}) {}
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+import "required_name_override_lib.dart" as req;
+
+import "org-dartlang-testcase:///required_name_override_lib.dart";
+
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method test_default({core::int? i = #C1}) → void {}
+  method test_nondefault({core::int? i = #C2}) → void {}
+}
+class A extends self::B implements req::C {
+  synthetic constructor •() → self::A
+    : super self::B::•()
+    ;
+  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 {}
+}
+static method main() → dynamic {
+  new self::A::•().{self::A::test_default}(i: 1);
+  new self::A::•().{self::A::test_nondefault}(i: 1);
+  new self::A::•().{self::A::test_legacy}(i: 1);
+}
+
+library;
+import self as req;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → req::C*
+    : super core::Object::•()
+    ;
+  method test_legacy({core::int* i = #C1}) → void {}
+}
+
+constants  {
+  #C1 = null
+  #C2 = 1
+}
diff --git a/pkg/front_end/testcases/nnbd/required_name_override.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/required_name_override.dart.strong.transformed.expect
new file mode 100644
index 0000000..201e23a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/required_name_override.dart.strong.transformed.expect
@@ -0,0 +1,67 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:13:36: Error: The required named parameter 'i' in method 'A.test_default' is not required in overridden method 'B.test_default'.
+//   void test_default({required int? i}) {}
+//                                    ^
+// pkg/front_end/testcases/nnbd/required_name_override.dart:8:8: Context: This is the overridden method ('test_default').
+//   void test_default({int? i}) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:14:39: Error: The required named parameter 'i' in method 'A.test_nondefault' is not required in overridden method 'B.test_nondefault'.
+//   void test_nondefault({required int? i}) {}
+//                                       ^
+// pkg/front_end/testcases/nnbd/required_name_override.dart:9:8: Context: This is the overridden method ('test_nondefault').
+//   void test_nondefault({int? i = 1}) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:15:35: Error: The required named parameter 'i' in method 'A.test_legacy' is not required in overridden method 'C.test_legacy'.
+//   void test_legacy({required int? i}) {}
+//                                   ^
+// pkg/front_end/testcases/nnbd/required_name_override_lib.dart:8:8: Context: This is the overridden method ('test_legacy').
+//   void test_legacy({int i}) {}
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+import "required_name_override_lib.dart" as req;
+
+import "org-dartlang-testcase:///required_name_override_lib.dart";
+
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method test_default({core::int? i = #C1}) → void {}
+  method test_nondefault({core::int? i = #C2}) → void {}
+}
+class A extends self::B implements req::C {
+  synthetic constructor •() → self::A
+    : super self::B::•()
+    ;
+  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 {}
+}
+static method main() → dynamic {
+  new self::A::•().{self::A::test_default}(i: 1);
+  new self::A::•().{self::A::test_nondefault}(i: 1);
+  new self::A::•().{self::A::test_legacy}(i: 1);
+}
+
+library;
+import self as req;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → req::C*
+    : super core::Object::•()
+    ;
+  method test_legacy({core::int* i = #C1}) → void {}
+}
+
+constants  {
+  #C1 = null
+  #C2 = 1
+}
diff --git a/pkg/front_end/testcases/nnbd/required_name_override.dart.weak.expect b/pkg/front_end/testcases/nnbd/required_name_override.dart.weak.expect
new file mode 100644
index 0000000..201e23a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/required_name_override.dart.weak.expect
@@ -0,0 +1,67 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:13:36: Error: The required named parameter 'i' in method 'A.test_default' is not required in overridden method 'B.test_default'.
+//   void test_default({required int? i}) {}
+//                                    ^
+// pkg/front_end/testcases/nnbd/required_name_override.dart:8:8: Context: This is the overridden method ('test_default').
+//   void test_default({int? i}) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:14:39: Error: The required named parameter 'i' in method 'A.test_nondefault' is not required in overridden method 'B.test_nondefault'.
+//   void test_nondefault({required int? i}) {}
+//                                       ^
+// pkg/front_end/testcases/nnbd/required_name_override.dart:9:8: Context: This is the overridden method ('test_nondefault').
+//   void test_nondefault({int? i = 1}) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:15:35: Error: The required named parameter 'i' in method 'A.test_legacy' is not required in overridden method 'C.test_legacy'.
+//   void test_legacy({required int? i}) {}
+//                                   ^
+// pkg/front_end/testcases/nnbd/required_name_override_lib.dart:8:8: Context: This is the overridden method ('test_legacy').
+//   void test_legacy({int i}) {}
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+import "required_name_override_lib.dart" as req;
+
+import "org-dartlang-testcase:///required_name_override_lib.dart";
+
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method test_default({core::int? i = #C1}) → void {}
+  method test_nondefault({core::int? i = #C2}) → void {}
+}
+class A extends self::B implements req::C {
+  synthetic constructor •() → self::A
+    : super self::B::•()
+    ;
+  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 {}
+}
+static method main() → dynamic {
+  new self::A::•().{self::A::test_default}(i: 1);
+  new self::A::•().{self::A::test_nondefault}(i: 1);
+  new self::A::•().{self::A::test_legacy}(i: 1);
+}
+
+library;
+import self as req;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → req::C*
+    : super core::Object::•()
+    ;
+  method test_legacy({core::int* i = #C1}) → void {}
+}
+
+constants  {
+  #C1 = null
+  #C2 = 1
+}
diff --git a/pkg/front_end/testcases/nnbd/required_name_override.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/required_name_override.dart.weak.transformed.expect
new file mode 100644
index 0000000..201e23a
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/required_name_override.dart.weak.transformed.expect
@@ -0,0 +1,67 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:13:36: Error: The required named parameter 'i' in method 'A.test_default' is not required in overridden method 'B.test_default'.
+//   void test_default({required int? i}) {}
+//                                    ^
+// pkg/front_end/testcases/nnbd/required_name_override.dart:8:8: Context: This is the overridden method ('test_default').
+//   void test_default({int? i}) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:14:39: Error: The required named parameter 'i' in method 'A.test_nondefault' is not required in overridden method 'B.test_nondefault'.
+//   void test_nondefault({required int? i}) {}
+//                                       ^
+// pkg/front_end/testcases/nnbd/required_name_override.dart:9:8: Context: This is the overridden method ('test_nondefault').
+//   void test_nondefault({int? i = 1}) {}
+//        ^
+//
+// pkg/front_end/testcases/nnbd/required_name_override.dart:15:35: Error: The required named parameter 'i' in method 'A.test_legacy' is not required in overridden method 'C.test_legacy'.
+//   void test_legacy({required int? i}) {}
+//                                   ^
+// pkg/front_end/testcases/nnbd/required_name_override_lib.dart:8:8: Context: This is the overridden method ('test_legacy').
+//   void test_legacy({int i}) {}
+//        ^
+//
+import self as self;
+import "dart:core" as core;
+import "required_name_override_lib.dart" as req;
+
+import "org-dartlang-testcase:///required_name_override_lib.dart";
+
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method test_default({core::int? i = #C1}) → void {}
+  method test_nondefault({core::int? i = #C2}) → void {}
+}
+class A extends self::B implements req::C {
+  synthetic constructor •() → self::A
+    : super self::B::•()
+    ;
+  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 {}
+}
+static method main() → dynamic {
+  new self::A::•().{self::A::test_default}(i: 1);
+  new self::A::•().{self::A::test_nondefault}(i: 1);
+  new self::A::•().{self::A::test_legacy}(i: 1);
+}
+
+library;
+import self as req;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → req::C*
+    : super core::Object::•()
+    ;
+  method test_legacy({core::int* i = #C1}) → void {}
+}
+
+constants  {
+  #C1 = null
+  #C2 = 1
+}
diff --git a/pkg/front_end/testcases/nnbd/required_name_override_lib.dart b/pkg/front_end/testcases/nnbd/required_name_override_lib.dart
new file mode 100644
index 0000000..44d3239
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/required_name_override_lib.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.5
+
+class C {
+  void test_legacy({int i}) {}
+}
diff --git a/pkg/front_end/testcases/nnbd/required_named_parameter.dart.weak.expect b/pkg/front_end/testcases/nnbd/required_named_parameter.dart.weak.expect
index 8f475d6..41566f3 100644
--- a/pkg/front_end/testcases/nnbd/required_named_parameter.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/required_named_parameter.dart.weak.expect
@@ -2,15 +2,15 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/required_named_parameter.dart:6:19: Warning: Named parameter 'parameter' is required and has a default value.
+// pkg/front_end/testcases/nnbd/required_named_parameter.dart:6:19: Error: Named parameter 'parameter' is required and can't have a default value.
 // foo({required int parameter = 42}) {}
 //                   ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/required_named_parameter.dart:7:11: Warning: Optional parameter 'parameter' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required_named_parameter.dart:7:11: Error: Optional parameter 'parameter' should have a default value because its type 'int' doesn't allow null.
 // foo2({int parameter}) {}
 //           ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/required_named_parameter.dart:8:11: Warning: Optional parameter 'parameter' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required_named_parameter.dart:8:11: Error: Optional parameter 'parameter' should have a default value because its type 'int' doesn't allow null.
 // foo3([int parameter]) {}
 //           ^^^^^^^^^
 //
diff --git a/pkg/front_end/testcases/nnbd/required_named_parameter.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/required_named_parameter.dart.weak.transformed.expect
index 8f475d6..41566f3 100644
--- a/pkg/front_end/testcases/nnbd/required_named_parameter.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/required_named_parameter.dart.weak.transformed.expect
@@ -2,15 +2,15 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/required_named_parameter.dart:6:19: Warning: Named parameter 'parameter' is required and has a default value.
+// pkg/front_end/testcases/nnbd/required_named_parameter.dart:6:19: Error: Named parameter 'parameter' is required and can't have a default value.
 // foo({required int parameter = 42}) {}
 //                   ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/required_named_parameter.dart:7:11: Warning: Optional parameter 'parameter' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required_named_parameter.dart:7:11: Error: Optional parameter 'parameter' should have a default value because its type 'int' doesn't allow null.
 // foo2({int parameter}) {}
 //           ^^^^^^^^^
 //
-// pkg/front_end/testcases/nnbd/required_named_parameter.dart:8:11: Warning: Optional parameter 'parameter' doesn't have a default value and its type 'int' doesn't allow null.
+// pkg/front_end/testcases/nnbd/required_named_parameter.dart:8:11: Error: Optional parameter 'parameter' should have a default value because its type 'int' doesn't allow null.
 // foo3([int parameter]) {}
 //           ^^^^^^^^^
 //
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart b/pkg/front_end/testcases/nnbd/return_null.dart
new file mode 100644
index 0000000..a044f19
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/return_null.dart
@@ -0,0 +1,126 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for 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';
+
+String returnImplicit() /*error*/ {
+  print("foo");
+}
+
+String returnExplicit() {
+  print("foo");
+  return null; // error
+}
+
+String returnMixed(bool b) /*error*/ {
+  if (b) {
+    print("foo");
+    return null; // error
+  }
+}
+
+Future returnAsync1() async {} // ok
+
+FutureOr returnAsync2() async {} // ok
+
+FutureOr<int> returnAsync3() async {} // error
+
+FutureOr<int?> returnAsync4() async {} // ok
+
+returnAsync5() async {} // ok
+
+Future<int?> returnAsync6() async {
+  return null; // ok
+}
+
+Future<int?> returnAsync7() async {} // ok
+
+Iterable yieldSync() sync* {} // ok
+
+Stream yieldAsync() async* {} // ok
+
+enum Enum { a, b }
+
+Enum caseReturn1(Enum e) /* ok */ {
+  switch (e) {
+    case Enum.a:
+      return e;
+    case Enum.b:
+      return e;
+  }
+}
+
+Enum caseReturn2(Enum e) /* error */ {
+  switch (e) {
+    case Enum.a:
+      return e;
+    default:
+  }
+}
+
+localFunctions() {
+  String returnImplicit() /* error */ {
+    print("foo");
+  }
+
+  String returnExplicit() {
+    print("foo");
+    return null; // error
+  }
+
+  String returnMixed(bool b) /* error */ {
+    if (b) {
+      print("foo");
+      return null; // error
+    }
+  }
+
+  Future returnAsync1() async {} // ok
+
+  FutureOr returnAsync2() async {} // ok
+
+  FutureOr<int> returnAsync3() async {} // error
+
+  FutureOr<int?> returnAsync4() async {} // ok
+
+  returnAsync5() async {} // ok
+
+  Future<int?> returnAsync6() async {
+    return null; // ok
+  }
+
+  Future<int?> returnAsync7() async {} // ok
+
+  Iterable yieldSync() sync* {} // ok
+
+  Stream yieldAsync() async* {} // ok
+
+  Enum caseReturn1(Enum e) /* ok */ {
+    switch (e) {
+      case Enum.a:
+        return e;
+      case Enum.b:
+        return e;
+    }
+  }
+
+  Enum caseReturn2(Enum e) /* error */ {
+    switch (e) {
+      case Enum.a:
+        return e;
+      default:
+    }
+  }
+
+  bool b = false;
+  var local1 = () /* error */ {
+    if (b) return 0;
+  }();
+  var local2 = () /* ok */ {
+    if (b) return null;
+    if (!b) return 0;
+  }();
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.outline.expect b/pkg/front_end/testcases/nnbd/return_null.dart.outline.expect
new file mode 100644
index 0000000..94a68bd
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.outline.expect
@@ -0,0 +1,51 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class Enum extends core::Object /*isEnum*/  {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum> values = const <self::Enum>[self::Enum::a, self::Enum::b];
+  static const field self::Enum a = const self::Enum::•(0, "Enum.a");
+  static const field self::Enum b = const self::Enum::•(1, "Enum.b");
+  const constructor •(core::int index, core::String _name) → self::Enum
+    : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum::_name};
+}
+static method returnImplicit() → core::String
+  ;
+static method returnExplicit() → core::String
+  ;
+static method returnMixed(core::bool b) → core::String
+  ;
+static method returnAsync1() → asy::Future<dynamic>
+  ;
+static method returnAsync2() → asy::FutureOr<dynamic>
+  ;
+static method returnAsync3() → asy::FutureOr<core::int>
+  ;
+static method returnAsync4() → asy::FutureOr<core::int?>
+  ;
+static method returnAsync5() → dynamic
+  ;
+static method returnAsync6() → asy::Future<core::int?>
+  ;
+static method returnAsync7() → asy::Future<core::int?>
+  ;
+static method yieldSync() → core::Iterable<dynamic>
+  ;
+static method yieldAsync() → asy::Stream<dynamic>
+  ;
+static method caseReturn1(self::Enum e) → self::Enum
+  ;
+static method caseReturn2(self::Enum e) → self::Enum
+  ;
+static method localFunctions() → dynamic
+  ;
+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
new file mode 100644
index 0000000..336e616
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect
@@ -0,0 +1,239 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:7:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+// String returnImplicit() /*error*/ {
+//        ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+//   return null; // error
+//          ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+//     return null; // error
+//            ^
+//
+// 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*/ {
+//        ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:27:15: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// FutureOr<int> returnAsync3() async {} // error
+//               ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+//  - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+// Enum caseReturn2(Enum e) /* error */ {
+//      ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+//   String returnImplicit() /* error */ {
+//   ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+//     return null; // error
+//            ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+//       return null; // error
+//              ^
+//
+// 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 */ {
+//   ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:83:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+//   FutureOr<int> returnAsync3() async {} // error
+//   ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+//  - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+//   Enum caseReturn2(Enum e) /* error */ {
+//   ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+//   var local1 = () /* error */ {
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class Enum extends core::Object /*isEnum*/  {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum> values = #C7;
+  static const field self::Enum a = #C3;
+  static const field self::Enum b = #C6;
+  const constructor •(core::int index, core::String _name) → self::Enum
+    : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum::_name};
+}
+static method returnImplicit() → core::String {
+  core::print("foo");
+  return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:7:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+String returnImplicit() /*error*/ {
+       ^" in null;
+}
+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 assigned to a variable of type 'String'.
+  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 assigned to a variable of type 'String'.
+    return null; // error
+           ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+  }
+  return let final<BottomType> #t4 = 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> async {}
+static method returnAsync2() → asy::FutureOr<dynamic> async {}
+static method returnAsync3() → asy::FutureOr<core::int> async {
+  return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:27:15: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+FutureOr<int> returnAsync3() async {} // error
+              ^" in null;
+}
+static method returnAsync4() → asy::FutureOr<core::int?> async {}
+static method returnAsync5() → dynamic async {}
+static method returnAsync6() → asy::Future<core::int?> async {
+  return null;
+}
+static method returnAsync7() → asy::Future<core::int?> async {}
+static method yieldSync() → core::Iterable<dynamic> sync* {}
+static method yieldAsync() → asy::Stream<dynamic> async* {}
+static method caseReturn1(self::Enum e) → self::Enum {
+  switch(e) {
+    #L1:
+    case #C3:
+      {
+        return e;
+      }
+    #L2:
+    case #C6:
+      {
+        return e;
+      }
+  }
+}
+static method caseReturn2(self::Enum e) → self::Enum {
+  switch(e) {
+    #L3:
+    case #C3:
+      {
+        return e;
+      }
+    #L4:
+    default:
+      {}
+  }
+  return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+ - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+Enum caseReturn2(Enum e) /* error */ {
+     ^" in null;
+}
+static method localFunctions() → dynamic {
+  function returnImplicit() → core::String {
+    core::print("foo");
+    return let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+  String returnImplicit() /* error */ {
+  ^" in null;
+  }
+  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 assigned to a variable of type 'String'.
+    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 assigned to a variable of type 'String'.
+      return null; // error
+             ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+    }
+    return let final<BottomType> #t10 = 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> async {}
+  function returnAsync2() → asy::FutureOr<dynamic> async {}
+  function returnAsync3() → asy::FutureOr<core::int> async {
+    return let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:83:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+  FutureOr<int> returnAsync3() async {} // error
+  ^" in null;
+  }
+  function returnAsync4() → asy::FutureOr<core::int?> async {}
+  function returnAsync5() → asy::Future<core::Null?> async {}
+  function returnAsync6() → asy::Future<core::int?> async {
+    return null;
+  }
+  function returnAsync7() → asy::Future<core::int?> async {}
+  function yieldSync() → core::Iterable<dynamic> sync* {}
+  function yieldAsync() → asy::Stream<dynamic> async* {}
+  function caseReturn1(self::Enum e) → self::Enum {
+    switch(e) {
+      #L5:
+      case #C3:
+        {
+          return e;
+        }
+      #L6:
+      case #C6:
+        {
+          return e;
+        }
+    }
+  }
+  function caseReturn2(self::Enum e) → self::Enum {
+    switch(e) {
+      #L7:
+      case #C3:
+        {
+          return e;
+        }
+      #L8:
+      default:
+        {}
+    }
+    return let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+ - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+  Enum caseReturn2(Enum e) /* error */ {
+  ^" in null;
+  }
+  core::bool b = false;
+  core::int local1 = (() → core::int {
+    if(b)
+      return 0;
+    return let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+  var local1 = () /* error */ {
+               ^" in null;
+  }).call();
+  core::int? local2 = (() → core::int? {
+    if(b)
+      return null;
+    if(!b)
+      return 0;
+  }).call();
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "Enum.a"
+  #C3 = self::Enum {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "Enum.b"
+  #C6 = self::Enum {index:#C4, _name:#C5}
+  #C7 = <self::Enum>[#C3, #C6]
+}
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
new file mode 100644
index 0000000..7c0e736
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect
@@ -0,0 +1,635 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:7:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+// String returnImplicit() /*error*/ {
+//        ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+//   return null; // error
+//          ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+//     return null; // error
+//            ^
+//
+// 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*/ {
+//        ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:27:15: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// FutureOr<int> returnAsync3() async {} // error
+//               ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+//  - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+// Enum caseReturn2(Enum e) /* error */ {
+//      ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+//   String returnImplicit() /* error */ {
+//   ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+//     return null; // error
+//            ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+//       return null; // error
+//              ^
+//
+// 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 */ {
+//   ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:83:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+//   FutureOr<int> returnAsync3() async {} // error
+//   ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+//  - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+//   Enum caseReturn2(Enum e) /* error */ {
+//   ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+//   var local1 = () /* error */ {
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class Enum extends core::Object /*isEnum*/  {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum> values = #C7;
+  static const field self::Enum a = #C3;
+  static const field self::Enum b = #C6;
+  const constructor •(core::int index, core::String _name) → self::Enum
+    : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum::_name};
+}
+static method returnImplicit() → core::String {
+  core::print("foo");
+  return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:7:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+String returnImplicit() /*error*/ {
+       ^" in null;
+}
+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 assigned to a variable of type 'String'.
+  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 assigned to a variable of type 'String'.
+    return null; // error
+           ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+  }
+  return let final<BottomType> #t4 = 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>();
+  asy::FutureOr<dynamic>? :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  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 {
+      #L1:
+      {}
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method returnAsync2() → asy::FutureOr<dynamic> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>? :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  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 {
+      #L2:
+      {}
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method returnAsync3() → asy::FutureOr<core::int> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
+  asy::FutureOr<core::int>? :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  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 {
+      #L3:
+      {
+        :return_value = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:27:15: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+FutureOr<int> returnAsync3() async {} // error
+              ^" in null;
+        break #L3;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method returnAsync4() → asy::FutureOr<core::int?> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+  asy::FutureOr<core::int?>? :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  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:
+      {}
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method returnAsync5() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>? :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  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:
+      {}
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method returnAsync6() → asy::Future<core::int?> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+  asy::FutureOr<core::int?>? :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  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 {
+      #L6:
+      {
+        :return_value = null;
+        break #L6;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method returnAsync7() → asy::Future<core::int?> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+  asy::FutureOr<core::int?>? :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  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 {
+      #L7:
+      {}
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method yieldSync() → core::Iterable<dynamic> /* originally sync* */ {
+  core::int :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :sync_op(core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+    {}
+    return false;
+  }
+  return new core::_SyncIterable::•<dynamic>(:sync_op);
+}
+static method yieldAsync() → asy::Stream<dynamic> /* originally async* */ {
+  asy::_AsyncStarStreamController<dynamic>? :controller;
+  dynamic :controller_stream;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  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
+      try {
+        #L8:
+        {}
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+      }
+    finally {
+      :controller.{asy::_AsyncStarStreamController::close}();
+    }
+  :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::•<dynamic>(:async_op);
+  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+  return :controller_stream;
+}
+static method caseReturn1(self::Enum e) → self::Enum {
+  switch(e) {
+    #L9:
+    case #C3:
+      {
+        return e;
+      }
+    #L10:
+    case #C6:
+      {
+        return e;
+      }
+  }
+}
+static method caseReturn2(self::Enum e) → self::Enum {
+  switch(e) {
+    #L11:
+    case #C3:
+      {
+        return e;
+      }
+    #L12:
+    default:
+      {}
+  }
+  return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+ - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+Enum caseReturn2(Enum e) /* error */ {
+     ^" in null;
+}
+static method localFunctions() → dynamic {
+  function returnImplicit() → core::String {
+    core::print("foo");
+    return let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+  String returnImplicit() /* error */ {
+  ^" in null;
+  }
+  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 assigned to a variable of type 'String'.
+    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 assigned to a variable of type 'String'.
+      return null; // error
+             ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+    }
+    return let final<BottomType> #t10 = 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>();
+    asy::FutureOr<dynamic>? :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    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 {
+        #L13:
+        {}
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+  function returnAsync2() → asy::FutureOr<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>? :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    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 {
+        #L14:
+        {}
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+  function returnAsync3() → asy::FutureOr<core::int> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
+    asy::FutureOr<core::int>? :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    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 {
+        #L15:
+        {
+          :return_value = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:83:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+  FutureOr<int> returnAsync3() async {} // error
+  ^" in null;
+          break #L15;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+  function returnAsync4() → asy::FutureOr<core::int?> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+    asy::FutureOr<core::int?>? :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    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 {
+        #L16:
+        {}
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+  function returnAsync5() → asy::Future<core::Null?> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::Null?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Null?>();
+    asy::FutureOr<core::Null?>? :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    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 {
+        #L17:
+        {}
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+  function returnAsync6() → asy::Future<core::int?> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+    asy::FutureOr<core::int?>? :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    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 {
+        #L18:
+        {
+          :return_value = null;
+          break #L18;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+  function returnAsync7() → asy::Future<core::int?> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+    asy::FutureOr<core::int?>? :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    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 {
+        #L19:
+        {}
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+  function yieldSync() → core::Iterable<dynamic> /* originally sync* */ {
+    core::int :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :sync_op(core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+      {}
+      return false;
+    }
+    return new core::_SyncIterable::•<dynamic>(:sync_op);
+  }
+  function yieldAsync() → asy::Stream<dynamic> /* originally async* */ {
+    asy::_AsyncStarStreamController<dynamic>? :controller;
+    dynamic :controller_stream;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    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
+        try {
+          #L20:
+          {}
+          return;
+        }
+        on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+          :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+        }
+      finally {
+        :controller.{asy::_AsyncStarStreamController::close}();
+      }
+    :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::•<dynamic>(:async_op);
+    :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+    return :controller_stream;
+  }
+  function caseReturn1(self::Enum e) → self::Enum {
+    switch(e) {
+      #L21:
+      case #C3:
+        {
+          return e;
+        }
+      #L22:
+      case #C6:
+        {
+          return e;
+        }
+    }
+  }
+  function caseReturn2(self::Enum e) → self::Enum {
+    switch(e) {
+      #L23:
+      case #C3:
+        {
+          return e;
+        }
+      #L24:
+      default:
+        {}
+    }
+    return let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+ - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+  Enum caseReturn2(Enum e) /* error */ {
+  ^" in null;
+  }
+  core::bool b = false;
+  core::int local1 = (() → core::int {
+    if(b)
+      return 0;
+    return let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+  var local1 = () /* error */ {
+               ^" in null;
+  }).call();
+  core::int? local2 = (() → core::int? {
+    if(b)
+      return null;
+    if(!b)
+      return 0;
+  }).call();
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "Enum.a"
+  #C3 = self::Enum {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "Enum.b"
+  #C6 = self::Enum {index:#C4, _name:#C5}
+  #C7 = <self::Enum>[#C3, #C6]
+}
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect b/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect
new file mode 100644
index 0000000..9180305
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect
@@ -0,0 +1,239 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:7:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+// String returnImplicit() /*error*/ {
+//        ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+//   return null; // error
+//          ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+//     return null; // error
+//            ^
+//
+// 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*/ {
+//        ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:27:15: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// FutureOr<int> returnAsync3() async {} // error
+//               ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+//  - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+// Enum caseReturn2(Enum e) /* error */ {
+//      ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+//   String returnImplicit() /* error */ {
+//   ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+//     return null; // error
+//            ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+//       return null; // error
+//              ^
+//
+// 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 */ {
+//   ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:83:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+//   FutureOr<int> returnAsync3() async {} // error
+//   ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+//  - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+//   Enum caseReturn2(Enum e) /* error */ {
+//   ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+//   var local1 = () /* error */ {
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class Enum extends core::Object /*isEnum*/  {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum> values = #C7;
+  static const field self::Enum a = #C3;
+  static const field self::Enum b = #C6;
+  const constructor •(core::int index, core::String _name) → self::Enum
+    : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum::_name};
+}
+static method returnImplicit() → core::String {
+  core::print("foo");
+  return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:7:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+String returnImplicit() /*error*/ {
+       ^" in null;
+}
+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 assigned to a variable of type 'String'.
+  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 assigned to a variable of type 'String'.
+    return null; // error
+           ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+  }
+  return let final<BottomType> #t4 = 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> async {}
+static method returnAsync2() → asy::FutureOr<dynamic> async {}
+static method returnAsync3() → asy::FutureOr<core::int> async {
+  return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:27:15: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+FutureOr<int> returnAsync3() async {} // error
+              ^" in null;
+}
+static method returnAsync4() → asy::FutureOr<core::int?> async {}
+static method returnAsync5() → dynamic async {}
+static method returnAsync6() → asy::Future<core::int?> async {
+  return null;
+}
+static method returnAsync7() → asy::Future<core::int?> async {}
+static method yieldSync() → core::Iterable<dynamic> sync* {}
+static method yieldAsync() → asy::Stream<dynamic> async* {}
+static method caseReturn1(self::Enum e) → self::Enum {
+  switch(e) {
+    #L1:
+    case #C3:
+      {
+        return e;
+      }
+    #L2:
+    case #C6:
+      {
+        return e;
+      }
+  }
+}
+static method caseReturn2(self::Enum e) → self::Enum {
+  switch(e) {
+    #L3:
+    case #C3:
+      {
+        return e;
+      }
+    #L4:
+    default:
+      {}
+  }
+  return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+ - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+Enum caseReturn2(Enum e) /* error */ {
+     ^" in null;
+}
+static method localFunctions() → dynamic {
+  function returnImplicit() → core::String {
+    core::print("foo");
+    return let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+  String returnImplicit() /* error */ {
+  ^" in null;
+  }
+  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 assigned to a variable of type 'String'.
+    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 assigned to a variable of type 'String'.
+      return null; // error
+             ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+    }
+    return let final<BottomType> #t10 = 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> async {}
+  function returnAsync2() → asy::FutureOr<dynamic> async {}
+  function returnAsync3() → asy::FutureOr<core::int> async {
+    return let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:83:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+  FutureOr<int> returnAsync3() async {} // error
+  ^" in null;
+  }
+  function returnAsync4() → asy::FutureOr<core::int?> async {}
+  function returnAsync5() → asy::Future<core::Null?> async {}
+  function returnAsync6() → asy::Future<core::int?> async {
+    return null;
+  }
+  function returnAsync7() → asy::Future<core::int?> async {}
+  function yieldSync() → core::Iterable<dynamic> sync* {}
+  function yieldAsync() → asy::Stream<dynamic> async* {}
+  function caseReturn1(self::Enum e) → self::Enum {
+    switch(e) {
+      #L5:
+      case #C3:
+        {
+          return e;
+        }
+      #L6:
+      case #C6:
+        {
+          return e;
+        }
+    }
+  }
+  function caseReturn2(self::Enum e) → self::Enum {
+    switch(e) {
+      #L7:
+      case #C3:
+        {
+          return e;
+        }
+      #L8:
+      default:
+        {}
+    }
+    return let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+ - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+  Enum caseReturn2(Enum e) /* error */ {
+  ^" in null;
+  }
+  core::bool b = false;
+  core::int local1 = (() → core::int {
+    if(b)
+      return 0;
+    return let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+  var local1 = () /* error */ {
+               ^" in null;
+  }).call();
+  core::int? local2 = (() → core::int? {
+    if(b)
+      return null;
+    if(!b)
+      return 0;
+  }).call();
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "Enum.a"
+  #C3 = self::Enum {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "Enum.b"
+  #C6 = self::Enum {index:#C4, _name:#C5}
+  #C7 = <self::Enum*>[#C3, #C6]
+}
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
new file mode 100644
index 0000000..319833c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect
@@ -0,0 +1,635 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:7:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+// String returnImplicit() /*error*/ {
+//        ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+//   return null; // error
+//          ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+//     return null; // error
+//            ^
+//
+// 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*/ {
+//        ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:27:15: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+// FutureOr<int> returnAsync3() async {} // error
+//               ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+//  - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+// Enum caseReturn2(Enum e) /* error */ {
+//      ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+//   String returnImplicit() /* error */ {
+//   ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+//     return null; // error
+//            ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null?' can't be assigned to a variable of type 'String'.
+//       return null; // error
+//              ^
+//
+// 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 */ {
+//   ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:83:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+//   FutureOr<int> returnAsync3() async {} // error
+//   ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+//  - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+//   Enum caseReturn2(Enum e) /* error */ {
+//   ^
+//
+// pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+//   var local1 = () /* error */ {
+//                ^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+class Enum extends core::Object /*isEnum*/  {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum> values = #C7;
+  static const field self::Enum a = #C3;
+  static const field self::Enum b = #C6;
+  const constructor •(core::int index, core::String _name) → self::Enum
+    : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum::_name};
+}
+static method returnImplicit() → core::String {
+  core::print("foo");
+  return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:7:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+String returnImplicit() /*error*/ {
+       ^" in null;
+}
+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 assigned to a variable of type 'String'.
+  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 assigned to a variable of type 'String'.
+    return null; // error
+           ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+  }
+  return let final<BottomType> #t4 = 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>();
+  asy::FutureOr<dynamic>? :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  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 {
+      #L1:
+      {}
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method returnAsync2() → asy::FutureOr<dynamic> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>? :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  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 {
+      #L2:
+      {}
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method returnAsync3() → asy::FutureOr<core::int> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
+  asy::FutureOr<core::int>? :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  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 {
+      #L3:
+      {
+        :return_value = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:27:15: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+FutureOr<int> returnAsync3() async {} // error
+              ^" in null;
+        break #L3;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method returnAsync4() → asy::FutureOr<core::int?> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+  asy::FutureOr<core::int?>? :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  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:
+      {}
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method returnAsync5() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>? :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  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:
+      {}
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method returnAsync6() → asy::Future<core::int?> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+  asy::FutureOr<core::int?>? :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  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 {
+      #L6:
+      {
+        :return_value = null;
+        break #L6;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method returnAsync7() → asy::Future<core::int?> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+  asy::FutureOr<core::int?>? :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  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 {
+      #L7:
+      {}
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method yieldSync() → core::Iterable<dynamic> /* originally sync* */ {
+  core::int :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :sync_op(core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+    {}
+    return false;
+  }
+  return new core::_SyncIterable::•<dynamic>(:sync_op);
+}
+static method yieldAsync() → asy::Stream<dynamic> /* originally async* */ {
+  asy::_AsyncStarStreamController<dynamic>? :controller;
+  dynamic :controller_stream;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  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
+      try {
+        #L8:
+        {}
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+      }
+    finally {
+      :controller.{asy::_AsyncStarStreamController::close}();
+    }
+  :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::•<dynamic>(:async_op);
+  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+  return :controller_stream;
+}
+static method caseReturn1(self::Enum e) → self::Enum {
+  switch(e) {
+    #L9:
+    case #C3:
+      {
+        return e;
+      }
+    #L10:
+    case #C6:
+      {
+        return e;
+      }
+  }
+}
+static method caseReturn2(self::Enum e) → self::Enum {
+  switch(e) {
+    #L11:
+    case #C3:
+      {
+        return e;
+      }
+    #L12:
+    default:
+      {}
+  }
+  return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:54:6: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+ - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+Enum caseReturn2(Enum e) /* error */ {
+     ^" in null;
+}
+static method localFunctions() → dynamic {
+  function returnImplicit() → core::String {
+    core::print("foo");
+    return let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:63:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
+  String returnImplicit() /* error */ {
+  ^" in null;
+  }
+  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 assigned to a variable of type 'String'.
+    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 assigned to a variable of type 'String'.
+      return null; // error
+             ^" in null as{TypeError,ForNonNullableByDefault} core::String;
+    }
+    return let final<BottomType> #t10 = 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>();
+    asy::FutureOr<dynamic>? :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    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 {
+        #L13:
+        {}
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+  function returnAsync2() → asy::FutureOr<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>? :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    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 {
+        #L14:
+        {}
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+  function returnAsync3() → asy::FutureOr<core::int> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
+    asy::FutureOr<core::int>? :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    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 {
+        #L15:
+        {
+          :return_value = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:83:3: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+  FutureOr<int> returnAsync3() async {} // error
+  ^" in null;
+          break #L15;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+  function returnAsync4() → asy::FutureOr<core::int?> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+    asy::FutureOr<core::int?>? :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    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 {
+        #L16:
+        {}
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+  function returnAsync5() → asy::Future<core::Null?> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::Null?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Null?>();
+    asy::FutureOr<core::Null?>? :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    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 {
+        #L17:
+        {}
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+  function returnAsync6() → asy::Future<core::int?> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+    asy::FutureOr<core::int?>? :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    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 {
+        #L18:
+        {
+          :return_value = null;
+          break #L18;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+  function returnAsync7() → asy::Future<core::int?> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int?> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int?>();
+    asy::FutureOr<core::int?>? :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    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 {
+        #L19:
+        {}
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+  function yieldSync() → core::Iterable<dynamic> /* originally sync* */ {
+    core::int :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :sync_op(core::_SyncIterator<dynamic>? :iterator) → core::bool* yielding {
+      {}
+      return false;
+    }
+    return new core::_SyncIterable::•<dynamic>(:sync_op);
+  }
+  function yieldAsync() → asy::Stream<dynamic> /* originally async* */ {
+    asy::_AsyncStarStreamController<dynamic>? :controller;
+    dynamic :controller_stream;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    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
+        try {
+          #L20:
+          {}
+          return;
+        }
+        on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+          :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+        }
+      finally {
+        :controller.{asy::_AsyncStarStreamController::close}();
+      }
+    :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::•<dynamic>(:async_op);
+    :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+    return :controller_stream;
+  }
+  function caseReturn1(self::Enum e) → self::Enum {
+    switch(e) {
+      #L21:
+      case #C3:
+        {
+          return e;
+        }
+      #L22:
+      case #C6:
+        {
+          return e;
+        }
+    }
+  }
+  function caseReturn2(self::Enum e) → self::Enum {
+    switch(e) {
+      #L23:
+      case #C3:
+        {
+          return e;
+        }
+      #L24:
+      default:
+        {}
+    }
+    return let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:108:3: Error: A non-null value must be returned since the return type 'Enum' doesn't allow null.
+ - 'Enum' is from 'pkg/front_end/testcases/nnbd/return_null.dart'.
+  Enum caseReturn2(Enum e) /* error */ {
+  ^" in null;
+  }
+  core::bool b = false;
+  core::int local1 = (() → core::int {
+    if(b)
+      return 0;
+    return let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:117:16: Error: A non-null value must be returned since the return type 'int' doesn't allow null.
+  var local1 = () /* error */ {
+               ^" in null;
+  }).call();
+  core::int? local2 = (() → core::int? {
+    if(b)
+      return null;
+    if(!b)
+      return 0;
+  }).call();
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "Enum.a"
+  #C3 = self::Enum {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "Enum.b"
+  #C6 = self::Enum {index:#C4, _name:#C5}
+  #C7 = <self::Enum*>[#C3, #C6]
+}
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 0c83c79..9ddd160 100644
--- a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.expect
@@ -2,34 +2,34 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Warning: Operator '+' is called on 'int?' which is potentially null.
+// 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
 //                                 ^
 //
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:21:34: Warning: Property 'field' is accessed on 'Class?' which is potentially null.
+// 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
 //                                  ^^^^^
 //
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:22:24: Warning: Operator 'unary-' is called on 'int?' which is potentially null.
+// 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
 //                        ^
 //
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Warning: Operator '+' is called on 'int?' which is potentially null.
+// 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
 //                                   ^
 //
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:28:37: Warning: Property 'isEven' is accessed on 'int?' which is potentially null.
+// 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
 //                                     ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:29:24: Warning: Operator 'unary-' is called on 'int?' which is potentially null.
+// 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
 //                        ^
 //
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:36:7: Warning: Property 'length' is accessed on 'String?' which is potentially null.
+// 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.
 //       ^^^^^^
@@ -54,21 +54,39 @@
 }
 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::int? => (let final self::Class? #t2 = c in #t2.{core::Object::==}(null) ?{core::int?} null : #t2{self::Class}.{self::Class::field}).{core::num::+}(2));
-  let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{core::int?} null : let final core::int #t4 = #t3.{self::Class::field}.{core::num::+}(1) in let final void #t5 = #t3.{self::Class::field} = #t4 in #t4;
-  let final self::Class? #t6 = c in #t6.{core::Object::==}(null) ?{core::int?} null : #t6.{self::Class::field} = #t6.{self::Class::field}.{core::num::+}(1);
-  self::throwsInStrong(() → core::int => (let final self::Class? #t7 = c in #t7.{core::Object::==}(null) ?{self::Class?} null : #t7{self::Class}.{self::Class::next}).{self::Class::field});
-  self::throwsInStrong(() → core::int => (let final self::Class? #t8 = c in #t8.{core::Object::==}(null) ?{core::int?} null : #t8{self::Class}.{self::Class::field}).{core::int::unary-}());
-  let final self::Class? #t9 = c in #t9.{core::Object::==}(null) ?{core::bool?} null : #t9{self::Class}.{self::Class::next}.{self::Class::[]}(0).{core::int::isEven};
-  self::throwsInStrong(() → core::int? => (let final self::Class? #t10 = c in #t10.{core::Object::==}(null) ?{core::int?} null : #t10{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::num::+}(2));
-  let final self::Class? #t11 = c in #t11.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t12 = #t11{self::Class}.{self::Class::next} in let final core::int #t13 = 0 in let final core::int #t14 = #t12.{self::Class::[]}(#t13).{core::num::+}(1) in let final void #t15 = #t12.{self::Class::[]=}(#t13, #t14) in #t14;
-  let final self::Class? #t16 = c in #t16.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t17 = #t16{self::Class}.{self::Class::next} in let final core::int #t18 = 0 in #t17.{self::Class::[]=}(#t18, #t17.{self::Class::[]}(#t18).{core::num::+}(1));
-  self::throwsInStrong(() → core::bool => (let final self::Class? #t19 = c in #t19.{core::Object::==}(null) ?{core::int?} null : #t19{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::isEven});
-  self::throwsInStrong(() → core::int => (let final self::Class? #t20 = c in #t20.{core::Object::==}(null) ?{core::int?} null : #t20{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::unary-}());
+  self::throwsInStrong(() → core::int? => 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.
+ - '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.
+  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::int? => 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.
+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.
+  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? {
-    s.{core::String::length};
+    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.
+      ^^^^^^" in s.{core::String::length};
   };
   try {
     f.call("foo");
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 0c83c79..9ddd160 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
@@ -2,34 +2,34 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:18:33: Warning: Operator '+' is called on 'int?' which is potentially null.
+// 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
 //                                 ^
 //
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:21:34: Warning: Property 'field' is accessed on 'Class?' which is potentially null.
+// 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
 //                                  ^^^^^
 //
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:22:24: Warning: Operator 'unary-' is called on 'int?' which is potentially null.
+// 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
 //                        ^
 //
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:25:35: Warning: Operator '+' is called on 'int?' which is potentially null.
+// 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
 //                                   ^
 //
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:28:37: Warning: Property 'isEven' is accessed on 'int?' which is potentially null.
+// 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
 //                                     ^^^^^^
 //
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:29:24: Warning: Operator 'unary-' is called on 'int?' which is potentially null.
+// 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
 //                        ^
 //
-// pkg/front_end/testcases/nnbd/shorting_stop.dart:36:7: Warning: Property 'length' is accessed on 'String?' which is potentially null.
+// 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.
 //       ^^^^^^
@@ -54,21 +54,39 @@
 }
 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::int? => (let final self::Class? #t2 = c in #t2.{core::Object::==}(null) ?{core::int?} null : #t2{self::Class}.{self::Class::field}).{core::num::+}(2));
-  let final self::Class? #t3 = c in #t3.{core::Object::==}(null) ?{core::int?} null : let final core::int #t4 = #t3.{self::Class::field}.{core::num::+}(1) in let final void #t5 = #t3.{self::Class::field} = #t4 in #t4;
-  let final self::Class? #t6 = c in #t6.{core::Object::==}(null) ?{core::int?} null : #t6.{self::Class::field} = #t6.{self::Class::field}.{core::num::+}(1);
-  self::throwsInStrong(() → core::int => (let final self::Class? #t7 = c in #t7.{core::Object::==}(null) ?{self::Class?} null : #t7{self::Class}.{self::Class::next}).{self::Class::field});
-  self::throwsInStrong(() → core::int => (let final self::Class? #t8 = c in #t8.{core::Object::==}(null) ?{core::int?} null : #t8{self::Class}.{self::Class::field}).{core::int::unary-}());
-  let final self::Class? #t9 = c in #t9.{core::Object::==}(null) ?{core::bool?} null : #t9{self::Class}.{self::Class::next}.{self::Class::[]}(0).{core::int::isEven};
-  self::throwsInStrong(() → core::int? => (let final self::Class? #t10 = c in #t10.{core::Object::==}(null) ?{core::int?} null : #t10{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::num::+}(2));
-  let final self::Class? #t11 = c in #t11.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t12 = #t11{self::Class}.{self::Class::next} in let final core::int #t13 = 0 in let final core::int #t14 = #t12.{self::Class::[]}(#t13).{core::num::+}(1) in let final void #t15 = #t12.{self::Class::[]=}(#t13, #t14) in #t14;
-  let final self::Class? #t16 = c in #t16.{core::Object::==}(null) ?{core::int?} null : let final self::Class #t17 = #t16{self::Class}.{self::Class::next} in let final core::int #t18 = 0 in #t17.{self::Class::[]=}(#t18, #t17.{self::Class::[]}(#t18).{core::num::+}(1));
-  self::throwsInStrong(() → core::bool => (let final self::Class? #t19 = c in #t19.{core::Object::==}(null) ?{core::int?} null : #t19{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::isEven});
-  self::throwsInStrong(() → core::int => (let final self::Class? #t20 = c in #t20.{core::Object::==}(null) ?{core::int?} null : #t20{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::unary-}());
+  self::throwsInStrong(() → core::int? => 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.
+ - '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.
+  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::int? => 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.
+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.
+  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? {
-    s.{core::String::length};
+    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.
+      ^^^^^^" in s.{core::String::length};
   };
   try {
     f.call("foo");
diff --git a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.expect b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.expect
index 2317ae7..19bd0eb 100644
--- a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.expect
@@ -2,19 +2,19 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:14:24: Warning: Tearing off method 'call' from a potentially null value.
+// 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.
 //                        ^
 //
-// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:15:32: Warning: Tearing off method 'call' from a potentially null value.
+// 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.
 //                                ^
 //
-// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:16:19: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:16:19: Error: Can't tear off method 'call' from a potentially null value.
 //   functionContext(c); // Error.
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:17:27: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:17:27: Error: Can't tear off method 'call' from a potentially null value.
 //   nullableFunctionContext(c); // Error.
 //                           ^
 //
@@ -55,30 +55,38 @@
 static method functionContext(() → core::int f) → dynamic {}
 static method nullableFunctionContext(() →? core::int f) → dynamic {}
 static method foo<T extends self::C? = self::C?>(self::C? c, self::foo::T% t, self::foo::T? nt) → dynamic {
-  self::functionContext((null as{ForNonNullableByDefault} self::C?) as{TypeError} () → core::int);
-  self::nullableFunctionContext((null as{ForNonNullableByDefault} self::C?) as{TypeError} () →? core::int);
-  self::functionContext(c as{TypeError} () → core::int);
-  self::nullableFunctionContext(c as{TypeError} () →? core::int);
-  self::functionContext(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:18:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
+  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 (null as{ForNonNullableByDefault} self::C?) as{TypeError} () → core::int);
+  self::nullableFunctionContext(let final<BottomType> #t2 = 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 as{ForNonNullableByDefault} self::C?) as{TypeError} () →? core::int);
+  self::functionContext(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:16:19: Error: Can't tear off method 'call' from a potentially null value.
+  functionContext(c); // Error.
+                  ^" in c as{TypeError} () → core::int);
+  self::nullableFunctionContext(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:17:27: Error: Can't tear off method 'call' from a potentially null value.
+  nullableFunctionContext(c); // Error.
+                          ^" in c as{TypeError} () →? core::int);
+  self::functionContext(let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:18:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
   functionContext(t); // Error.
                   ^" in t as{TypeError,ForNonNullableByDefault} () → core::int);
-  self::nullableFunctionContext(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:19:27: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()?'.
+  self::nullableFunctionContext(let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:19:27: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()?'.
   nullableFunctionContext(t); // Error.
                           ^" in t as{TypeError,ForNonNullableByDefault} () →? core::int);
-  self::functionContext(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:20:19: Error: The argument type 'T?' can't be assigned to the parameter type 'int Function()'.
+  self::functionContext(let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:20:19: Error: The argument type 'T?' can't be assigned to the parameter type 'int Function()'.
   functionContext(nt); // Error.
                   ^" in nt as{TypeError,ForNonNullableByDefault} () → core::int);
-  self::nullableFunctionContext(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:21:27: Error: The argument type 'T?' can't be assigned to the parameter type 'int Function()?'.
+  self::nullableFunctionContext(let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:21:27: Error: The argument type 'T?' can't be assigned to the parameter type 'int Function()?'.
   nullableFunctionContext(nt); // Error.
                           ^" in nt as{TypeError,ForNonNullableByDefault} () →? core::int);
 }
 static method bar<T extends self::C = self::C>(self::C c, self::bar::T t) → dynamic {
-  self::functionContext(let final self::C #t5 = c in #t5.==(null) ?{() → core::int} null : #t5.{self::C::call});
-  self::nullableFunctionContext(let final self::C #t6 = c in #t6.==(null) ?{() → core::int} null : #t6.{self::C::call});
-  self::functionContext(let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:27:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
+  self::functionContext(let final self::C #t9 = c in #t9.==(null) ?{() → core::int} null : #t9.{self::C::call});
+  self::nullableFunctionContext(let final self::C #t10 = c in #t10.==(null) ?{() → core::int} null : #t10.{self::C::call});
+  self::functionContext(let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:27:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
   functionContext(t); // Shouldn't result in a compile-time error.
                   ^" in t as{TypeError,ForNonNullableByDefault} () → core::int);
-  self::nullableFunctionContext(let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:28:27: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()?'.
+  self::nullableFunctionContext(let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:28:27: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()?'.
   nullableFunctionContext(t); // Shouldn't result in a compile-time error.
                           ^" in t as{TypeError,ForNonNullableByDefault} () →? core::int);
 }
diff --git a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.transformed.expect
index 2317ae7..19bd0eb 100644
--- a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.weak.transformed.expect
@@ -2,19 +2,19 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:14:24: Warning: Tearing off method 'call' from a potentially null value.
+// 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.
 //                        ^
 //
-// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:15:32: Warning: Tearing off method 'call' from a potentially null value.
+// 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.
 //                                ^
 //
-// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:16:19: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:16:19: Error: Can't tear off method 'call' from a potentially null value.
 //   functionContext(c); // Error.
 //                   ^
 //
-// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:17:27: Warning: Tearing off method 'call' from a potentially null value.
+// pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:17:27: Error: Can't tear off method 'call' from a potentially null value.
 //   nullableFunctionContext(c); // Error.
 //                           ^
 //
@@ -55,30 +55,38 @@
 static method functionContext(() → core::int f) → dynamic {}
 static method nullableFunctionContext(() →? core::int f) → dynamic {}
 static method foo<T extends self::C? = self::C?>(self::C? c, self::foo::T% t, self::foo::T? nt) → dynamic {
-  self::functionContext((null as{ForNonNullableByDefault} self::C?) as{TypeError} () → core::int);
-  self::nullableFunctionContext((null as{ForNonNullableByDefault} self::C?) as{TypeError} () →? core::int);
-  self::functionContext(c as{TypeError} () → core::int);
-  self::nullableFunctionContext(c as{TypeError} () →? core::int);
-  self::functionContext(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:18:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
+  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 (null as{ForNonNullableByDefault} self::C?) as{TypeError} () → core::int);
+  self::nullableFunctionContext(let final<BottomType> #t2 = 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 as{ForNonNullableByDefault} self::C?) as{TypeError} () →? core::int);
+  self::functionContext(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:16:19: Error: Can't tear off method 'call' from a potentially null value.
+  functionContext(c); // Error.
+                  ^" in c as{TypeError} () → core::int);
+  self::nullableFunctionContext(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:17:27: Error: Can't tear off method 'call' from a potentially null value.
+  nullableFunctionContext(c); // Error.
+                          ^" in c as{TypeError} () →? core::int);
+  self::functionContext(let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:18:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
   functionContext(t); // Error.
                   ^" in t as{TypeError,ForNonNullableByDefault} () → core::int);
-  self::nullableFunctionContext(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:19:27: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()?'.
+  self::nullableFunctionContext(let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:19:27: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()?'.
   nullableFunctionContext(t); // Error.
                           ^" in t as{TypeError,ForNonNullableByDefault} () →? core::int);
-  self::functionContext(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:20:19: Error: The argument type 'T?' can't be assigned to the parameter type 'int Function()'.
+  self::functionContext(let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:20:19: Error: The argument type 'T?' can't be assigned to the parameter type 'int Function()'.
   functionContext(nt); // Error.
                   ^" in nt as{TypeError,ForNonNullableByDefault} () → core::int);
-  self::nullableFunctionContext(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:21:27: Error: The argument type 'T?' can't be assigned to the parameter type 'int Function()?'.
+  self::nullableFunctionContext(let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:21:27: Error: The argument type 'T?' can't be assigned to the parameter type 'int Function()?'.
   nullableFunctionContext(nt); // Error.
                           ^" in nt as{TypeError,ForNonNullableByDefault} () →? core::int);
 }
 static method bar<T extends self::C = self::C>(self::C c, self::bar::T t) → dynamic {
-  self::functionContext(let final self::C #t5 = c in #t5.==(null) ?{() → core::int} null : #t5.{self::C::call});
-  self::nullableFunctionContext(let final self::C #t6 = c in #t6.==(null) ?{() → core::int} null : #t6.{self::C::call});
-  self::functionContext(let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:27:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
+  self::functionContext(let final self::C #t9 = c in #t9.==(null) ?{() → core::int} null : #t9.{self::C::call});
+  self::nullableFunctionContext(let final self::C #t10 = c in #t10.==(null) ?{() → core::int} null : #t10.{self::C::call});
+  self::functionContext(let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:27:19: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()'.
   functionContext(t); // Shouldn't result in a compile-time error.
                   ^" in t as{TypeError,ForNonNullableByDefault} () → core::int);
-  self::nullableFunctionContext(let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:28:27: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()?'.
+  self::nullableFunctionContext(let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:28:27: Error: The argument type 'T' can't be assigned to the parameter type 'int Function()?'.
   nullableFunctionContext(t); // Shouldn't result in a compile-time error.
                           ^" in t as{TypeError,ForNonNullableByDefault} () →? core::int);
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000032.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000032.dart.strong.expect
index f449dd1..8b101b6 100644
--- a/pkg/front_end/testcases/rasta/issue_000032.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000032.dart.strong.expect
@@ -28,9 +28,9 @@
 // }
 // ^
 //
-// pkg/front_end/testcases/rasta/issue_000032.dart:10:4: Error: The method '<' isn't defined for the class 'Type'.
+// pkg/front_end/testcases/rasta/issue_000032.dart:10:4: Error: The operator '<' isn't defined for the class 'Type'.
 //  - 'Type' is from 'dart:core'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
 //   C<
 //    ^
 //
@@ -42,9 +42,9 @@
     : super core::Object::•() {}
 }
 static method main() → dynamic {
-  invalid-expression "pkg/front_end/testcases/rasta/issue_000032.dart:10:4: Error: The method '<' isn't defined for the class 'Type'.
+  invalid-expression "pkg/front_end/testcases/rasta/issue_000032.dart:10:4: Error: The operator '<' isn't defined for the class 'Type'.
  - 'Type' is from 'dart:core'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
   C<
    ^";
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000032.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000032.dart.strong.transformed.expect
index f449dd1..8b101b6 100644
--- a/pkg/front_end/testcases/rasta/issue_000032.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000032.dart.strong.transformed.expect
@@ -28,9 +28,9 @@
 // }
 // ^
 //
-// pkg/front_end/testcases/rasta/issue_000032.dart:10:4: Error: The method '<' isn't defined for the class 'Type'.
+// pkg/front_end/testcases/rasta/issue_000032.dart:10:4: Error: The operator '<' isn't defined for the class 'Type'.
 //  - 'Type' is from 'dart:core'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
 //   C<
 //    ^
 //
@@ -42,9 +42,9 @@
     : super core::Object::•() {}
 }
 static method main() → dynamic {
-  invalid-expression "pkg/front_end/testcases/rasta/issue_000032.dart:10:4: Error: The method '<' isn't defined for the class 'Type'.
+  invalid-expression "pkg/front_end/testcases/rasta/issue_000032.dart:10:4: Error: The operator '<' isn't defined for the class 'Type'.
  - 'Type' is from 'dart:core'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
   C<
    ^";
 }
diff --git a/pkg/front_end/testcases/rasta/super.dart.strong.expect b/pkg/front_end/testcases/rasta/super.dart.strong.expect
index 4ed69fe..5907733 100644
--- a/pkg/front_end/testcases/rasta/super.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.strong.expect
@@ -229,43 +229,43 @@
 //     use(super.m -= 42);
 //               ^
 //
-// pkg/front_end/testcases/rasta/super.dart:95:12: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:95:12: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //     super.m++;
 //            ^
 //
-// pkg/front_end/testcases/rasta/super.dart:96:16: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:96:16: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //     use(super.m++);
 //                ^
 //
-// pkg/front_end/testcases/rasta/super.dart:97:12: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:97:12: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //     super.n++;
 //            ^
 //
-// pkg/front_end/testcases/rasta/super.dart:98:16: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:98:16: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //     use(super.n++);
 //                ^
 //
-// pkg/front_end/testcases/rasta/super.dart:120:5: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:120:5: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //     ++super.m;
 //     ^
 //
-// pkg/front_end/testcases/rasta/super.dart:121:9: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:121:9: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //     use(++super.m);
 //         ^
 //
-// pkg/front_end/testcases/rasta/super.dart:122:5: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:122:5: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //     ++super.n;
 //     ^
 //
-// pkg/front_end/testcases/rasta/super.dart:123:9: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:123:9: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //     use(++super.n);
 //         ^
 //
@@ -293,43 +293,43 @@
 //     use(super.n(87));
 //                ^
 //
-// pkg/front_end/testcases/rasta/super.dart:222:13: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:222:13: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //     super.m += 42;
 //             ^
 //
-// pkg/front_end/testcases/rasta/super.dart:223:17: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:223:17: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //     use(super.m += 42);
 //                 ^
 //
-// pkg/front_end/testcases/rasta/super.dart:224:13: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:224:13: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //     super.n += 42;
 //             ^
 //
-// pkg/front_end/testcases/rasta/super.dart:225:17: Error: The method '+' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
+// pkg/front_end/testcases/rasta/super.dart:225:17: Error: The operator '+' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '+' operator.
 //     use(super.n += 42);
 //                 ^
 //
-// pkg/front_end/testcases/rasta/super.dart:247:13: Error: The method '-' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '-'.
+// pkg/front_end/testcases/rasta/super.dart:247:13: Error: The operator '-' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
 //     super.m -= 42;
 //             ^
 //
-// pkg/front_end/testcases/rasta/super.dart:248:17: Error: The method '-' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '-'.
+// pkg/front_end/testcases/rasta/super.dart:248:17: Error: The operator '-' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
 //     use(super.m -= 42);
 //                 ^
 //
-// pkg/front_end/testcases/rasta/super.dart:249:13: Error: The method '-' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '-'.
+// pkg/front_end/testcases/rasta/super.dart:249:13: Error: The operator '-' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
 //     super.n -= 42;
 //             ^
 //
-// pkg/front_end/testcases/rasta/super.dart:250:17: Error: The method '-' isn't defined for the class 'void Function()'.
-// Try correcting the name to the name of an existing method, or defining a method named '-'.
+// pkg/front_end/testcases/rasta/super.dart:250:17: Error: The operator '-' isn't defined for the class 'void Function()'.
+// Try correcting the operator to an existing operator, or defining a '-' operator.
 //     use(super.n -= 42);
 //                 ^
 //
@@ -455,20 +455,20 @@
     self::use(let final dynamic #t17 = super.{self::A::i} in let final dynamic #t18 = super.{self::B::i} = #t17.+(1) in #t17);
     let final core::int* #t19 = 87 in super.{self::A::[]=}(#t19, super.{self::A::[]}(#t19).+(1));
     self::use(let final core::int* #t20 = 87 in let final dynamic #t21 = super.{self::A::[]}(#t20) in let final void #t22 = super.{self::A::[]=}(#t20, #t21.+(1)) in #t21);
-    super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:95:12: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+    super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:95:12: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
     super.m++;
            ^";
-    self::use(let final () →* void #t23 = super.{self::A::m} in let final dynamic #t24 = super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:96:16: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+    self::use(let final () →* void #t23 = super.{self::A::m} in let final dynamic #t24 = super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:96:16: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
     use(super.m++);
                ^" in #t23);
-    super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:97:12: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+    super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:97:12: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
     super.n++;
            ^";
-    self::use(let final () →* void #t25 = super.{self::A::n} in let final dynamic #t26 = super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:98:16: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+    self::use(let final () →* void #t25 = super.{self::A::n} in let final dynamic #t26 = super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:98:16: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
     use(super.n++);
                ^" in #t25);
     super.{self::A::a} = super.{self::A::a}.+(1);
@@ -491,20 +491,20 @@
     self::use(super.{self::B::i} = super.{self::A::i}.+(1));
     let final core::int* #t27 = 87 in let final dynamic #t28 = super.{self::A::[]}(#t27).+(1) in let final void #t29 = super.{self::A::[]=}(#t27, #t28) in #t28;
     self::use(let final core::int* #t30 = 87 in let final dynamic #t31 = super.{self::A::[]}(#t30).+(1) in let final void #t32 = super.{self::A::[]=}(#t30, #t31) in #t31);
-    super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:120:5: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+    super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:120:5: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
     ++super.m;
     ^";
-    self::use(super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:121:9: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+    self::use(super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:121:9: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
     use(++super.m);
         ^");
-    super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:122:5: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+    super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:122:5: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
     ++super.n;
     ^";
-    self::use(super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:123:9: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+    self::use(super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:123:9: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
     use(++super.n);
         ^");
     super.{self::A::a}.call();
@@ -615,20 +615,20 @@
     self::use(super.{self::B::i} = super.{self::A::i}.+(42));
     let final core::int* #t57 = 87 in super.{self::A::[]=}(#t57, super.{self::A::[]}(#t57).+(42));
     self::use(let final core::int* #t58 = 87 in let final dynamic #t59 = super.{self::A::[]}(#t58).+(42) in let final void #t60 = super.{self::A::[]=}(#t58, #t59) in #t59);
-    super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:222:13: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+    super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:222:13: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
     super.m += 42;
             ^";
-    self::use(super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:223:17: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+    self::use(super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:223:17: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
     use(super.m += 42);
                 ^");
-    super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:224:13: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+    super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:224:13: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
     super.n += 42;
             ^";
-    self::use(super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:225:17: Error: The method '+' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
+    self::use(super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:225:17: Error: The operator '+' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '+' operator.
     use(super.n += 42);
                 ^");
     super.{self::A::a} = super.{self::A::a}.-(42);
@@ -651,20 +651,20 @@
     self::use(super.{self::B::i} = super.{self::A::i}.-(42));
     let final core::int* #t61 = 87 in super.{self::A::[]=}(#t61, super.{self::A::[]}(#t61).-(42));
     self::use(let final core::int* #t62 = 87 in let final dynamic #t63 = super.{self::A::[]}(#t62).-(42) in let final void #t64 = super.{self::A::[]=}(#t62, #t63) in #t63);
-    super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:247:13: Error: The method '-' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
+    super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:247:13: Error: The operator '-' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
     super.m -= 42;
             ^";
-    self::use(super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:248:17: Error: The method '-' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
+    self::use(super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:248:17: Error: The operator '-' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
     use(super.m -= 42);
                 ^");
-    super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:249:13: Error: The method '-' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
+    super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:249:13: Error: The operator '-' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
     super.n -= 42;
             ^";
-    self::use(super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:250:17: Error: The method '-' isn't defined for the class 'void Function()'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
+    self::use(super.{self::A::n} = invalid-expression "pkg/front_end/testcases/rasta/super.dart:250:17: Error: The operator '-' isn't defined for the class 'void Function()'.
+Try correcting the operator to an existing operator, or defining a '-' operator.
     use(super.n -= 42);
                 ^");
   }
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
index abdf3cd..96da1b8 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
@@ -24,9 +24,9 @@
 //   var f = Map<A, B> {};
 //                       ^
 //
-// pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The method '<' isn't defined for the class 'Type'.
+// pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The operator '<' isn't defined for the class 'Type'.
 //  - 'Type' is from 'dart:core'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
 //   var f = Map<A, B> {};
 //              ^
 //
@@ -44,9 +44,9 @@
     ;
 }
 class C extends core::Object {
-  field dynamic f = invalid-expression "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The method '<' isn't defined for the class 'Type'.
+  field dynamic f = invalid-expression "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The operator '<' isn't defined for the class 'Type'.
  - 'Type' is from 'dart:core'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
   var f = Map<A, B> {};
              ^";
   field dynamic B = null;
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
index abdf3cd..96da1b8 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
@@ -24,9 +24,9 @@
 //   var f = Map<A, B> {};
 //                       ^
 //
-// pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The method '<' isn't defined for the class 'Type'.
+// pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The operator '<' isn't defined for the class 'Type'.
 //  - 'Type' is from 'dart:core'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
 //   var f = Map<A, B> {};
 //              ^
 //
@@ -44,9 +44,9 @@
     ;
 }
 class C extends core::Object {
-  field dynamic f = invalid-expression "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The method '<' isn't defined for the class 'Type'.
+  field dynamic f = invalid-expression "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The operator '<' isn't defined for the class 'Type'.
  - 'Type' is from 'dart:core'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
   var f = Map<A, B> {};
              ^";
   field dynamic B = null;
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
index 5874008..8a0e754 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
@@ -22,17 +22,17 @@
 // type T = Map<A, B>
 //              ^
 //
-// pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The method '<' isn't defined for the class 'Type'.
+// pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The operator '<' isn't defined for the class 'Type'.
 //  - 'Type' is from 'dart:core'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
 // type T = Map<A, B>
 //             ^
 //
 import self as self;
 
-static field invalid-type T = invalid-expression "pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The method '<' isn't defined for the class 'Type'.
+static field invalid-type T = invalid-expression "pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The operator '<' isn't defined for the class 'Type'.
  - 'Type' is from 'dart:core'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
 type T = Map<A, B>
             ^" as{TypeError,ForDynamic} invalid-type;
 static field invalid-type B;
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect
index 5874008..8a0e754 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect
@@ -22,17 +22,17 @@
 // type T = Map<A, B>
 //              ^
 //
-// pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The method '<' isn't defined for the class 'Type'.
+// pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The operator '<' isn't defined for the class 'Type'.
 //  - 'Type' is from 'dart:core'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
+// Try correcting the operator to an existing operator, or defining a '<' operator.
 // type T = Map<A, B>
 //             ^
 //
 import self as self;
 
-static field invalid-type T = invalid-expression "pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The method '<' isn't defined for the class 'Type'.
+static field invalid-type T = invalid-expression "pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The operator '<' isn't defined for the class 'Type'.
  - 'Type' is from 'dart:core'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
+Try correcting the operator to an existing operator, or defining a '<' operator.
 type T = Map<A, B>
             ^" as{TypeError,ForDynamic} invalid-type;
 static field invalid-type B;
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index a15ef79..2ef9e79 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -38,7 +38,6 @@
 general/external_import: RuntimeError # The native extension to import doesn't exist. This is ok.
 general/incomplete_field_formal_parameter: RuntimeError
 general/infer_field_from_multiple: TypeCheckError
-general/invalid_type: TypeCheckError
 general/invalid_operator: TypeCheckError
 general/invocations: RuntimeError
 general/issue37776: RuntimeError
@@ -92,7 +91,6 @@
 general_nnbd_opt_out/expressions: RuntimeError
 general_nnbd_opt_out/external_import: RuntimeError # The native extension to import doesn't exist. This is ok.
 general_nnbd_opt_out/incomplete_field_formal_parameter: RuntimeError
-general_nnbd_opt_out/invalid_type: TypeCheckError
 general_nnbd_opt_out/invocations: RuntimeError
 general_nnbd_opt_out/issue37776: RuntimeError
 general_nnbd_opt_out/issue38938: RuntimeError # no main and compile time errors.
@@ -150,7 +148,6 @@
 inference/override_equals: RuntimeError
 inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1: InstrumentationMismatch # Issue #25824
 inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1: InstrumentationMismatch # Issue #25824
-inference_new/dependency_only_if_overloaded: TypeCheckError
 inference_new/infer_assign_to_index_super_upwards: TypeCheckError
 inference_new/infer_assign_to_index_this_upwards: TypeCheckError
 inference_new/infer_assign_to_index_upwards: TypeCheckError
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 20fccba..1a235ee 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -11,6 +11,7 @@
 agnostic/set: TextSerializationFailure
 expression/eval: TextSerializationFailure # Was: Pass
 expression/main: TextSerializationFailure # Was: Pass
+extensions/ambiguous: TextSerializationFailure
 extensions/annotations: TextSerializationFailure
 extensions/builtin_identifiers: TextSerializationFailure
 extensions/call_methods: TypeCheckError
@@ -57,6 +58,7 @@
 extensions/issue38750: TextSerializationFailure
 extensions/issue38755: TextSerializationFailure
 extensions/issue38915: TextSerializationFailure
+extensions/issue39527: TextSerializationFailure
 extensions/issue39889: TextSerializationFailure
 extensions/issue39938/issue39938: TextSerializationFailure
 extensions/issue40596: TextSerializationFailure
@@ -217,6 +219,7 @@
 general/infer_field_type: TextSerializationFailure
 general/infer_fixed_generic_return_type: TextSerializationFailure
 general/infer_map_literal_with_closure: TextSerializationFailure
+general/inherit_function: TextSerializationFailure
 general/interface_conflict: TextSerializationFailure
 general/interface_contravariant_from_class: TextSerializationFailure
 general/interface_covariantImpl_from_class: TextSerializationFailure
@@ -225,7 +228,7 @@
 general/invalid_cast: TextSerializationFailure # Was: Pass
 general/invalid_operator2: TextSerializationFailure
 general/invalid_operator: TypeCheckError
-general/invalid_type: TypeCheckError
+general/invalid_type: TextSerializationFailure
 general/invocations: TextSerializationFailure # Was: RuntimeError
 general/issue129167943: TextSerializationFailure
 general/issue34515: TextSerializationFailure
@@ -512,7 +515,7 @@
 general_nnbd_opt_out/interface_covariantInterface_from_class: TextSerializationFailure
 general_nnbd_opt_out/invalid_assignment: TextSerializationFailure # Was: Pass
 general_nnbd_opt_out/invalid_cast: TextSerializationFailure # Was: Pass
-general_nnbd_opt_out/invalid_type: TypeCheckError
+general_nnbd_opt_out/invalid_type: TextSerializationFailure
 general_nnbd_opt_out/invocations: TextSerializationFailure # Was: RuntimeError
 general_nnbd_opt_out/issue129167943: TextSerializationFailure
 general_nnbd_opt_out/issue34515: TextSerializationFailure
@@ -1211,8 +1214,12 @@
 instantiate_to_bound/typedef_omitted_bound: TextSerializationFailure # Was: Pass
 instantiate_to_bound/typedef_raw_in_bound: TextSerializationFailure # Was: Pass
 instantiate_to_bound/typedef_super_bounded_type: TextSerializationFailure # Was: Pass
+late_lowering/compound: TextSerializationFailure
+late_lowering/definitely_assigned: TextSerializationFailure
+late_lowering/definitely_unassigned: TextSerializationFailure
 late_lowering/initializer_rewrite: TextSerializationFailure
 late_lowering/infer_late_field_type: TextSerializationFailure
+late_lowering/infer_from_late_variable: TextSerializationFailure
 late_lowering/injected_late_field_checks/main: TextSerializationFailure
 late_lowering/instance_field_with_initializer: TextSerializationFailure
 late_lowering/instance_field_without_initializer: TextSerializationFailure
@@ -1223,6 +1230,7 @@
 late_lowering/issue40093: TextSerializationFailure
 late_lowering/issue40373: TextSerializationFailure
 late_lowering/issue40373b: TextSerializationFailure
+late_lowering/issue40601: TextSerializationFailure
 late_lowering/issue40805: TextSerializationFailure
 late_lowering/late_field_inference: TextSerializationFailure
 late_lowering/late_field_with_initializer: TextSerializationFailure
@@ -1255,6 +1263,8 @@
 nnbd/constants: TextSerializationFailure
 nnbd/covariant_nnbd_top_merge: TextSerializationFailure
 nnbd/definite_assignment_and_completion: TextSerializationFailure
+nnbd/definitely_assigned: TextSerializationFailure
+nnbd/definitely_unassigned: TextSerializationFailure
 nnbd/definitely_unassigned_late_local_variables: TextSerializationFailure
 nnbd/demote_closure_types: TextSerializationFailure
 nnbd/export_from_opt_out: TextSerializationFailure
@@ -1265,6 +1275,7 @@
 nnbd/future_or_variables: TextSerializationFailure
 nnbd/generic_override: TextSerializationFailure
 nnbd/infer_constraints_from_opt_in: TextSerializationFailure
+nnbd/infer_from_late_variable: TextSerializationFailure
 nnbd/infer_from_opt_in: TextSerializationFailure
 nnbd/infer_from_opt_out: TextSerializationFailure
 nnbd/infer_if_null: TextSerializationFailure
@@ -1280,7 +1291,10 @@
 nnbd/issue40134: TextSerializationFailure
 nnbd/issue40512/issue40512: TextSerializationFailure
 nnbd/issue40600: TextSerializationFailure
+nnbd/issue40601: TextSerializationFailure
 nnbd/issue40805: TextSerializationFailure
+nnbd/issue41102: TextSerializationFailure
+nnbd/issue41103: TextSerializationFailure
 nnbd/issue_39286: TextSerializationFailure
 nnbd/issue_39286_2: TextSerializationFailure
 nnbd/late: TextSerializationFailure
@@ -1288,6 +1302,7 @@
 nnbd/lhs_of_if_null: TextSerializationFailure
 nnbd/list_constructor: TextSerializationFailure
 nnbd/literal_from_opt_in: TextSerializationFailure
+nnbd/load_library: TextSerializationFailure
 nnbd/member_inheritance_from_opt_in: TextSerializationFailure
 nnbd/member_inheritance_from_opt_out: TextSerializationFailure
 nnbd/messages_with_types_opt_in: TypeCheckError
@@ -1330,8 +1345,10 @@
 nnbd/potentially_non_nullable_field: TextSerializationFailure
 nnbd/regress_null_aware: TextSerializationFailure
 nnbd/required: TextSerializationFailure
+nnbd/required_name_override: TextSerializationFailure
 nnbd/required_named_parameter: TextSerializationFailure
 nnbd/return_late: TextSerializationFailure
+nnbd/return_null: TextSerializationFailure
 nnbd/shorting_stop: TextSerializationFailure
 nnbd/simple_never: TextSerializationFailure
 nnbd/sink_hierarchy: TextSerializationFailure
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index 23aa8f9..76ab3a5 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -35,7 +35,6 @@
 general_nnbd_opt_out/expressions: RuntimeError
 general_nnbd_opt_out/external_import: RuntimeError # The native extension to import doesn't exist. This is ok.
 general_nnbd_opt_out/incomplete_field_formal_parameter: RuntimeError
-general_nnbd_opt_out/invalid_type: TypeCheckError
 general_nnbd_opt_out/invocations: RuntimeError
 general_nnbd_opt_out/issue37776: RuntimeError
 general_nnbd_opt_out/issue38938: RuntimeError # no main and compile time errors.
diff --git a/pkg/front_end/tool/_fasta/abcompile.dart b/pkg/front_end/tool/_fasta/abcompile.dart
index 4ccde2a..63ea80b 100644
--- a/pkg/front_end/tool/_fasta/abcompile.dart
+++ b/pkg/front_end/tool/_fasta/abcompile.dart
@@ -9,11 +9,10 @@
 
 import 'standard_deviation.dart';
 
-const String bRootPath = const String.fromEnvironment("bRoot");
-const int abIterations =
-    const int.fromEnvironment("abIterations", defaultValue: 15);
-const int iterations =
-    const int.fromEnvironment("iterations", defaultValue: 15);
+const String bRootPath =
+    bool.hasEnvironment("bRoot") ? String.fromEnvironment("bRoot") : null;
+const int abIterations = int.fromEnvironment("abIterations", defaultValue: 15);
+const int iterations = int.fromEnvironment("iterations", defaultValue: 15);
 
 /// Compare the performance of two different fast implementations
 /// by alternately launching the compile application in this directory
diff --git a/pkg/frontend_server/lib/src/javascript_bundle.dart b/pkg/frontend_server/lib/src/javascript_bundle.dart
index cedccc6..201d379f 100644
--- a/pkg/frontend_server/lib/src/javascript_bundle.dart
+++ b/pkg/frontend_server/lib/src/javascript_bundle.dart
@@ -156,6 +156,7 @@
         mapUrl: '$moduleUrl.lib.js.map',
         sourceMapBase: sourceMapBase,
         customScheme: _fileSystemScheme,
+        component: summaryComponent,
       );
       final codeBytes = utf8.encode(code.code);
       final sourceMapBytes = utf8.encode(json.encode(code.sourceMap));
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 92e1b4c..3cce979 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -76,12 +76,83 @@
 import 'default_language_version.dart';
 
 import 'transformations/flags.dart';
-import 'text/ast_to_text.dart';
+import 'text/ast_to_text.dart' as astToText;
 import 'core_types.dart';
 import 'type_algebra.dart';
 import 'type_environment.dart';
 import 'src/assumptions.dart';
 
+String _debugNullability(Nullability nullability) {
+  switch (nullability) {
+    case Nullability.legacy:
+      return '*';
+    case Nullability.nullable:
+      return '?';
+    case Nullability.undetermined:
+      return '%';
+    case Nullability.nonNullable:
+      return '';
+  }
+  throw "Unknown Nullability: $nullability";
+}
+
+String _debugLibraryName(Library node) {
+  return node == null ? 'null' : node.name ?? 'library ${node.importUri}';
+}
+
+String _debugQualifiedClassName(Class node) {
+  return _debugLibraryName(node.enclosingLibrary) +
+      '::' +
+      _debugClassName(node);
+}
+
+String _debugClassName(Class node) {
+  return node == null
+      ? 'null'
+      : node.name ?? 'null-named class ${node.runtimeType} ${node.hashCode}';
+}
+
+String _debugQualifiedMemberName(Member node) {
+  if (node.enclosingClass != null) {
+    return _debugQualifiedClassName(node.enclosingClass) +
+        '::' +
+        _debugMemberName(node);
+  } else {
+    return _debugLibraryName(node.enclosingLibrary) +
+        '::' +
+        _debugMemberName(node);
+  }
+}
+
+String _debugMemberName(Member node) {
+  return node.name?.name ??
+      "null-named member ${node.runtimeType} ${node.hashCode}";
+}
+
+String _debugVariableDeclarationName(VariableDeclaration node) {
+  return node.name ??
+      "null-named VariableDeclaration ${node.runtimeType} ${node.hashCode}";
+}
+
+String _debugQualifiedTypeParameterName(TypeParameter node) {
+  if (node.parent is Class) {
+    return _debugQualifiedClassName(node.parent) +
+        '::' +
+        _debugTypeParameterName(node);
+  }
+  if (node.parent is Member) {
+    return _debugQualifiedMemberName(node.parent) +
+        '::' +
+        _debugTypeParameterName(node);
+  }
+  return _debugTypeParameterName(node);
+}
+
+String _debugTypeParameterName(TypeParameter node) {
+  return node.name ??
+      "null-named TypeParameter ${node.runtimeType} ${node.hashCode}";
+}
+
 /// Any type of node in the IR.
 abstract class Node {
   const Node();
@@ -91,22 +162,21 @@
 
   /// Returns the textual representation of this node for use in debugging.
   ///
-  /// [toString] should only be used for debugging and short-running test tools
-  /// as it can cause serious memory leaks.
+  /// [toString] should only be used for debugging, but should not leak.
   ///
-  /// Synthetic names are cached globally to retain consistency across different
-  /// [toString] calls (hence the memory leak).
-  ///
-  /// Nodes that are named, such as [Class] and [Member], return their
-  /// (possibly synthesized) name, whereas other AST nodes return the complete
-  /// textual representation of their subtree.
-  String toString() => debugNodeToString(this);
+  /// The data is generally bare-bones, but can easily be updated for your
+  /// specific debugging needs.
+  String toString();
 
   /// Returns the textual representation of this node for use in debugging.
   ///
   /// Note that this adds some nodes to a static map to ensure consistent
-  /// naming, but that it thus also leaks memory.
-  String leakingDebugToString() => debugNodeToString(this);
+  /// naming, but that it thus also leaks memory. [leakingDebugToString] should
+  /// thus only be used for debugging and short-running test tools.
+  ///
+  /// Synthetic names are cached globally to retain consistency across different
+  /// [leakingDebugToString] calls (hence the memory leak).
+  String leakingDebugToString() => astToText.debugNodeToString(this);
 }
 
 /// A mutable AST node with a parent pointer.
@@ -615,7 +685,7 @@
 
   /// Returns a possibly synthesized name for this library, consistent with
   /// the names across all [toString] calls.
-  String toString() => debugLibraryName(this);
+  String toString() => _debugLibraryName(this);
 
   Location _getLocationInEnclosingFile(int offset) {
     return _getLocationInComponent(enclosingComponent, fileUri, offset);
@@ -698,6 +768,11 @@
     transformList(annotations, v, this);
     transformList(combinators, v, this);
   }
+
+  @override
+  String toString() {
+    return "LibraryDependency()";
+  }
 }
 
 /// A part declaration in a library.
@@ -726,6 +801,11 @@
   transformChildren(Transformer v) {
     transformList(annotations, v, this);
   }
+
+  @override
+  String toString() {
+    return "LibraryPart()";
+  }
 }
 
 /// A `show` or `hide` clause for an import or export.
@@ -750,6 +830,11 @@
 
   @override
   transformChildren(Transformer v) {}
+
+  @override
+  String toString() {
+    return "Combinator()";
+  }
 }
 
 /// Declaration of a type alias.
@@ -817,6 +902,11 @@
   Location _getLocationInEnclosingFile(int offset) {
     return _getLocationInComponent(enclosingComponent, fileUri, offset);
   }
+
+  @override
+  String toString() {
+    return "Typedef()";
+  }
 }
 
 /// The degree to which the contents of a class have been loaded into memory.
@@ -1328,7 +1418,7 @@
 
   /// Returns a possibly synthesized name for this class, consistent with
   /// the names used across all [toString] calls.
-  String toString() => debugQualifiedClassName(this);
+  String toString() => _debugQualifiedClassName(this);
 
   visitChildren(Visitor v) {
     visitList(annotations, v);
@@ -1426,6 +1516,11 @@
       onType = v.visitDartType(onType);
     }
   }
+
+  @override
+  String toString() {
+    return "Extension()";
+  }
 }
 
 enum ExtensionMemberKind {
@@ -1586,7 +1681,7 @@
 
   /// Returns a possibly synthesized name for this member, consistent with
   /// the names used across all [toString] calls.
-  String toString() => debugQualifiedMemberName(this);
+  String toString() => _debugQualifiedMemberName(this);
 
   void addAnnotation(Expression node) {
     if (annotations.isEmpty) {
@@ -2362,6 +2457,11 @@
 
   visitChildren(Visitor v) {}
   transformChildren(Transformer v) {}
+
+  @override
+  String toString() {
+    return "InvalidInitializer()";
+  }
 }
 
 /// A field assignment `field = value` occurring in the initializer list of
@@ -2403,6 +2503,11 @@
       value?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "FieldInitializer()";
+  }
 }
 
 /// A super call `super(x,y)` occurring in the initializer list of a
@@ -2445,6 +2550,11 @@
       arguments?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "SuperInitializer()";
+  }
 }
 
 /// A redirecting call `this(x,y)` occurring in the initializer list of
@@ -2483,6 +2593,11 @@
       arguments?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "RedirectingInitializer()";
+  }
 }
 
 /// Binding of a temporary variable in the initializer list of a constructor.
@@ -2508,6 +2623,11 @@
       variable?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "LocalInitializer()";
+  }
 }
 
 class AssertInitializer extends Initializer {
@@ -2527,6 +2647,11 @@
     statement = statement.accept<TreeNode>(v);
     statement.parent = this;
   }
+
+  @override
+  String toString() {
+    return "AssertInitializer()";
+  }
 }
 
 // ------------------------------------------------------------------------
@@ -2676,6 +2801,11 @@
       body?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "FunctionNode()";
+  }
 }
 
 enum AsyncMarker {
@@ -2802,6 +2932,11 @@
 
   visitChildren(Visitor v) {}
   transformChildren(Transformer v) {}
+
+  @override
+  String toString() {
+    return "InvalidExpression()";
+  }
 }
 
 /// Read a local variable, a local function, or a function parameter.
@@ -2828,6 +2963,11 @@
       promotedType = v.visitDartType(promotedType);
     }
   }
+
+  @override
+  String toString() {
+    return "VariableGet()";
+  }
 }
 
 /// Assign a local variable or function parameter.
@@ -2858,6 +2998,11 @@
       value?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "VariableSet()";
+  }
 }
 
 /// Expression of form `x.field`.
@@ -2918,6 +3063,11 @@
       receiver?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "PropertyGet($receiver.$name)";
+  }
 }
 
 /// Expression of form `x.field = value`.
@@ -2973,6 +3123,11 @@
       value?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "PropertySet()";
+  }
 }
 
 /// Directly read a field, call a getter, or tear off a method.
@@ -3015,6 +3170,11 @@
     return Substitution.fromInterfaceType(receiverType)
         .substituteType(target.getterType);
   }
+
+  @override
+  String toString() {
+    return "DirectPropertyGet()";
+  }
 }
 
 /// Directly assign a field, or call a setter.
@@ -3063,6 +3223,11 @@
 
   DartType getStaticType(StaticTypeContext context) =>
       value.getStaticType(context);
+
+  @override
+  String toString() {
+    return "DirectPropertySet()";
+  }
 }
 
 /// Directly call an instance method, bypassing ordinary dispatch.
@@ -3124,6 +3289,11 @@
             target.function.typeParameters, arguments.types)
         .substituteType(returnType);
   }
+
+  @override
+  String toString() {
+    return "DirectMethodInvocation()";
+  }
 }
 
 /// Expression of form `super.field`.
@@ -3172,6 +3342,11 @@
   }
 
   transformChildren(Transformer v) {}
+
+  @override
+  String toString() {
+    return "SuperPropertyGet()";
+  }
 }
 
 /// Expression of form `super.field = value`.
@@ -3218,6 +3393,11 @@
       value?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "SuperPropertySet()";
+  }
 }
 
 /// Read a static field, call a static getter, or tear off a static method.
@@ -3246,6 +3426,11 @@
   }
 
   transformChildren(Transformer v) {}
+
+  @override
+  String toString() {
+    return "StaticGet()";
+  }
 }
 
 /// Assign a static field or call a static setter.
@@ -3287,6 +3472,11 @@
       value?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "StaticSet()";
+  }
 }
 
 /// The arguments to a function call, divided into type arguments,
@@ -3334,6 +3524,11 @@
     transformList(positional, v, this);
     transformList(named, v, this);
   }
+
+  @override
+  String toString() {
+    return "Arguments()";
+  }
 }
 
 /// A named argument, `name: value`.
@@ -3357,6 +3552,11 @@
       value?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "NamedExpression()";
+  }
 }
 
 /// Common super class for [DirectMethodInvocation], [MethodInvocation],
@@ -3486,6 +3686,11 @@
       arguments?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "MethodInvocation()";
+  }
 }
 
 /// Expression of form `super.foo(x)`.
@@ -3541,6 +3746,11 @@
       arguments?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "SuperMethodInvocation()";
+  }
 }
 
 /// Expression of form `foo(x)`, or `const foo(x)` if the target is an
@@ -3592,6 +3802,11 @@
       arguments?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "StaticInvocation($targetReference, $arguments)";
+  }
 }
 
 /// Expression of form `new Foo(x)` or `const Foo(x)`.
@@ -3659,6 +3874,11 @@
         : new InterfaceType(
             enclosingClass, Nullability.legacy, arguments.types);
   }
+
+  @override
+  String toString() {
+    return "ConstructorInvocation()";
+  }
 }
 
 /// An explicit type instantiation of a generic function.
@@ -3692,6 +3912,11 @@
     }
     transformTypeList(typeArguments, v);
   }
+
+  @override
+  String toString() {
+    return "Instantiation()";
+  }
 }
 
 /// Expression of form `!x`.
@@ -3721,6 +3946,11 @@
       operand?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "Not()";
+  }
 }
 
 /// Expression of form `x && y` or `x || y`
@@ -3756,6 +3986,11 @@
       right?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "LogicalExpression()";
+  }
 }
 
 /// Expression of form `x ? y : z`.
@@ -3804,6 +4039,11 @@
       staticType = v.visitDartType(staticType);
     }
   }
+
+  @override
+  String toString() {
+    return "ConditionalExpression($condition ? $then : $otherwise)";
+  }
 }
 
 /// Convert expressions to strings and concatenate them.  Semantically, calls
@@ -3834,6 +4074,11 @@
   transformChildren(Transformer v) {
     transformList(expressions, v, this);
   }
+
+  @override
+  String toString() {
+    return "StringConcatenation()";
+  }
 }
 
 /// Concatenate lists into a single list.
@@ -3868,6 +4113,11 @@
     typeArgument = v.visitDartType(typeArgument);
     transformList(lists, v, this);
   }
+
+  @override
+  String toString() {
+    return "ListConcatenation()";
+  }
 }
 
 /// Concatenate sets into a single set.
@@ -3905,6 +4155,11 @@
     typeArgument = v.visitDartType(typeArgument);
     transformList(sets, v, this);
   }
+
+  @override
+  String toString() {
+    return "SetConcatenation()";
+  }
 }
 
 /// Concatenate maps into a single map.
@@ -3948,6 +4203,11 @@
     valueType = v.visitDartType(valueType);
     transformList(maps, v, this);
   }
+
+  @override
+  String toString() {
+    return "MapConcatenation()";
+  }
 }
 
 /// Create an instance directly from the field values.
@@ -4007,6 +4267,11 @@
     transformList(asserts, v, this);
     transformList(unusedArguments, v, this);
   }
+
+  @override
+  String toString() {
+    return "InstanceCreation()";
+  }
 }
 
 /// A marker indicating that a subexpression originates in a different source
@@ -4044,6 +4309,11 @@
   Location _getLocationInEnclosingFile(int offset) {
     return _getLocationInComponent(enclosingComponent, fileUri, offset);
   }
+
+  @override
+  String toString() {
+    return "FileUriExpression()";
+  }
 }
 
 /// Expression of form `x is T`.
@@ -4091,6 +4361,11 @@
     }
     type = v.visitDartType(type);
   }
+
+  @override
+  String toString() {
+    return "IsExpression()";
+  }
 }
 
 /// Expression of form `x as T`.
@@ -4183,6 +4458,11 @@
     }
     type = v.visitDartType(type);
   }
+
+  @override
+  String toString() {
+    return "AsExpression($operand as $type)";
+  }
 }
 
 /// Null check expression of form `x!`.
@@ -4217,6 +4497,11 @@
       operand?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "NullCheck()";
+  }
 }
 
 /// An integer, double, boolean, string, or null constant.
@@ -4238,6 +4523,11 @@
   R accept<R>(ExpressionVisitor<R> v) => v.visitStringLiteral(this);
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitStringLiteral(this, arg);
+
+  @override
+  String toString() {
+    return "StringLiteral($value)";
+  }
 }
 
 class IntLiteral extends BasicLiteral {
@@ -4255,6 +4545,11 @@
   R accept<R>(ExpressionVisitor<R> v) => v.visitIntLiteral(this);
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitIntLiteral(this, arg);
+
+  @override
+  String toString() {
+    return "IntLiteral($value)";
+  }
 }
 
 class DoubleLiteral extends BasicLiteral {
@@ -4268,6 +4563,11 @@
   R accept<R>(ExpressionVisitor<R> v) => v.visitDoubleLiteral(this);
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitDoubleLiteral(this, arg);
+
+  @override
+  String toString() {
+    return "DoubleLiteral($value)";
+  }
 }
 
 class BoolLiteral extends BasicLiteral {
@@ -4281,6 +4581,11 @@
   R accept<R>(ExpressionVisitor<R> v) => v.visitBoolLiteral(this);
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitBoolLiteral(this, arg);
+
+  @override
+  String toString() {
+    return "BoolLiteral($value)";
+  }
 }
 
 class NullLiteral extends BasicLiteral {
@@ -4292,6 +4597,11 @@
   R accept<R>(ExpressionVisitor<R> v) => v.visitNullLiteral(this);
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.visitNullLiteral(this, arg);
+
+  @override
+  String toString() {
+    return "NullLiteral()";
+  }
 }
 
 class SymbolLiteral extends Expression {
@@ -4308,6 +4618,11 @@
 
   visitChildren(Visitor v) {}
   transformChildren(Transformer v) {}
+
+  @override
+  String toString() {
+    return "SymbolLiteral(#$value)";
+  }
 }
 
 class TypeLiteral extends Expression {
@@ -4329,6 +4644,11 @@
   transformChildren(Transformer v) {
     type = v.visitDartType(type);
   }
+
+  @override
+  String toString() {
+    return "TypeLiteral($type)";
+  }
 }
 
 class ThisExpression extends Expression {
@@ -4340,6 +4660,11 @@
 
   visitChildren(Visitor v) {}
   transformChildren(Transformer v) {}
+
+  @override
+  String toString() {
+    return "ThisExpression()";
+  }
 }
 
 class Rethrow extends Expression {
@@ -4354,6 +4679,11 @@
 
   visitChildren(Visitor v) {}
   transformChildren(Transformer v) {}
+
+  @override
+  String toString() {
+    return "Rethrow()";
+  }
 }
 
 class Throw extends Expression {
@@ -4381,6 +4711,11 @@
       expression?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "Throw()";
+  }
 }
 
 class ListLiteral extends Expression {
@@ -4411,6 +4746,11 @@
     typeArgument = v.visitDartType(typeArgument);
     transformList(expressions, v, this);
   }
+
+  @override
+  String toString() {
+    return "ListLiteral()";
+  }
 }
 
 class SetLiteral extends Expression {
@@ -4441,6 +4781,11 @@
     typeArgument = v.visitDartType(typeArgument);
     transformList(expressions, v, this);
   }
+
+  @override
+  String toString() {
+    return "SetLiteral()";
+  }
 }
 
 class MapLiteral extends Expression {
@@ -4478,6 +4823,11 @@
     valueType = v.visitDartType(valueType);
     transformList(entries, v, this);
   }
+
+  @override
+  String toString() {
+    return "MapLiteral()";
+  }
 }
 
 class MapEntry extends TreeNode {
@@ -4506,6 +4856,11 @@
       value?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "MapEntry()";
+  }
 }
 
 /// Expression of form `await x`.
@@ -4534,6 +4889,11 @@
       operand?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "AwaitExpression()";
+  }
 }
 
 /// Common super-interface for [FunctionExpression] and [FunctionDeclaration].
@@ -4569,6 +4929,11 @@
       function?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "FunctionExpression()";
+  }
 }
 
 class ConstantExpression extends Expression {
@@ -4594,6 +4959,11 @@
     constant = v.visitConstant(constant);
     type = v.visitDartType(type);
   }
+
+  @override
+  String toString() {
+    return "ConstantExpression()";
+  }
 }
 
 /// Synthetic expression of form `let v = x in y`
@@ -4627,6 +4997,11 @@
       body?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "Let()";
+  }
 }
 
 class BlockExpression extends Expression {
@@ -4660,6 +5035,11 @@
       value?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "BlockExpression()";
+  }
 }
 
 /// Attempt to load the library referred to by a deferred import.
@@ -4691,6 +5071,11 @@
 
   visitChildren(Visitor v) {}
   transformChildren(Transformer v) {}
+
+  @override
+  String toString() {
+    return "LoadLibrary()";
+  }
 }
 
 /// Checks that the given deferred import has been marked as 'loaded'.
@@ -4710,6 +5095,11 @@
 
   visitChildren(Visitor v) {}
   transformChildren(Transformer v) {}
+
+  @override
+  String toString() {
+    return "CheckLibraryIsLoaded()";
+  }
 }
 
 // ------------------------------------------------------------------------
@@ -4742,6 +5132,11 @@
       expression?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "ExpressionStatement()";
+  }
 }
 
 class Block extends Statement {
@@ -4771,6 +5166,11 @@
     statements.add(node);
     node.parent = this;
   }
+
+  @override
+  String toString() {
+    return "Block()";
+  }
 }
 
 /// A block that is only executed when asserts are enabled.
@@ -4806,6 +5206,11 @@
     statements.add(node);
     node.parent = this;
   }
+
+  @override
+  String toString() {
+    return "AssertBlock()";
+  }
 }
 
 class EmptyStatement extends Statement {
@@ -4815,6 +5220,11 @@
 
   visitChildren(Visitor v) {}
   transformChildren(Transformer v) {}
+
+  @override
+  String toString() {
+    return "EmptyStatement()";
+  }
 }
 
 class AssertStatement extends Statement {
@@ -4856,6 +5266,11 @@
       message?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "AssertStatement()";
+  }
 }
 
 /// A target of a [Break] statement.
@@ -4884,6 +5299,11 @@
       body?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "LabeledStatement()";
+  }
 }
 
 /// Breaks out of an enclosing [LabeledStatement].
@@ -4917,6 +5337,11 @@
 
   visitChildren(Visitor v) {}
   transformChildren(Transformer v) {}
+
+  @override
+  String toString() {
+    return "BreakStatement()";
+  }
 }
 
 class WhileStatement extends Statement {
@@ -4947,6 +5372,11 @@
       body?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "WhileStatement()";
+  }
 }
 
 class DoStatement extends Statement {
@@ -4977,6 +5407,11 @@
       condition?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "DoStatement()";
+  }
 }
 
 class ForStatement extends Statement {
@@ -5015,6 +5450,11 @@
       body?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "ForStatement()";
+  }
 }
 
 class ForInStatement extends Statement {
@@ -5060,6 +5500,11 @@
       body?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "ForInStatement()";
+  }
 }
 
 /// Statement of form `switch (e) { case x: ... }`.
@@ -5091,6 +5536,11 @@
     }
     transformList(cases, v, this);
   }
+
+  @override
+  String toString() {
+    return "SwitchStatement()";
+  }
 }
 
 /// A group of `case` clauses and/or a `default` clause.
@@ -5135,6 +5585,11 @@
       body?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "SwitchCase()";
+  }
 }
 
 /// Jump to a case in an enclosing switch.
@@ -5149,6 +5604,11 @@
 
   visitChildren(Visitor v) {}
   transformChildren(Transformer v) {}
+
+  @override
+  String toString() {
+    return "ContinueSwitchStatement()";
+  }
 }
 
 class IfStatement extends Statement {
@@ -5186,6 +5646,11 @@
       otherwise?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "IfStatement()";
+  }
 }
 
 class ReturnStatement extends Statement {
@@ -5209,6 +5674,11 @@
       expression?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "ReturnStatement()";
+  }
 }
 
 class TryCatch extends Statement {
@@ -5237,6 +5707,11 @@
     }
     transformList(catches, v, this);
   }
+
+  @override
+  String toString() {
+    return "TryCatch()";
+  }
 }
 
 class Catch extends TreeNode {
@@ -5277,6 +5752,11 @@
       body?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "Catch()";
+  }
 }
 
 class TryFinally extends Statement {
@@ -5307,6 +5787,11 @@
       finalizer?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "TryFinally()";
+  }
 }
 
 /// Statement of form `yield x` or `yield* x`.
@@ -5351,6 +5836,11 @@
       expression?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "YieldStatement()";
+  }
 }
 
 /// Declaration of a local variable.
@@ -5550,7 +6040,7 @@
 
   /// Returns a possibly synthesized name for this variable, consistent with
   /// the names used across all [toString] calls.
-  String toString() => debugVariableDeclarationName(this);
+  String toString() => _debugVariableDeclarationName(this);
 }
 
 /// Declaration a local function.
@@ -5584,6 +6074,11 @@
       function?.parent = this;
     }
   }
+
+  @override
+  String toString() {
+    return "FunctionDeclaration()";
+  }
 }
 
 // ------------------------------------------------------------------------
@@ -5637,7 +6132,7 @@
   ///
   /// Note that this adds some nodes to a static map to ensure consistent
   /// naming, but that it thus also leaks memory.
-  String leakingDebugToString() => debugNodeToString(this);
+  String leakingDebugToString() => astToText.debugNodeToString(this);
 }
 
 class _PrivateName extends Name {
@@ -5800,6 +6295,11 @@
 
   @override
   InvalidType withNullability(Nullability nullability) => this;
+
+  @override
+  String toString() {
+    return "invalid-type";
+  }
 }
 
 class DynamicType extends DartType {
@@ -5829,6 +6329,11 @@
 
   @override
   DynamicType withNullability(Nullability nullability) => this;
+
+  @override
+  String toString() {
+    return "dynamic";
+  }
 }
 
 class VoidType extends DartType {
@@ -5858,6 +6363,11 @@
 
   @override
   VoidType withNullability(Nullability nullability) => this;
+
+  @override
+  String toString() {
+    return "void";
+  }
 }
 
 class NeverType extends DartType {
@@ -5892,6 +6402,11 @@
   NeverType withNullability(Nullability nullability) {
     return this.nullability == nullability ? this : new NeverType(nullability);
   }
+
+  @override
+  String toString() {
+    return "NeverType()";
+  }
 }
 
 class BottomType extends DartType {
@@ -5921,6 +6436,11 @@
 
   @override
   BottomType withNullability(Nullability nullability) => this;
+
+  @override
+  String toString() {
+    return "<BottomType>";
+  }
 }
 
 class InterfaceType extends DartType {
@@ -6005,6 +6525,11 @@
         ? this
         : new InterfaceType.byReference(className, nullability, typeArguments);
   }
+
+  @override
+  String toString() {
+    return "InterfaceType($className${_debugNullability(nullability)})";
+  }
 }
 
 /// A possibly generic function type.
@@ -6175,6 +6700,11 @@
     if (typeParameters.isEmpty) return result;
     return getFreshTypeParameters(typeParameters).applyToFunctionType(result);
   }
+
+  @override
+  String toString() {
+    return "FunctionType()";
+  }
 }
 
 /// A use of a [Typedef] as a type.
@@ -6263,6 +6793,11 @@
         : new TypedefType.byReference(
             typedefReference, nullability, typeArguments);
   }
+
+  @override
+  String toString() {
+    return "TypedefType()";
+  }
 }
 
 /// A named parameter in [FunctionType].
@@ -6301,6 +6836,11 @@
   void visitChildren(Visitor v) {
     type.accept(v);
   }
+
+  @override
+  String toString() {
+    return "NamedType()";
+  }
 }
 
 /// Reference to a type variable.
@@ -6571,6 +7111,11 @@
 
     return Nullability.legacy;
   }
+
+  @override
+  String toString() {
+    return "TypeParameterType()";
+  }
 }
 
 /// Value set for variance of a type parameter X in a type term T.
@@ -6772,7 +7317,7 @@
 
   /// Returns a possibly synthesized name for this type parameter, consistent
   /// with the names used across all [toString] calls.
-  String toString() => debugQualifiedTypeParameterName(this);
+  String toString() => _debugQualifiedTypeParameterName(this);
 
   bool get isFunctionTypeTypeParameter => parent == null;
 }
@@ -6820,6 +7365,11 @@
     }
     return hash;
   }
+
+  @override
+  String toString() {
+    return "Supertype()";
+  }
 }
 
 // ------------------------------------------------------------------------
@@ -7256,6 +7806,11 @@
 
   @override
   Expression asExpression() => expression;
+
+  @override
+  String toString() {
+    return "UnevaluatedConstant()";
+  }
 }
 
 // ------------------------------------------------------------------------
@@ -7394,6 +7949,11 @@
   void addMetadataRepository(MetadataRepository repository) {
     metadata[repository.tag] = repository;
   }
+
+  @override
+  String toString() {
+    return "Component()";
+  }
 }
 
 /// A tuple with file, line, and column number, for displaying human-readable
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index da3e50b..9d460d4 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -1284,11 +1284,9 @@
       // Copy over the super type entries.
       subInfo.genericSuperType ??= <Class, Supertype>{};
       subInfo.genericSuperTypes ??= <Class, List<Supertype>>{};
-      superInfo.genericSuperTypes?.forEach((Class key, List<Supertype> types) {
-        for (Supertype type in types) {
-          subInfo.recordGenericSuperType(
-              coreTypes, key, type, _onAmbiguousSupertypes);
-        }
+      superInfo.genericSuperType?.forEach((Class key, Supertype type) {
+        subInfo.recordGenericSuperType(
+            coreTypes, key, type, _onAmbiguousSupertypes);
       });
     } else {
       // Copy over all transitive generic super types, and substitute the
@@ -1298,11 +1296,9 @@
           superclass.typeParameters, supertype.typeArguments);
       subInfo.genericSuperType ??= <Class, Supertype>{};
       subInfo.genericSuperTypes ??= <Class, List<Supertype>>{};
-      superInfo.genericSuperTypes?.forEach((Class key, List<Supertype> types) {
-        for (Supertype type in types) {
-          subInfo.recordGenericSuperType(coreTypes, key,
-              substitution.substituteSupertype(type), _onAmbiguousSupertypes);
-        }
+      superInfo.genericSuperType?.forEach((Class key, Supertype type) {
+        subInfo.recordGenericSuperType(coreTypes, key,
+            substitution.substituteSupertype(type), _onAmbiguousSupertypes);
       });
 
       subInfo.recordGenericSuperType(
diff --git a/pkg/kernel/lib/naive_type_checker.dart b/pkg/kernel/lib/naive_type_checker.dart
index 20ee3b5..e18a1125 100644
--- a/pkg/kernel/lib/naive_type_checker.dart
+++ b/pkg/kernel/lib/naive_type_checker.dart
@@ -251,6 +251,12 @@
     if (receiver is DynamicType) {
       return;
     }
+    if (receiver is InvalidType) {
+      return;
+    }
+    if (receiver is BottomType) {
+      return;
+    }
     if (receiver is NeverType &&
         receiver.nullability == Nullability.nonNullable) {
       return;
diff --git a/pkg/kernel/lib/src/bounds_checks.dart b/pkg/kernel/lib/src/bounds_checks.dart
index 03e68b4..c1ea1f8 100644
--- a/pkg/kernel/lib/src/bounds_checks.dart
+++ b/pkg/kernel/lib/src/bounds_checks.dart
@@ -11,8 +11,10 @@
         FunctionType,
         InterfaceType,
         InvalidType,
+        Library,
         NamedType,
         NeverType,
+        Nullability,
         TypeParameter,
         TypeParameterType,
         Typedef,
@@ -113,7 +115,8 @@
   }
 }
 
-DartType instantiateToBounds(DartType type, Class objectClass) {
+DartType instantiateToBounds(
+    DartType type, Class objectClass, Library contextLibrary) {
   if (type is InterfaceType) {
     if (type.typeArguments.isEmpty) return type;
     for (DartType typeArgument in type.typeArguments) {
@@ -124,8 +127,11 @@
         return type;
       }
     }
-    return new InterfaceType.byReference(type.className, type.nullability,
-        calculateBounds(type.classNode.typeParameters, objectClass));
+    return new InterfaceType.byReference(
+        type.className,
+        type.nullability,
+        calculateBounds(
+            type.classNode.typeParameters, objectClass, contextLibrary));
   }
   if (type is TypedefType) {
     if (type.typeArguments.isEmpty) return type;
@@ -134,8 +140,11 @@
         return type;
       }
     }
-    return new TypedefType.byReference(type.typedefReference, type.nullability,
-        calculateBounds(type.typedefNode.typeParameters, objectClass));
+    return new TypedefType.byReference(
+        type.typedefReference,
+        type.nullability,
+        calculateBounds(
+            type.typedefNode.typeParameters, objectClass, contextLibrary));
   }
   return type;
 }
@@ -146,8 +155,8 @@
 /// See the [description]
 /// (https://github.com/dart-lang/sdk/blob/master/docs/language/informal/instantiate-to-bound.md)
 /// of the algorithm for details.
-List<DartType> calculateBounds(
-    List<TypeParameter> typeParameters, Class objectClass) {
+List<DartType> calculateBounds(List<TypeParameter> typeParameters,
+    Class objectClass, Library contextLibrary) {
   List<DartType> bounds = new List<DartType>(typeParameters.length);
   for (int i = 0; i < typeParameters.length; i++) {
     DartType bound = typeParameters[i].bound;
@@ -165,12 +174,16 @@
 
   TypeVariableGraph graph = new TypeVariableGraph(typeParameters, bounds);
   List<List<int>> stronglyConnected = computeStrongComponents(graph);
+  final DartType topType = const DynamicType();
+  final DartType bottomType = contextLibrary.isNonNullableByDefault
+      ? const NeverType(Nullability.nonNullable)
+      : const BottomType();
   for (List<int> component in stronglyConnected) {
     Map<TypeParameter, DartType> upperBounds = <TypeParameter, DartType>{};
     Map<TypeParameter, DartType> lowerBounds = <TypeParameter, DartType>{};
     for (int typeParameterIndex in component) {
-      upperBounds[typeParameters[typeParameterIndex]] = const DynamicType();
-      lowerBounds[typeParameters[typeParameterIndex]] = const BottomType();
+      upperBounds[typeParameters[typeParameterIndex]] = topType;
+      lowerBounds[typeParameters[typeParameterIndex]] = bottomType;
     }
     Substitution substitution =
         Substitution.fromUpperAndLowerBounds(upperBounds, lowerBounds);
@@ -184,7 +197,7 @@
     Map<TypeParameter, DartType> upperBounds = <TypeParameter, DartType>{};
     Map<TypeParameter, DartType> lowerBounds = <TypeParameter, DartType>{};
     upperBounds[typeParameters[i]] = bounds[i];
-    lowerBounds[typeParameters[i]] = const BottomType();
+    lowerBounds[typeParameters[i]] = bottomType;
     Substitution substitution =
         Substitution.fromUpperAndLowerBounds(upperBounds, lowerBounds);
     for (int j = 0; j < typeParameters.length; j++) {
@@ -227,13 +240,30 @@
         typeParameter == other.typeParameter &&
         enclosingType == other.enclosingType;
   }
+
+  String toString() {
+    return "TypeArgumentIssue(index=${index}, argument=${argument}, "
+        "typeParameter=${typeParameter}, enclosingType=${enclosingType}";
+  }
 }
 
+// Finds type arguments that don't follow the rules of well-boundness.
+//
+// [bottomType] should be either Null or Never, depending on what should be
+// taken for the bottom type at the call site.  The bottom type is used in the
+// checks for super-boundness for construction of the auxiliary type.  For
+// details see Dart Language Specification, Section 14.3.2 The Instantiation to
+// Bound Algorithm.
 // TODO(dmitryas):  Remove [typedefInstantiations] when type arguments passed to
 // typedefs are preserved in the Kernel output.
-List<TypeArgumentIssue> findTypeArgumentIssues(DartType type,
-    TypeEnvironment typeEnvironment, SubtypeCheckMode subtypeCheckMode,
+List<TypeArgumentIssue> findTypeArgumentIssues(
+    DartType type,
+    TypeEnvironment typeEnvironment,
+    SubtypeCheckMode subtypeCheckMode,
+    DartType bottomType,
     {bool allowSuperBounded = false}) {
+  assert(bottomType == const NeverType(Nullability.nonNullable) ||
+      bottomType == typeEnvironment.nullType);
   List<TypeParameter> variables;
   List<DartType> arguments;
   List<TypeArgumentIssue> typedefRhsResult;
@@ -251,7 +281,7 @@
         requiredParameterCount: functionType.requiredParameterCount,
         typedefType: null);
     typedefRhsResult = findTypeArgumentIssues(
-        cloned, typeEnvironment, subtypeCheckMode,
+        cloned, typeEnvironment, subtypeCheckMode, bottomType,
         allowSuperBounded: true);
     type = functionType.typedefType;
   }
@@ -266,24 +296,24 @@
     List<TypeArgumentIssue> result = <TypeArgumentIssue>[];
     for (TypeParameter parameter in type.typeParameters) {
       result.addAll(findTypeArgumentIssues(
-              parameter.bound, typeEnvironment, subtypeCheckMode,
+              parameter.bound, typeEnvironment, subtypeCheckMode, bottomType,
               allowSuperBounded: true) ??
           const <TypeArgumentIssue>[]);
     }
     for (DartType formal in type.positionalParameters) {
       result.addAll(findTypeArgumentIssues(
-              formal, typeEnvironment, subtypeCheckMode,
+              formal, typeEnvironment, subtypeCheckMode, bottomType,
               allowSuperBounded: true) ??
           const <TypeArgumentIssue>[]);
     }
     for (NamedType named in type.namedParameters) {
       result.addAll(findTypeArgumentIssues(
-              named.type, typeEnvironment, subtypeCheckMode,
+              named.type, typeEnvironment, subtypeCheckMode, bottomType,
               allowSuperBounded: true) ??
           const <TypeArgumentIssue>[]);
     }
     result.addAll(findTypeArgumentIssues(
-            type.returnType, typeEnvironment, subtypeCheckMode,
+            type.returnType, typeEnvironment, subtypeCheckMode, bottomType,
             allowSuperBounded: true) ??
         const <TypeArgumentIssue>[]);
     return result.isEmpty ? null : result;
@@ -316,7 +346,7 @@
     }
 
     List<TypeArgumentIssue> issues = findTypeArgumentIssues(
-        argument, typeEnvironment, subtypeCheckMode,
+        argument, typeEnvironment, subtypeCheckMode, bottomType,
         allowSuperBounded: true);
     if (issues != null) {
       argumentsResult ??= <TypeArgumentIssue>[];
@@ -337,7 +367,7 @@
   if (!allowSuperBounded) return result;
 
   result = null;
-  type = convertSuperBoundedToRegularBounded(typeEnvironment, type);
+  type = convertSuperBoundedToRegularBounded(typeEnvironment, type, bottomType);
   List<DartType> argumentsToReport = arguments.toList();
   if (type is InterfaceType) {
     variables = type.classNode.typeParameters;
@@ -373,6 +403,13 @@
   return result;
 }
 
+// Finds type arguments that don't follow the rules of well-boundness.
+//
+// [bottomType] should be either Null or Never, depending on what should be
+// taken for the bottom type at the call site.  The bottom type is used in the
+// checks for super-boundness for construction of the auxiliary type.  For
+// details see Dart Language Specification, Section 14.3.2 The Instantiation to
+// Bound Algorithm.
 // TODO(dmitryas):  Remove [typedefInstantiations] when type arguments passed to
 // typedefs are preserved in the Kernel output.
 List<TypeArgumentIssue> findTypeArgumentIssuesForInvocation(
@@ -380,8 +417,11 @@
     List<DartType> arguments,
     TypeEnvironment typeEnvironment,
     SubtypeCheckMode subtypeCheckMode,
+    DartType bottomType,
     {Map<FunctionType, List<DartType>> typedefInstantiations}) {
   assert(arguments.length == parameters.length);
+  assert(bottomType == const NeverType(Nullability.nonNullable) ||
+      bottomType == typeEnvironment.nullType);
   List<TypeArgumentIssue> result;
   var substitutionMap = <TypeParameter, DartType>{};
   for (int i = 0; i < arguments.length; ++i) {
@@ -403,7 +443,7 @@
     }
 
     List<TypeArgumentIssue> issues = findTypeArgumentIssues(
-        argument, typeEnvironment, subtypeCheckMode,
+        argument, typeEnvironment, subtypeCheckMode, bottomType,
         allowSuperBounded: true);
     if (issues != null) {
       result ??= <TypeArgumentIssue>[];
@@ -426,22 +466,21 @@
 /// [BottomType] and all contravariant occurrences of `Null` and [BottomType]
 /// with `Object`.
 DartType convertSuperBoundedToRegularBounded(
-    TypeEnvironment typeEnvironment, DartType type,
+    TypeEnvironment typeEnvironment, DartType type, DartType bottomType,
     {bool isCovariant = true}) {
   if ((type is DynamicType ||
           type is VoidType ||
           isObject(typeEnvironment, type)) &&
       isCovariant) {
-    return const BottomType();
-  } else if ((type is BottomType || isNull(typeEnvironment, type)) &&
-      !isCovariant) {
+    return bottomType;
+  } else if ((type == bottomType || type is BottomType) && !isCovariant) {
     return typeEnvironment.coreTypes.objectLegacyRawType;
   } else if (type is InterfaceType && type.classNode.typeParameters != null) {
     List<DartType> replacedTypeArguments =
         new List<DartType>(type.typeArguments.length);
     for (int i = 0; i < replacedTypeArguments.length; i++) {
       replacedTypeArguments[i] = convertSuperBoundedToRegularBounded(
-          typeEnvironment, type.typeArguments[i],
+          typeEnvironment, type.typeArguments[i], bottomType,
           isCovariant: isCovariant);
     }
     return new InterfaceType(
@@ -451,20 +490,20 @@
         new List<DartType>(type.typeArguments.length);
     for (int i = 0; i < replacedTypeArguments.length; i++) {
       replacedTypeArguments[i] = convertSuperBoundedToRegularBounded(
-          typeEnvironment, type.typeArguments[i],
+          typeEnvironment, type.typeArguments[i], bottomType,
           isCovariant: isCovariant);
     }
     return new TypedefType(
         type.typedefNode, type.nullability, replacedTypeArguments);
   } else if (type is FunctionType) {
     var replacedReturnType = convertSuperBoundedToRegularBounded(
-        typeEnvironment, type.returnType,
+        typeEnvironment, type.returnType, bottomType,
         isCovariant: isCovariant);
     var replacedPositionalParameters =
         new List<DartType>(type.positionalParameters.length);
     for (int i = 0; i < replacedPositionalParameters.length; i++) {
       replacedPositionalParameters[i] = convertSuperBoundedToRegularBounded(
-          typeEnvironment, type.positionalParameters[i],
+          typeEnvironment, type.positionalParameters[i], bottomType,
           isCovariant: !isCovariant);
     }
     var replacedNamedParameters =
@@ -473,7 +512,7 @@
       replacedNamedParameters[i] = new NamedType(
           type.namedParameters[i].name,
           convertSuperBoundedToRegularBounded(
-              typeEnvironment, type.namedParameters[i].type,
+              typeEnvironment, type.namedParameters[i].type, bottomType,
               isCovariant: !isCovariant));
     }
     return new FunctionType(
@@ -491,11 +530,6 @@
       type.classNode == typeEnvironment.coreTypes.objectClass;
 }
 
-bool isNull(TypeEnvironment typeEnvironment, DartType type) {
-  return type is InterfaceType &&
-      type.classNode == typeEnvironment.nullType.classNode;
-}
-
 int computeVariance(TypeParameter typeParameter, DartType type,
     {Map<TypeParameter, Map<DartType, int>> computedVariances}) {
   computedVariances ??= new Map<TypeParameter, Map<DartType, int>>.identity();
diff --git a/pkg/kernel/lib/testing/type_parser_environment.dart b/pkg/kernel/lib/testing/type_parser_environment.dart
index 0f066b2..43b38d5 100644
--- a/pkg/kernel/lib/testing/type_parser_environment.dart
+++ b/pkg/kernel/lib/testing/type_parser_environment.dart
@@ -437,7 +437,8 @@
           ..defaultType = type;
       }
     }
-    List<DartType> defaultTypes = calculateBounds(typeParameters, objectClass);
+    List<DartType> defaultTypes = calculateBounds(typeParameters, objectClass,
+        new Library(new Uri.file("test.lib"))..isNonNullableByDefault = true);
     for (int i = 0; i < typeParameters.length; i++) {
       typeParameters[i].defaultType = defaultTypes[i];
     }
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 72fb6e7..e3e2566 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -2294,6 +2294,16 @@
     endLine(')');
   }
 
+  visitTypeLiteralConstant(TypeLiteralConstant node) {
+    writeIndentation();
+    writeConstantReference(node);
+    writeSpaced('=');
+    writeWord('${node.runtimeType}');
+    writeSymbol('(');
+    writeNode(node.type);
+    endLine(')');
+  }
+
   visitInstanceConstant(InstanceConstant node) {
     writeIndentation();
     writeConstantReference(node);
diff --git a/pkg/kernel/test/metadata_test.dart b/pkg/kernel/test/metadata_test.dart
index 87ed4e9..a6d285a 100644
--- a/pkg/kernel/test/metadata_test.dart
+++ b/pkg/kernel/test/metadata_test.dart
@@ -25,8 +25,8 @@
   Member get member => _memberRef?.asMember;
 
   Metadata.forNode(TreeNode n)
-      : this(n.toString(), getMemberReference(getMemberForMetadata(n)),
-            getTypeForMetadata(n));
+      : this(n.leakingDebugToString(),
+            getMemberReference(getMemberForMetadata(n)), getTypeForMetadata(n));
 
   Metadata(this.string, this._memberRef, this.type);
 }
diff --git a/pkg/kernel/test/verify_test.dart b/pkg/kernel/test/verify_test.dart
index c69b044..a128818 100644
--- a/pkg/kernel/test/verify_test.dart
+++ b/pkg/kernel/test/verify_test.dart
@@ -7,10 +7,6 @@
 import 'package:kernel/verifier.dart';
 import 'package:test/test.dart';
 
-const String varRegexp = "#t[0-9]+";
-
-const String tvarRegexp = "#T[0-9]+";
-
 /// Checks that the verifier correctly find errors in invalid components.
 ///
 /// The frontend should never generate invalid components, so we have to test
@@ -19,496 +15,653 @@
 /// We mostly test negative cases here, as we get plenty of positive cases by
 /// compiling the Dart test suite with the verifier enabled.
 main() {
-  positiveTest('Test harness has no errors', (TestHarness test) {
-    test.addNode(NullLiteral());
-  });
-  negativeTest('VariableGet out of scope',
-      matches("Variable '$varRegexp' used out of scope\\."),
-      (TestHarness test) {
-    test.addNode(VariableGet(test.makeVariable()));
-  });
-  negativeTest('VariableSet out of scope',
-      matches("Variable '$varRegexp' used out of scope\\."),
-      (TestHarness test) {
-    test.addNode(VariableSet(test.makeVariable(), new NullLiteral()));
-  });
-  negativeTest('Variable block scope',
-      matches("Variable '$varRegexp' used out of scope\\."),
-      (TestHarness test) {
-    VariableDeclaration variable = test.makeVariable();
-    test.addNode(Block([
-      new Block([variable]),
-      new ReturnStatement(new VariableGet(variable))
-    ]));
-  });
-  negativeTest('Variable let scope',
-      matches("Variable '$varRegexp' used out of scope\\."),
-      (TestHarness test) {
-    VariableDeclaration variable = test.makeVariable();
-    test.addNode(LogicalExpression(new Let(variable, new VariableGet(variable)),
-        '&&', new VariableGet(variable)));
-  });
-  negativeTest('Variable redeclared',
-      matches("Variable '$varRegexp' declared more than once\\."),
-      (TestHarness test) {
-    VariableDeclaration variable = test.makeVariable();
-    test.addNode(Block([variable, variable]));
-  });
-  negativeTest('Member redeclared',
-      "Member 'test_lib::Test::field' has been declared more than once.",
-      (TestHarness test) {
-    Field field = new Field(new Name('field'), initializer: new NullLiteral());
-    test.addNode(Class(
-        name: 'Test',
-        supertype: test.objectClass.asRawSupertype,
-        fields: [field, field]));
-  });
-  negativeTest('Class redeclared',
-      "Class 'test_lib::OtherClass' declared more than once.",
-      (TestHarness test) {
-    test.addNode(
-        test.otherClass); // Test harness also adds otherClass to component.
-  });
-  negativeTest('Class type parameter redeclared',
-      matches("Type parameter 'test_lib::Test::$tvarRegexp' redeclared\\."),
-      (TestHarness test) {
-    var parameter = test.makeTypeParameter();
-    test.addNode(Class(
-        name: 'Test',
-        supertype: test.objectClass.asRawSupertype,
-        typeParameters: [parameter, parameter]));
-  });
-  negativeTest('Member type parameter redeclared',
-      matches("Type parameter '$tvarRegexp' redeclared\\."),
-      (TestHarness test) {
-    var parameter = test.makeTypeParameter();
-    test.addNode(Procedure(
-        new Name('bar'),
-        ProcedureKind.Method,
-        new FunctionNode(new ReturnStatement(new NullLiteral()),
-            typeParameters: [parameter, parameter])));
-  });
-  negativeTest(
-      'Type parameter out of scope',
-      matches("Type parameter '$tvarRegexp' referenced out of scope,"
-          " parent is: 'null'\\."), (TestHarness test) {
-    var parameter = test.makeTypeParameter();
-    test.addNode(ListLiteral([],
-        typeArgument: new TypeParameterType(parameter, Nullability.legacy)));
-  });
-  negativeTest(
-      'Class type parameter from another class',
-      "Type parameter 'test_lib::OtherClass::OtherT' referenced out of scope,"
-          " parent is: 'test_lib::OtherClass'.", (TestHarness test) {
-    test.addNode(TypeLiteral(new TypeParameterType(
-        test.otherClass.typeParameters[0], Nullability.legacy)));
-  });
-  negativeTest(
-      'Class type parameter in static method',
-      "Type parameter 'test_lib::TestClass::T' referenced from static context,"
-          " parent is: 'test_lib::TestClass'.", (TestHarness test) {
-    test.addNode(Procedure(
-        new Name('bar'),
-        ProcedureKind.Method,
-        new FunctionNode(new ReturnStatement(new TypeLiteral(
-            new TypeParameterType(
-                test.classTypeParameter, Nullability.legacy)))),
-        isStatic: true));
-  });
-  negativeTest(
-      'Class type parameter in static field',
-      "Type parameter 'test_lib::TestClass::T' referenced from static context,"
-          " parent is: 'test_lib::TestClass'.", (TestHarness test) {
-    test.addNode(Field(new Name('field'),
-        initializer: new TypeLiteral(
-            new TypeParameterType(test.classTypeParameter, Nullability.legacy)),
-        isStatic: true));
-  });
-  negativeTest(
-      'Method type parameter out of scope',
-      matches("Type parameter '$tvarRegexp' referenced out of scope,"
-          " parent is: '<FunctionNode>'\\."), (TestHarness test) {
-    var parameter = test.makeTypeParameter();
-    test.addNode(Class(
-        name: 'Test',
-        supertype: test.objectClass.asRawSupertype,
-        procedures: [
-          new Procedure(
-              new Name('generic'),
-              ProcedureKind.Method,
-              new FunctionNode(new EmptyStatement(),
-                  typeParameters: [parameter])),
-          new Procedure(
-              new Name('use'),
-              ProcedureKind.Method,
-              new FunctionNode(new ReturnStatement(new TypeLiteral(
-                  new TypeParameterType(parameter, Nullability.legacy)))))
-        ]));
-  });
-  negativeTest(
-      'Interface type arity too low',
-      "Type test_lib::OtherClass* provides 0 type arguments,"
-          " but the class declares 1 parameters.", (TestHarness test) {
-    test.addNode(TypeLiteral(
-        new InterfaceType(test.otherClass, Nullability.legacy, [])));
-  });
-  negativeTest(
-      'Interface type arity too high',
-      "Type test_lib::OtherClass<dynamic, dynamic>* provides 2 type arguments,"
-          " but the class declares 1 parameters.", (TestHarness test) {
-    test.addNode(TypeLiteral(new InterfaceType(test.otherClass,
-        Nullability.legacy, [new DynamicType(), new DynamicType()])));
-  });
-  negativeTest(
-      'Dangling interface type',
-      matches("Dangling reference to 'null::#class[0-9]+',"
-          " parent is: 'null'\\."), (TestHarness test) {
-    var orphan = new Class();
-    test.addNode(TypeLiteral(new InterfaceType(orphan, Nullability.legacy)));
-  });
-  negativeTest('Dangling field get',
-      "Dangling reference to 'null::foo', parent is: 'null'.",
-      (TestHarness test) {
-    var orphan = new Field(new Name('foo'));
-    test.addNode(DirectPropertyGet(new NullLiteral(), orphan));
-  });
-  negativeTest(
-      'Missing block parent pointer',
-      "Incorrect parent pointer on ReturnStatement:"
-          " expected 'Block', but found: 'Null'.", (TestHarness test) {
-    var block = new Block([]);
-    block.statements.add(new ReturnStatement());
-    test.addNode(block);
-  });
-  negativeTest(
-      'Missing function parent pointer',
-      "Incorrect parent pointer on FunctionNode:"
-          " expected 'Procedure', but found: 'Null'.", (TestHarness test) {
-    var procedure = new Procedure(new Name('bar'), ProcedureKind.Method, null);
-    procedure.function = new FunctionNode(new EmptyStatement());
-    test.addNode(procedure);
-  });
-  negativeTest('StaticGet without target', "StaticGet without target.",
-      (TestHarness test) {
-    test.addNode(StaticGet(null));
-  });
-  negativeTest('StaticSet without target', "StaticSet without target.",
-      (TestHarness test) {
-    test.addNode(StaticSet(null, new NullLiteral()));
-  });
-  negativeTest(
-      'StaticInvocation without target', "StaticInvocation without target.",
-      (TestHarness test) {
-    test.addNode(StaticInvocation(null, new Arguments.empty()));
-  });
-  positiveTest('Correct StaticInvocation', (TestHarness test) {
-    var method = new Procedure(
-        new Name('foo'),
-        ProcedureKind.Method,
-        new FunctionNode(new EmptyStatement(),
-            positionalParameters: [new VariableDeclaration('p')]),
-        isStatic: true);
-    test.enclosingClass.addMember(method);
-    test.addNode(StaticInvocation(method, new Arguments([new NullLiteral()])));
-  });
-  negativeTest(
-      'StaticInvocation with too many parameters',
-      "StaticInvocation with incompatible arguments for"
-          " 'test_lib::TestClass::bar'.", (TestHarness test) {
-    var method = new Procedure(new Name('bar'), ProcedureKind.Method,
-        new FunctionNode(new EmptyStatement()),
-        isStatic: true);
-    test.enclosingClass.addMember(method);
-    test.addNode(StaticInvocation(method, new Arguments([new NullLiteral()])));
-  });
-  negativeTest(
-      'StaticInvocation with too few parameters',
-      "StaticInvocation with incompatible arguments for"
-          " 'test_lib::TestClass::bar'.", (TestHarness test) {
-    var method = new Procedure(
-        new Name('bar'),
-        ProcedureKind.Method,
-        new FunctionNode(new EmptyStatement(),
-            positionalParameters: [new VariableDeclaration('p')]),
-        isStatic: true);
-    test.enclosingClass.addMember(method);
-    test.addNode(StaticInvocation(method, new Arguments.empty()));
-  });
-  negativeTest(
-      'StaticInvocation with unmatched named parameter',
-      "StaticInvocation with incompatible arguments for"
-          " 'test_lib::TestClass::bar'.", (TestHarness test) {
-    var method = new Procedure(new Name('bar'), ProcedureKind.Method,
-        new FunctionNode(new EmptyStatement()),
-        isStatic: true);
-    test.enclosingClass.addMember(method);
-    test.addNode(StaticInvocation(
-        method,
-        new Arguments([],
-            named: [new NamedExpression('p', new NullLiteral())])));
-  });
-  negativeTest(
-      'StaticInvocation with missing type argument',
-      "StaticInvocation with wrong number of type arguments for"
-          " 'test_lib::TestClass::bar'.", (TestHarness test) {
-    var method = new Procedure(
-        new Name('bar'),
-        ProcedureKind.Method,
-        new FunctionNode(new EmptyStatement(),
-            typeParameters: [test.makeTypeParameter()]),
-        isStatic: true);
-    test.enclosingClass.addMember(method);
-    test.addNode(StaticInvocation(method, new Arguments.empty()));
-  });
-  negativeTest(
-      'ConstructorInvocation with missing type argument',
-      "ConstructorInvocation with wrong number of type arguments for"
-          " 'test_lib::TestClass::foo'.", (TestHarness test) {
-    var class_ = new Class(
-        name: 'Test',
-        typeParameters: [test.makeTypeParameter()],
-        supertype: test.objectClass.asRawSupertype);
-    test.enclosingLibrary.addClass(class_);
-    var constructor = new Constructor(new FunctionNode(new EmptyStatement()),
-        name: new Name('foo'));
-    test.enclosingClass.addMember(constructor);
-    test.addNode(ConstructorInvocation(constructor, new Arguments.empty()));
-  });
-  positiveTest('Valid typedef Foo = `(C) => void`', (TestHarness test) {
-    var typedef_ = new Typedef(
-        'Foo',
-        new FunctionType(
-            [test.otherLegacyRawType], const VoidType(), Nullability.legacy));
-    test.addNode(typedef_);
-  });
-  positiveTest('Valid typedef Foo = C<dynamic>', (TestHarness test) {
-    var typedef_ = new Typedef(
-        'Foo',
-        new InterfaceType(
-            test.otherClass, Nullability.legacy, [const DynamicType()]));
-    test.addNode(typedef_);
-  });
-  positiveTest('Valid typedefs Foo = Bar, Bar = C', (TestHarness test) {
-    var foo = new Typedef('Foo', null);
-    var bar = new Typedef('Bar', null);
-    foo.type = new TypedefType(bar, Nullability.legacy);
-    bar.type = test.otherLegacyRawType;
-    test.enclosingLibrary.addTypedef(foo);
-    test.enclosingLibrary.addTypedef(bar);
-  });
-  positiveTest('Valid typedefs Foo = C<Bar>, Bar = C', (TestHarness test) {
-    var foo = new Typedef('Foo', null);
-    var bar = new Typedef('Bar', null);
-    foo.type = new InterfaceType(test.otherClass, Nullability.legacy,
-        [new TypedefType(bar, Nullability.legacy)]);
-    bar.type = test.otherLegacyRawType;
-    test.enclosingLibrary.addTypedef(foo);
-    test.enclosingLibrary.addTypedef(bar);
-  });
-  positiveTest('Valid typedef type in field', (TestHarness test) {
-    var typedef_ = new Typedef(
-        'Foo',
-        new FunctionType(
-            [test.otherLegacyRawType], const VoidType(), Nullability.legacy));
-    var field = new Field(new Name('field'),
-        type: new TypedefType(typedef_, Nullability.legacy), isStatic: true);
-    test.enclosingLibrary.addTypedef(typedef_);
-    test.enclosingLibrary.addMember(field);
-  });
-  negativeTest(
-      'Invalid typedef Foo = Foo',
-      "The typedef 'typedef Foo = test_lib::Foo;\n'"
-          " refers to itself", (TestHarness test) {
-    var typedef_ = new Typedef('Foo', null);
-    typedef_.type = new TypedefType(typedef_, Nullability.legacy);
-    test.addNode(typedef_);
-  });
-  negativeTest(
-      'Invalid typedef Foo = `(Foo) => void`',
-      "The typedef 'typedef Foo = (test_lib::Foo) →* void;\n'"
-          " refers to itself", (TestHarness test) {
-    var typedef_ = new Typedef('Foo', null);
-    typedef_.type = new FunctionType(
-        [new TypedefType(typedef_, Nullability.legacy)],
-        const VoidType(),
-        Nullability.legacy);
-    test.addNode(typedef_);
-  });
-  negativeTest(
-      'Invalid typedef Foo = `() => Foo`',
-      "The typedef 'typedef Foo = () →* test_lib::Foo;\n'"
-          " refers to itself", (TestHarness test) {
-    var typedef_ = new Typedef('Foo', null);
-    typedef_.type = new FunctionType(
-        [], new TypedefType(typedef_, Nullability.legacy), Nullability.legacy);
-    test.addNode(typedef_);
-  });
-  negativeTest(
-      'Invalid typedef Foo = C<Foo>',
-      "The typedef 'typedef Foo = test_lib::OtherClass<test_lib::Foo>*;\n'"
-          " refers to itself", (TestHarness test) {
-    var typedef_ = new Typedef('Foo', null);
-    typedef_.type = new InterfaceType(test.otherClass, Nullability.legacy,
-        [new TypedefType(typedef_, Nullability.legacy)]);
-    test.addNode(typedef_);
-  });
-  negativeTest(
-      'Invalid typedefs Foo = Bar, Bar = Foo',
-      "The typedef 'typedef Foo = test_lib::Bar;\n'"
-          " refers to itself", (TestHarness test) {
-    var foo = new Typedef('Foo', null);
-    var bar = new Typedef('Bar', null);
-    foo.type = new TypedefType(bar, Nullability.legacy);
-    bar.type = new TypedefType(foo, Nullability.legacy);
-    test.enclosingLibrary.addTypedef(foo);
-    test.enclosingLibrary.addTypedef(bar);
-  });
-  negativeTest(
-      'Invalid typedefs Foo = Bar, Bar = C<Foo>',
-      "The typedef 'typedef Foo = test_lib::Bar;\n'"
-          " refers to itself", (TestHarness test) {
-    var foo = new Typedef('Foo', null);
-    var bar = new Typedef('Bar', null);
-    foo.type = new TypedefType(bar, Nullability.legacy);
-    bar.type = new InterfaceType(test.otherClass, Nullability.legacy,
-        [new TypedefType(foo, Nullability.legacy)]);
-    test.enclosingLibrary.addTypedef(foo);
-    test.enclosingLibrary.addTypedef(bar);
-  });
-  negativeTest(
-      'Invalid typedefs Foo = C<Bar>, Bar = C<Foo>',
-      "The typedef 'typedef Foo = test_lib::OtherClass<test_lib::Bar>*;\n'"
-          " refers to itself", (TestHarness test) {
-    var foo = new Typedef('Foo', null);
-    var bar = new Typedef('Bar', null);
-    foo.type = new InterfaceType(test.otherClass, Nullability.legacy,
-        [new TypedefType(bar, Nullability.legacy)]);
-    bar.type = new InterfaceType(test.otherClass, Nullability.legacy,
-        [new TypedefType(foo, Nullability.legacy)]);
-    test.enclosingLibrary.addTypedef(foo);
-    test.enclosingLibrary.addTypedef(bar);
-  });
-  positiveTest('Valid long typedefs C20 = C19 = ... = C1 = C0 = dynamic',
-      (TestHarness test) {
-    var typedef_ = new Typedef('C0', const DynamicType());
-    test.enclosingLibrary.addTypedef(typedef_);
-    for (int i = 1; i < 20; ++i) {
-      typedef_ =
-          new Typedef('C$i', new TypedefType(typedef_, Nullability.legacy));
+  positiveTest(
+    'Test harness has no errors',
+    (TestHarness test) {
+      test.addNode(NullLiteral());
+    },
+  );
+  negative1Test(
+    'VariableGet out of scope',
+    (TestHarness test) {
+      VariableDeclaration node = test.makeVariable();
+      test.addNode(VariableGet(node));
+      return node;
+    },
+    (Node node) => matches("Variable '$node' used out of scope\\."),
+  );
+  negative1Test(
+    'VariableSet out of scope',
+    (TestHarness test) {
+      VariableDeclaration variable = test.makeVariable();
+      test.addNode(VariableSet(variable, new NullLiteral()));
+      return variable;
+    },
+    (Node node) => matches("Variable '$node' used out of scope\\."),
+  );
+  negative1Test(
+    'Variable block scope',
+    (TestHarness test) {
+      VariableDeclaration variable = test.makeVariable();
+      test.addNode(Block([
+        new Block([variable]),
+        new ReturnStatement(new VariableGet(variable))
+      ]));
+      return variable;
+    },
+    (Node node) => matches("Variable '$node' used out of scope\\."),
+  );
+  negative1Test(
+    'Variable let scope',
+    (TestHarness test) {
+      VariableDeclaration variable = test.makeVariable();
+      test.addNode(LogicalExpression(
+          new Let(variable, new VariableGet(variable)),
+          '&&',
+          new VariableGet(variable)));
+      return variable;
+    },
+    (Node node) => matches("Variable '$node' used out of scope\\."),
+  );
+  negative1Test(
+    'Variable redeclared',
+    (TestHarness test) {
+      VariableDeclaration variable = test.makeVariable();
+      test.addNode(Block([variable, variable]));
+      return variable;
+    },
+    (Node node) => matches("Variable '$node' declared more than once\\."),
+  );
+  negative1Test(
+    'Member redeclared',
+    (TestHarness test) {
+      Field field =
+          new Field(new Name('field'), initializer: new NullLiteral());
+      test.addNode(Class(
+          name: 'Test',
+          supertype: test.objectClass.asRawSupertype,
+          fields: [field, field]));
+      return field;
+    },
+    (Node node) => "Member '$node' has been declared more than once.",
+  );
+  negative1Test(
+    'Class redeclared',
+    (TestHarness test) {
+      Class otherClass = test.otherClass;
+      test.addNode(
+          otherClass); // Test harness also adds otherClass to component.
+      return test.otherClass;
+    },
+    (Node node) => "Class '$node' declared more than once.",
+  );
+  negative1Test(
+    'Class type parameter redeclared',
+    (TestHarness test) {
+      TypeParameter parameter = test.makeTypeParameter();
+      test.addNode(Class(
+          name: 'Test',
+          supertype: test.objectClass.asRawSupertype,
+          typeParameters: [parameter, parameter]));
+      return parameter;
+    },
+    (Node node) => matches("Type parameter '$node' redeclared\\."),
+  );
+  negative1Test(
+    'Member type parameter redeclared',
+    (TestHarness test) {
+      TypeParameter parameter = test.makeTypeParameter();
+      test.addNode(Procedure(
+          new Name('bar'),
+          ProcedureKind.Method,
+          new FunctionNode(new ReturnStatement(new NullLiteral()),
+              typeParameters: [parameter, parameter])));
+
+      return parameter;
+    },
+    (Node node) => matches("Type parameter '$node' redeclared\\."),
+  );
+  negative2Test(
+    'Type parameter out of scope',
+    (TestHarness test) {
+      TypeParameter parameter = test.makeTypeParameter();
+      test.addNode(ListLiteral([],
+          typeArgument: new TypeParameterType(parameter, Nullability.legacy)));
+      return [parameter, null];
+    },
+    (Node node, Node parent) =>
+        matches("Type parameter '$node' referenced out of scope,"
+            " parent is: '$parent'\\."),
+  );
+  negative2Test(
+    'Class type parameter from another class',
+    (TestHarness test) {
+      TypeParameter node = test.otherClass.typeParameters[0];
+      test.addNode(
+          TypeLiteral(new TypeParameterType(node, Nullability.legacy)));
+      return [node, test.otherClass];
+    },
+    (Node node, Node parent) =>
+        "Type parameter '$node' referenced out of scope,"
+        " parent is: '$parent'.",
+  );
+  negative2Test(
+    'Class type parameter in static method',
+    (TestHarness test) {
+      TypeParameter node = test.classTypeParameter;
+      test.addNode(Procedure(
+          new Name('bar'),
+          ProcedureKind.Method,
+          new FunctionNode(new ReturnStatement(new TypeLiteral(
+              new TypeParameterType(node, Nullability.legacy)))),
+          isStatic: true));
+
+      return [node, test.enclosingClass];
+    },
+    (Node node, Node parent) =>
+        "Type parameter '$node' referenced from static context,"
+        " parent is: '$parent'.",
+  );
+  negative2Test(
+    'Class type parameter in static field',
+    (TestHarness test) {
+      TypeParameter node = test.classTypeParameter;
+      test.addNode(Field(new Name('field'),
+          initializer:
+              new TypeLiteral(new TypeParameterType(node, Nullability.legacy)),
+          isStatic: true));
+      return [node, test.enclosingClass];
+    },
+    (Node node, Node parent) =>
+        "Type parameter '$node' referenced from static context,"
+        " parent is: '$parent'.",
+  );
+  negative2Test(
+    'Method type parameter out of scope',
+    (TestHarness test) {
+      TypeParameter parameter = test.makeTypeParameter();
+      FunctionNode parent =
+          new FunctionNode(new EmptyStatement(), typeParameters: [parameter]);
+      test.addNode(Class(
+          name: 'Test',
+          supertype: test.objectClass.asRawSupertype,
+          procedures: [
+            new Procedure(new Name('generic'), ProcedureKind.Method, parent),
+            new Procedure(
+                new Name('use'),
+                ProcedureKind.Method,
+                new FunctionNode(new ReturnStatement(new TypeLiteral(
+                    new TypeParameterType(parameter, Nullability.legacy)))))
+          ]));
+
+      return [parameter, parent];
+    },
+    (Node node, Node parent) =>
+        "Type parameter '$node' referenced out of scope,"
+        " parent is: '$parent'.",
+  );
+  negative1Test(
+    'Interface type arity too low',
+    (TestHarness test) {
+      InterfaceType node =
+          new InterfaceType(test.otherClass, Nullability.legacy, []);
+      test.addNode(TypeLiteral(node));
+      return node;
+    },
+    (Node node) => "Type $node provides 0 type arguments,"
+        " but the class declares 1 parameters.",
+  );
+  negative1Test(
+    'Interface type arity too high',
+    (TestHarness test) {
+      InterfaceType node = new InterfaceType(test.otherClass,
+          Nullability.legacy, [new DynamicType(), new DynamicType()]);
+      test.addNode(TypeLiteral(node));
+      return node;
+    },
+    (Node node) => "Type $node provides 2 type arguments,"
+        " but the class declares 1 parameters.",
+  );
+  negative1Test(
+    'Dangling interface type',
+    (TestHarness test) {
+      Class orphan = new Class();
+      test.addNode(
+          new TypeLiteral(new InterfaceType(orphan, Nullability.legacy)));
+      return orphan;
+    },
+    (Node node) => "Dangling reference to '$node', parent is: 'null'.",
+  );
+  negative1Test(
+    'Dangling field get',
+    (TestHarness test) {
+      Field orphan = new Field(new Name('foo'));
+      test.addNode(new DirectPropertyGet(new NullLiteral(), orphan));
+      return orphan;
+    },
+    (Node node) => "Dangling reference to '$node', parent is: 'null'.",
+  );
+  simpleNegativeTest(
+    'Missing block parent pointer',
+    "Incorrect parent pointer on ReturnStatement:"
+        " expected 'Block', but found: 'Null'.",
+    (TestHarness test) {
+      var block = new Block([]);
+      block.statements.add(new ReturnStatement());
+      test.addNode(block);
+    },
+  );
+  simpleNegativeTest(
+    'Missing function parent pointer',
+    "Incorrect parent pointer on FunctionNode:"
+        " expected 'Procedure', but found: 'Null'.",
+    (TestHarness test) {
+      var procedure =
+          new Procedure(new Name('bar'), ProcedureKind.Method, null);
+      procedure.function = new FunctionNode(new EmptyStatement());
+      test.addNode(procedure);
+    },
+  );
+  simpleNegativeTest(
+    'StaticGet without target',
+    "StaticGet without target.",
+    (TestHarness test) {
+      test.addNode(StaticGet(null));
+    },
+  );
+  simpleNegativeTest(
+    'StaticSet without target',
+    "StaticSet without target.",
+    (TestHarness test) {
+      test.addNode(StaticSet(null, new NullLiteral()));
+    },
+  );
+  simpleNegativeTest(
+    'StaticInvocation without target',
+    "StaticInvocation without target.",
+    (TestHarness test) {
+      test.addNode(StaticInvocation(null, new Arguments.empty()));
+    },
+  );
+  positiveTest(
+    'Correct StaticInvocation',
+    (TestHarness test) {
+      var method = new Procedure(
+          new Name('foo'),
+          ProcedureKind.Method,
+          new FunctionNode(new EmptyStatement(),
+              positionalParameters: [new VariableDeclaration('p')]),
+          isStatic: true);
+      test.enclosingClass.addMember(method);
+      test.addNode(
+          StaticInvocation(method, new Arguments([new NullLiteral()])));
+    },
+  );
+  negative1Test(
+    'StaticInvocation with too many parameters',
+    (TestHarness test) {
+      var method = new Procedure(new Name('bar'), ProcedureKind.Method,
+          new FunctionNode(new EmptyStatement()),
+          isStatic: true);
+      test.enclosingClass.addMember(method);
+      test.addNode(
+          StaticInvocation(method, new Arguments([new NullLiteral()])));
+      return method;
+    },
+    (Node node) => "StaticInvocation with incompatible arguments for"
+        " '$node'.",
+  );
+  negative1Test(
+    'StaticInvocation with too few parameters',
+    (TestHarness test) {
+      var method = new Procedure(
+          new Name('bar'),
+          ProcedureKind.Method,
+          new FunctionNode(new EmptyStatement(),
+              positionalParameters: [new VariableDeclaration('p')]),
+          isStatic: true);
+      test.enclosingClass.addMember(method);
+      test.addNode(StaticInvocation(method, new Arguments.empty()));
+      return method;
+    },
+    (Node node) => "StaticInvocation with incompatible arguments for '$node'.",
+  );
+  negative1Test(
+    'StaticInvocation with unmatched named parameter',
+    (TestHarness test) {
+      var method = new Procedure(new Name('bar'), ProcedureKind.Method,
+          new FunctionNode(new EmptyStatement()),
+          isStatic: true);
+      test.enclosingClass.addMember(method);
+      test.addNode(StaticInvocation(
+          method,
+          new Arguments([],
+              named: [new NamedExpression('p', new NullLiteral())])));
+      return method;
+    },
+    (Node node) => "StaticInvocation with incompatible arguments for"
+        " '$node'.",
+  );
+  negative1Test(
+    'StaticInvocation with missing type argument',
+    (TestHarness test) {
+      Procedure method = new Procedure(
+          new Name('bar'),
+          ProcedureKind.Method,
+          new FunctionNode(new EmptyStatement(),
+              typeParameters: [test.makeTypeParameter()]),
+          isStatic: true);
+      test.enclosingClass.addMember(method);
+      test.addNode(StaticInvocation(method, new Arguments.empty()));
+      return method;
+    },
+    (Node node) => "StaticInvocation with wrong number of type arguments for"
+        " '$node'.",
+  );
+  negative1Test(
+    'ConstructorInvocation with missing type argument',
+    (TestHarness test) {
+      var constructor = new Constructor(new FunctionNode(new EmptyStatement()),
+          name: new Name('foo'));
+      test.enclosingClass.addMember(constructor);
+      test.addNode(ConstructorInvocation(constructor, new Arguments.empty()));
+      return constructor;
+    },
+    (Node node) =>
+        "ConstructorInvocation with wrong number of type arguments for"
+        " '$node'.",
+  );
+  positiveTest(
+    'Valid typedef Foo = `(C) => void`',
+    (TestHarness test) {
+      var typedef_ = new Typedef(
+          'Foo',
+          new FunctionType(
+              [test.otherLegacyRawType], const VoidType(), Nullability.legacy));
+      test.addNode(typedef_);
+    },
+  );
+  positiveTest(
+    'Valid typedef Foo = C<dynamic>',
+    (TestHarness test) {
+      var typedef_ = new Typedef(
+          'Foo',
+          new InterfaceType(
+              test.otherClass, Nullability.legacy, [const DynamicType()]));
+      test.addNode(typedef_);
+    },
+  );
+  positiveTest(
+    'Valid typedefs Foo = Bar, Bar = C',
+    (TestHarness test) {
+      var foo = new Typedef('Foo', null);
+      var bar = new Typedef('Bar', null);
+      foo.type = new TypedefType(bar, Nullability.legacy);
+      bar.type = test.otherLegacyRawType;
+      test.enclosingLibrary.addTypedef(foo);
+      test.enclosingLibrary.addTypedef(bar);
+    },
+  );
+  positiveTest(
+    'Valid typedefs Foo = C<Bar>, Bar = C',
+    (TestHarness test) {
+      var foo = new Typedef('Foo', null);
+      var bar = new Typedef('Bar', null);
+      foo.type = new InterfaceType(test.otherClass, Nullability.legacy,
+          [new TypedefType(bar, Nullability.legacy)]);
+      bar.type = test.otherLegacyRawType;
+      test.enclosingLibrary.addTypedef(foo);
+      test.enclosingLibrary.addTypedef(bar);
+    },
+  );
+  positiveTest(
+    'Valid typedef type in field',
+    (TestHarness test) {
+      var typedef_ = new Typedef(
+          'Foo',
+          new FunctionType(
+              [test.otherLegacyRawType], const VoidType(), Nullability.legacy));
+      var field = new Field(new Name('field'),
+          type: new TypedefType(typedef_, Nullability.legacy), isStatic: true);
       test.enclosingLibrary.addTypedef(typedef_);
-    }
-  });
-  negativeTest(
-      'Invalid long typedefs C20 = C19 = ... = C1 = C0 = C20',
-      "The typedef 'typedef C0 = test_lib::C19;\n'"
-          " refers to itself", (TestHarness test) {
-    var typedef_ = new Typedef('C0', null);
-    test.enclosingLibrary.addTypedef(typedef_);
-    var first = typedef_;
-    for (int i = 1; i < 20; ++i) {
-      typedef_ =
-          new Typedef('C$i', new TypedefType(typedef_, Nullability.legacy));
+      test.enclosingLibrary.addMember(field);
+    },
+  );
+  negative1Test(
+    'Invalid typedef Foo = Foo',
+    (TestHarness test) {
+      var typedef_ = new Typedef('Foo', null);
+      typedef_.type = new TypedefType(typedef_, Nullability.legacy);
+      test.addNode(typedef_);
+      return typedef_;
+    },
+    (Node node) => "The typedef '$node' refers to itself",
+  );
+  negative1Test(
+    'Invalid typedef Foo = `(Foo) => void`',
+    (TestHarness test) {
+      var typedef_ = new Typedef('Foo', null);
+      typedef_.type = new FunctionType(
+          [new TypedefType(typedef_, Nullability.legacy)],
+          const VoidType(),
+          Nullability.legacy);
+      test.addNode(typedef_);
+      return typedef_;
+    },
+    (Node node) => "The typedef '$node' refers to itself",
+  );
+  negative1Test(
+    'Invalid typedef Foo = `() => Foo`',
+    (TestHarness test) {
+      var typedef_ = new Typedef('Foo', null);
+      typedef_.type = new FunctionType([],
+          new TypedefType(typedef_, Nullability.legacy), Nullability.legacy);
+      test.addNode(typedef_);
+      return typedef_;
+    },
+    (Node node) => "The typedef '$node' refers to itself",
+  );
+  negative1Test(
+    'Invalid typedef Foo = C<Foo>',
+    (TestHarness test) {
+      var typedef_ = new Typedef('Foo', null);
+      typedef_.type = new InterfaceType(test.otherClass, Nullability.legacy,
+          [new TypedefType(typedef_, Nullability.legacy)]);
+      test.addNode(typedef_);
+      return typedef_;
+    },
+    (Node node) => "The typedef '$node' refers to itself",
+  );
+  negative1Test(
+    'Invalid typedefs Foo = Bar, Bar = Foo',
+    (TestHarness test) {
+      var foo = new Typedef('Foo', null);
+      var bar = new Typedef('Bar', null);
+      foo.type = new TypedefType(bar, Nullability.legacy);
+      bar.type = new TypedefType(foo, Nullability.legacy);
+      test.enclosingLibrary.addTypedef(foo);
+      test.enclosingLibrary.addTypedef(bar);
+      return foo;
+    },
+    (Node foo) => "The typedef '$foo' refers to itself",
+  );
+  negative1Test(
+    'Invalid typedefs Foo = Bar, Bar = C<Foo>',
+    (TestHarness test) {
+      var foo = new Typedef('Foo', null);
+      var bar = new Typedef('Bar', null);
+      foo.type = new TypedefType(bar, Nullability.legacy);
+      bar.type = new InterfaceType(test.otherClass, Nullability.legacy,
+          [new TypedefType(foo, Nullability.legacy)]);
+      test.enclosingLibrary.addTypedef(foo);
+      test.enclosingLibrary.addTypedef(bar);
+      return foo;
+    },
+    (Node foo) => "The typedef '$foo' refers to itself",
+  );
+  negative1Test(
+    'Invalid typedefs Foo = C<Bar>, Bar = C<Foo>',
+    (TestHarness test) {
+      var foo = new Typedef('Foo', null);
+      var bar = new Typedef('Bar', null);
+      foo.type = new InterfaceType(test.otherClass, Nullability.legacy,
+          [new TypedefType(bar, Nullability.legacy)]);
+      bar.type = new InterfaceType(test.otherClass, Nullability.legacy,
+          [new TypedefType(foo, Nullability.legacy)]);
+      test.enclosingLibrary.addTypedef(foo);
+      test.enclosingLibrary.addTypedef(bar);
+      return foo;
+    },
+    (Node foo) => "The typedef '$foo' refers to itself",
+  );
+  positiveTest(
+    'Valid long typedefs C20 = C19 = ... = C1 = C0 = dynamic',
+    (TestHarness test) {
+      var typedef_ = new Typedef('C0', const DynamicType());
       test.enclosingLibrary.addTypedef(typedef_);
-    }
-    first.type = new TypedefType(typedef_, Nullability.legacy);
-  });
-  positiveTest('Valid typedef Foo<T extends C> = C<T>', (TestHarness test) {
-    var param = new TypeParameter('T', test.otherLegacyRawType);
-    var foo = new Typedef(
-        'Foo',
-        new InterfaceType(test.otherClass, Nullability.legacy,
-            [new TypeParameterType(param, Nullability.legacy)]),
-        typeParameters: [param]);
-    test.addNode(foo);
-  });
-  positiveTest('Valid typedef Foo<T extends C<T>> = C<T>', (TestHarness test) {
-    var param = new TypeParameter('T', test.otherLegacyRawType);
-    param.bound = new InterfaceType(test.otherClass, Nullability.legacy,
-        [new TypeParameterType(param, Nullability.legacy)]);
-    var foo = new Typedef(
-        'Foo',
-        new InterfaceType(test.otherClass, Nullability.legacy,
-            [new TypeParameterType(param, Nullability.legacy)]),
-        typeParameters: [param]);
-    test.addNode(foo);
-  });
-  positiveTest('Valid typedef Foo<T> = dynamic, Bar<T extends Foo<T>> = C<T>',
-      (TestHarness test) {
-    var fooParam = test.makeTypeParameter('T');
-    var foo =
-        new Typedef('Foo', const DynamicType(), typeParameters: [fooParam]);
-    var barParam = new TypeParameter('T', null);
-    barParam.bound = new TypedefType(foo, Nullability.legacy,
-        [new TypeParameterType(barParam, Nullability.legacy)]);
-    var bar = new Typedef(
-        'Bar',
-        new InterfaceType(test.otherClass, Nullability.legacy,
-            [new TypeParameterType(barParam, Nullability.legacy)]),
-        typeParameters: [barParam]);
-    test.enclosingLibrary.addTypedef(foo);
-    test.enclosingLibrary.addTypedef(bar);
-  });
-  negativeTest(
-      'Invalid typedefs Foo<T extends Bar<T>>, Bar<T extends Foo<T>>',
-      "The typedef 'typedef Foo<T extends test_lib::Bar<T*>> = dynamic;\n'"
-          " refers to itself", (TestHarness test) {
-    var fooParam = test.makeTypeParameter('T');
-    var foo =
-        new Typedef('Foo', const DynamicType(), typeParameters: [fooParam]);
-    var barParam = new TypeParameter('T', null);
-    barParam.bound = new TypedefType(foo, Nullability.legacy,
-        [new TypeParameterType(barParam, Nullability.legacy)]);
-    var bar = new Typedef(
-        'Bar',
-        new InterfaceType(test.otherClass, Nullability.legacy,
-            [new TypeParameterType(barParam, Nullability.legacy)]),
-        typeParameters: [barParam]);
-    fooParam.bound = new TypedefType(bar, Nullability.legacy,
-        [new TypeParameterType(fooParam, Nullability.legacy)]);
-    test.enclosingLibrary.addTypedef(foo);
-    test.enclosingLibrary.addTypedef(bar);
-  });
-  negativeTest(
-      'Invalid typedef Foo<T extends Foo<dynamic> = C<T>',
-      "The typedef 'typedef Foo<T extends test_lib::Foo<dynamic>> = "
-          "test_lib::OtherClass<T*>*;\n'"
-          " refers to itself", (TestHarness test) {
-    var param = new TypeParameter('T', null);
-    var foo = new Typedef(
-        'Foo',
-        new InterfaceType(test.otherClass, Nullability.legacy,
-            [new TypeParameterType(param, Nullability.legacy)]),
-        typeParameters: [param]);
-    param.bound =
-        new TypedefType(foo, Nullability.legacy, [const DynamicType()]);
-    test.addNode(foo);
-  });
-  negativeTest(
-      'Typedef arity error',
-      "The typedef type test_lib::Foo provides 0 type arguments,"
-          " but the typedef declares 1 parameters.", (TestHarness test) {
-    var param = test.makeTypeParameter('T');
-    var foo =
-        new Typedef('Foo', test.otherLegacyRawType, typeParameters: [param]);
-    var field = new Field(new Name('field'),
-        type: new TypedefType(foo, Nullability.legacy, []), isStatic: true);
-    test.enclosingLibrary.addTypedef(foo);
-    test.enclosingLibrary.addMember(field);
-  });
-  negativeTest(
-      'Dangling typedef reference',
-      "Dangling reference to 'typedef Foo = test_lib::OtherClass<dynamic>*;\n'"
-          ", parent is: 'null'", (TestHarness test) {
-    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);
-  });
-  negativeTest('Non-static top-level field',
-      "The top-level field 'field' should be static", (TestHarness test) {
-    var field = new Field(new Name('field'));
-    test.enclosingLibrary.addMember(field);
-  });
+      for (int i = 1; i < 20; ++i) {
+        typedef_ =
+            new Typedef('C$i', new TypedefType(typedef_, Nullability.legacy));
+        test.enclosingLibrary.addTypedef(typedef_);
+      }
+    },
+  );
+  negative1Test(
+    'Invalid long typedefs C20 = C19 = ... = C1 = C0 = C20',
+    (TestHarness test) {
+      Typedef firstTypedef = new Typedef('C0', null);
+      Typedef typedef_ = firstTypedef;
+      test.enclosingLibrary.addTypedef(typedef_);
+      var first = typedef_;
+      for (int i = 1; i < 20; ++i) {
+        typedef_ =
+            new Typedef('C$i', new TypedefType(typedef_, Nullability.legacy));
+        test.enclosingLibrary.addTypedef(typedef_);
+      }
+      first.type = new TypedefType(typedef_, Nullability.legacy);
+      return firstTypedef;
+    },
+    (Node node) => "The typedef '$node' refers to itself",
+  );
+  positiveTest(
+    'Valid typedef Foo<T extends C> = C<T>',
+    (TestHarness test) {
+      var param = new TypeParameter('T', test.otherLegacyRawType);
+      var foo = new Typedef(
+          'Foo',
+          new InterfaceType(test.otherClass, Nullability.legacy,
+              [new TypeParameterType(param, Nullability.legacy)]),
+          typeParameters: [param]);
+      test.addNode(foo);
+    },
+  );
+  positiveTest(
+    'Valid typedef Foo<T extends C<T>> = C<T>',
+    (TestHarness test) {
+      var param = new TypeParameter('T', test.otherLegacyRawType);
+      param.bound = new InterfaceType(test.otherClass, Nullability.legacy,
+          [new TypeParameterType(param, Nullability.legacy)]);
+      var foo = new Typedef(
+          'Foo',
+          new InterfaceType(test.otherClass, Nullability.legacy,
+              [new TypeParameterType(param, Nullability.legacy)]),
+          typeParameters: [param]);
+      test.addNode(foo);
+    },
+  );
+  positiveTest(
+    'Valid typedef Foo<T> = dynamic, Bar<T extends Foo<T>> = C<T>',
+    (TestHarness test) {
+      var fooParam = test.makeTypeParameter('T');
+      var foo =
+          new Typedef('Foo', const DynamicType(), typeParameters: [fooParam]);
+      var barParam = new TypeParameter('T', null);
+      barParam.bound = new TypedefType(foo, Nullability.legacy,
+          [new TypeParameterType(barParam, Nullability.legacy)]);
+      var bar = new Typedef(
+          'Bar',
+          new InterfaceType(test.otherClass, Nullability.legacy,
+              [new TypeParameterType(barParam, Nullability.legacy)]),
+          typeParameters: [barParam]);
+      test.enclosingLibrary.addTypedef(foo);
+      test.enclosingLibrary.addTypedef(bar);
+    },
+  );
+  negative1Test(
+    'Invalid typedefs Foo<T extends Bar<T>>, Bar<T extends Foo<T>>',
+    (TestHarness test) {
+      var fooParam = test.makeTypeParameter('T');
+      var foo =
+          new Typedef('Foo', const DynamicType(), typeParameters: [fooParam]);
+      var barParam = new TypeParameter('T', null);
+      barParam.bound = new TypedefType(foo, Nullability.legacy,
+          [new TypeParameterType(barParam, Nullability.legacy)]);
+      var bar = new Typedef(
+          'Bar',
+          new InterfaceType(test.otherClass, Nullability.legacy,
+              [new TypeParameterType(barParam, Nullability.legacy)]),
+          typeParameters: [barParam]);
+      fooParam.bound = new TypedefType(bar, Nullability.legacy,
+          [new TypeParameterType(fooParam, Nullability.legacy)]);
+      test.enclosingLibrary.addTypedef(foo);
+      test.enclosingLibrary.addTypedef(bar);
+      return foo;
+    },
+    (Node foo) => "The typedef '$foo' refers to itself",
+  );
+  negative1Test(
+    'Invalid typedef Foo<T extends Foo<dynamic> = C<T>',
+    (TestHarness test) {
+      var param = new TypeParameter('T', null);
+      var foo = new Typedef(
+          'Foo',
+          new InterfaceType(test.otherClass, Nullability.legacy,
+              [new TypeParameterType(param, Nullability.legacy)]),
+          typeParameters: [param]);
+      param.bound =
+          new TypedefType(foo, Nullability.legacy, [const DynamicType()]);
+      test.addNode(foo);
+      return foo;
+    },
+    (Node foo) => "The typedef '$foo' refers to itself",
+  );
+  negative1Test(
+    'Typedef arity error',
+    (TestHarness test) {
+      var param = test.makeTypeParameter('T');
+      var foo =
+          new Typedef('Foo', test.otherLegacyRawType, typeParameters: [param]);
+      var typedefType = new TypedefType(foo, Nullability.legacy, []);
+      var field =
+          new Field(new Name('field'), type: typedefType, isStatic: true);
+      test.enclosingLibrary.addTypedef(foo);
+      test.enclosingLibrary.addMember(field);
+      return typedefType;
+    },
+    (Node typedefType) =>
+        "The typedef type $typedefType provides 0 type arguments,"
+        " but the typedef declares 1 parameters.",
+  );
+  negative1Test(
+    'Dangling typedef reference',
+    (TestHarness test) {
+      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);
+      return foo;
+    },
+    (Node foo) => "Dangling reference to '$foo', parent is: 'null'",
+  );
+  negative1Test(
+    'Non-static top-level field',
+    (TestHarness test) {
+      var field = new Field(new Name('field'));
+      test.enclosingLibrary.addMember(field);
+      return null;
+    },
+    (Node node) => "The top-level field 'field' should be static",
+  );
 }
 
 checkHasError(Component component, Matcher matcher) {
@@ -620,21 +773,61 @@
   }
 }
 
-negativeTest(String name, matcher, void makeTestCase(TestHarness test)) {
-  if (matcher is String) {
-    matcher = equals(matcher);
-  }
-  test(name, () {
-    var test = new TestHarness();
-    makeTestCase(test);
-    checkHasError(test.component, matcher);
-  });
+negative1Test(String name, Node Function(TestHarness test) nodeProvider,
+    dynamic Function(Node node) matcher) {
+  TestHarness testHarness = new TestHarness();
+  Node node = nodeProvider(testHarness);
+  test(
+    name,
+    () {
+      dynamic matcherResult = matcher(node);
+      if (matcherResult is String) {
+        matcherResult = equals(matcherResult);
+      }
+      checkHasError(testHarness.component, matcherResult);
+    },
+  );
+}
+
+negative2Test(String name, List<Node> Function(TestHarness test) nodeProvider,
+    dynamic Function(Node node, Node other) matcher) {
+  TestHarness testHarness = new TestHarness();
+  List<Node> nodes = nodeProvider(testHarness);
+  if (nodes.length != 2) throw "Needs exactly 2 nodes: Node and other!";
+  test(
+    name,
+    () {
+      dynamic matcherResult = matcher(nodes[0], nodes[1]);
+      if (matcherResult is String) {
+        matcherResult = equals(matcherResult);
+      }
+      checkHasError(testHarness.component, matcherResult);
+    },
+  );
+}
+
+simpleNegativeTest(String name, dynamic matcher,
+    void Function(TestHarness test) makeTestCase) {
+  TestHarness testHarness = new TestHarness();
+  test(
+    name,
+    () {
+      makeTestCase(testHarness);
+      if (matcher is String) {
+        matcher = equals(matcher);
+      }
+      checkHasError(testHarness.component, matcher);
+    },
+  );
 }
 
 positiveTest(String name, void makeTestCase(TestHarness test)) {
-  test(name, () {
-    var test = new TestHarness();
-    makeTestCase(test);
-    verifyComponent(test.component);
-  });
+  test(
+    name,
+    () {
+      var test = new TestHarness();
+      makeTestCase(test);
+      verifyComponent(test.component);
+    },
+  );
 }
diff --git a/pkg/native_stack_traces/CHANGELOG.md b/pkg/native_stack_traces/CHANGELOG.md
index de635af..c6fb8b8 100644
--- a/pkg/native_stack_traces/CHANGELOG.md
+++ b/pkg/native_stack_traces/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Changelog
 
+## 0.3.0
+
+- Adds handling of virtual addresses within stub code payloads.
+
 ## 0.2.2
 
 - Finds instruction sections by the dynamic symbols the Dart VM creates instead
diff --git a/pkg/native_stack_traces/bin/decode.dart b/pkg/native_stack_traces/bin/decode.dart
index fe59643..4b864c0 100644
--- a/pkg/native_stack_traces/bin/decode.dart
+++ b/pkg/native_stack_traces/bin/decode.dart
@@ -10,36 +10,36 @@
 import 'package:path/path.dart' as path;
 import 'package:native_stack_traces/native_stack_traces.dart';
 
-final ArgParser _translateParser = ArgParser(allowTrailingOptions: true)
+ArgParser _createBaseDebugParser(ArgParser parser) => parser
   ..addOption('debug',
       abbr: 'd',
       help: 'Filename containing debugging information (REQUIRED)',
       valueHelp: 'FILE')
-  ..addOption('input',
-      abbr: 'i', help: 'Filename for processed input', valueHelp: 'FILE')
-  ..addOption('output',
-      abbr: 'o', help: 'Filename for generated output', valueHelp: 'FILE')
-  ..addFlag('verbose',
-      abbr: 'v',
-      negatable: false,
-      help: 'Translate all frames, not just user or library code frames');
-
-final ArgParser _findParser = ArgParser(allowTrailingOptions: true)
-  ..addOption('debug',
-      abbr: 'd',
-      help: 'Filename containing debugging information (REQUIRED)',
-      valueHelp: 'FILE')
-  ..addMultiOption('location',
-      abbr: 'l', help: 'PC address to find', valueHelp: 'PC')
   ..addFlag('verbose',
       abbr: 'v',
       negatable: false,
       help: 'Translate all frames, not just user or library code frames')
-  ..addOption('vm_start',
-      help: 'Absolute address for start of VM instructions', valueHelp: 'PC')
-  ..addOption('isolate_start',
-      help: 'Absolute address for start of isolate instructions',
-      valueHelp: 'PC');
+  ..addFlag('dump_debug_file_contents',
+      negatable: false,
+      help: 'Dump all the parsed information from the debugging file');
+
+final ArgParser _translateParser =
+    _createBaseDebugParser(ArgParser(allowTrailingOptions: true))
+      ..addOption('input',
+          abbr: 'i', help: 'Filename for processed input', valueHelp: 'FILE')
+      ..addOption('output',
+          abbr: 'o', help: 'Filename for generated output', valueHelp: 'FILE');
+
+final ArgParser _findParser =
+    _createBaseDebugParser(ArgParser(allowTrailingOptions: true))
+      ..addMultiOption('location',
+          abbr: 'l', help: 'PC address to find', valueHelp: 'PC')
+      ..addOption('vm_start',
+          help: 'Absolute address for start of VM instructions',
+          valueHelp: 'PC')
+      ..addOption('isolate_start',
+          help: 'Absolute address for start of isolate instructions',
+          valueHelp: 'PC');
 
 final ArgParser _helpParser = ArgParser(allowTrailingOptions: true);
 
@@ -141,14 +141,34 @@
   }
 }
 
+Dwarf _loadFromFile(String original, Function(String) usageError) {
+  if (original == null) {
+    usageError('must provide -d/--debug');
+    return null;
+  }
+  final filename = path.canonicalize(path.normalize(original));
+  if (!io.File(filename).existsSync()) {
+    usageError('debug file "$original" does not exist');
+    return null;
+  }
+  final dwarf = Dwarf.fromFile(filename);
+  if (dwarf == null) {
+    usageError('file "$original" does not contain debugging information');
+  }
+  return dwarf;
+}
+
 void find(ArgResults options) {
   void usageError(String message) => errorWithUsage(message, command: 'find');
   int convertAddress(String s) => int.tryParse(s, radix: 16);
 
-  if (options['debug'] == null) {
-    return usageError('must provide -d/--debug');
+  final dwarf = _loadFromFile(options['debug'], usageError);
+  if (dwarf == null) {
+    return;
   }
-  final dwarf = Dwarf.fromFile(options['debug']);
+  if (options['dump_debug_file_contents']) {
+    print(dwarf.dumpFileInfo());
+  }
   final verbose = options['verbose'];
 
   int vm_start;
@@ -215,11 +235,13 @@
   void usageError(String message) =>
       errorWithUsage(message, command: 'translate');
 
-  if (options['debug'] == null) {
-    return usageError('must provide -d/--debug');
+  final dwarf = _loadFromFile(options['debug'], usageError);
+  if (dwarf == null) {
+    return;
   }
-  final dwarf =
-      Dwarf.fromFile(path.canonicalize(path.normalize(options['debug'])));
+  if (options['dump_debug_file_contents']) {
+    print(dwarf.dumpFileInfo());
+  }
 
   final verbose = options['verbose'];
   final output = options['output'] != null
diff --git a/pkg/native_stack_traces/lib/native_stack_traces.dart b/pkg/native_stack_traces/lib/native_stack_traces.dart
index ad8e6a9..bbb59f7 100644
--- a/pkg/native_stack_traces/lib/native_stack_traces.dart
+++ b/pkg/native_stack_traces/lib/native_stack_traces.dart
@@ -4,4 +4,5 @@
 
 export 'src/convert.dart'
     show collectPCOffsets, DwarfStackTraceDecoder, StackTraceHeader;
-export 'src/dwarf.dart' show CallInfo, Dwarf, PCOffset;
+export 'src/dwarf.dart'
+    show CallInfo, DartCallInfo, StubCallInfo, Dwarf, PCOffset;
diff --git a/pkg/native_stack_traces/lib/src/dwarf.dart b/pkg/native_stack_traces/lib/src/dwarf.dart
index a10a9cd..a53ea59 100644
--- a/pkg/native_stack_traces/lib/src/dwarf.dart
+++ b/pkg/native_stack_traces/lib/src/dwarf.dart
@@ -174,16 +174,27 @@
     }
   }
 
+  void writeToStringBuffer(StringBuffer buffer) {
+    buffer
+      ..write('    Tag: ')
+      ..writeln(_tagStrings[tag])
+      ..write('    Children: ')
+      ..writeln(children ? 'DW_CHILDREN_yes' : 'DW_CHILDREN_no')
+      ..writeln('    Attributes:');
+    for (final attribute in attributes) {
+      buffer
+        ..write('      ')
+        ..write(_attributeNameStrings[attribute.name])
+        ..write(': ')
+        ..writeln(_attributeFormStrings[attribute.form]);
+    }
+  }
+
   @override
   String toString() {
-    var ret = "    Tag: ${_tagStrings[tag]}\n"
-        "    Children: ${children ? "DW_CHILDREN_yes" : "DW_CHILDREN_no"}\n"
-        "    Attributes:\n";
-    for (final attribute in attributes) {
-      ret += "      ${_attributeNameStrings[attribute.name]}: "
-          "${_attributeFormStrings[attribute.form]}\n";
-    }
-    return ret;
+    final buffer = StringBuffer();
+    writeToStringBuffer(buffer);
+    return buffer.toString();
   }
 }
 
@@ -214,12 +225,24 @@
     }
   }
 
+  void writeToStringBuffer(StringBuffer buffer) {
+    buffer..writeln('Abbreviations table:')..writeln();
+    for (final key in _abbreviations.keys) {
+      buffer
+        ..write('  ')
+        ..write(key)
+        ..writeln(':');
+      _abbreviations[key].writeToStringBuffer(buffer);
+      buffer..writeln();
+    }
+  }
+
   @override
-  String toString() =>
-      "Abbreviations table:\n\n" +
-      _abbreviations.keys
-          .map((k) => "  Abbreviation $k:\n" + _abbreviations[k].toString())
-          .join("\n");
+  String toString() {
+    final buffer = StringBuffer();
+    writeToStringBuffer(buffer);
+    return buffer.toString();
+  }
 }
 
 /// A DWARF Debug Information Entry (DIE).
@@ -356,7 +379,7 @@
         continue;
       }
       if (tag != _Tag.compileUnit) {
-        callInfo.add(CallInfo(
+        callInfo.add(DartCallInfo(
             function: abstractOrigin.name,
             inlined: inlined,
             filename: callFilename(unit.callFileIndex),
@@ -370,7 +393,7 @@
     final filename = lineNumberProgram.filename(address);
     final line = lineNumberProgram.lineNumber(address);
     return [
-      CallInfo(
+      DartCallInfo(
           function: abstractOrigin.name,
           inlined: inlined,
           filename: filename,
@@ -378,26 +401,51 @@
     ];
   }
 
-  @override
-  String toString() {
-    var ret =
-        "Abbreviated unit (code $code, offset ${paddedHex(_unitOffset)}):\n";
+  void writeToStringBuffer(StringBuffer buffer, {String indent = ''}) {
+    buffer
+      ..write(indent)
+      ..write('Abbreviated unit (code ')
+      ..write(code)
+      ..write(', offset ')
+      ..write(paddedHex(_unitOffset))
+      ..writeln('):');
     for (final attribute in attributes.keys) {
-      ret += "  ${_attributeNameStrings[attribute.name]} => "
-          "${_attributeValueToString(attribute, attributes[attribute])}\n";
+      buffer
+        ..write(indent)
+        ..write('  ')
+        ..write(_attributeNameStrings[attribute.name])
+        ..write(' => ')
+        ..writeln(_attributeValueToString(attribute, attributes[attribute]));
     }
     if (children == null || children.isEmpty) {
-      ret += "Has no children.\n\n";
-      return ret;
+      buffer
+        ..write(indent)
+        ..writeln('Has no children.');
+      return;
     }
-    ret += "Has ${children.length} " +
-        (children.length == 1 ? "child" : "children") +
-        "\n\n";
+    buffer
+      ..write(indent)
+      ..write('Has ')
+      ..write(children.length)
+      ..write(' ')
+      ..write(children.length == 1 ? "child" : "children")
+      ..writeln(':');
     for (int i = 0; i < children.length; i++) {
-      ret += "Child ${i} of unit at offset ${paddedHex(_unitOffset)}:\n";
-      ret += children[i].toString();
+      buffer
+        ..write(indent)
+        ..write('Child ')
+        ..write(i)
+        ..write(' of unit at offset ')
+        ..write(paddedHex(_unitOffset))
+        ..writeln(':');
+      children[i].writeToStringBuffer(buffer, indent: indent + '  ');
     }
-    return ret;
+  }
+
+  String toString() {
+    final buffer = StringBuffer();
+    writeToStringBuffer(buffer);
+    return buffer.toString();
   }
 }
 
@@ -465,13 +513,28 @@
   _AbbreviationsTable get abbreviations =>
       _abbreviationsTables[abbreviationOffset];
 
+  void writeToStringBuffer(StringBuffer buffer) {
+    buffer
+      ..writeln('Compilation unit:')
+      ..write('  Version: ')
+      ..writeln(version)
+      ..write('  Abbreviation offset: ')
+      ..writeln(paddedHex(abbreviationOffset, 4))
+      ..write('  Address size: ')
+      ..writeln(addressSize)
+      ..writeln();
+    for (final die in contents) {
+      die.writeToStringBuffer(buffer);
+      buffer.writeln();
+    }
+  }
+
   @override
-  String toString() =>
-      "Compilation unit:\n"
-          "  Version: $version\n"
-          "  Abbreviation offset: ${paddedHex(abbreviationOffset, 4)}\n"
-          "  Address size: $addressSize\n\n" +
-      contents.map((DebugInformationEntry u) => u.toString()).join();
+  String toString() {
+    final buffer = StringBuffer();
+    writeToStringBuffer(buffer);
+    return buffer.toString();
+  }
 }
 
 /// A class representing a DWARF `.debug_info` section.
@@ -511,9 +574,18 @@
     return null;
   }
 
-  String toString() =>
-      "Debug information:\n\n" +
-      units.map((CompilationUnit u) => u.toString()).join();
+  void writeToStringBuffer(StringBuffer buffer) {
+    for (final unit in units) {
+      unit.writeToStringBuffer(buffer);
+      buffer.writeln();
+    }
+  }
+
+  String toString() {
+    final buffer = StringBuffer();
+    writeToStringBuffer(buffer);
+    return buffer.toString();
+  }
 }
 
 class FileEntry {
@@ -681,7 +753,7 @@
       "  Column number: $column\n"
       "  Is ${isStatement ? "" : "not "}a statement.\n"
       "  Is ${basicBlock ? "" : "not "}at the beginning of a basic block.\n"
-      "  Is ${endSequence ? "" : "not "}just after the end of a sequence.\n";
+      "  Is ${endSequence ? "" : "not "}just after the end of a sequence.";
 }
 
 /// A class representing a DWARF line number program.
@@ -887,32 +959,40 @@
     return state.line;
   }
 
-  @override
-  String toString() {
-    var buffer = StringBuffer("  Size: $size\n"
-        "  Version: $version\n"
-        "  Header length: $headerLength\n"
-        "  Min instruction length: $minimumInstructionLength\n"
-        "  Default value of is_stmt: $defaultIsStatement\n"
-        "  Line base: $lineBase\n"
-        "  Line range: $lineRange\n"
-        "  Opcode base: $opcodeBase\n"
-        "  Standard opcode lengths:\n");
+  void writeToStringBuffer(StringBuffer buffer) {
+    buffer
+      ..write('  Size: ')
+      ..writeln(size)
+      ..write('  Version: ')
+      ..writeln(version)
+      ..write('  Header length: ')
+      ..writeln(headerLength)
+      ..write('  Min instruction length: ')
+      ..writeln(minimumInstructionLength)
+      ..write('  Default value of is_stmt: ')
+      ..writeln(defaultIsStatement)
+      ..write('  Line base: ')
+      ..writeln(lineBase)
+      ..write('  Line range: ')
+      ..writeln(lineRange)
+      ..write('  Opcode base: ')
+      ..writeln(opcodeBase)
+      ..writeln('Standard opcode lengths:');
     for (int i = 1; i < opcodeBase; i++) {
       buffer
-        ..write("    Opcode ")
+        ..write('    Opcode ')
         ..write(i)
-        ..write(": ")
+        ..write(': ')
         ..writeln(standardOpcodeLengths[i]);
     }
 
     if (includeDirectories.isEmpty) {
-      buffer.writeln("No include directories.");
+      buffer.writeln('No include directories.');
     } else {
-      buffer.writeln("Include directories:");
+      buffer.writeln('Include directories:');
       for (final dir in includeDirectories) {
         buffer
-          ..write("    ")
+          ..write('    ')
           ..writeln(dir);
       }
     }
@@ -921,9 +1001,13 @@
 
     buffer.writeln("Results of line number program:");
     for (final state in calculatedMatrix) {
-      buffer..write(state);
+      buffer..writeln(state);
     }
+  }
 
+  String toString() {
+    final buffer = StringBuffer();
+    writeToStringBuffer(buffer);
     return buffer.toString();
   }
 }
@@ -955,13 +1039,20 @@
   bool containsKey(int address) => programs.containsKey(address);
   LineNumberProgram operator [](int address) => programs[address];
 
-  String toString() =>
-      "Line number information:\n\n" +
-      programs
-          .map((int i, LineNumberProgram p) =>
-              MapEntry(i, "Line number program @ 0x${paddedHex(i)}:\n$p\n"))
-          .values
-          .join();
+  void writeToStringBuffer(StringBuffer buffer) {
+    for (final offset in programs.keys) {
+      buffer
+        ..write('Line number program @ 0x')
+        ..writeln(paddedHex(offset));
+      programs[offset].writeToStringBuffer(buffer);
+    }
+  }
+
+  String toString() {
+    final buffer = StringBuffer();
+    writeToStringBuffer(buffer);
+    return buffer.toString();
+  }
 }
 
 // TODO(11617): Replace calls to these functions with a general hashing solution
@@ -978,22 +1069,35 @@
   return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
 }
 
-class CallInfo {
+/// Represents the information for a call site.
+abstract class CallInfo {
+  /// Whether this call site is considered internal (i.e. not located in either
+  /// user or library Dart source code).
+  bool get isInternal => true;
+}
+
+/// Represents the information for a call site located in Dart source code.
+class DartCallInfo extends CallInfo {
   final bool inlined;
   final String function;
   final String filename;
   final int line;
 
-  CallInfo({this.inlined = false, this.function, this.filename, this.line});
+  DartCallInfo({this.inlined = false, this.function, this.filename, this.line});
 
+  @override
+  bool get isInternal => line <= 0;
+
+  @override
   int get hashCode => _hashFinish(_hashCombine(
       _hashCombine(
           _hashCombine(_hashCombine(0, inlined.hashCode), function.hashCode),
           filename.hashCode),
       line.hashCode));
 
+  @override
   bool operator ==(Object other) {
-    if (other is CallInfo) {
+    if (other is DartCallInfo) {
       return inlined == other.inlined &&
           function == other.function &&
           filename == other.filename &&
@@ -1002,8 +1106,32 @@
     return false;
   }
 
+  @override
   String toString() =>
-      "${function} (${filename}:${line <= 0 ? "??" : line.toString()})";
+      "${function} (${filename}:${isInternal ? "??" : line.toString()})";
+}
+
+/// Represents the information for a call site located in a Dart stub.
+class StubCallInfo extends CallInfo {
+  final String name;
+  final int offset;
+
+  StubCallInfo({this.name, this.offset});
+
+  @override
+  int get hashCode => _hashFinish(
+      _hashCombine(_hashCombine(0, name.hashCode), offset.hashCode));
+
+  @override
+  bool operator ==(Object other) {
+    if (other is StubCallInfo) {
+      return name == other.name && offset == other.offset;
+    }
+    return false;
+  }
+
+  @override
+  String toString() => "${name} + ${offset}";
 }
 
 /// The instructions section in which a program counter address is located.
@@ -1042,14 +1170,15 @@
 
 /// The DWARF debugging information for a Dart snapshot.
 class Dwarf {
+  final Elf _elf;
   final Map<int, _AbbreviationsTable> _abbreviationTables;
   final DebugInfo _debugInfo;
   final LineNumberInfo _lineNumberInfo;
   final int _vmStartAddress;
   final int _isolateStartAddress;
 
-  Dwarf._(this._abbreviationTables, this._debugInfo, this._lineNumberInfo,
-      this._vmStartAddress, this._isolateStartAddress);
+  Dwarf._(this._elf, this._abbreviationTables, this._debugInfo,
+      this._lineNumberInfo, this._vmStartAddress, this._isolateStartAddress);
 
   /// Attempts to load the DWARF debugging information from the reader.
   ///
@@ -1072,8 +1201,8 @@
   /// Returns a [Dwarf] object if the load succeeds, otherwise returns null.
   static Dwarf fromFile(String path) => Dwarf.fromReader(Reader.fromFile(path));
 
-  static const String _vmSymbol = "_kDartVmSnapshotInstructions";
-  static const String _isolateSymbol = "_kDartIsolateSnapshotInstructions";
+  static const String _vmSymbolName = "_kDartVmSnapshotInstructions";
+  static const String _isolateSymbolName = "_kDartIsolateSnapshotInstructions";
 
   static Dwarf _loadSectionsFromElf(Elf elf) {
     final abbrevSection = elf.namedSections(".debug_abbrev").single;
@@ -1094,17 +1223,21 @@
     final debugInfo = DebugInfo.fromReader(
         infoSection.reader, abbreviationTables, lineNumberInfo);
 
-    final vmStartAddress = elf.namedAddress(_vmSymbol);
-    if (vmStartAddress == -1) {
-      throw FormatException("Expected a dynamic symbol with name ${_vmSymbol}");
-    }
-    final isolateStartAddress = elf.namedAddress(_isolateSymbol);
-    if (isolateStartAddress == -1) {
+    final vmStartSymbol = elf.dynamicSymbolFor(_vmSymbolName);
+    if (vmStartSymbol == null) {
       throw FormatException(
-          "Expected a dynamic symbol with name ${_isolateSymbol}");
+          "Expected a dynamic symbol with name ${_vmSymbolName}");
     }
+    final vmStartAddress = vmStartSymbol.value;
 
-    return Dwarf._(abbreviationTables, debugInfo, lineNumberInfo,
+    final isolateStartSymbol = elf.dynamicSymbolFor(_isolateSymbolName);
+    if (isolateStartSymbol == null) {
+      throw FormatException(
+          "Expected a dynamic symbol with name ${_isolateSymbolName}");
+    }
+    final isolateStartAddress = isolateStartSymbol.value;
+
+    return Dwarf._(elf, abbreviationTables, debugInfo, lineNumberInfo,
         vmStartAddress, isolateStartAddress);
   }
 
@@ -1116,9 +1249,19 @@
   /// to user or library code is returned.
   Iterable<CallInfo> callInfoFor(int address,
       {bool includeInternalFrames = false}) {
-    final calls = _debugInfo.callInfo(address);
+    var calls = _debugInfo.callInfo(address);
+    if (calls == null) {
+      // Since we're dealing with return addresses in stack frames, subtract
+      // one in case the return address is just off the end of the stub (since
+      // the calling instruction is before the return address).
+      final symbol = _elf.staticSymbolAt(address - 1);
+      if (symbol != null) {
+        final offset = address - symbol.value;
+        calls = <CallInfo>[StubCallInfo(name: symbol.name, offset: offset)];
+      }
+    }
     if (calls != null && !includeInternalFrames) {
-      return calls.where((CallInfo c) => c.line > 0);
+      return calls.where((CallInfo c) => !c.isInternal);
     }
     return calls;
   }
@@ -1135,13 +1278,42 @@
     }
   }
 
+  void writeToStringBuffer(StringBuffer buffer) {
+    buffer
+      ..writeln('----------------------------------------')
+      ..writeln('         Abbreviation tables')
+      ..writeln('----------------------------------------')
+      ..writeln();
+    for (final offset in _abbreviationTables.keys) {
+      buffer..write('(Offset ')..write(paddedHex(offset, 4))..write(') ');
+      _abbreviationTables[offset].writeToStringBuffer(buffer);
+    }
+    buffer
+      ..writeln('----------------------------------------')
+      ..writeln('          Debug information')
+      ..writeln('----------------------------------------')
+      ..writeln();
+    _debugInfo.writeToStringBuffer(buffer);
+    buffer
+      ..writeln('----------------------------------------')
+      ..writeln('        Line number information')
+      ..writeln('----------------------------------------')
+      ..writeln();
+    _lineNumberInfo.writeToStringBuffer(buffer);
+  }
+
+  String dumpFileInfo() {
+    final buffer = StringBuffer();
+    _elf.writeToStringBuffer(buffer);
+    buffer.writeln();
+    writeToStringBuffer(buffer);
+    return buffer.toString();
+  }
+
   @override
-  String toString() =>
-      "DWARF debugging information:\n\n" +
-      _abbreviationTables
-          .map((int i, _AbbreviationsTable t) =>
-              MapEntry(i, "(Offset ${paddedHex(i)}) $t"))
-          .values
-          .join() +
-      "\n$_debugInfo\n$_lineNumberInfo";
+  String toString() {
+    final buffer = StringBuffer();
+    writeToStringBuffer(buffer);
+    return buffer.toString();
+  }
 }
diff --git a/pkg/native_stack_traces/lib/src/elf.dart b/pkg/native_stack_traces/lib/src/elf.dart
index da4efae..64b325a 100644
--- a/pkg/native_stack_traces/lib/src/elf.dart
+++ b/pkg/native_stack_traces/lib/src/elf.dart
@@ -189,29 +189,42 @@
     }
   }
 
-  String toString() {
-    var ret = "Format is ${wordSize * 8} bits\n";
+  void writeToStringBuffer(StringBuffer buffer) {
+    buffer..write('Format is ')..write(wordSize * 8)..write(' bits');
     switch (endian) {
       case Endian.little:
-        ret += "Little-endian format\n";
+        buffer..writeln(' and little-endian');
         break;
       case Endian.big:
-        ret += "Big-endian format\n";
+        buffer..writeln(' and big-endian');
         break;
     }
-    ret += "Entry point: 0x${paddedHex(entry, wordSize)}\n"
-        "Flags: 0x${paddedHex(flags, 4)}\n"
-        "Header size: ${headerSize}\n"
-        "Program header offset: "
-        "0x${paddedHex(programHeaderOffset, wordSize)}\n"
-        "Program header entry size: ${programHeaderEntrySize}\n"
-        "Program header entry count: ${programHeaderCount}\n"
-        "Section header offset: "
-        "0x${paddedHex(sectionHeaderOffset, wordSize)}\n"
-        "Section header entry size: ${sectionHeaderEntrySize}\n"
-        "Section header entry count: ${sectionHeaderCount}\n"
-        "Section header strings index: ${sectionHeaderStringsIndex}\n";
-    return ret;
+    buffer
+      ..write('Entry point: 0x')
+      ..writeln(paddedHex(entry, wordSize))
+      ..write('Flags: 0x')
+      ..writeln(paddedHex(flags, 4))
+      ..write('Program header offset: 0x')
+      ..writeln(paddedHex(programHeaderOffset, wordSize))
+      ..write('Program header entry size: ')
+      ..writeln(programHeaderEntrySize)
+      ..write('Program header entry count: ')
+      ..writeln(programHeaderCount)
+      ..write('Section header offset: 0x')
+      ..writeln(paddedHex(sectionHeaderOffset, wordSize))
+      ..write('Section header entry size: ')
+      ..writeln(sectionHeaderEntrySize)
+      ..write('Section header entry count: ')
+      ..writeln(sectionHeaderCount)
+      ..write('Section header strings index: ')
+      ..write(sectionHeaderStringsIndex);
+  }
+
+  @override
+  String toString() {
+    var buffer = StringBuffer();
+    writeToStringBuffer(buffer);
+    return buffer.toString();
   }
 }
 
@@ -269,14 +282,31 @@
     return "unknown (${paddedHex(type, 4)})";
   }
 
-  String toString() => "Type: ${_typeToString(type)}\n"
-      "Flags: 0x${paddedHex(flags, 4)}\n"
-      "Offset: $offset (0x${paddedHex(offset, reader.wordSize)})\n"
-      "Virtual address: 0x${paddedHex(vaddr, reader.wordSize)}\n"
-      "Physical address: 0x${paddedHex(paddr, reader.wordSize)}\n"
-      "Size in file: $filesz\n"
-      "Size in memory: $memsz\n"
-      "Alignment: 0x${paddedHex(align, reader.wordSize)}\n";
+  void writeToStringBuffer(StringBuffer buffer) {
+    buffer
+      ..write('Type: ')
+      ..writeln(_typeToString(type))
+      ..write('Flags: 0x')
+      ..writeln(paddedHex(flags, 4))
+      ..write('Offset: 0x')
+      ..writeln(paddedHex(offset, reader.wordSize))
+      ..write('Virtual address: 0x')
+      ..writeln(paddedHex(vaddr, reader.wordSize))
+      ..write('Physical address: 0x')
+      ..writeln(paddedHex(paddr, reader.wordSize))
+      ..write('Size in file: ')
+      ..writeln(filesz)
+      ..write('Size in memory')
+      ..writeln(memsz)
+      ..write('Alignment: 0x')
+      ..write(paddedHex(align, reader.wordSize));
+  }
+
+  String toString() {
+    final buffer = StringBuffer();
+    writeToStringBuffer(buffer);
+    return buffer.toString();
+  }
 }
 
 class ProgramHeader {
@@ -303,12 +333,21 @@
     }
   }
 
-  String toString() {
-    var ret = "";
+  void writeToStringBuffer(StringBuffer buffer) {
     for (var i = 0; i < length; i++) {
-      ret += "Entry $i:\n${this[i]}\n";
+      if (i != 0) buffer..writeln()..writeln();
+      buffer
+        ..write('Entry ')
+        ..write(i)
+        ..writeln(':');
+      _entries[i].writeToStringBuffer(buffer);
     }
-    return ret;
+  }
+
+  String toString() {
+    final buffer = StringBuffer();
+    writeToStringBuffer(buffer);
+    return buffer.toString();
   }
 }
 
@@ -316,7 +355,7 @@
   final Reader reader;
 
   int nameIndex;
-  String name;
+  String _cachedName;
   int type;
   int flags;
   int addr;
@@ -356,9 +395,11 @@
   }
 
   void setName(StringTable nameTable) {
-    name = nameTable[nameIndex];
+    _cachedName = nameTable[nameIndex];
   }
 
+  String get name => _cachedName != null ? _cachedName : '<${nameIndex}>';
+
   static const _typeStrings = <int, String>{
     _SHT_NULL: "SHT_NULL",
     _SHT_PROGBITS: "SHT_PROGBITS",
@@ -377,16 +418,44 @@
     return "unknown (${paddedHex(type, 4)})";
   }
 
-  String toString() => "Name: ${name} (@ ${nameIndex})\n"
-      "Type: ${_typeToString(type)}\n"
-      "Flags: 0x${paddedHex(flags, reader.wordSize)}\n"
-      "Address: 0x${paddedHex(addr, reader.wordSize)}\n"
-      "Offset: $offset (0x${paddedHex(offset, reader.wordSize)})\n"
-      "Size: $size\n"
-      "Link: $link\n"
-      "Info: 0x${paddedHex(info, 4)}\n"
-      "Address alignment: 0x${paddedHex(addrAlign, reader.wordSize)}\n"
-      "Entry size: ${entrySize}\n";
+  void writeToStringBuffer(StringBuffer buffer) {
+    buffer.write('Name: ');
+    if (_cachedName != null) {
+      buffer
+        ..write('"')
+        ..write(name)
+        ..write('" (@ ')
+        ..write(nameIndex)
+        ..writeln(')');
+    } else {
+      buffer.writeln(name);
+    }
+    buffer
+      ..write('Type: ')
+      ..writeln(_typeToString(type))
+      ..write('Flags: 0x')
+      ..writeln(paddedHex(flags, reader.wordSize))
+      ..write('Address: 0x')
+      ..writeln(paddedHex(addr, reader.wordSize))
+      ..write('Offset: 0x')
+      ..writeln(paddedHex(offset, reader.wordSize))
+      ..write('Size: ')
+      ..writeln(size)
+      ..write('Link: ')
+      ..writeln(link)
+      ..write('Info: 0x')
+      ..writeln(paddedHex(info, 4))
+      ..write('Address alignment: 0x')
+      ..writeln(paddedHex(addrAlign, reader.wordSize))
+      ..write('Entry size: ')
+      ..write(entrySize);
+  }
+
+  String toString() {
+    final buffer = StringBuffer();
+    writeToStringBuffer(buffer);
+    return buffer.toString();
+  }
 }
 
 class SectionHeader {
@@ -436,13 +505,22 @@
   int get length => _entries.length;
   SectionHeaderEntry operator [](int index) => _entries[index];
 
+  void writeToStringBuffer(StringBuffer buffer) {
+    for (var i = 0; i < length; i++) {
+      if (i != 0) buffer..writeln()..writeln();
+      buffer
+        ..write('Entry ')
+        ..write(i)
+        ..writeln(':');
+      _entries[i].writeToStringBuffer(buffer);
+    }
+  }
+
   @override
   String toString() {
-    var ret = "";
-    for (var i = 0; i < length; i++) {
-      ret += "Entry $i:\n${this[i]}\n";
-    }
-    return ret;
+    final buffer = StringBuffer();
+    writeToStringBuffer(buffer);
+    return buffer.toString();
   }
 }
 
@@ -467,33 +545,48 @@
 
   int get virtualAddress => headerEntry.addr;
   int get length => reader.bdata.lengthInBytes;
+
+  void writeToStringBuffer(StringBuffer buffer) {
+    buffer
+      ..write('Section "')
+      ..write(headerEntry.name)
+      ..write('" is unparsed and ')
+      ..write(length)
+      ..writeln(' bytes long.');
+  }
+
   @override
-  String toString() => "an unparsed section of ${length} bytes\n";
+  String toString() {
+    StringBuffer buffer;
+    writeToStringBuffer(buffer);
+    return buffer.toString();
+  }
 }
 
 class StringTable extends Section {
-  final _entries = Map<int, String>();
+  final _entries;
 
-  StringTable(SectionHeaderEntry entry, Reader reader) : super(entry, reader) {
-    while (!reader.done) {
-      _entries[reader.offset] = reader.readNullTerminatedString();
-    }
-  }
+  StringTable(SectionHeaderEntry entry, Reader reader)
+      : _entries = Map<int, String>.fromEntries(
+            reader.readRepeated((r) => r.readNullTerminatedString())),
+        super(entry, reader);
 
   String operator [](int index) => _entries[index];
   bool containsKey(int index) => _entries.containsKey(index);
 
   @override
-  String toString() {
-    var buffer = StringBuffer("a string table:\n");
+  void writeToStringBuffer(StringBuffer buffer) {
+    buffer
+      ..write('Section "')
+      ..write(headerEntry.name)
+      ..writeln('" is a string table:');
     for (var key in _entries.keys) {
       buffer
-        ..write(" ")
+        ..write("  ")
         ..write(key)
         ..write(" => ")
         ..writeln(_entries[key]);
     }
-    return buffer.toString();
   }
 }
 
@@ -562,37 +655,59 @@
   SymbolType get type => SymbolType.values[info & 0x0f];
   SymbolVisibility get visibility => SymbolVisibility.values[other & 0x03];
 
-  @override
-  String toString() {
-    final buffer = StringBuffer("symbol ");
+  void writeToStringBuffer(StringBuffer buffer) {
     if (name != null) {
-      buffer..write('"')..write(name)..write('" ');
+      buffer..write('"')..write(name)..write('" =>');
+    } else {
+      buffer..write('<')..write(nameIndex)..write('> =>');
+    }
+    switch (bind) {
+      case SymbolBinding.STB_GLOBAL:
+        buffer..write(' a global');
+        break;
+      case SymbolBinding.STB_LOCAL:
+        buffer..write(' a local');
+        break;
+    }
+    switch (visibility) {
+      case SymbolVisibility.STV_DEFAULT:
+        break;
+      case SymbolVisibility.STV_HIDDEN:
+        buffer..write(' hidden');
+        break;
+      case SymbolVisibility.STV_INTERNAL:
+        buffer..write(' internal');
+        break;
+      case SymbolVisibility.STV_PROTECTED:
+        buffer..write(' protected');
+        break;
     }
     buffer
-      ..write("(")
-      ..write(nameIndex)
-      ..write("): ")
-      ..write(paddedHex(value, _wordSize))
-      ..write(" ")
+      ..write(" symbol that points to ")
       ..write(size)
-      ..write(" sec ")
-      ..write(sectionIndex)
-      ..write(" ")
-      ..write(bind)
-      ..write(" ")
-      ..write(type)
-      ..write(" ")
-      ..write(visibility);
+      ..write(" bytes at location 0x")
+      ..write(paddedHex(value, _wordSize))
+      ..write(" in section ")
+      ..write(sectionIndex);
+  }
+
+  @override
+  String toString() {
+    final buffer = StringBuffer();
+    writeToStringBuffer(buffer);
     return buffer.toString();
   }
 }
 
 class SymbolTable extends Section {
-  final Iterable<Symbol> _entries;
+  final List<Symbol> _entries;
   final _nameCache = Map<String, Symbol>();
 
   SymbolTable(SectionHeaderEntry entry, Reader reader)
-      : _entries = reader.readRepeated(Symbol.fromReader),
+      : _entries = reader
+            .readRepeated(Symbol.fromReader)
+            .map((kv) => kv.value)
+            .toList(),
         super(entry, reader);
 
   void _cacheNames(StringTable stringTable) {
@@ -603,18 +718,21 @@
     }
   }
 
+  Iterable<String> get keys => _nameCache.keys;
   Symbol operator [](String name) => _nameCache[name];
   bool containsKey(String name) => _nameCache.containsKey(name);
 
   @override
-  String toString() {
-    var buffer = StringBuffer("a symbol table:\n");
+  void writeToStringBuffer(StringBuffer buffer) {
+    buffer
+      ..write('Section "')
+      ..write(headerEntry.name)
+      ..writeln('" is a symbol table:');
     for (var symbol in _entries) {
-      buffer
-        ..write(" ")
-        ..writeln(symbol);
+      buffer.write(" ");
+      symbol.writeToStringBuffer(buffer);
+      buffer.writeln();
     }
-    return buffer.toString();
   }
 }
 
@@ -647,16 +765,16 @@
   /// Returns null if the file does not start with the ELF magic number.
   static Elf fromFile(String path) => Elf.fromReader(Reader.fromFile(path));
 
-  /// The virtual address value of the dynamic symbol named [name].
+  /// Lookup of a dynamic symbol by name.
   ///
-  /// Returns -1 if there is no dynamic symbol with that name.
-  int namedAddress(String name) {
+  /// Returns -1 if there is no dynamic symbol that matches [name].
+  Symbol dynamicSymbolFor(String name) {
     for (final SymbolTable dynsym in namedSections(".dynsym")) {
       if (dynsym.containsKey(name)) {
-        return dynsym[name].value;
+        return dynsym[name];
       }
     }
-    return -1;
+    return null;
   }
 
   /// The [Section]s whose names match [name].
@@ -666,6 +784,20 @@
         .map((entry) => _sections[entry]);
   }
 
+  /// Reverse lookup of the static symbol that contains the given virtual
+  /// address. Returns null if no static symbol matching the address is found.
+  Symbol staticSymbolAt(int address) {
+    for (final SymbolTable table in namedSections('.symtab')) {
+      for (final name in table.keys) {
+        final symbol = table[name];
+        if (symbol.value <= address && address < (symbol.value + symbol.size)) {
+          return symbol;
+        }
+      }
+    }
+    return null;
+  }
+
   static Elf _read(Reader startingReader) {
     final header = ElfHeader.fromReader(startingReader.copy());
     // Now use the word size and endianness information from the header.
@@ -681,48 +813,81 @@
         entryCount: header.sectionHeaderCount,
         stringsIndex: header.sectionHeaderStringsIndex);
     final sections = <SectionHeaderEntry, Section>{};
-    final dynsyms = Map<SectionHeaderEntry, SymbolTable>();
-    final dynstrs = Map<SectionHeaderEntry, StringTable>();
     for (var i = 0; i < sectionHeader.length; i++) {
       final entry = sectionHeader[i];
       if (i == header.sectionHeaderStringsIndex) {
         sections[entry] = sectionHeader.nameTable;
         continue;
       }
-      final section = Section.fromEntryAndReader(
+      sections[entry] = Section.fromEntryAndReader(
           entry, reader.refocus(entry.offset, entry.size));
-      // Store the dynamic symbol tables and dynamic string tables so we can
-      // cache the symbol names afterwards.
-      switch (entry.name) {
-        case ".dynsym":
-          dynsyms[entry] = section;
-          break;
-        case ".dynstr":
-          dynstrs[entry] = section;
-          break;
-        default:
-          break;
-      }
-      sections[entry] = section;
     }
-    dynsyms.forEach((entry, dynsym) {
-      final linkEntry = sectionHeader[entry.link];
-      if (!dynstrs.containsKey(linkEntry)) {
-        throw FormatException(
-            "String table not found at section header entry ${entry.link}");
+    void _cacheSymbolNames(String stringTableTag, String symbolTableTag) {
+      final stringTables = <SectionHeaderEntry, StringTable>{};
+      final symbolTables = <SymbolTable>[];
+      for (final entry in sections.keys) {
+        if (entry.name == stringTableTag) {
+          stringTables[entry] = sections[entry];
+        } else if (entry.name == symbolTableTag) {
+          symbolTables.add(sections[entry]);
+        }
       }
-      dynsym._cacheNames(dynstrs[linkEntry]);
-    });
+      for (final symbolTable in symbolTables) {
+        final link = symbolTable.headerEntry.link;
+        final entry = sectionHeader[link];
+        if (!stringTables.containsKey(entry)) {
+          throw FormatException(
+              "String table not found at section header entry ${link}");
+        }
+        symbolTable._cacheNames(stringTables[entry]);
+      }
+    }
+
+    _cacheSymbolNames('.strtab', '.symtab');
+    _cacheSymbolNames('.dynstr', '.dynsym');
     return Elf._(header, programHeader, sectionHeader, sections);
   }
 
+  void writeToStringBuffer(StringBuffer buffer) {
+    buffer
+      ..writeln('-----------------------------------------------------')
+      ..writeln('             ELF header information')
+      ..writeln('-----------------------------------------------------')
+      ..writeln();
+    _header.writeToStringBuffer(buffer);
+    buffer
+      ..writeln()
+      ..writeln()
+      ..writeln('-----------------------------------------------------')
+      ..writeln('            Program header information')
+      ..writeln('-----------------------------------------------------')
+      ..writeln();
+    _programHeader.writeToStringBuffer(buffer);
+    buffer
+      ..writeln()
+      ..writeln()
+      ..writeln('-----------------------------------------------------')
+      ..writeln('            Section header information')
+      ..writeln('-----------------------------------------------------')
+      ..writeln();
+    _sectionHeader.writeToStringBuffer(buffer);
+    buffer
+      ..writeln()
+      ..writeln()
+      ..writeln('-----------------------------------------------------')
+      ..writeln('                 Section information')
+      ..writeln('-----------------------------------------------------')
+      ..writeln();
+    for (final entry in _sections.keys) {
+      _sections[entry].writeToStringBuffer(buffer);
+      buffer.writeln();
+    }
+  }
+
   @override
   String toString() {
-    String accumulateSection(String acc, SectionHeaderEntry entry) =>
-        acc + "\nSection ${entry.name} is ${_sections[entry]}";
-    return "Header information:\n\n${_header}"
-        "\nProgram header information:\n\n${_programHeader}"
-        "\nSection header information:\n\n${_sectionHeader}"
-        "${_sections.keys.fold("", accumulateSection)}";
+    StringBuffer buffer = StringBuffer();
+    writeToStringBuffer(buffer);
+    return buffer.toString();
   }
 }
diff --git a/pkg/native_stack_traces/lib/src/reader.dart b/pkg/native_stack_traces/lib/src/reader.dart
index 3079094..8f6b637 100644
--- a/pkg/native_stack_traces/lib/src/reader.dart
+++ b/pkg/native_stack_traces/lib/src/reader.dart
@@ -123,9 +123,10 @@
     return ret;
   }
 
-  Iterable<S> readRepeated<S>(S Function(Reader) callback) sync* {
+  Iterable<MapEntry<int, S>> readRepeated<S>(
+      S Function(Reader) callback) sync* {
     while (!done) {
-      yield callback(this);
+      yield MapEntry<int, S>(offset, callback(this));
     }
   }
 
@@ -156,7 +157,7 @@
   }
 
   String toString() {
-    final buffer = new StringBuffer();
+    final buffer = StringBuffer();
     buffer
       ..write("Start:  0x")
       ..write(paddedHex(start, wordSize))
diff --git a/pkg/native_stack_traces/pubspec.yaml b/pkg/native_stack_traces/pubspec.yaml
index aeccefc..e300e9e 100644
--- a/pkg/native_stack_traces/pubspec.yaml
+++ b/pkg/native_stack_traces/pubspec.yaml
@@ -1,6 +1,6 @@
 name: native_stack_traces
 description: Utilities for working with non-symbolic stack traces.
-version: 0.2.2
+version: 0.3.0
 
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/native_stack_traces
 
diff --git a/pkg/nnbd_migration/README.md b/pkg/nnbd_migration/README.md
index b1d8f0a..4e46dd6 100644
--- a/pkg/nnbd_migration/README.md
+++ b/pkg/nnbd_migration/README.md
@@ -1,4 +1,85 @@
-# NNBD Migration Engine
+# Null Safety Migration Tooling
 
-This package provides infrastructure for migrating code to be non-nullable by
-default.
+Note: the null safety migration tooling and workflow is in an early state;
+this doc will be updated as the steps and workflow are simplified.
+
+## Building the NNBD sdk
+
+In order to run the tool currently you have to be able to build your own copy
+of the Dart SDK.
+
+To do this, run:
+
+```
+./tools/build.py -mrelease --nnbd create_sdk
+```
+
+The NNBD sdk now lives under the ReleaseX64NNBD sub-directory of your build
+directory, e.g.
+
+```
+xcodebuild/ReleaseX64NNBD/dart-sdk/
+```
+
+## Migrating a package
+
+- build a NNBD version of the SDK (see above)
+- select a package to work on
+- in that package, edit the `analysis_options.yaml` to enable the NNBD
+  experiment from the POV of the analyzer:
+```yaml
+analyzer:
+  enable-experiment:
+    - non-nullable
+```
+- run `pub get` for the package (and, verify that the
+  `.dart_tool/package_config.json` file was created)
+
+Then, run the migration tool from the top-level of the package directory:
+
+```
+<sdk-repo>/xcodebuild/ReleaseX64NNBD/dart migrate .
+```
+
+The migration tool will run, print the proposed changes to the console, and
+display a url for the preview tool. Open that url from a browser to see a rich
+preview of the proposed null safety changes.
+
+## Using the tool
+
+1. Run the tool (see above).
+2. Once analysis and migration suggestions are complete, open the indicated url
+in a browser.
+3. Start with an important or interesting file in your package on the left
+side by clicking on it.
+4. Look at the proposed edits in the upper right, and click on them in turn.
+5. If you see an edit that looks wrong:
+    1. Use the "trace view" in the bottom right to find the root cause
+    2. Go to your editor and make a change to the original file by adding a hint
+    (`String foo` ==> `String/*!*/ foo`) or making other changes as needed.
+    3. You can have the migration tool perform this itself, although right now
+       for large packages this takes a prohibitively long time.
+       1. ***Warning: DO NOT mix edits in your editor and edits applied by the
+       migration tool. We have not yet written the necessary logic to
+       prevent the migration tool from clobbering files edited while the
+       preview tool is running.*** 
+       2. To try this, from the 'Edit Details' area in the bottom right select
+       the `Force type to be non-nullable` or `Force type to be nullable`
+       links. These will add the indicated hints on disk and recompute the
+       migration suggestions. 
+6. After some edits are complete, control-C the migration and rerun it.  If
+some things are still wrong, return to step 5.
+7. Once all edits are complete and you've rerun migration and are satisfied with
+the output:
+    1. Save your work using git or other means. Applying the migration will
+    overwrite the existing files on disk.
+    2. Rerun the migration with `--apply-changes`, or click the
+    `Apply Migration` button in the interface.
+8. Remove any SDK constraint in your pubspec.yaml.
+9. Remove any opt-out comments in your library files (e.g.:  `// @dart = 2.6`).
+10. Rerun `pub get` and test your package.
+
+## Providing feedback
+
+Please file issues at https://github.com/dart-lang/sdk/issues, and reference the
+`analyzer-nnbd-migration` label (you may not be able to apply the label yourself). 
diff --git a/pkg/nnbd_migration/lib/nnbd_migration.dart b/pkg/nnbd_migration/lib/nnbd_migration.dart
index bd2113c..16cdeed 100644
--- a/pkg/nnbd_migration/lib/nnbd_migration.dart
+++ b/pkg/nnbd_migration/lib/nnbd_migration.dart
@@ -86,6 +86,14 @@
         kind: NullabilityFixKind.makeTypeNullable,
       );
 
+  /// An explicit type mentioned in the source program does not need to be made
+  /// nullable.
+  factory NullabilityFixDescription.typeNotMadeNullable(String type) =>
+      NullabilityFixDescription._(
+        appliedMessage: "Type '$type' was not made nullable",
+        kind: NullabilityFixKind.typeNotMadeNullable,
+      );
+
   const NullabilityFixDescription._(
       {@required this.appliedMessage, @required this.kind});
 
@@ -117,9 +125,9 @@
   discardIf,
   discardThen,
   makeTypeNullable,
-  noModification,
   removeAs,
   removeNullAwareness,
+  typeNotMadeNullable,
 }
 
 /// Provisional API for DartFix to perform nullability migration.
diff --git a/pkg/nnbd_migration/lib/src/edge_builder.dart b/pkg/nnbd_migration/lib/src/edge_builder.dart
index 6949482..021717b 100644
--- a/pkg/nnbd_migration/lib/src/edge_builder.dart
+++ b/pkg/nnbd_migration/lib/src/edge_builder.dart
@@ -893,7 +893,8 @@
     List<DecoratedType> decoratedTypeArguments;
     var typeArguments = node.constructorName.type.typeArguments;
     List<EdgeOrigin> parameterEdgeOrigins;
-    var target = NullabilityNodeTarget.codeRef('constructed type', node);
+    var target =
+        NullabilityNodeTarget.text('constructed type').withCodeRef(node);
     if (typeArguments != null) {
       typeArguments.accept(this);
       typeArgumentTypes = typeArguments.arguments.map((t) => t.type);
@@ -999,7 +1000,8 @@
     try {
       var listType = node.staticType as InterfaceType;
       if (node.typeArguments == null) {
-        var target = NullabilityNodeTarget.codeRef('list element type', node);
+        var target =
+            NullabilityNodeTarget.text('list element type').withCodeRef(node);
         var elementType = DecoratedType.forImplicitType(
             typeProvider, listType.typeArguments[0], _graph, target);
         instrumentation?.implicitTypeArguments(source, node, [elementType]);
@@ -1104,7 +1106,7 @@
   @override
   DecoratedType visitNullLiteral(NullLiteral node) {
     _flowAnalysis.nullLiteral(node);
-    var target = NullabilityNodeTarget.codeRef('null literal', node);
+    var target = NullabilityNodeTarget.text('null literal').withCodeRef(node);
     var decoratedType = DecoratedType.forImplicitType(
         typeProvider, node.staticType, _graph, target);
     _graph.makeNullable(decoratedType.node, LiteralOrigin(source, node));
@@ -1223,7 +1225,8 @@
   @override
   DecoratedType visitRethrowExpression(RethrowExpression node) {
     _flowAnalysis.handleExit();
-    var target = NullabilityNodeTarget.codeRef('rethrow expression', node);
+    var target =
+        NullabilityNodeTarget.text('rethrow expression').withCodeRef(node);
     var nullabilityNode = NullabilityNode.forInferredType(target);
     _graph.makeNonNullable(nullabilityNode, ThrowOrigin(source, node));
     return DecoratedType(node.staticType, nullabilityNode);
@@ -1235,7 +1238,8 @@
     Expression returnValue = node.expression;
     final isAsync = node.thisOrAncestorOfType<FunctionBody>().isAsynchronous;
     if (returnValue == null) {
-      var target = NullabilityNodeTarget.codeRef('implicit null return', node);
+      var target =
+          NullabilityNodeTarget.text('implicit null return').withCodeRef(node);
       var implicitNullType = DecoratedType.forImplicitType(
           typeProvider, typeProvider.nullType, _graph, target);
       _graph.makeNullable(
@@ -1269,7 +1273,8 @@
       try {
         if (typeArguments == null) {
           assert(setOrMapType.typeArguments.length == 1);
-          var target = NullabilityNodeTarget.codeRef('set element type', node);
+          var target =
+              NullabilityNodeTarget.text('set element type').withCodeRef(node);
           var elementType = DecoratedType.forImplicitType(
               typeProvider, setOrMapType.typeArguments[0], _graph, target);
           instrumentation?.implicitTypeArguments(source, node, [elementType]);
@@ -1294,12 +1299,13 @@
       try {
         if (typeArguments == null) {
           assert(setOrMapType.typeArguments.length == 2);
-          var targetKey = NullabilityNodeTarget.codeRef('map key type', node);
+          var targetKey =
+              NullabilityNodeTarget.text('map key type').withCodeRef(node);
           var keyType = DecoratedType.forImplicitType(
               typeProvider, setOrMapType.typeArguments[0], _graph, targetKey);
           _currentMapKeyType = keyType;
           var targetValue =
-              NullabilityNodeTarget.codeRef('map value type', node);
+              NullabilityNodeTarget.text('map value type').withCodeRef(node);
           var valueType = DecoratedType.forImplicitType(
               typeProvider, setOrMapType.typeArguments[1], _graph, targetValue);
           _currentMapValueType = valueType;
@@ -1375,7 +1381,8 @@
   DecoratedType visitSpreadElement(SpreadElement node) {
     final spreadType = node.expression.staticType;
     DecoratedType spreadTypeDecorated;
-    var target = NullabilityNodeTarget.codeRef('spread element type', node);
+    var target =
+        NullabilityNodeTarget.text('spread element type').withCodeRef(node);
     if (_typeSystem.isSubtypeOf(spreadType, typeProvider.mapObjectObjectType)) {
       assert(_currentMapKeyType != null && _currentMapValueType != null);
       final expectedType = typeProvider.mapType2(
@@ -1418,8 +1425,8 @@
   DecoratedType visitSuperConstructorInvocation(
       SuperConstructorInvocation node) {
     var callee = node.staticElement;
-    var target =
-        NullabilityNodeTarget.codeRef('super constructor invocation', node);
+    var target = NullabilityNodeTarget.text('super constructor invocation')
+        .withCodeRef(node);
     var nullabilityNode = NullabilityNode.forInferredType(target);
     var class_ = node.thisOrAncestorOfType<ClassDeclaration>();
     var decoratedSupertype = _decoratedClassHierarchy.getDecoratedSupertype(
@@ -1485,7 +1492,8 @@
     node.expression.accept(this);
     // TODO(paulberry): do we need to check the expression type?  I think not.
     _flowAnalysis.handleExit();
-    var target = NullabilityNodeTarget.codeRef('throw expression', node);
+    var target =
+        NullabilityNodeTarget.text('throw expression').withCodeRef(node);
     var nullabilityNode = NullabilityNode.forInferredType(target);
     _graph.makeNonNullable(nullabilityNode, ThrowOrigin(source, node));
     return DecoratedType(node.staticType, nullabilityNode);
@@ -1601,6 +1609,29 @@
       } else {
         assert(_flowAnalysis != null);
       }
+      var type = _variables.decoratedElementType(declaredElement);
+      var enclosingElement = declaredElement.enclosingElement;
+      if (!declaredElement.isStatic && enclosingElement is ClassElement) {
+        var overriddenElements = _inheritanceManager.getOverridden(
+            enclosingElement.thisType,
+            Name(enclosingElement.library.source.uri, declaredElement.name));
+        for (var overriddenElement
+            in overriddenElements ?? <ExecutableElement>[]) {
+          _handleFieldOverriddenDeclaration(
+              variable, type, enclosingElement, overriddenElement);
+        }
+        if (!declaredElement.isFinal) {
+          var overriddenElements = _inheritanceManager.getOverridden(
+              enclosingElement.thisType,
+              Name(enclosingElement.library.source.uri,
+                  declaredElement.name + '='));
+          for (var overriddenElement
+              in overriddenElements ?? <ExecutableElement>[]) {
+            _handleFieldOverriddenDeclaration(
+                variable, type, enclosingElement, overriddenElement);
+          }
+        }
+      }
       try {
         if (declaredElement is PromotableElement) {
           _flowAnalysis.declare(declaredElement, initializer != null);
@@ -1613,13 +1644,11 @@
           // the variable isn't definitely assigned).
           if (isTopLevel &&
               !(declaredElement is FieldElement && !declaredElement.isStatic)) {
-            var type = _variables.decoratedElementType(declaredElement);
             _graph.makeNullable(
                 type.node, ImplicitNullInitializerOrigin(source, node));
           }
         } else {
-          var destinationType = getOrComputeElementType(declaredElement);
-          _handleAssignment(initializer, destinationType: destinationType);
+          _handleAssignment(initializer, destinationType: type);
         }
         if (isTopLevel) {
           _flowAnalysis.finish();
@@ -1720,7 +1749,8 @@
   /// Creates a type that can be used to check that an expression's value is
   /// non-nullable.
   DecoratedType _createNonNullableType(Expression expression) {
-    var target = NullabilityNodeTarget.codeRef('expression type', expression);
+    var target =
+        NullabilityNodeTarget.text('expression type').withCodeRef(expression);
     // Note: it's not necessary for the type to precisely match the type of the
     // expression, since all we are going to do is cause a single graph edge to
     // be built; it is sufficient to pass in any decorated type whose node is
@@ -1903,7 +1933,7 @@
           typeProvider,
           typeProvider.futureType2(type.type),
           _graph,
-          NullabilityNodeTarget.codeRef('implicit future', node),
+          NullabilityNodeTarget.text('implicit future').withCodeRef(node),
           typeArguments: [type]);
 
   @override
@@ -2200,6 +2230,45 @@
     }
   }
 
+  void _handleFieldOverriddenDeclaration(
+      VariableDeclaration node,
+      DecoratedType type,
+      ClassElement classElement,
+      Element overriddenElement) {
+    overriddenElement = overriddenElement.declaration;
+    var overriddenClass = overriddenElement.enclosingElement as ClassElement;
+    var decoratedSupertype = _decoratedClassHierarchy.getDecoratedSupertype(
+        classElement, overriddenClass);
+    var substitution = decoratedSupertype.asSubstitution;
+    if (overriddenElement is PropertyAccessorElement) {
+      DecoratedType unsubstitutedOverriddenType;
+      if (overriddenElement.isSynthetic) {
+        unsubstitutedOverriddenType =
+            _variables.decoratedElementType(overriddenElement.variable);
+      } else {
+        if (overriddenElement.isGetter) {
+          unsubstitutedOverriddenType =
+              _variables.decoratedElementType(overriddenElement).returnType;
+        } else {
+          unsubstitutedOverriddenType = _variables
+              .decoratedElementType(overriddenElement)
+              .positionalParameters[0];
+        }
+      }
+      var overriddenType = unsubstitutedOverriddenType.substitute(substitution);
+      if (overriddenElement.isGetter) {
+        _checkAssignment(ReturnTypeInheritanceOrigin(source, node),
+            source: type, destination: overriddenType, hard: true);
+      } else {
+        assert(overriddenElement.isSetter);
+        _checkAssignment(ParameterInheritanceOrigin(source, node),
+            source: overriddenType, destination: type, hard: true);
+      }
+    } else {
+      assert(false, 'Field overrides non-property-accessor');
+    }
+  }
+
   void _handleForLoopParts(AstNode node, ForLoopParts parts, AstNode body,
       DecoratedType Function(AstNode) bodyHandler) {
     if (parts is ForParts) {
@@ -2218,6 +2287,7 @@
       Element lhsElement;
       if (parts is ForEachPartsWithDeclaration) {
         var variableElement = parts.loopVariable.declaredElement;
+        _flowAnalysis.declare(variableElement, true);
         lhsElement = variableElement;
         parts.loopVariable?.type?.accept(this);
       } else if (parts is ForEachPartsWithIdentifier) {
@@ -2294,7 +2364,7 @@
       List<TypeParameterElement> constructorTypeParameters,
       {DartType invokeType}) {
     var typeFormals = constructorTypeParameters ?? calleeType.typeFormals;
-    var target = NullabilityNodeTarget.codeRef('invocation', node);
+    var target = NullabilityNodeTarget.text('invocation').withCodeRef(node);
     if (typeFormals.isNotEmpty) {
       if (typeArguments != null) {
         var argumentTypes = typeArguments.arguments
@@ -2505,7 +2575,8 @@
 
   DecoratedType _makeNonNullableBoolType(Expression expression) {
     assert(expression.staticType.isDartCoreBool);
-    var target = NullabilityNodeTarget.codeRef('expression', expression);
+    var target =
+        NullabilityNodeTarget.text('expression').withCodeRef(expression);
     var nullabilityNode = NullabilityNode.forInferredType(target);
     _graph.makeNonNullableUnion(
         nullabilityNode, NonNullableBoolTypeOrigin(source, expression));
@@ -2514,7 +2585,8 @@
 
   DecoratedType _makeNonNullLiteralType(Expression expression,
       {List<DecoratedType> typeArguments = const []}) {
-    var target = NullabilityNodeTarget.codeRef('expression', expression);
+    var target =
+        NullabilityNodeTarget.text('expression').withCodeRef(expression);
     var nullabilityNode = NullabilityNode.forInferredType(target);
     _graph.makeNonNullableUnion(
         nullabilityNode, LiteralOrigin(source, expression));
@@ -2523,7 +2595,8 @@
   }
 
   DecoratedType _makeNullableDynamicType(AstNode astNode) {
-    var target = NullabilityNodeTarget.codeRef('dynamic type', astNode);
+    var target =
+        NullabilityNodeTarget.text('dynamic type').withCodeRef(astNode);
     var decoratedType = DecoratedType.forImplicitType(
         typeProvider, typeProvider.dynamicType, _graph, target);
     _graph.makeNullable(
@@ -2532,7 +2605,7 @@
   }
 
   DecoratedType _makeNullableVoidType(SimpleIdentifier astNode) {
-    var target = NullabilityNodeTarget.codeRef('void type', astNode);
+    var target = NullabilityNodeTarget.text('void type').withCodeRef(astNode);
     var decoratedType = DecoratedType.forImplicitType(
         typeProvider, typeProvider.voidType, _graph, target);
     _graph.makeNullable(
@@ -2563,7 +2636,8 @@
     }
 
     var token = node.beginToken.lexeme;
-    var target = NullabilityNodeTarget.codeRef('$token expression', node);
+    var target =
+        NullabilityNodeTarget.text('$token expression').withCodeRef(node);
     if (_currentClassOrExtension is ClassElement) {
       final type = (_currentClassOrExtension as ClassElement).thisType;
 
diff --git a/pkg/nnbd_migration/lib/src/edit_plan.dart b/pkg/nnbd_migration/lib/src/edit_plan.dart
index 6cb72cb..00931b3 100644
--- a/pkg/nnbd_migration/lib/src/edit_plan.dart
+++ b/pkg/nnbd_migration/lib/src/edit_plan.dart
@@ -69,19 +69,26 @@
   /// if no characters should be inserted.
   final String replacement;
 
+  /// If `true`, this edit shouldn't actually be made to the source file; it
+  /// exists merely to provide additional information to be shown in the preview
+  /// tool.
+  final bool isInformative;
+
   /// Initialize an edit to delete [length] characters.
   ///
   /// Optional argument [info] contains information about why the change was
   /// made.
   const AtomicEdit.delete(this.length, {this.info})
       : assert(length > 0),
-        replacement = '';
+        replacement = '',
+        isInformative = false;
 
   /// Initialize an edit to insert the [replacement] characters.
   ///
   /// Optional argument [info] contains information about why the change was
   /// made.
-  const AtomicEdit.insert(this.replacement, {this.info})
+  const AtomicEdit.insert(this.replacement,
+      {this.info, this.isInformative: false})
       : assert(replacement.length > 0),
         length = 0;
 
@@ -91,7 +98,8 @@
   /// Optional argument [info] contains information about why the change was
   /// made.
   const AtomicEdit.replace(this.length, this.replacement, {this.info})
-      : assert(length > 0 || replacement.length > 0);
+      : assert(length > 0 || replacement.length > 0),
+        isInformative = false;
 
   /// Return `true` if this edit is a deletion (no characters added).
   bool get isDeletion => replacement.length == 0;
@@ -255,6 +263,18 @@
       _PassThroughBuilderImpl(node);
 
   /// Creates a new edit plan that consists of executing [innerPlan], and then
+  /// appending an informative ` `, to illustrate that the type is non-nullable.
+  ///
+  /// Optional argument [info] contains information about why the change was
+  /// made.
+  NodeProducingEditPlan explainNonNullable(NodeProducingEditPlan innerPlan,
+      {AtomicEditInfo info}) {
+    assert(innerPlan.sourceNode is TypeAnnotation);
+    return surround(innerPlan,
+        suffix: [AtomicEdit.insert(' ', info: info, isInformative: true)]);
+  }
+
+  /// Creates a new edit plan that consists of executing [innerPlan], and then
   /// removing from the source code any code that is in [sourceNode] but not in
   /// [innerPlan.sourceNode].  This is intended to be used to drop unnecessary
   /// syntax (for example, to drop an unnecessary cast).
@@ -1498,12 +1518,17 @@
 extension AtomicEditList on List<AtomicEdit> {
   /// Converts a list of [AtomicEdits] to a single [SourceEdit] by concatenating
   /// them.
-  SourceEdit toSourceEdit(int offset) {
+  ///
+  /// If [includeInformative] is `true`, informative edits are included;
+  /// otherwise they are ignored.
+  SourceEdit toSourceEdit(int offset, {bool includeInformative = false}) {
     var totalLength = 0;
     var replacement = '';
     for (var edit in this) {
-      totalLength += edit.length;
-      replacement += edit.replacement;
+      if (!edit.isInformative || includeInformative) {
+        totalLength += edit.length;
+        replacement += edit.replacement;
+      }
     }
     return SourceEdit(offset, totalLength, replacement);
   }
@@ -1514,16 +1539,24 @@
 /// source file changes.
 extension AtomicEditMap on Map<int, List<AtomicEdit>> {
   /// Applies the changes to source file text.
-  String applyTo(String code) {
-    return SourceEdit.applySequence(code, toSourceEdits());
+  ///
+  /// If [includeInformative] is `true`, informative edits are included;
+  /// otherwise they are ignored.
+  String applyTo(String code, {bool includeInformative = false}) {
+    return SourceEdit.applySequence(
+        code, toSourceEdits(includeInformative: includeInformative));
   }
 
   /// Converts the changes to a list of [SourceEdit]s.  The list is reverse
   /// sorted by offset so that they can be applied in order.
-  List<SourceEdit> toSourceEdits() {
+  ///
+  /// If [includeInformative] is `true`, informative edits are included;
+  /// otherwise they are ignored.
+  List<SourceEdit> toSourceEdits({bool includeInformative = false}) {
     return [
       for (var offset in keys.toList()..sort((a, b) => b.compareTo(a)))
-        this[offset].toSourceEdit(offset)
+        this[offset]
+            .toSourceEdit(offset, includeInformative: includeInformative)
     ];
   }
 
diff --git a/pkg/nnbd_migration/lib/src/fix_aggregator.dart b/pkg/nnbd_migration/lib/src/fix_aggregator.dart
index 1aca2bc..a4c8043 100644
--- a/pkg/nnbd_migration/lib/src/fix_aggregator.dart
+++ b/pkg/nnbd_migration/lib/src/fix_aggregator.dart
@@ -5,6 +5,8 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.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:nnbd_migration/instrumentation.dart';
 import 'package:nnbd_migration/nnbd_migration.dart';
@@ -24,7 +26,35 @@
 
   final EditPlanner planner;
 
-  FixAggregator._(this.planner, this._changes);
+  /// Map from library to the prefix we should use when inserting code that
+  /// refers to it.
+  final Map<LibraryElement, String> _importPrefixes = {};
+
+  FixAggregator._(this.planner, this._changes,
+      CompilationUnitElement compilationUnitElement) {
+    for (var importElement in compilationUnitElement.library.imports) {
+      // TODO(paulberry): the `??=` should ensure that if there are two imports,
+      // one prefixed and one not, we prefer the prefix.  Test this.
+      _importPrefixes[importElement.importedLibrary] ??=
+          importElement.prefix?.name;
+    }
+  }
+
+  /// Creates the necessary Dart code to refer to the given element, using an
+  /// import prefix if necessary.
+  ///
+  /// TODO(paulberry): if the element is not currently imported, we should
+  /// update or add an import statement as necessary.
+  String elementToCode(Element element) {
+    var name = element.name;
+    var library = element.library;
+    var prefix = _importPrefixes[library];
+    if (prefix != null) {
+      return '$prefix.$name';
+    } else {
+      return name;
+    }
+  }
 
   /// Gathers all the changes to nodes descended from [node] into a single
   /// [EditPlan].
@@ -57,6 +87,75 @@
     }
   }
 
+  /// Creates a string representation of the given type parameter element,
+  /// suitable for inserting into the user's source code.
+  String typeFormalToCode(TypeParameterElement formal) {
+    var bound = formal.bound;
+    if (bound == null ||
+        bound.isDynamic ||
+        (bound.isDartCoreObject &&
+            bound.nullabilitySuffix != NullabilitySuffix.none)) {
+      return formal.name;
+    }
+    return '${formal.name} extends ${typeToCode(bound)}';
+  }
+
+  String typeToCode(DartType type) {
+    // TODO(paulberry): is it possible to share code with DartType.toString()
+    // somehow?
+    String suffix =
+        type.nullabilitySuffix == NullabilitySuffix.question ? '?' : '';
+    if (type is InterfaceType) {
+      var name = elementToCode(type.element);
+      var typeArguments = type.typeArguments;
+      if (typeArguments.isEmpty) {
+        return '$name$suffix';
+      } else {
+        var args = [for (var arg in typeArguments) typeToCode(arg)].join(', ');
+        return '$name<$args>$suffix';
+      }
+    } else if (type is FunctionType) {
+      var buffer = StringBuffer();
+      buffer.write(typeToCode(type.returnType));
+      buffer.write(' Function');
+      var typeFormals = type.typeFormals;
+      if (typeFormals.isNotEmpty) {
+        var formals = [for (var formal in typeFormals) typeFormalToCode(formal)]
+            .join(', ');
+        buffer.write('<$formals>');
+      }
+      buffer.write('(');
+      String optionalOrNamedCloser = '';
+      bool commaNeeded = false;
+      for (var parameter in type.parameters) {
+        if (commaNeeded) {
+          buffer.write(', ');
+        } else {
+          commaNeeded = true;
+        }
+        if (optionalOrNamedCloser.isEmpty && !parameter.isRequiredPositional) {
+          if (parameter.isPositional) {
+            buffer.write('[');
+            optionalOrNamedCloser = ']';
+          } else {
+            buffer.write('{');
+            optionalOrNamedCloser = '}';
+          }
+        }
+        buffer.write(typeToCode(parameter.type));
+        if (parameter.isNamed) {
+          buffer.write(' ${parameter.name}');
+        }
+      }
+      buffer.write(optionalOrNamedCloser);
+      buffer.write(')');
+      buffer.write(suffix);
+      return buffer.toString();
+    } else {
+      return type.toString();
+    }
+  }
+
   @override
   void visitNode(AstNode node) {
     var change = _changes[node];
@@ -76,7 +175,7 @@
       {bool removeViaComments: false}) {
     var planner = EditPlanner(unit.lineInfo, sourceText,
         removeViaComments: removeViaComments);
-    var aggregator = FixAggregator._(planner, changes);
+    var aggregator = FixAggregator._(planner, changes, unit.declaredElement);
     unit.accept(aggregator);
     if (aggregator._plans.isEmpty) return {};
     EditPlan plan;
@@ -94,6 +193,10 @@
 abstract class NodeChange<N extends AstNode> {
   NodeChange._();
 
+  /// Indicates whether this node exists solely to provide informative
+  /// information.
+  bool get isInformative => false;
+
   /// Applies this change to the given [node], producing an [EditPlan].  The
   /// [aggregator] may be used to gather up any edits to the node's descendants
   /// into their own [EditPlan]s.
@@ -289,7 +392,7 @@
 
   AtomicEditInfo _addNullCheckInfo;
 
-  String _introducesAsType;
+  DartType _introducesAsType;
 
   AtomicEditInfo _introduceAsInfo;
 
@@ -308,7 +411,7 @@
 
   /// Causes a cast to the given [type] to be added to this expression, with
   /// the given [info].
-  void introduceAs(String type, AtomicEditInfo info) {
+  void introduceAs(DartType type, AtomicEditInfo info) {
     assert(!_addsNullCheck);
     assert(_introducesAsType == null);
     assert(type != null);
@@ -332,7 +435,7 @@
           .addUnaryPostfix(innerPlan, TokenType.BANG, info: _addNullCheckInfo);
     } else if (_introducesAsType != null) {
       return aggregator.planner.addBinaryPostfix(
-          innerPlan, TokenType.AS, _introducesAsType,
+          innerPlan, TokenType.AS, aggregator.typeToCode(_introducesAsType),
           info: _introduceAsInfo);
     } else {
       return innerPlan;
@@ -461,20 +564,35 @@
   /// Indicates whether the type should be made nullable by adding a `?`.
   bool makeNullable = false;
 
-  /// If [makeNullable] is `true`, the decorated type that results.
-  DecoratedType makeNullableType;
+  /// The decorated type of the type annotation, or `null` if there is no
+  /// decorated type info of interest.  If [makeNullable] is `true`, the node
+  /// from this type will be attached to the edit that adds the `?`. If
+  /// [makeNullable] is `false`, the node from this type will be attached to the
+  /// information about why the node wasn't made nullable.
+  DecoratedType decoratedType;
 
   NodeChangeForTypeAnnotation() : super._();
 
   @override
+  bool get isInformative => !makeNullable;
+
+  @override
   EditPlan _apply(TypeAnnotation node, FixAggregator aggregator) {
     var innerPlan = aggregator.innerPlanForNode(node);
-    if (!makeNullable) return innerPlan;
-    return aggregator.planner.makeNullable(innerPlan,
-        info: AtomicEditInfo(
-            NullabilityFixDescription.makeTypeNullable(
-                makeNullableType.type.getDisplayString(withNullability: false)),
-            [makeNullableType.node]));
+    if (decoratedType == null) return innerPlan;
+    if (makeNullable) {
+      return aggregator.planner.makeNullable(innerPlan,
+          info: AtomicEditInfo(
+              NullabilityFixDescription.makeTypeNullable(
+                  decoratedType.type.getDisplayString(withNullability: false)),
+              [decoratedType.node]));
+    } else {
+      return aggregator.planner.explainNonNullable(innerPlan,
+          info: AtomicEditInfo(
+              NullabilityFixDescription.typeNotMadeNullable(
+                  decoratedType.type.getDisplayString(withNullability: false)),
+              [decoratedType.node]));
+    }
   }
 }
 
diff --git a/pkg/nnbd_migration/lib/src/fix_builder.dart b/pkg/nnbd_migration/lib/src/fix_builder.dart
index 098c842..76b1db7 100644
--- a/pkg/nnbd_migration/lib/src/fix_builder.dart
+++ b/pkg/nnbd_migration/lib/src/fix_builder.dart
@@ -32,6 +32,7 @@
 import 'package:nnbd_migration/src/fix_aggregator.dart';
 import 'package:nnbd_migration/src/nullability_node.dart';
 import 'package:nnbd_migration/src/utilities/permissive_mode.dart';
+import 'package:nnbd_migration/src/utilities/resolution_utils.dart';
 import 'package:nnbd_migration/src/variables.dart';
 
 /// Problem reported by [FixBuilder] when encountering a compound assignment
@@ -432,7 +433,7 @@
             NullabilityFixDescription.checkExpression, checks.edges)
         : null;
     (_fixBuilder._getChange(node) as NodeChangeForExpression)
-        .introduceAs(contextType.getDisplayString(withNullability: true), info);
+        .introduceAs(contextType, info);
     _flowAnalysis.asExpression_end(node, contextType);
     return contextType;
   }
@@ -659,10 +660,10 @@
   void visitGenericFunctionType(GenericFunctionType node) {
     var decoratedType = _fixBuilder._variables
         .decoratedTypeAnnotation(_fixBuilder.source, node);
-    if (decoratedType.node.isNullable) {
+    if (!typeIsNonNullableByContext(node)) {
       (_fixBuilder._getChange(node) as NodeChangeForTypeAnnotation)
-        ..makeNullable = true
-        ..makeNullableType = decoratedType;
+        ..makeNullable = decoratedType.node.isNullable
+        ..decoratedType = decoratedType;
     }
     (node as GenericFunctionTypeImpl).type =
         _fixBuilder._variables.toFinalType(decoratedType);
@@ -673,11 +674,13 @@
   void visitTypeName(TypeName node) {
     var decoratedType = _fixBuilder._variables
         .decoratedTypeAnnotation(_fixBuilder.source, node);
-    var type = decoratedType.type;
-    if (!type.isDynamic && !type.isVoid && decoratedType.node.isNullable) {
-      (_fixBuilder._getChange(node) as NodeChangeForTypeAnnotation)
-        ..makeNullable = true
-        ..makeNullableType = decoratedType;
+    if (!typeIsNonNullableByContext(node)) {
+      var type = decoratedType.type;
+      if (!type.isDynamic && !type.isVoid) {
+        (_fixBuilder._getChange(node) as NodeChangeForTypeAnnotation)
+          ..makeNullable = decoratedType.node.isNullable
+          ..decoratedType = decoratedType;
+      }
     }
     node.type = _fixBuilder._variables.toFinalType(decoratedType);
     super.visitTypeName(node);
diff --git a/pkg/nnbd_migration/lib/src/node_builder.dart b/pkg/nnbd_migration/lib/src/node_builder.dart
index 132666e..e0e5a2f 100644
--- a/pkg/nnbd_migration/lib/src/node_builder.dart
+++ b/pkg/nnbd_migration/lib/src/node_builder.dart
@@ -22,6 +22,7 @@
 import 'package:nnbd_migration/src/potential_modification.dart';
 import 'package:nnbd_migration/src/utilities/completeness_tracker.dart';
 import 'package:nnbd_migration/src/utilities/permissive_mode.dart';
+import 'package:nnbd_migration/src/utilities/resolution_utils.dart';
 
 import 'edge_origin.dart';
 
@@ -74,7 +75,7 @@
     if (node.exceptionParameter != null) {
       // If there is no `on Type` part of the catch clause, the type is dynamic.
       if (exceptionType == null) {
-        var target = NullabilityNodeTarget.codeRef('exception', node);
+        var target = NullabilityNodeTarget.text('exception').withCodeRef(node);
         exceptionType = DecoratedType.forImplicitType(
             _typeProvider, _typeProvider.dynamicType, _graph, target);
         instrumentation?.implicitType(
@@ -85,7 +86,7 @@
     }
     if (node.stackTraceParameter != null) {
       // The type of stack traces is always StackTrace (non-nullable).
-      var target = NullabilityNodeTarget.codeRef('stack trace', node);
+      var target = NullabilityNodeTarget.text('stack trace').withCodeRef(node);
       var nullabilityNode = NullabilityNode.forInferredType(target);
       _graph.makeNonNullableUnion(nullabilityNode,
           StackTraceTypeOrigin(source, node.stackTraceParameter));
@@ -273,6 +274,24 @@
   }
 
   @override
+  DecoratedType visitFormalParameterList(FormalParameterList node) {
+    int index = 0;
+    for (var parameter in node.parameters) {
+      var element = parameter.declaredElement;
+      NullabilityNodeTarget newTarget;
+      if (_target == null) {
+        newTarget = null;
+      } else if (element.isNamed) {
+        newTarget = _target.namedParameter(element.name);
+      } else {
+        newTarget = _target.positionalParameter(index++);
+      }
+      _pushNullabilityNodeTarget(newTarget, () => parameter.accept(this));
+    }
+    return null;
+  }
+
+  @override
   DecoratedType visitFunctionDeclaration(FunctionDeclaration node) {
     _handleExecutableDeclaration(
         node,
@@ -398,8 +417,8 @@
   DecoratedType visitTypeAnnotation(TypeAnnotation node) {
     assert(node != null); // TODO(paulberry)
     var type = node.type;
-    var target =
-        _target ?? NullabilityNodeTarget.codeRef('explicit type', node);
+    var target = (_target ?? NullabilityNodeTarget.text('explicit type'))
+        .withCodeRef(node);
     if (type.isVoid || type.isDynamic) {
       var nullabilityNode = NullabilityNode.forTypeAnnotation(target);
       var decoratedType = DecoratedType(type, nullabilityNode);
@@ -457,13 +476,7 @@
       }
     }
     NullabilityNode nullabilityNode;
-    var parent = node.parent;
-    if (parent is ExtendsClause ||
-        parent is ImplementsClause ||
-        parent is WithClause ||
-        parent is OnClause ||
-        parent is ClassTypeAlias ||
-        parent is GenericTypeAlias) {
+    if (typeIsNonNullableByContext(node)) {
       nullabilityNode = _graph.never;
     } else {
       nullabilityNode = NullabilityNode.forTypeAnnotation(target);
@@ -612,7 +625,7 @@
     DecoratedType decoratedFunctionType;
     try {
       typeParameters?.accept(this);
-      parameters?.accept(this);
+      _pushNullabilityNodeTarget(target, () => parameters?.accept(this));
       redirectedConstructor?.accept(this);
       initializers?.accept(this);
       decoratedFunctionType = DecoratedType(functionType, _graph.never,
@@ -708,8 +721,8 @@
     for (var supertype in supertypes) {
       DecoratedType decoratedSupertype;
       if (supertype == null) {
-        var target =
-            NullabilityNodeTarget.codeRef('implicit object supertype', astNode);
+        var target = NullabilityNodeTarget.text('implicit object supertype')
+            .withCodeRef(astNode);
         var nullabilityNode = NullabilityNode.forInferredType(target);
         _graph.makeNonNullableUnion(
             nullabilityNode, NonNullableObjectSuperclass(source, astNode));
diff --git a/pkg/nnbd_migration/lib/src/nullability_node.dart b/pkg/nnbd_migration/lib/src/nullability_node.dart
index 506236e..6031c97 100644
--- a/pkg/nnbd_migration/lib/src/nullability_node.dart
+++ b/pkg/nnbd_migration/lib/src/nullability_node.dart
@@ -680,7 +680,7 @@
   /// Creates a [NullabilityNode] representing the nullability of a variable
   /// whose type is determined by the `??` operator.
   factory NullabilityNode.forIfNotNull(AstNode node) => _NullabilityNodeSimple(
-      NullabilityNodeTarget.codeRef('?? operator', node));
+      NullabilityNodeTarget.text('?? operator').withCodeRef(node));
 
   /// Creates a [NullabilityNode] representing the nullability of a variable
   /// whose type is determined by type inference.
diff --git a/pkg/nnbd_migration/lib/src/nullability_node_target.dart b/pkg/nnbd_migration/lib/src/nullability_node_target.dart
index c83ae21..61a46e6 100644
--- a/pkg/nnbd_migration/lib/src/nullability_node_target.dart
+++ b/pkg/nnbd_migration/lib/src/nullability_node_target.dart
@@ -27,11 +27,6 @@
 /// Data structure tracking information about which type in the user's source
 /// code is referenced by a given nullability node.
 abstract class NullabilityNodeTarget {
-  /// Creates a [NullabilityNodeTarget] referring to a particular point in the
-  /// source code.
-  factory NullabilityNodeTarget.codeRef(String description, AstNode astNode) =
-      _NullabilityNodeTarget_CodeRef;
-
   /// Creates a [NullabilityNodeTarget] referring to a particular element.
   factory NullabilityNodeTarget.element(Element element) =
       _NullabilityNodeTarget_Element;
@@ -51,8 +46,15 @@
   CodeReference get codeReference => null;
 
   /// Gets a short description of this nullability node target suitable for
-  /// displaying to the user.
-  String get displayName;
+  /// displaying to the user, not including a code reference.
+  String get description;
+
+  /// Same as [description], but if there is a [codeReference], it is included
+  /// after the description in parentheses.
+  String get displayName {
+    if (codeReference == null) return description;
+    return '$description (${codeReference.shortName})';
+  }
 
   /// Creates a new [NullabilityNodeTarget] representing a named function
   /// parameter of this target.
@@ -77,21 +79,26 @@
   /// function type parameter of this target.
   NullabilityNodeTarget typeFormalBound(String typeFormalName) =>
       _NullabilityNodeTarget_TypeFormalBound(this, typeFormalName);
+
+  /// Creates a [NullabilityNodeTarget] referring to a particular point in the
+  /// source code.
+  NullabilityNodeTarget withCodeRef(AstNode astNode) =>
+      _NullabilityNodeTarget_CodeRef(this, astNode);
 }
 
 /// Nullability node target representing a reference to a specific location in
 /// source code.
 class _NullabilityNodeTarget_CodeRef extends NullabilityNodeTarget {
-  final String description;
+  final NullabilityNodeTarget inner;
 
   final CodeReference codeReference;
 
-  _NullabilityNodeTarget_CodeRef(this.description, AstNode astNode)
+  _NullabilityNodeTarget_CodeRef(this.inner, AstNode astNode)
       : codeReference = CodeReference.fromAstNode(astNode),
         super._();
 
   @override
-  String get displayName => '$description (${codeReference.shortName})';
+  String get description => inner.description;
 }
 
 /// Nullability node target representing the type of an element.
@@ -103,7 +110,7 @@
         super._();
 
   @override
-  String get displayName => name;
+  String get description => name;
 }
 
 /// Nullability node target representing the type of a named function parameter.
@@ -115,7 +122,7 @@
       : super(inner);
 
   @override
-  String get displayName => 'parameter $name of ${inner.displayName}';
+  String get description => 'parameter $name of ${inner.description}';
 }
 
 /// Nullability node target representing a type that forms part of a larger type
@@ -140,7 +147,7 @@
       : super(inner);
 
   @override
-  String get displayName => 'parameter $index of ${inner.displayName}';
+  String get description => 'parameter $index of ${inner.description}';
 }
 
 /// Nullability node target representing a function's return type.
@@ -148,7 +155,7 @@
   _NullabilityNodeTarget_ReturnType(NullabilityNodeTarget inner) : super(inner);
 
   @override
-  String get displayName => 'return type of ${inner.displayName}';
+  String get description => 'return type of ${inner.description}';
 }
 
 /// Nullability node target for which we only know a string description.
@@ -158,7 +165,7 @@
   _NullabilityNodeTarget_Text(this.name) : super._();
 
   @override
-  String get displayName => name;
+  String get description => name;
 }
 
 /// Nullability node target representing a type argument of an interface type or
@@ -170,7 +177,7 @@
       : super(inner);
 
   @override
-  String get displayName => 'type argument $index of ${inner.displayName}';
+  String get description => 'type argument $index of ${inner.description}';
 }
 
 /// Nullability node target representing a bound of a function type's formal
@@ -184,8 +191,8 @@
       : super(inner);
 
   @override
-  String get displayName =>
-      'bound of type formal $typeFormalName of ${inner.displayName}';
+  String get description =>
+      'bound of type formal $typeFormalName of ${inner.description}';
 }
 
 /// Nullability node target representing a type parameter bound.
@@ -197,5 +204,5 @@
         super._();
 
   @override
-  String get displayName => 'bound of $name';
+  String get description => 'bound of $name';
 }
diff --git a/pkg/nnbd_migration/lib/src/utilities/resolution_utils.dart b/pkg/nnbd_migration/lib/src/utilities/resolution_utils.dart
index d5d8170..81624db 100644
--- a/pkg/nnbd_migration/lib/src/utilities/resolution_utils.dart
+++ b/pkg/nnbd_migration/lib/src/utilities/resolution_utils.dart
@@ -2,8 +2,22 @@
 // for 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/type_provider.dart';
 
+/// Determines whether a type annotation's position in the AST makes it
+/// impossible to be nullable.
+bool typeIsNonNullableByContext(TypeAnnotation node) {
+  var parent = node.parent;
+  return parent is ExtendsClause ||
+      parent is ImplementsClause ||
+      parent is WithClause ||
+      parent is OnClause ||
+      parent is ClassTypeAlias ||
+      parent is GenericTypeAlias ||
+      parent is ConstructorName;
+}
+
 /// This mixin provides utilities that are useful to visitors implementing
 /// resolution-like behaviors.
 mixin ResolutionUtils {
diff --git a/pkg/nnbd_migration/test/api_test.dart b/pkg/nnbd_migration/test/api_test.dart
index 7a63ba6..06dd229 100644
--- a/pkg/nnbd_migration/test/api_test.dart
+++ b/pkg/nnbd_migration/test/api_test.dart
@@ -2053,6 +2053,32 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_field_overrides_getter() async {
+    var content = '''
+abstract class C {
+  int get i;
+}
+class D implements C {
+  @override
+  final int i;
+  D._() : i = computeI();
+}
+int computeI() => null;
+''';
+    var expected = '''
+abstract class C {
+  int? get i;
+}
+class D implements C {
+  @override
+  final int? i;
+  D._() : i = computeI();
+}
+int? computeI() => null;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_field_type_inferred() async {
     var content = '''
 int f() => null;
@@ -2161,6 +2187,28 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_for_each_variable_initialized() async {
+    var content = '''
+int sum(List<int> list) {
+  int total = 0;
+  for (var i in list) {
+    total = total + i;
+  }
+  return total;
+}
+''';
+    var expected = '''
+int sum(List<int> list) {
+  int total = 0;
+  for (var i in list) {
+    total = total + i;
+  }
+  return total;
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_function_expression() async {
     var content = '''
 int f(int i) {
@@ -2704,6 +2752,18 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_insert_as_prefixed_type() async {
+    var content = '''
+import 'dart:async' as a;
+Future<int> f(Object o) => o;
+''';
+    var expected = '''
+import 'dart:async' as a;
+Future<int> f(Object o) => o as a.Future<int>;
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/40871')
   Future<void> test_insert_type_with_prefix() async {
     var content = '''
diff --git a/pkg/nnbd_migration/test/edge_builder_test.dart b/pkg/nnbd_migration/test/edge_builder_test.dart
index a410270..9612cea 100644
--- a/pkg/nnbd_migration/test/edge_builder_test.dart
+++ b/pkg/nnbd_migration/test/edge_builder_test.dart
@@ -2705,6 +2705,22 @@
     // metadata was visited.
   }
 
+  Future<void> test_field_final_does_not_override_setter() async {
+    await analyze('''
+abstract class A {
+  void set i(int value);
+}
+abstract class C implements A {
+  final int i;
+  C(this.i);
+}
+''');
+    var baseNode = decoratedTypeAnnotation('int value').node;
+    var derivedNode = decoratedTypeAnnotation('int i').node;
+    assertNoEdge(derivedNode, baseNode);
+    assertNoEdge(baseNode, derivedNode);
+  }
+
   Future<void> test_field_initialized_in_constructor() async {
     await analyze('''
 class C {
@@ -2731,6 +2747,67 @@
     // metadata was visited.
   }
 
+  Future<void> test_field_overrides_field() async {
+    await analyze('''
+abstract class A {
+  int i; // A
+}
+class C implements A {
+  int i; // C
+}
+''');
+    var baseNode = decoratedTypeAnnotation('int i; // A').node;
+    var derivedNode = decoratedTypeAnnotation('int i; // C').node;
+    assertEdge(baseNode, derivedNode, hard: true);
+    assertEdge(derivedNode, baseNode, hard: true);
+  }
+
+  Future<void> test_field_overrides_field_final() async {
+    await analyze('''
+abstract class A {
+  final int i; // A
+  A(this.i);
+}
+class C implements A {
+  int i; // C
+}
+''');
+    var baseNode = decoratedTypeAnnotation('int i; // A').node;
+    var derivedNode = decoratedTypeAnnotation('int i; // C').node;
+    assertEdge(derivedNode, baseNode, hard: true);
+    assertNoEdge(baseNode, derivedNode);
+  }
+
+  Future<void> test_field_overrides_getter() async {
+    await analyze('''
+abstract class A {
+  int get i;
+}
+class C implements A {
+  int i;
+}
+''');
+    var baseNode = decoratedTypeAnnotation('int get i').node;
+    var derivedNode = decoratedTypeAnnotation('int i').node;
+    assertEdge(derivedNode, baseNode, hard: true);
+    assertNoEdge(baseNode, derivedNode);
+  }
+
+  Future<void> test_field_overrides_setter() async {
+    await analyze('''
+abstract class A {
+  void set i(int value);
+}
+class C implements A {
+  int i;
+}
+''');
+    var baseNode = decoratedTypeAnnotation('int value').node;
+    var derivedNode = decoratedTypeAnnotation('int i').node;
+    assertEdge(baseNode, derivedNode, hard: true);
+    assertNoEdge(derivedNode, baseNode);
+  }
+
   Future<void> test_field_static_implicitInitializer() async {
     await analyze('''
 class C {
diff --git a/pkg/nnbd_migration/test/edit_plan_test.dart b/pkg/nnbd_migration/test/edit_plan_test.dart
index 3d78101..5cb8c7f 100644
--- a/pkg/nnbd_migration/test/edit_plan_test.dart
+++ b/pkg/nnbd_migration/test/edit_plan_test.dart
@@ -40,9 +40,13 @@
     await resolveTestUnit(code);
   }
 
-  Map<int, List<AtomicEdit>> checkPlan(EditPlan plan, String expected) {
+  Map<int, List<AtomicEdit>> checkPlan(EditPlan plan, String expected,
+      {String expectedIncludingInformative}) {
+    expectedIncludingInformative ??= expected;
     var changes = planner.finalize(plan);
     expect(changes.applyTo(code), expected);
+    expect(changes.applyTo(code, includeInformative: true),
+        expectedIncludingInformative);
     return changes;
   }
 
@@ -284,6 +288,15 @@
     }
   }
 
+  Future<void> test_explainNonNullable() async {
+    await analyze('int x = 0;');
+    checkPlan(
+        planner.explainNonNullable(
+            planner.passThrough(findNode.typeAnnotation('int'))),
+        'int x = 0;',
+        expectedIncludingInformative: 'int  x = 0;');
+  }
+
   Future<void> test_extract_add_parens() async {
     await analyze('f(g) => 1 * g(2, 3 + 4, 5);');
     checkPlan(
diff --git a/pkg/nnbd_migration/test/fix_aggregator_test.dart b/pkg/nnbd_migration/test/fix_aggregator_test.dart
index 10cc5a8..e50444b 100644
--- a/pkg/nnbd_migration/test/fix_aggregator_test.dart
+++ b/pkg/nnbd_migration/test/fix_aggregator_test.dart
@@ -2,9 +2,13 @@
 // for 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/analyzer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:nnbd_migration/src/decorated_type.dart';
 import 'package:nnbd_migration/src/edit_plan.dart';
 import 'package:nnbd_migration/src/fix_aggregator.dart';
@@ -23,6 +27,10 @@
 
 @reflectiveTest
 class FixAggregatorTest extends FixAggregatorTestBase {
+  TypeProviderImpl get nnbdTypeProvider =>
+      (testAnalysisResult.typeProvider as TypeProviderImpl)
+          .asNonNullableByDefault;
+
   Future<void> test_addRequired() async {
     await analyze('f({int x}) => 0;');
     var previewInfo = run({
@@ -374,28 +382,296 @@
     // leave them.
     await analyze('f(a, c) => a..b = (throw c..d);');
     var cd = findNode.cascade('c..d');
-    var previewInfo =
-        run({cd: NodeChangeForExpression()..introduceAs('int', _MockInfo())});
+    var previewInfo = run({
+      cd: NodeChangeForExpression()
+        ..introduceAs(nnbdTypeProvider.intType, _MockInfo())
+    });
     expect(
         previewInfo.applyTo(code), 'f(a, c) => a..b = (throw (c..d) as int);');
   }
 
+  Future<void> test_introduceAs_dynamic() async {
+    await analyze('f(Object o) => o;');
+    var expr = findNode.simple('o;');
+    var previewInfo = run({
+      expr: NodeChangeForExpression()
+        ..introduceAs(nnbdTypeProvider.dynamicType, _MockInfo())
+    });
+    expect(previewInfo.applyTo(code), 'f(Object o) => o as dynamic;');
+  }
+
+  Future<void> test_introduceAs_favorPrefix() async {
+    await analyze('''
+import 'dart:async' as a;
+import 'dart:async';
+f(Object o) => o;
+''');
+    var expr = findNode.simple('o;');
+    var previewInfo = run({
+      expr: NodeChangeForExpression()
+        ..introduceAs(nnbdTypeProvider.futureNullType, _MockInfo())
+    });
+    expect(previewInfo.applyTo(code), '''
+import 'dart:async' as a;
+import 'dart:async';
+f(Object o) => o as a.Future<Null>;
+''');
+  }
+
+  Future<void> test_introduceAs_functionType() async {
+    await analyze('f(Object o) => o;');
+    var expr = findNode.simple('o;');
+    var previewInfo = run({
+      expr: NodeChangeForExpression()
+        ..introduceAs(
+            FunctionTypeImpl(
+                returnType: nnbdTypeProvider.boolType,
+                typeFormals: [],
+                parameters: [],
+                nullabilitySuffix: NullabilitySuffix.none),
+            _MockInfo())
+    });
+    expect(previewInfo.applyTo(code), 'f(Object o) => o as bool Function();');
+  }
+
+  Future<void> test_introduceAs_functionType_formal_bound() async {
+    await analyze('f(Object o) => o;');
+    var expr = findNode.simple('o;');
+    var previewInfo = run({
+      expr: NodeChangeForExpression()
+        ..introduceAs(
+            FunctionTypeImpl(
+                returnType: nnbdTypeProvider.boolType,
+                typeFormals: [
+                  TypeParameterElementImpl.synthetic('T')
+                    ..bound = nnbdTypeProvider.numType
+                ],
+                parameters: [],
+                nullabilitySuffix: NullabilitySuffix.none),
+            _MockInfo())
+    });
+    expect(previewInfo.applyTo(code),
+        'f(Object o) => o as bool Function<T extends num>();');
+  }
+
+  Future<void> test_introduceAs_functionType_formal_bound_dynamic() async {
+    await analyze('f(Object o) => o;');
+    var expr = findNode.simple('o;');
+    var previewInfo = run({
+      expr: NodeChangeForExpression()
+        ..introduceAs(
+            FunctionTypeImpl(
+                returnType: nnbdTypeProvider.boolType,
+                typeFormals: [
+                  TypeParameterElementImpl.synthetic('T')
+                    ..bound = nnbdTypeProvider.dynamicType
+                ],
+                parameters: [],
+                nullabilitySuffix: NullabilitySuffix.none),
+            _MockInfo())
+    });
+    expect(
+        previewInfo.applyTo(code), 'f(Object o) => o as bool Function<T>();');
+  }
+
+  Future<void> test_introduceAs_functionType_formal_bound_object() async {
+    await analyze('f(Object o) => o;');
+    var expr = findNode.simple('o;');
+    var previewInfo = run({
+      expr: NodeChangeForExpression()
+        ..introduceAs(
+            FunctionTypeImpl(
+                returnType: nnbdTypeProvider.boolType,
+                typeFormals: [
+                  TypeParameterElementImpl.synthetic('T')
+                    ..bound = nnbdTypeProvider.objectType
+                ],
+                parameters: [],
+                nullabilitySuffix: NullabilitySuffix.none),
+            _MockInfo())
+    });
+    expect(previewInfo.applyTo(code),
+        'f(Object o) => o as bool Function<T extends Object>();');
+  }
+
+  Future<void>
+      test_introduceAs_functionType_formal_bound_object_question() async {
+    await analyze('f(Object o) => o;');
+    var expr = findNode.simple('o;');
+    var previewInfo = run({
+      expr: NodeChangeForExpression()
+        ..introduceAs(
+            FunctionTypeImpl(
+                returnType: nnbdTypeProvider.boolType,
+                typeFormals: [
+                  TypeParameterElementImpl.synthetic('T')
+                    ..bound = (nnbdTypeProvider.objectType as TypeImpl)
+                        .withNullability(NullabilitySuffix.question)
+                ],
+                parameters: [],
+                nullabilitySuffix: NullabilitySuffix.none),
+            _MockInfo())
+    });
+    expect(
+        previewInfo.applyTo(code), 'f(Object o) => o as bool Function<T>();');
+  }
+
+  Future<void> test_introduceAs_functionType_formal_bound_question() async {
+    await analyze('f(Object o) => o;');
+    var expr = findNode.simple('o;');
+    var previewInfo = run({
+      expr: NodeChangeForExpression()
+        ..introduceAs(
+            FunctionTypeImpl(
+                returnType: nnbdTypeProvider.boolType,
+                typeFormals: [
+                  TypeParameterElementImpl.synthetic('T')
+                    ..bound = (nnbdTypeProvider.numType as TypeImpl)
+                        .withNullability(NullabilitySuffix.question)
+                ],
+                parameters: [],
+                nullabilitySuffix: NullabilitySuffix.none),
+            _MockInfo())
+    });
+    expect(previewInfo.applyTo(code),
+        'f(Object o) => o as bool Function<T extends num?>();');
+  }
+
+  Future<void> test_introduceAs_functionType_formals() async {
+    await analyze('f(Object o) => o;');
+    var expr = findNode.simple('o;');
+    var previewInfo = run({
+      expr: NodeChangeForExpression()
+        ..introduceAs(
+            FunctionTypeImpl(
+                returnType: nnbdTypeProvider.boolType,
+                typeFormals: [
+                  TypeParameterElementImpl.synthetic('T'),
+                  TypeParameterElementImpl.synthetic('U')
+                ],
+                parameters: [],
+                nullabilitySuffix: NullabilitySuffix.none),
+            _MockInfo())
+    });
+    expect(previewInfo.applyTo(code),
+        'f(Object o) => o as bool Function<T, U>();');
+  }
+
+  Future<void> test_introduceAs_functionType_parameters() async {
+    await analyze('f(Object o) => o;');
+    var expr = findNode.simple('o;');
+    var previewInfo = run({
+      expr: NodeChangeForExpression()
+        ..introduceAs(
+            FunctionTypeImpl(
+                returnType: nnbdTypeProvider.boolType,
+                typeFormals: [],
+                parameters: [
+                  ParameterElementImpl.synthetic(
+                      'x', nnbdTypeProvider.intType, ParameterKind.REQUIRED),
+                  ParameterElementImpl.synthetic(
+                      'y', nnbdTypeProvider.numType, ParameterKind.REQUIRED)
+                ],
+                nullabilitySuffix: NullabilitySuffix.none),
+            _MockInfo())
+    });
+    expect(previewInfo.applyTo(code),
+        'f(Object o) => o as bool Function(int, num);');
+  }
+
+  Future<void> test_introduceAs_functionType_parameters_named() async {
+    await analyze('f(Object o) => o;');
+    var expr = findNode.simple('o;');
+    var previewInfo = run({
+      expr: NodeChangeForExpression()
+        ..introduceAs(
+            FunctionTypeImpl(
+                returnType: nnbdTypeProvider.boolType,
+                typeFormals: [],
+                parameters: [
+                  ParameterElementImpl.synthetic(
+                      'x', nnbdTypeProvider.intType, ParameterKind.NAMED),
+                  ParameterElementImpl.synthetic(
+                      'y', nnbdTypeProvider.numType, ParameterKind.NAMED)
+                ],
+                nullabilitySuffix: NullabilitySuffix.none),
+            _MockInfo())
+    });
+    expect(previewInfo.applyTo(code),
+        'f(Object o) => o as bool Function({int x, num y});');
+  }
+
+  Future<void> test_introduceAs_functionType_parameters_optional() async {
+    await analyze('f(Object o) => o;');
+    var expr = findNode.simple('o;');
+    var previewInfo = run({
+      expr: NodeChangeForExpression()
+        ..introduceAs(
+            FunctionTypeImpl(
+                returnType: nnbdTypeProvider.boolType,
+                typeFormals: [],
+                parameters: [
+                  ParameterElementImpl.synthetic(
+                      'x', nnbdTypeProvider.intType, ParameterKind.POSITIONAL),
+                  ParameterElementImpl.synthetic(
+                      'y', nnbdTypeProvider.numType, ParameterKind.POSITIONAL)
+                ],
+                nullabilitySuffix: NullabilitySuffix.none),
+            _MockInfo())
+    });
+    expect(previewInfo.applyTo(code),
+        'f(Object o) => o as bool Function([int, num]);');
+  }
+
+  Future<void> test_introduceAs_interfaceType_parameterized() async {
+    await analyze('f(Object o) => o;');
+    var expr = findNode.simple('o;');
+    var previewInfo = run({
+      expr: NodeChangeForExpression()
+        ..introduceAs(
+            nnbdTypeProvider.mapType2(
+                nnbdTypeProvider.intType, nnbdTypeProvider.boolType),
+            _MockInfo())
+    });
+    expect(previewInfo.applyTo(code), 'f(Object o) => o as Map<int, bool>;');
+  }
+
   Future<void> test_introduceAs_no_parens() async {
     await analyze('f(a, b) => a | b;');
     var expr = findNode.binary('a | b');
-    var previewInfo =
-        run({expr: NodeChangeForExpression()..introduceAs('int', _MockInfo())});
+    var previewInfo = run({
+      expr: NodeChangeForExpression()
+        ..introduceAs(nnbdTypeProvider.intType, _MockInfo())
+    });
     expect(previewInfo.applyTo(code), 'f(a, b) => a | b as int;');
   }
 
   Future<void> test_introduceAs_parens() async {
     await analyze('f(a, b) => a < b;');
     var expr = findNode.binary('a < b');
-    var previewInfo = run(
-        {expr: NodeChangeForExpression()..introduceAs('bool', _MockInfo())});
+    var previewInfo = run({
+      expr: NodeChangeForExpression()
+        ..introduceAs(nnbdTypeProvider.boolType, _MockInfo())
+    });
     expect(previewInfo.applyTo(code), 'f(a, b) => (a < b) as bool;');
   }
 
+  Future<void> test_introduceAs_usePrefix() async {
+    await analyze('''
+import 'dart:async' as a;
+f(Object o) => o;
+''');
+    var expr = findNode.simple('o;');
+    var previewInfo = run({
+      expr: NodeChangeForExpression()
+        ..introduceAs(nnbdTypeProvider.futureNullType, _MockInfo())
+    });
+    expect(previewInfo.applyTo(code), '''
+import 'dart:async' as a;
+f(Object o) => o as a.Future<Null>;
+''');
+  }
+
   Future<void> test_keep_redundant_parens() async {
     await analyze('f(a, b, c) => a + (b * c);');
     var previewInfo = run({});
@@ -408,12 +684,33 @@
     var previewInfo = run({
       typeName: NodeChangeForTypeAnnotation()
         ..makeNullable = true
-        ..makeNullableType = MockDecoratedType(
+        ..decoratedType = MockDecoratedType(
             MockDartType(toStringValueWithoutNullability: 'int'))
     });
     expect(previewInfo.applyTo(code), 'f(int? x) {}');
   }
 
+  Future<void> test_noChangeToTypeAnnotation() async {
+    await analyze('int x = 0;');
+    var typeName = findNode.typeName('int');
+    var previewInfo = run({
+      typeName: NodeChangeForTypeAnnotation()
+        ..decoratedType = MockDecoratedType(
+            MockDartType(toStringValueWithoutNullability: 'int'))
+    });
+    expect(previewInfo.applyTo(code), 'int x = 0;');
+    expect(previewInfo.applyTo(code, includeInformative: true), 'int  x = 0;');
+    expect(previewInfo.values.single.single.info.description.appliedMessage,
+        "Type 'int' was not made nullable");
+  }
+
+  Future<void> test_noInfoForTypeAnnotation() async {
+    await analyze('int x = 0;');
+    var typeName = findNode.typeName('int');
+    var previewInfo = run({typeName: NodeChangeForTypeAnnotation()});
+    expect(previewInfo, null);
+  }
+
   Future<void> test_nullCheck_index_cascadeResult() async {
     await analyze('f(a) => a..[0].c;');
     var index = findNode.index('[0]');
@@ -614,7 +911,7 @@
         ..removeNullAwareness = true,
       typeAnnotation: NodeChangeForTypeAnnotation()
         ..makeNullable = true
-        ..makeNullableType = MockDecoratedType(
+        ..decoratedType = MockDecoratedType(
             MockDartType(toStringValueWithoutNullability: 'int'))
     });
     expect(previewInfo.applyTo(code), 'f(x) => x.m<int?>();');
diff --git a/pkg/nnbd_migration/test/fix_builder_test.dart b/pkg/nnbd_migration/test/fix_builder_test.dart
index bded508..228047a 100644
--- a/pkg/nnbd_migration/test/fix_builder_test.dart
+++ b/pkg/nnbd_migration/test/fix_builder_test.dart
@@ -46,6 +46,9 @@
   static final isMakeNullable = TypeMatcher<NodeChangeForTypeAnnotation>()
       .having((c) => c.makeNullable, 'makeNullable', true);
 
+  static final isExplainNonNullable = TypeMatcher<NodeChangeForTypeAnnotation>()
+      .having((c) => c.makeNullable, 'makeNullable', false);
+
   static final isNullCheck = TypeMatcher<NodeChangeForExpression>()
       .having((c) => c.addsNullCheck, 'addsNullCheck', true);
 
@@ -78,7 +81,16 @@
           FixBuilder fixBuilder, AstNode scope) =>
       {
         for (var entry in fixBuilder.changes.entries)
-          if (_isInScope(entry.key, scope)) entry.key: entry.value
+          if (_isInScope(entry.key, scope) && !entry.value.isInformative)
+            entry.key: entry.value
+      };
+
+  Map<AstNode, NodeChange> scopedInformative(
+          FixBuilder fixBuilder, AstNode scope) =>
+      {
+        for (var entry in fixBuilder.changes.entries)
+          if (_isInScope(entry.key, scope) && entry.value.isInformative)
+            entry.key: entry.value
       };
 
   Map<AstNode, Set<Problem>> scopedProblems(
@@ -1216,8 +1228,18 @@
   void Function() x = _f;
 }
 ''');
-    visitTypeAnnotation(
-        findNode.genericFunctionType('Function'), 'void Function()');
+    var genericFunctionType = findNode.genericFunctionType('Function');
+    visitTypeAnnotation(genericFunctionType, 'void Function()',
+        informative: {genericFunctionType: isExplainNonNullable});
+  }
+
+  Future<void> test_genericFunctionType_nonNullable_by_context() async {
+    await analyze('''
+typedef F = void Function();
+''');
+    var genericFunctionType = findNode.genericFunctionType('Function');
+    visitTypeAnnotation(genericFunctionType, 'void Function()',
+        informative: isEmpty);
   }
 
   Future<void> test_genericFunctionType_nullable() async {
@@ -2575,7 +2597,17 @@
   int i = 0;
 }
 ''');
-    visitTypeAnnotation(findNode.typeAnnotation('int'), 'int');
+    var typeAnnotation = findNode.typeAnnotation('int');
+    visitTypeAnnotation(typeAnnotation, 'int',
+        informative: {typeAnnotation: isExplainNonNullable});
+  }
+
+  Future<void> test_typeName_simple_nonNullable_by_context() async {
+    await analyze('''
+class C extends Object {}
+''');
+    visitTypeAnnotation(findNode.typeAnnotation('Object'), 'Object',
+        informative: isEmpty);
   }
 
   Future<void> test_typeName_simple_nullable() async {
@@ -2715,13 +2747,15 @@
 
   void visitTypeAnnotation(TypeAnnotation node, String expectedType,
       {Map<AstNode, Matcher> changes = const <AstNode, Matcher>{},
-      Map<AstNode, Set<Problem>> problems = const <AstNode, Set<Problem>>{}}) {
+      Map<AstNode, Set<Problem>> problems = const <AstNode, Set<Problem>>{},
+      dynamic informative = anything}) {
     var fixBuilder = _createFixBuilder(node);
     fixBuilder.visitAll();
     var type = node.type;
     expect(type.getDisplayString(withNullability: true), expectedType);
     expect(scopedChanges(fixBuilder, node), changes);
     expect(scopedProblems(fixBuilder, node), problems);
+    expect(scopedInformative(fixBuilder, node), informative);
   }
 
   AssignmentTargetInfo _computeAssignmentTargetInfo(
diff --git a/pkg/nnbd_migration/test/instrumentation_test.dart b/pkg/nnbd_migration/test/instrumentation_test.dart
index a27e8f4..3f20a56 100644
--- a/pkg/nnbd_migration/test/instrumentation_test.dart
+++ b/pkg/nnbd_migration/test/instrumentation_test.dart
@@ -29,7 +29,11 @@
   @override
   void changes(Source source, Map<int, List<AtomicEdit>> changes) {
     expect(test.changes, isNull);
-    test.changes = changes;
+    test.changes = {
+      for (var entry in changes.entries)
+        if (entry.value.any((edit) => !edit.isInformative))
+          entry.key: entry.value
+    };
   }
 
   @override
diff --git a/pkg/nnbd_migration/test/node_builder_test.dart b/pkg/nnbd_migration/test/node_builder_test.dart
index f6e8bbc..7a1fcf7 100644
--- a/pkg/nnbd_migration/test/node_builder_test.dart
+++ b/pkg/nnbd_migration/test/node_builder_test.dart
@@ -454,6 +454,24 @@
         same(decoratedTypeAnnotation('V> {').node));
   }
 
+  Future<void> test_displayName_explicitParameterType_named() async {
+    await analyze('void f({int x, int y}) {}');
+    expect(decoratedTypeAnnotation('int x').node.displayName,
+        'parameter x of f (test.dart:1:9)');
+    expect(decoratedTypeAnnotation('int y').node.displayName,
+        'parameter y of f (test.dart:1:16)');
+  }
+
+  Future<void> test_displayName_explicitParameterType_positional() async {
+    await analyze('void f(int x, int y, [int z]) {}');
+    expect(decoratedTypeAnnotation('int x').node.displayName,
+        'parameter 0 of f (test.dart:1:8)');
+    expect(decoratedTypeAnnotation('int y').node.displayName,
+        'parameter 1 of f (test.dart:1:15)');
+    expect(decoratedTypeAnnotation('int z').node.displayName,
+        'parameter 2 of f (test.dart:1:23)');
+  }
+
   Future<void> test_dynamic_type() async {
     await analyze('''
 dynamic f() {}
@@ -656,7 +674,8 @@
 }
 ''');
     var decoratedType = decoratedTypeAnnotation('int');
-    expect(decoratedType.node.displayName, 'return type of C.f');
+    expect(
+        decoratedType.node.displayName, 'return type of C.f (test.dart:2:3)');
   }
 
   Future<void> test_function_generic_bounded() async {
@@ -903,7 +922,7 @@
     expect(decoratedIntType.node, isNotNull);
     expect(decoratedIntType.node, isNot(never));
     expect(decoratedType.returnType.node.displayName,
-        'return type of explicit type (test.dart:1:8)');
+        'parameter 0 of f (test.dart:1:8)');
   }
 
   Future<void> test_genericFunctionType_syntax_inferred_dynamic_return() async {
@@ -1010,7 +1029,8 @@
     expect(decoratedType.typeFormals, isEmpty);
     expect(decoratedType.positionalParameters[0],
         same(decoratedTypeAnnotation('String')));
-    expect(decoratedType.returnType.node.displayName, 'return type of F');
+    expect(decoratedType.returnType.node.displayName,
+        'return type of F (test.dart:1:13)');
   }
 
   Future<void> test_interfaceType_generic_instantiate_to_dynamic() async {
@@ -1642,8 +1662,8 @@
         decoratedType.returnType.node, TypeMatcher<NullabilityNodeMutable>());
     expect(decoratedType.returnType.node,
         isNot(same(typedefDecoratedType.returnType.node)));
-    expect(
-        typedefDecoratedType.returnType.node.displayName, 'return type of F');
+    expect(typedefDecoratedType.returnType.node.displayName,
+        'return type of F (test.dart:1:9)');
     expect(decoratedType.returnType.node.displayName,
         'return type of explicit type (test.dart:2:1)');
     _assertType(decoratedType.positionalParameters[0].type, 'String');
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 53d5295..18134be 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -120,6 +120,7 @@
 mutation_observer: Skip # Skip tests on the VM if the package depends on dart:html
 
 [ $runtime != vm ]
+dds/test/*: SkipByDesign # Only meant to run on vm
 dev_compiler/test/options/*: SkipByDesign
 front_end/test/hot_reload_e2e_test: Skip
 frontend_server/test/*: SkipByDesign # Only meant to run on vm
diff --git a/pkg/telemetry/lib/crash_reporting.dart b/pkg/telemetry/lib/crash_reporting.dart
index 808c4ac..1590da8 100644
--- a/pkg/telemetry/lib/crash_reporting.dart
+++ b/pkg/telemetry/lib/crash_reporting.dart
@@ -126,15 +126,20 @@
       }
 
       final Chain chain = new Chain.forTrace(stackTrace);
-      req.files.add(new http.MultipartFile.fromString(
-          _stackTraceFileField, chain.terse.toString(),
-          filename: _stackTraceFilename));
+      req.files.add(
+        new http.MultipartFile.fromString(
+          _stackTraceFileField,
+          chain.terse.toString(),
+          filename: _stackTraceFilename,
+        ),
+      );
 
       for (var attachment in attachments) {
         req.files.add(
           new http.MultipartFile.fromString(
             attachment._field,
             attachment._value,
+            filename: attachment._field,
           ),
         );
       }
diff --git a/pkg/test_runner/lib/src/utils.dart b/pkg/test_runner/lib/src/utils.dart
index ca61d45..7daa0eb 100644
--- a/pkg/test_runner/lib/src/utils.dart
+++ b/pkg/test_runner/lib/src/utils.dart
@@ -27,8 +27,7 @@
   "matcher",
   "meta",
   "path",
-  "stack_trace",
-  "unittest"
+  "stack_trace"
 ];
 
 // TODO(nshahan): Grow this list until it matches the list above. We are
diff --git a/pkg/testing/lib/src/discover.dart b/pkg/testing/lib/src/discover.dart
index 9b82e8a..3fd09e9 100644
--- a/pkg/testing/lib/src/discover.dart
+++ b/pkg/testing/lib/src/discover.dart
@@ -64,9 +64,15 @@
   return Uri.base.resolve(".packages");
 }
 
+// TODO(eernst): Use `bool.hasEnvironment` below when possible;
+// for now we use a dual `defaultValue` rewrite.
+const _dartSdk = (String.fromEnvironment("DART_SDK", defaultValue: "1") ==
+        String.fromEnvironment("DART_SDK", defaultValue: "2"))
+    ? String.fromEnvironment("DART_SDK")
+    : null;
+
 Uri computeDartSdk() {
-  String dartSdkPath = Platform.environment["DART_SDK"] ??
-      const String.fromEnvironment("DART_SDK");
+  String dartSdkPath = Platform.environment["DART_SDK"] ?? _dartSdk;
   if (dartSdkPath != null) {
     return Uri.base.resolveUri(new Uri.file(dartSdkPath));
   } else {
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index d947d92..7109a15 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -820,6 +820,9 @@
         library.importUri.toString() == 'dart:_internal') {
       return false;
     }
+    if (member is Procedure && member.isMemberSignature) {
+      return false;
+    }
     return true;
   }
 
diff --git a/pkg/vm/lib/transformations/list_factory_specializer.dart b/pkg/vm/lib/transformations/list_factory_specializer.dart
index ca9df25..ad989c3 100644
--- a/pkg/vm/lib/transformations/list_factory_specializer.dart
+++ b/pkg/vm/lib/transformations/list_factory_specializer.dart
@@ -7,25 +7,36 @@
 import 'package:kernel/ast.dart';
 import 'package:kernel/core_types.dart' show CoreTypes;
 
-/// Replaces new List() and new List(n) with VM-specific
-/// new _GrowableList(0) and new _List(n).
+/// Replaces invocation of List factory constructors with
+/// factories of VM-specific classes.
+///
+/// new List() => new _GrowableList(0)
+/// new List(n) => new _List(n)
+/// new List.filled(n, null, growable: true) => new _GrowableList(n)
+/// new List.filled(n, null) => new _List(n)
+///
 void transformLibraries(List<Library> libraries, CoreTypes coreTypes) {
   final transformer = new _ListFactorySpecializer(coreTypes);
   libraries.forEach(transformer.visitLibrary);
 }
 
 class _ListFactorySpecializer extends Transformer {
-  final Procedure _listFactory;
+  final Procedure _defaultListFactory;
+  final Procedure _listFilledFactory;
   final Procedure _growableListFactory;
   final Procedure _fixedListFactory;
 
   _ListFactorySpecializer(CoreTypes coreTypes)
-      : _listFactory = coreTypes.index.getMember('dart:core', 'List', ''),
+      : _defaultListFactory =
+            coreTypes.index.getMember('dart:core', 'List', ''),
+        _listFilledFactory =
+            coreTypes.index.getMember('dart:core', 'List', 'filled'),
         _growableListFactory =
             coreTypes.index.getMember('dart:core', '_GrowableList', ''),
         _fixedListFactory =
             coreTypes.index.getMember('dart:core', '_List', '') {
-    assert(_listFactory.isFactory);
+    assert(_defaultListFactory.isFactory);
+    assert(_listFilledFactory.isFactory);
     assert(_growableListFactory.isFactory);
     assert(_fixedListFactory.isFactory);
   }
@@ -34,15 +45,53 @@
   visitStaticInvocation(StaticInvocation node) {
     super.visitStaticInvocation(node);
 
-    if (node.target == _listFactory) {
-      if (node.arguments.positional.isEmpty) {
-        return new StaticInvocation(_growableListFactory,
-            new Arguments([new IntLiteral(0)], types: node.arguments.types))
-          ..parent = node.parent
+    final target = node.target;
+    if (target == _defaultListFactory) {
+      final args = node.arguments;
+      if (args.positional.isEmpty) {
+        return StaticInvocation(_growableListFactory,
+            Arguments([new IntLiteral(0)], types: args.types))
           ..fileOffset = node.fileOffset;
       } else {
-        return new StaticInvocation(_fixedListFactory, node.arguments)
-          ..parent = node.parent
+        return StaticInvocation(_fixedListFactory, args)
+          ..fileOffset = node.fileOffset;
+      }
+    } else if (target == _listFilledFactory) {
+      final args = node.arguments;
+      assert(args.positional.length == 2);
+      final length = args.positional[0];
+      final fill = args.positional[1];
+      if (fill is! NullLiteral &&
+          !(fill is ConstantExpression && fill.constant is NullConstant)) {
+        return node;
+      }
+      bool growable;
+      if (args.named.isEmpty) {
+        growable = false;
+      } else {
+        final namedArg = args.named.single;
+        assert(namedArg.name == 'growable');
+        final value = namedArg.value;
+        if (value is BoolLiteral) {
+          growable = value.value;
+        } else if (value is ConstantExpression) {
+          final constant = value.constant;
+          if (constant is BoolConstant) {
+            growable = constant.value;
+          } else {
+            return node;
+          }
+        } else {
+          return node;
+        }
+      }
+      if (growable) {
+        return StaticInvocation(
+            _growableListFactory, Arguments([length], types: args.types))
+          ..fileOffset = node.fileOffset;
+      } else {
+        return StaticInvocation(
+            _fixedListFactory, Arguments([length], types: args.types))
           ..fileOffset = node.fileOffset;
       }
     }
diff --git a/pkg/vm/lib/transformations/type_flow/utils.dart b/pkg/vm/lib/transformations/type_flow/utils.dart
index 164a6e9..379c1ed 100644
--- a/pkg/vm/lib/transformations/type_flow/utils.dart
+++ b/pkg/vm/lib/transformations/type_flow/utils.dart
@@ -32,7 +32,7 @@
     const bool.fromEnvironment('global.type.flow.scope.trace');
 
 const int kScopeIndent =
-    const int.fromEnvironment('global.type.flow.scope.indent');
+    const int.fromEnvironment('global.type.flow.scope.indent', defaultValue: 1);
 
 /// Extended 'assert': always checks condition.
 assertx(bool cond, {details}) {
@@ -57,7 +57,7 @@
     "\u001b[35m", // magenta
     "\u001b[36m", // cyan
   ];
-  static const int _scopeIndent = kScopeIndent ?? 1;
+  static const int _scopeIndent = kScopeIndent;
 
   int _scope = 0;
   List<String> _scopePrefixes = <String>[""];
diff --git a/pkg/vm/testcases/bytecode/asserts.dart.expect b/pkg/vm/testcases/bytecode/asserts.dart.expect
index d8c3913..4149a93 100644
--- a/pkg/vm/testcases/bytecode/asserts.dart.expect
+++ b/pkg/vm/testcases/bytecode/asserts.dart.expect
@@ -90,7 +90,7 @@
     assert(condition);
   }
   static method test2(() →* dart.core::bool* condition, () →* dart.core::String* message) → void {
-    assert([@vm.call-site-attributes.metadata=receiverType:() →* dart.core::bool*] condition.call(), [@vm.call-site-attributes.metadata=receiverType:() →* dart.core::String*] message.call());
+    assert([@vm.call-site-attributes.metadata=receiverType:FunctionType()] condition.call(), [@vm.call-site-attributes.metadata=receiverType:FunctionType()] message.call());
   }
   static method main() → dynamic {}
 }
diff --git a/pkg/vm/testcases/bytecode/closures.dart.expect b/pkg/vm/testcases/bytecode/closures.dart.expect
index 558d02f..fd792c7 100644
--- a/pkg/vm/testcases/bytecode/closures.dart.expect
+++ b/pkg/vm/testcases/bytecode/closures.dart.expect
@@ -1770,13 +1770,13 @@
             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?] nested3.call();
+          [@vm.call-site-attributes.metadata=receiverType:FunctionType()] nested3.call();
         }
-        [@vm.call-site-attributes.metadata=receiverType:<T7 extends dart.core::Object* = dynamic, T8 extends dart.core::Object* = dynamic>() →* void] nested2.call<#lib::C7*, #lib::C8*>();
-        [@vm.call-site-attributes.metadata=receiverType:<T7 extends dart.core::Object* = dynamic, T8 extends dart.core::Object* = dynamic>() →* void] nested2.call<dart.core::List<#lib::C7*>*, dart.core::List<#lib::C8*>*>();
+        [@vm.call-site-attributes.metadata=receiverType:FunctionType()] nested2.call<#lib::C7*, #lib::C8*>();
+        [@vm.call-site-attributes.metadata=receiverType:FunctionType()] nested2.call<dart.core::List<#lib::C7*>*, dart.core::List<#lib::C8*>*>();
       }
-      [@vm.call-site-attributes.metadata=receiverType:<T5 extends dart.core::Object* = dynamic, T6 extends dart.core::Object* = dynamic>() →* void] nested1.call<#lib::C5*, #lib::C6*>();
-      [@vm.call-site-attributes.metadata=receiverType:<T5 extends dart.core::Object* = dynamic, T6 extends dart.core::Object* = dynamic>() →* void] nested1.call<dart.core::List<#lib::C5*>*, dart.core::List<#lib::C6*>*>();
+      [@vm.call-site-attributes.metadata=receiverType:FunctionType()] nested1.call<#lib::C5*, #lib::C6*>();
+      [@vm.call-site-attributes.metadata=receiverType:FunctionType()] nested1.call<dart.core::List<#lib::C5*>*, dart.core::List<#lib::C6*>*>();
     }
   }
   class B extends dart.core::Object {
@@ -1798,12 +1798,12 @@
                 z = x.{dart.core::num::+}(2);
                 w = this.{#lib::B::foo}.{dart.core::num::+}(y);
               }
-              [@vm.call-site-attributes.metadata=receiverType:() →* void] closure2.call();
+              [@vm.call-site-attributes.metadata=receiverType:FunctionType()] closure2.call();
               dart.core::print(w);
             }
           };
-          [@vm.call-site-attributes.metadata=receiverType:(dart.core::int*) →* dart.core::Null?] closure1.call(10);
-          [@vm.call-site-attributes.metadata=receiverType:(dart.core::int*) →* dart.core::Null?] closure1.call(11);
+          [@vm.call-site-attributes.metadata=receiverType:FunctionType()] closure1.call(10);
+          [@vm.call-site-attributes.metadata=receiverType:FunctionType()] closure1.call(11);
           dart.core::print(y);
           dart.core::print(z);
         }
@@ -1814,7 +1814,7 @@
         () →* dart.core::Null? closure3 = () → dart.core::Null? {
           this.{#lib::B::foo} = x;
         };
-        [@vm.call-site-attributes.metadata=receiverType:() →* dart.core::Null?] closure3.call();
+        [@vm.call-site-attributes.metadata=receiverType:FunctionType()] closure3.call();
       }
     }
   }
@@ -1827,8 +1827,8 @@
       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? {
+        [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::List*)] getI.{dart.core::List::add}(() → dart.core::int* => i.{dart.core::num::+}(delta));
+        [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::List*)] setI.{dart.core::List::add}((dart.core::int* ii) → dart.core::Null? {
           i = ii.{dart.core::num::+}(delta);
         });
       }
@@ -1842,7 +1842,7 @@
             () →* dart.core::Null? inc = () → dart.core::Null? {
               i = i.{dart.core::num::+}(1);
             };
-            [@vm.call-site-attributes.metadata=receiverType:() →* dart.core::Null?] inc.call();
+            [@vm.call-site-attributes.metadata=receiverType:FunctionType()] inc.call();
             dart.core::print(i);
           }
         }
@@ -1859,7 +1859,7 @@
     method bar() → dynamic {
       return () → dart.core::Null? {
         function inner() → dart.core::Null? {}
-        [@vm.call-site-attributes.metadata=receiverType:() →* dart.core::Null?] inner.call();
+        [@vm.call-site-attributes.metadata=receiverType:FunctionType()] inner.call();
       };
     }
   }
@@ -1873,18 +1873,18 @@
     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*, dart.core::int*) →* dart.core::int*] this.{#lib::E::foo1}.call(#t1, #t2);
+      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:FunctionType()] 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:<T extends dart.core::Object* = dynamic>(T*, T*) →* dart.core::int*] this.{#lib::E::foo2}.call<dart.core::int*>(#t3, #t4);
+      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:FunctionType()] 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:<T extends dart.core::Object* = dynamic>(T*, T*) →* dart.core::int*] #t5.{#lib::E::foo2}.call<dart.core::int*>(#t6, #t7);
+      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:FunctionType()] #t5.{#lib::E::foo2}.call<dart.core::int*>(#t6, #t7);
   }
   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::int*) →* dart.core::Null?] inc.call(3);
+    [@vm.call-site-attributes.metadata=receiverType:FunctionType()] 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 {
diff --git a/pkg/vm/testcases/bytecode/try_blocks.dart.expect b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
index 4bc3448..1d0580f 100644
--- a/pkg/vm/testcases/bytecode/try_blocks.dart.expect
+++ b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
@@ -1033,7 +1033,7 @@
           y = 3;
         }
       }
-      [@vm.call-site-attributes.metadata=receiverType:() →* void] foo.call();
+      [@vm.call-site-attributes.metadata=receiverType:FunctionType()] foo.call();
       dart.core::print(y);
     }
     on dynamic catch(final dynamic e, final dart.core::StackTrace* st) {
@@ -1099,7 +1099,7 @@
                 dart.core::print(x);
                 dart.core::print(y);
               }
-              [@vm.call-site-attributes.metadata=receiverType:() →* void] foo.call();
+              [@vm.call-site-attributes.metadata=receiverType:FunctionType()] foo.call();
               continue #L4;
             }
             finally {
diff --git a/pkg/vm/testcases/bytecode/type_ops.dart.expect b/pkg/vm/testcases/bytecode/type_ops.dart.expect
index 02d8487..1293a71 100644
--- a/pkg/vm/testcases/bytecode/type_ops.dart.expect
+++ b/pkg/vm/testcases/bytecode/type_ops.dart.expect
@@ -706,7 +706,7 @@
       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*>*;
+      [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to #lib::D*)] 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*>*) {
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
index f99332f..80c11a9 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
@@ -6,22 +6,22 @@
 RESULT: _T {}?
 ------------ #lib::bool_expressions ------------
 t0* = _Call direct [#lib::foo] ()
-t1 = _TypeCheck (t0 against dart.core::bool) (for #lib::foo() as{TypeError,ForDynamic} dart.core::bool*)
+t1 = _TypeCheck (t0 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
 t2* = _Call direct [#lib::bar] ()
 t3* = _Call [dart.core::num::+] (_T (dart.core::int)+, _T (dart.core::_Smi, 1))
-i_0 = _Join [dart.core::int*] (_T (dart.core::_Smi, 0), t3)
+i_0 = _Join [InterfaceType(Reference to root::dart:core::int*)] (_T (dart.core::_Smi, 0), t3)
 t5* = _Call [dart.core::num::<] (i_0, _T (dart.core::_Smi, 10))
 t6* = _Call direct [#lib::bar] ()
 t7* = _Call direct [#lib::foo] ()
 t8 = _Join [dynamic] (_T (dart.core::bool, true), t7)
-t9 = _TypeCheck (t8 against dart.core::bool) (for (x{dart.core::bool*} ?{dynamic} true : #lib::foo()) as{TypeError,ForDynamic} dart.core::bool*)
+t9 = _TypeCheck (t8 against dart.core::bool) (for AsExpression(ConditionalExpression(VariableGetImpl() ? BoolLiteral(true) : StaticInvocation(Reference to #lib::foo, ArgumentsImpl())) as InterfaceType(Reference to root::dart:core::bool*)))
 t10* = _Call direct [#lib::bar] ()
 t11* = _Call direct [#lib::bar] ()
 t12* = _Call direct [#lib::foo] ()
-t13 = _TypeCheck (t12 against dart.core::bool) (for #lib::foo() as{TypeError,ForDynamic} dart.core::bool*)
+t13 = _TypeCheck (t12 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
 t14* = _Call direct [#lib::foo] ()
-t15 = _TypeCheck (t14 against dart.core::bool) (for #lib::foo() as{TypeError,ForDynamic} dart.core::bool*)
-y_0 = _Join [dart.core::bool*] (_T (dart.core::bool), _T (dart.core::bool, true))
+t15 = _TypeCheck (t14 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
+y_0 = _Join [InterfaceType(Reference to root::dart:core::bool*)] (_T (dart.core::bool), _T (dart.core::bool, true))
 RESULT: _T {}?
 ------------ #lib::main ------------
 
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart.expect
index 50d02f9b..721f2bd 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart.expect
@@ -38,7 +38,7 @@
 t6 = _Call [#lib::A::foo1] (%aa, _T (#lib::B))
 t7 = _Narrow (%aa to _T ANY)
 t8* = _Call get [#lib::A::foo2] (t7)
-t9 = _TypeCheck (t8 against dart.core::int) (for aa.{#lib::A::foo2} as{TypeError,ForDynamic} dart.core::int*)
+t9 = _TypeCheck (t8 against dart.core::int) (for AsExpression(PropertyGet(VariableGetImpl().foo2) as InterfaceType(Reference to root::dart:core::int*)))
 t10 = _Call set [#lib::A::foo3] (t7, t9)
 t11* = _Call get [#lib::A::foo1] (t7)
 t12* = _Call get [#lib::A::foo2] (t7)
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/constants.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/constants.dart.expect
index 7741659..b471e61 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/constants.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/constants.dart.expect
@@ -9,18 +9,18 @@
 RESULT: _T (dart.core::_OneByteString, abc)
 ------------ #lib::indexingIntoConstantList1 ------------
 %i = _Parameter #0 [_T (dart.core::int)+?]
-t1 = _Join [dart.core::int*] (_T (dart.core::_Smi, 1), _T (dart.core::_Smi, 2), _T (dart.core::_Smi, 3))
+t1 = _Join [InterfaceType(Reference to root::dart:core::int*)] (_T (dart.core::_Smi, 1), _T (dart.core::_Smi, 2), _T (dart.core::_Smi, 3))
 RESULT: t1
 ------------ #lib::indexingIntoConstantList2 ------------
 %i = _Parameter #0 [_T (dart.core::int)+?]
-t1 = _Join [dart.core::Object*] (_T (dart.core::_OneByteString, hi), _T (dart.core::_Smi, 33), _T {}?, _T (dart.core::_Smi, -5))
+t1 = _Join [InterfaceType(Reference to root::dart:core::Object*)] (_T (dart.core::_OneByteString, hi), _T (dart.core::_Smi, 33), _T {}?, _T (dart.core::_Smi, -5))
 RESULT: t1
 ------------ #lib::main ------------
 
 RESULT: _T {}?
 ------------ #lib::_constList1 ------------
 
-RESULT: _T (dart.core::_ImmutableList, ListConstant<dart.core::int*>([1, 2, 3]))
+RESULT: _T (dart.core::_ImmutableList, ListConstant<InterfaceType(Reference to root::dart:core::int*)>([1, 2, 3]))
 ------------ #lib::_constList2 ------------
 
-RESULT: _T (dart.core::_ImmutableList, ListConstant<dart.core::Object*>([hi, 33, null, -5]))
+RESULT: _T (dart.core::_ImmutableList, ListConstant<InterfaceType(Reference to root::dart:core::Object*)>([hi, 33, null, -5]))
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/control_flow.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/control_flow.dart.expect
index eba9380..460c362 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/control_flow.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/control_flow.dart.expect
@@ -28,7 +28,7 @@
 RESULT: t1
 ------------ #lib::TestEnum::values ------------
 
-RESULT: _T (dart.core::_ImmutableList, ListConstant<#lib::TestEnum*>([#lib::TestEnum {index: 0, #lib::_name: TestEnum.v1, }, #lib::TestEnum {index: 1, #lib::_name: TestEnum.v2, }]))
+RESULT: _T (dart.core::_ImmutableList, ListConstant<InterfaceType(Reference to #lib::TestEnum*)>([#lib::TestEnum {index: 0, #lib::_name: TestEnum.v1, }, #lib::TestEnum {index: 1, #lib::_name: TestEnum.v2, }]))
 ------------ #lib::TestEnum::v1 ------------
 
 RESULT: _T (#lib::TestEnum, #lib::TestEnum {index: 0, #lib::_name: TestEnum.v1, })
@@ -71,10 +71,10 @@
 t2 = _Call direct [#lib::C1::] (_T (#lib::C1))
 t3 = _Call direct [#lib::C2::] (_T (#lib::C2))
 t4* = _Call direct [#lib::foo] (_T (#lib::C2))
-t5 = _TypeCheck (t4 against dart.core::bool) (for #lib::foo(x = new #lib::C2::•()) as{TypeError,ForDynamic} dart.core::bool*)
+t5 = _TypeCheck (t4 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
 t6 = _Call direct [#lib::C3::] (_T (#lib::C3))
 t7* = _Call direct [#lib::foo] (_T (#lib::C3))
-t8 = _TypeCheck (t7 against dart.core::bool) (for #lib::foo(x = new #lib::C3::•()) as{TypeError,ForDynamic} dart.core::bool*)
+t8 = _TypeCheck (t7 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
 x_0 = _Join [dynamic] (_T (#lib::C2), _T (#lib::C3))
 t10 = _Call direct [#lib::bar] (x_0)
 RESULT: x_0
@@ -82,10 +82,10 @@
 t0 = _Call direct [#lib::C1::] (_T (#lib::C1))
 t1 = _Call direct [#lib::C2::] (_T (#lib::C2))
 t2* = _Call direct [#lib::foo] (_T (#lib::C2))
-t3 = _TypeCheck (t2 against dart.core::bool) (for #lib::foo(x = new #lib::C2::•()) as{TypeError,ForDynamic} dart.core::bool*)
+t3 = _TypeCheck (t2 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
 t4 = _Call direct [#lib::C3::] (_T (#lib::C3))
 t5* = _Call direct [#lib::foo] (_T (#lib::C3))
-t6 = _TypeCheck (t5 against dart.core::bool) (for #lib::foo(x = new #lib::C3::•()) as{TypeError,ForDynamic} dart.core::bool*)
+t6 = _TypeCheck (t5 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
 t7 = _Call direct [#lib::bar] (_T (#lib::C3))
 x_0 = _Join [dynamic] (_T (#lib::C2), _T (#lib::C3))
 RESULT: x_0
@@ -99,12 +99,12 @@
 %x = _Parameter #0 [_T (dart.core::bool)+?]
 t1 = _Call direct [#lib::foo] (_T (dart.core::bool, true))
 t2 = _Call direct [#lib::bar] (_T (dart.core::bool, false))
-x_0 = _Join [dart.core::bool*] (_T (dart.core::bool, true), _T (dart.core::bool, false))
+x_0 = _Join [InterfaceType(Reference to root::dart:core::bool*)] (_T (dart.core::bool, true), _T (dart.core::bool, false))
 t4 = _Call direct [#lib::baz] (x_0)
 RESULT: _T {}?
 ------------ #lib::if6b ------------
 %x = _Parameter #0 [_T ANY?]
-t1 = _TypeCheck (%x against dart.core::bool) (for x as{TypeError,ForDynamic} dart.core::bool*)
+t1 = _TypeCheck (%x against dart.core::bool) (for AsExpression(VariableGetImpl() as InterfaceType(Reference to root::dart:core::bool*)))
 t2 = _Call direct [#lib::foo] (_T (dart.core::bool, true))
 t3 = _Call direct [#lib::bar] (_T (dart.core::bool, false))
 x_0 = _Join [dynamic] (_T (dart.core::bool, true), _T (dart.core::bool, false))
@@ -138,12 +138,12 @@
 t2 = _Call direct [#lib::C1::] (_T (#lib::C1))
 t3 = _Call direct [#lib::C2::] (_T (#lib::C2))
 t4* = _Call direct [#lib::foo] (_T (#lib::C2))
-t5 = _TypeCheck (t4 against dart.core::bool) (for #lib::foo(x = new #lib::C2::•()) as{TypeError,ForDynamic} dart.core::bool*)
+t5 = _TypeCheck (t4 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
 t6 = _Call direct [#lib::C3::] (_T (#lib::C3))
 t7 = _Call direct [#lib::C4::] (_T (#lib::C4))
 x_0 = _Join [dynamic] (_T (#lib::C3), _T (#lib::C4))
 t9 = _Call direct [#lib::foo] (x_0)
-t10 = _Join [dart.core::Object*] (_T (#lib::C3), _T (#lib::C4))
+t10 = _Join [InterfaceType(Reference to root::dart:core::Object*)] (_T (#lib::C3), _T (#lib::C4))
 t11 = _Narrow (t10 to _T (dart.core::Object)+?)
 t12 = _Call direct [#lib::bar] (t11)
 RESULT: _T {}?
@@ -153,7 +153,7 @@
 t2 = _Call direct [#lib::C1::] (_T (#lib::C1))
 t3 = _Call direct [#lib::C2::] (_T (#lib::C2))
 t4* = _Call direct [#lib::foo] (_T (#lib::C2))
-t5 = _TypeCheck (t4 against dart.core::bool) (for #lib::foo(x = new #lib::C2::•()) as{TypeError,ForDynamic} dart.core::bool*)
+t5 = _TypeCheck (t4 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
 t6 = _Call direct [#lib::C3::] (_T (#lib::C3))
 t7 = _Call direct [#lib::C4::] (_T (#lib::C4))
 t8* = _Call direct [#lib::foo] (_T (dart.core::_GrowableList<#lib::C4>))
@@ -165,7 +165,7 @@
 t0 = _Call direct [#lib::C1::] (_T (#lib::C1))
 x_0 = _Join [dynamic] (_T (#lib::C1), _T (#lib::C2))
 t2* = _Call direct [#lib::foo] (x_0)
-t3 = _TypeCheck (t2 against dart.core::bool) (for #lib::foo(x) as{TypeError,ForDynamic} dart.core::bool*)
+t3 = _TypeCheck (t2 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
 t4 = _Call direct [#lib::C2::] (_T (#lib::C2))
 t5 = _Call direct [#lib::bar] (x_0)
 RESULT: x_0
@@ -177,13 +177,13 @@
 t4 = _Call direct [#lib::bar] (_T (#lib::C2))
 t5 = _Call direct [#lib::C3::] (_T (#lib::C3))
 t6* = _Call direct [#lib::bar] (_T (#lib::C3))
-t7 = _TypeCheck (t6 against dart.core::bool) (for #lib::bar(x = new #lib::C3::•()) as{TypeError,ForDynamic} dart.core::bool*)
+t7 = _TypeCheck (t6 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::bar, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
 RESULT: _T (#lib::C3)
 ------------ #lib::loop3 ------------
 t0 = _Call direct [#lib::C1::] (_T (#lib::C1))
 t1 = _Call direct [#lib::C2::] (_T (#lib::C2))
 t2* = _Call direct [#lib::foo] (_T (#lib::C2))
-t3 = _TypeCheck (t2 against dart.core::bool) (for #lib::foo(x = new #lib::C2::•()) as{TypeError,ForDynamic} dart.core::bool*)
+t3 = _TypeCheck (t2 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
 t4 = _Call direct [#lib::C3::] (_T (#lib::C3))
 t5 = _Call direct [#lib::bar] (_T (#lib::C2))
 RESULT: _T (#lib::C2)
@@ -204,10 +204,10 @@
 t0 = _Call direct [#lib::C1::] (_T (#lib::C1))
 x_0 = _Join [dynamic] (_T (#lib::C1), _T (#lib::C3))
 t2* = _Call direct [#lib::foo] (x_0)
-t3 = _TypeCheck (t2 against dart.core::bool) (for #lib::foo(x) as{TypeError,ForDynamic} dart.core::bool*)
+t3 = _TypeCheck (t2 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
 t4 = _Call direct [#lib::C2::] (_T (#lib::C2))
 t5* = _Call direct [#lib::bar] (_T (#lib::C2))
-t6 = _TypeCheck (t5 against dart.core::bool) (for #lib::bar(x) as{TypeError,ForDynamic} dart.core::bool*)
+t6 = _TypeCheck (t5 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::bar, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
 t7 = _Call direct [#lib::C3::] (_T (#lib::C3))
 x_1 = _Join [dynamic] (x_0, _T (#lib::C2))
 RESULT: x_1
@@ -216,10 +216,10 @@
 x_1 = _Join [dynamic] (_T (#lib::C3), _T (#lib::C2))
 x_0 = _Join [dynamic] (_T (#lib::C1), x_1)
 t3* = _Call direct [#lib::foo] (x_0)
-t4 = _TypeCheck (t3 against dart.core::bool) (for #lib::foo(x) as{TypeError,ForDynamic} dart.core::bool*)
+t4 = _TypeCheck (t3 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::foo, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
 t5 = _Call direct [#lib::C2::] (_T (#lib::C2))
 t6* = _Call direct [#lib::bar] (_T (#lib::C2))
-t7 = _TypeCheck (t6 against dart.core::bool) (for #lib::bar(x) as{TypeError,ForDynamic} dart.core::bool*)
+t7 = _TypeCheck (t6 against dart.core::bool) (for AsExpression(StaticInvocation(Reference to #lib::bar, ArgumentsImpl()) as InterfaceType(Reference to root::dart:core::bool*)))
 t8 = _Call direct [#lib::C3::] (_T (#lib::C3))
 RESULT: x_0
 ------------ #lib::try1 ------------
@@ -272,7 +272,7 @@
 RESULT: x_2
 ------------ #lib::cast1 ------------
 %x = _Parameter #0 [_T ANY?]
-t1 = _TypeCheck (%x against #lib::C1) (for x as #lib::C1*)
+t1 = _TypeCheck (%x against #lib::C1) (for AsExpression(VariableGetImpl() as InterfaceType(Reference to #lib::C1*)))
 t2 = _Call direct [#lib::foo] (t1)
 t3 = _Call direct [#lib::bar] (t1)
 RESULT: _T {}?
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect
index 2aff27c..c6281be 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect
@@ -11,11 +11,11 @@
 %a2 = _Parameter #1 [_T (dart.core::Object)+?]
 t2* = _Call direct get [#lib::someStatic] ()
 t3 = _Call direct [#lib::A::] (_T (#lib::A))
-a1_0 = _Join [dart.core::Object*] (_T (#lib::A), %a1)
+a1_0 = _Join [InterfaceType(Reference to root::dart:core::Object*)] (_T (#lib::A), %a1)
 t5 = _Call direct [#lib::bar] (a1_0, _T (dart.core::_Smi, 42))
 t6 = _Call direct [#lib::B::] (_T (#lib::B))
 t7* = _Call [dart.core::Object::==] (_T (#lib::B), %a2)
-t8 = _Join [dart.core::Object*] (_T (#lib::B), %a2)
+t8 = _Join [InterfaceType(Reference to root::dart:core::Object*)] (_T (#lib::B), %a2)
 t9 = _Narrow (t8 to _T (dart.core::Object)+?)
 RESULT: t9
 ------------ #lib::bar ------------
@@ -25,7 +25,7 @@
 t3* = _Call [dart.core::num::+] (t2, %a2)
 t4* = _Call [dart.core::num::*] (t3, _T (dart.core::_Smi, 3))
 t5* = _Call [dart.core::int::unary-] (_T (dart.core::_Smi, 1))
-%result = _Join [dart.core::int*] (t4, t5)
+%result = _Join [InterfaceType(Reference to root::dart:core::int*)] (t4, t5)
 RESULT: %result
 ------------ #lib::loop1 ------------
 %a1 = _Parameter #0 [_T (dart.core::Object)+?]
@@ -35,10 +35,10 @@
 ------------ #lib::loop2 ------------
 %x = _Parameter #0 [_T (dart.core::int)+?]
 t1* = _Call [dart.core::num::+] (_T (dart.core::int)+, _T (dart.core::_Smi, 1))
-i_0 = _Join [dart.core::int*] (_T (dart.core::_Smi, 0), t1)
+i_0 = _Join [InterfaceType(Reference to root::dart:core::int*)] (_T (dart.core::_Smi, 0), t1)
 t3* = _Call [dart.core::num::<] (i_0, _T (dart.core::_Smi, 5))
 t4* = _Call [dart.core::num::+] (_T (dart.core::int)+?, _T (dart.core::_Smi, 10))
-x_0 = _Join [dart.core::int*] (%x, t4)
+x_0 = _Join [InterfaceType(Reference to root::dart:core::int*)] (%x, t4)
 RESULT: x_0
 ------------ #lib::main ------------
 
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect
index fd9dd20..6188f8a 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect
@@ -23,7 +23,7 @@
     : super self::C::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → dynamic
-    return [@vm.inferred-type.metadata=#lib::D<dart.core::String*>] super.{self::C::foo}();
+    return [@vm.inferred-type.metadata=#lib::D<InterfaceType(Reference to root::dart:core::String*)>] super.{self::C::foo}();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  method bar() → dynamic
     return new self::D::•<self::E::S*>();
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method baz() → dynamic
@@ -59,18 +59,18 @@
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12]  method id3([@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.0)] generic-covariant-impl core::Comparable<self::C2::T*>* x) → dynamic
     return x;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14]  method id4([@vm.inferred-type.metadata=#lib::K<#lib::J*> (skip check)] generic-covariant-impl self::K<self::I<self::C2::T*>*>* x) → dynamic
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14]  method id4([@vm.inferred-type.metadata=#lib::K<InterfaceType(Reference to #lib::J*)> (skip check)] generic-covariant-impl self::K<self::I<self::C2::T*>*>* x) → dynamic
     return x;
 }
 static method main() → dynamic {
-  core::print([@vm.direct-call.metadata=#lib::C::foo] [@vm.inferred-type.metadata=#lib::D<dart.core::int*> (skip check)] new self::C::•<core::int*>().{self::C::foo}());
-  core::print([@vm.direct-call.metadata=#lib::E::foo] [@vm.inferred-type.metadata=#lib::D<dart.core::String*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::foo}());
-  core::print([@vm.direct-call.metadata=#lib::E::bar] [@vm.inferred-type.metadata=#lib::D<dart.core::int*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::bar}());
-  core::print([@vm.direct-call.metadata=#lib::E::baz] [@vm.inferred-type.metadata=#lib::D<dart.core::String*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::baz}());
+  core::print([@vm.direct-call.metadata=#lib::C::foo] [@vm.inferred-type.metadata=#lib::D<InterfaceType(Reference to root::dart:core::int*)> (skip check)] new self::C::•<core::int*>().{self::C::foo}());
+  core::print([@vm.direct-call.metadata=#lib::E::foo] [@vm.inferred-type.metadata=#lib::D<InterfaceType(Reference to root::dart:core::String*)> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::foo}());
+  core::print([@vm.direct-call.metadata=#lib::E::bar] [@vm.inferred-type.metadata=#lib::D<InterfaceType(Reference to root::dart:core::int*)> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::bar}());
+  core::print([@vm.direct-call.metadata=#lib::E::baz] [@vm.inferred-type.metadata=#lib::D<InterfaceType(Reference to root::dart:core::String*)> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::baz}());
   self::C<self::X*>* c = new self::C::•<self::Y*>();
-  [@vm.call-site-attributes.metadata=receiverType:#lib::C<#lib::X*>*] [@vm.direct-call.metadata=#lib::C::id1] [@vm.inferred-type.metadata=!? (skip check)] c.{self::C::id1}(new self::Y::•());
-  [@vm.call-site-attributes.metadata=receiverType:#lib::C<#lib::X*>*] [@vm.direct-call.metadata=#lib::C::id2] c.{self::C::id2}(new self::Z::•());
+  [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to #lib::C*)] [@vm.direct-call.metadata=#lib::C::id1] [@vm.inferred-type.metadata=!? (skip check)] c.{self::C::id1}(new self::Y::•());
+  [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to #lib::C*)] [@vm.direct-call.metadata=#lib::C::id2] c.{self::C::id2}(new self::Z::•());
   self::C2<core::num*>* c2 = new self::C2::•<core::num*>();
-  [@vm.call-site-attributes.metadata=receiverType:#lib::C2<dart.core::num*>*] [@vm.direct-call.metadata=#lib::C2::id3] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id3}(3.0);
-  [@vm.call-site-attributes.metadata=receiverType:#lib::C2<dart.core::num*>*] [@vm.direct-call.metadata=#lib::C2::id4] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id4}(new self::K::•<self::J*>());
+  [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to #lib::C2*)] [@vm.direct-call.metadata=#lib::C2::id3] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id3}(3.0);
+  [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to #lib::C2*)] [@vm.direct-call.metadata=#lib::C2::id4] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id4}(new self::K::•<self::J*>());
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect
index 8c4940c..701445c 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect
@@ -10,12 +10,12 @@
     ;
 }
 class InheritedElement extends self::Element {
-[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<#lib::Element*, dart.core::Object*>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  final field core::Map<self::Element*, core::Object*>* _dependents = <self::Element*, core::Object*>{};
+[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<InterfaceType(Reference to #lib::Element*), InterfaceType(Reference to root::dart:core::Object*)>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  final field core::Map<self::Element*, core::Object*>* _dependents = <self::Element*, core::Object*>{};
   synthetic constructor •() → self::InheritedElement*
     : super self::Element::•()
     ;
 [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method setDependencies([@vm.inferred-type.metadata=!] self::Element* dependent, [@vm.inferred-type.metadata=dart.core::_Smi?] core::Object* value) → void {
-    [@vm.call-site-attributes.metadata=receiverType:dart.core::Map<#lib::Element*, dart.core::Object*>*] [@vm.direct-call.metadata=dart.collection::__InternalLinkedHashMap&_HashVMBase&MapMixin&_LinkedHashMapMixin::[]=] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::InheritedElement::_dependents] [@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<#lib::Element*, dart.core::Object*>] this.{self::InheritedElement::_dependents}.{core::Map::[]=}(dependent, value);
+    [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Map*)] [@vm.direct-call.metadata=dart.collection::__InternalLinkedHashMap&_HashVMBase&MapMixin&_LinkedHashMapMixin::[]=] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::InheritedElement::_dependents] [@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<InterfaceType(Reference to #lib::Element*), InterfaceType(Reference to root::dart:core::Object*)>] this.{self::InheritedElement::_dependents}.{core::Map::[]=}(dependent, value);
   }
 }
 static method main() → dynamic {
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 5ad5c41..9f278403 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
@@ -45,7 +45,7 @@
 }
 static method getList() → dynamic
   return #C6;
-static method testList([@vm.inferred-type.metadata=dart.core::_ImmutableList (value: ListConstant<dart.core::int*>([1, 2, 3]))] dynamic arg1, [[@vm.inferred-type.metadata=dart.core::_ImmutableList (value: ListConstant<dart.core::int*>([4, 5]))] dynamic arg2 = #C9]) → void {
+static method testList([@vm.inferred-type.metadata=dart.core::_ImmutableList (value: ListConstant<InterfaceType(Reference to root::dart:core::int*)>([1, 2, 3]))] dynamic arg1, [[@vm.inferred-type.metadata=dart.core::_ImmutableList (value: ListConstant<InterfaceType(Reference to root::dart:core::int*)>([4, 5]))] dynamic arg2 = #C9]) → void {
   core::print(arg1);
   core::print(arg2);
 }
@@ -56,5 +56,5 @@
   self::testDouble(3.14);
   self::testStrings(new self::A::•(), "bazz");
   self::testPassEnum(#C11);
-  self::testList([@vm.inferred-type.metadata=dart.core::_ImmutableList (value: ListConstant<dart.core::int*>([1, 2, 3]))] self::getList());
+  self::testList([@vm.inferred-type.metadata=dart.core::_ImmutableList (value: ListConstant<InterfaceType(Reference to root::dart:core::int*)>([1, 2, 3]))] self::getList());
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/dynamic_list_access.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/dynamic_list_access.dart.expect
index 2f98a40..c2edab0 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/dynamic_list_access.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/dynamic_list_access.dart.expect
@@ -3,6 +3,6 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  dynamic x = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int*>] core::_List::•<core::int*>(10);
+  dynamic x = [@vm.inferred-type.metadata=dart.core::_List<InterfaceType(Reference to root::dart:core::int*)>] core::_List::•<core::int*>(10);
   [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.direct-call.metadata=dart.core::_List::[]] [@vm.inferred-type.metadata=int? (receiver not int)] x.[](0).+(10);
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/future.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/future.dart.expect
index be83db0..406725b 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/future.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/future.dart.expect
@@ -10,21 +10,21 @@
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method test2c([@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 3)] generic-covariant-impl asy::FutureOr<self::C::T*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method test3c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*> (skip check)] generic-covariant-impl asy::Future<self::C::T*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method test4c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*> (skip check)] generic-covariant-impl asy::FutureOr<self::C::T*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  method test2r([@vm.inferred-type.metadata=#lib::C<dart.core::int*> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T*>*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method test3r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int*>*> (skip check)] generic-covariant-impl self::C<asy::Future<self::C::T*>*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12]  method test4r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int*>*> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T*>*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14]  method test5r([@vm.inferred-type.metadata=#lib::C<dart.async::FutureOr<dart.core::int*>*>] generic-covariant-impl self::C<asy::Future<self::C::T*>*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:15,getterSelectorId:16]  method test6r([@vm.inferred-type.metadata=#lib::C<dart.async::FutureOr<dart.core::int*>*> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T*>*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:17,getterSelectorId:18]  method test7r([@vm.inferred-type.metadata=#lib::C<dart.async::FutureOr<dart.core::int*>*>] generic-covariant-impl self::C<self::C::T*>* x) → void {}
-[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:19,getterSelectorId:20]  method test8r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int*>*>] generic-covariant-impl self::C<self::C::T*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method test3c([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(Reference to root::dart:core::int*)> (skip check)] generic-covariant-impl asy::Future<self::C::T*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method test4c([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(Reference to root::dart:core::int*)> (skip check)] generic-covariant-impl asy::FutureOr<self::C::T*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  method test2r([@vm.inferred-type.metadata=#lib::C<InterfaceType(Reference to root::dart:core::int*)> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T*>*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method test3r([@vm.inferred-type.metadata=#lib::C<InterfaceType(Reference to root::dart:async::Future*)> (skip check)] generic-covariant-impl self::C<asy::Future<self::C::T*>*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12]  method test4r([@vm.inferred-type.metadata=#lib::C<InterfaceType(Reference to root::dart:async::Future*)> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T*>*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14]  method test5r([@vm.inferred-type.metadata=#lib::C<InterfaceType(Reference to root::dart:async::FutureOr*)>] generic-covariant-impl self::C<asy::Future<self::C::T*>*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:15,getterSelectorId:16]  method test6r([@vm.inferred-type.metadata=#lib::C<InterfaceType(Reference to root::dart:async::FutureOr*)> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T*>*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:17,getterSelectorId:18]  method test7r([@vm.inferred-type.metadata=#lib::C<InterfaceType(Reference to root::dart:async::FutureOr*)>] generic-covariant-impl self::C<self::C::T*>* x) → void {}
+[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:19,getterSelectorId:20]  method test8r([@vm.inferred-type.metadata=#lib::C<InterfaceType(Reference to root::dart:async::Future*)>] generic-covariant-impl self::C<self::C::T*>* x) → void {}
 }
 static method main() → dynamic {
   dynamic c = new self::C::•<core::int*>();
   [@vm.direct-call.metadata=#lib::C::test2c] [@vm.inferred-type.metadata=!? (receiver not int)] c.test2c(3);
-  [@vm.direct-call.metadata=#lib::C::test3c] [@vm.inferred-type.metadata=!? (receiver not int)] c.test3c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*>] asy::Future::value<core::int*>(3));
-  [@vm.direct-call.metadata=#lib::C::test4c] [@vm.inferred-type.metadata=!? (receiver not int)] c.test4c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*>] asy::Future::value<core::int*>(3));
+  [@vm.direct-call.metadata=#lib::C::test3c] [@vm.inferred-type.metadata=!? (receiver not int)] c.test3c([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(Reference to root::dart:core::int*)>] asy::Future::value<core::int*>(3));
+  [@vm.direct-call.metadata=#lib::C::test4c] [@vm.inferred-type.metadata=!? (receiver not int)] c.test4c([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(Reference to root::dart:core::int*)>] asy::Future::value<core::int*>(3));
   [@vm.direct-call.metadata=#lib::C::test2r] [@vm.inferred-type.metadata=!? (receiver not int)] c.test2r(new self::C::•<core::int*>());
   [@vm.direct-call.metadata=#lib::C::test3r] [@vm.inferred-type.metadata=!? (receiver not int)] c.test3r(new self::C::•<asy::Future<core::int*>*>());
   [@vm.direct-call.metadata=#lib::C::test4r] [@vm.inferred-type.metadata=!? (receiver not int)] c.test4r(new self::C::•<asy::Future<core::int*>*>());
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 d7385b2..f97cfd3 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
@@ -16,11 +16,11 @@
     ;
 }
 [@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_a1([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(Reference to #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_a3([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(Reference to #lib::B*)>] dynamic x) → void {}
 static method foo1_a4([@vm.inferred-type.metadata=#lib::B] dynamic x) → void {}
-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*>] asy::FutureOr<self::A*>* a3, [@vm.inferred-type.metadata=#lib::B] asy::FutureOr<self::A*>* a4) → void {
+static method foo1([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(Reference to #lib::B*)>] asy::Future<self::A*>* a1, [@vm.inferred-type.metadata=#lib::B] self::A* a2, [@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(Reference to #lib::B*)>] asy::FutureOr<self::A*>* a3, [@vm.inferred-type.metadata=#lib::B] asy::FutureOr<self::A*>* a4) → void {
   self::foo1_a1(a1);
   self::foo1_a2(a2);
   self::foo1_a3(a3);
@@ -37,8 +37,8 @@
   self::foo2_a4(a4);
 }
 static method getDynamic() → dynamic
-  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
+  return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] self::unknown.call();
 static method main(core::List<core::String*>* args) → dynamic {
-  self::foo1([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] asy::Future::value<self::B*>(new self::B::•()), new self::B::•(), [@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] asy::Future::value<self::B*>(new self::B::•()), new self::B::•());
+  self::foo1([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(Reference to #lib::B*)>] asy::Future::value<self::B*>(new self::B::•()), new self::B::•(), [@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(Reference to #lib::B*)>] asy::Future::value<self::B*>(new self::B::•()), new self::B::•());
   self::foo2(self::getDynamic() as{TypeError,ForDynamic} asy::Future<self::A*>*, self::getDynamic() as{TypeError,ForDynamic} self::A*, self::getDynamic() as{TypeError,ForDynamic} asy::FutureOr<self::A*>*, self::getDynamic() as{TypeError,ForDynamic} asy::FutureOr<self::A*>*);
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect
index 6d5cf67..975ada1 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect
@@ -64,7 +64,7 @@
 [@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field core::Function* unknown;
 static field core::Object* field1 = [@vm.inferred-type.metadata=!] self::getValue();
 static method getDynamic() → dynamic
-  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
+  return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] self::unknown.call();
 static method getValue() → core::Object* {
   self::A* aa = self::getDynamic() as{TypeError,ForDynamic} self::A*;
   return [@vm.inferred-type.metadata=!] aa.{self::A::foo}();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart.expect
index 95c4d00..5685ec8 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart.expect
@@ -33,7 +33,7 @@
 static method use2([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, [@vm.inferred-type.metadata=#lib::B?] self::A* aa) → dynamic
   return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=#lib::T1 (skip check)] i.{self::Intermediate::bar}(aa);
 static method getDynamic() → dynamic
-  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
+  return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] self::unknown.call();
 static method allocateB() → dynamic {
   new self::B::•();
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart.expect
index 6149267..1718427 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart.expect
@@ -59,7 +59,7 @@
 static method use3([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, self::A* aa) → dynamic
   return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=! (skip check)] i.{self::Intermediate::bar}(aa);
 static method getDynamic() → dynamic
-  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
+  return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] self::unknown.call();
 static method allocateB() → dynamic {
   new self::B::•();
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart.expect
index c86de6e..9321536 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart.expect
@@ -49,7 +49,7 @@
 static method use_bazz(dynamic x) → dynamic
   return [@vm.inferred-type.metadata=#lib::T3] x.bazz();
 static method getDynamic() → dynamic
-  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
+  return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] self::unknown.call();
 static method allocateA() → dynamic {
   new self::A::•();
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect
index 6698bb7..c4aba2f 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect
@@ -51,7 +51,7 @@
 static method use2([@vm.inferred-type.metadata=#lib::DeepCaller2] self::DeepCaller2* x, [@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
   return [@vm.direct-call.metadata=#lib::DeepCaller2::barL1] [@vm.inferred-type.metadata=! (skip check)] x.{self::DeepCaller2::barL1}(aa);
 static method getDynamic() → dynamic
-  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
+  return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] self::unknown.call();
 static method setField2([@vm.inferred-type.metadata=#lib::A] self::A* aa, [@vm.inferred-type.metadata=#lib::T2] dynamic value) → void {
   [@vm.direct-call.metadata=#lib::A::field2] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::field2} = value;
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect
index 9372e70..fdbf579 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect
@@ -28,8 +28,8 @@
     : self::Q::result = result, super core::Object::•()
     ;
 }
-static method foo1([@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::T1*>] core::List<self::T1*>* list) → dynamic {
-  [@vm.direct-call.metadata=#lib::T3::run] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::T1::go??] [@vm.inferred-type.metadata=#lib::T3 (skip check)] [@vm.direct-call.metadata=#lib::Q::result??] [@vm.direct-call.metadata=dart._internal::ListIterable::first] [@vm.inferred-type.metadata=#lib::Q?] [@vm.direct-call.metadata=dart.collection::_ListBase&Object&ListMixin::map] [@vm.inferred-type.metadata=dart._internal::MappedListIterable<#lib::T1*, ?> (skip check)] list.{core::Iterable::map}<self::Q<self::T1*>*>((self::T1* t1) → self::Q<self::T1*>* => new self::Q::•<self::T1*>(t1)).{core::Iterable::first}.{self::Q::result}.{self::T1::go}().{self::T3::run}();
+static method foo1([@vm.inferred-type.metadata=dart.core::_GrowableList<InterfaceType(Reference to #lib::T1*)>] core::List<self::T1*>* list) → dynamic {
+  [@vm.direct-call.metadata=#lib::T3::run] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::T1::go??] [@vm.inferred-type.metadata=#lib::T3 (skip check)] [@vm.direct-call.metadata=#lib::Q::result??] [@vm.direct-call.metadata=dart._internal::ListIterable::first] [@vm.inferred-type.metadata=#lib::Q?] [@vm.direct-call.metadata=dart.collection::_ListBase&Object&ListMixin::map] [@vm.inferred-type.metadata=dart._internal::MappedListIterable<InterfaceType(Reference to #lib::T1*), ?> (skip check)] list.{core::Iterable::map}<self::Q<self::T1*>*>((self::T1* t1) → self::Q<self::T1*>* => new self::Q::•<self::T1*>(t1)).{core::Iterable::first}.{self::Q::result}.{self::T1::go}().{self::T3::run}();
 }
 static method foo2NewValue() → self::Q<dynamic>*
   return new self::Q::•<self::T2*>(new self::T2::•());
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 fa129ad..52f7c57 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
@@ -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(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<InterfaceType(Reference to root::dart:core::Symbol*), dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
 [@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))));
+    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<InterfaceType(Reference to root::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]  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(#C7, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<InterfaceType(Reference to root::dart:core::Symbol*), dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
 }
 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(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<InterfaceType(Reference to root::dart:core::Symbol*), dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
 [@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))));
+    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<InterfaceType(Reference to root::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]  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(#C7, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<InterfaceType(Reference to root::dart:core::Symbol*), dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
 }
 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(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<InterfaceType(Reference to root::dart:core::Symbol*), dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
 }
 class F extends core::Object {
   synthetic constructor •() → self::F*
@@ -114,7 +114,7 @@
 [@vm.inferred-type.metadata=#lib::D?]static field self::A* dd = new self::D::•();
 [@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field core::Function* unknown;
 static method getDynamic() → dynamic
-  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
+  return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] self::unknown.call();
 static method main(core::List<core::String*>* args) → dynamic {
   core::print([@vm.direct-call.metadata=#lib::B::foo??] [@vm.inferred-type.metadata=#lib::T1 (skip check)] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::foo}());
   core::print([@vm.direct-call.metadata=#lib::B::bar??] [@vm.inferred-type.metadata=#lib::T1] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::bar});
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect
index 0378cce..3a1361a 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect
@@ -49,9 +49,9 @@
   [@vm.direct-call.metadata=#lib::T2::foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
 }
 static method getDynamic() → dynamic
-  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
+  return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] self::unknown.call();
 static method use(dynamic x) → dynamic
-  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call(x);
+  return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] self::unknown.call(x);
 static method main(core::List<core::String*>* args) → dynamic {
   self::func1(self::getDynamic() as{TypeError,ForDynamic} self::T0*);
   self::use(#C1);
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_37455.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37455.dart.expect
index a7ca2b5..471beff 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_37455.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37455.dart.expect
@@ -14,18 +14,18 @@
   synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method _foo([@vm.inferred-type.metadata=dart._internal::ListIterator<dart.core::int*>] core::Iterator<core::int*>* iter) → core::List<dynamic>* {
+[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method _foo([@vm.inferred-type.metadata=dart._internal::ListIterator<InterfaceType(Reference to root::dart:core::int*)>] core::Iterator<core::int*>* iter) → core::List<dynamic>* {
     core::List<dynamic>* result = <dynamic>[];
     while ([@vm.direct-call.metadata=dart._internal::ListIterator::moveNext] [@vm.inferred-type.metadata=dart.core::bool (skip check)] iter.{core::Iterator::moveNext}()) {
       if([@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=dart._internal::ListIterator::current] [@vm.inferred-type.metadata=int?] iter.{core::Iterator::current}.{core::num::<}(0)) {
         return result;
       }
-      [@vm.call-site-attributes.metadata=receiverType:dart.core::List<dynamic>*] [@vm.direct-call.metadata=dart.core::_GrowableList::add] [@vm.inferred-type.metadata=!? (skip check)] result.{core::List::add}(new self::A::•([@vm.direct-call.metadata=#lib::B::_foo] [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic> (skip check)] this.{self::B::_foo}(iter)));
+      [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::List*)] [@vm.direct-call.metadata=dart.core::_GrowableList::add] [@vm.inferred-type.metadata=!? (skip check)] result.{core::List::add}(new self::A::•([@vm.direct-call.metadata=#lib::B::_foo] [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic> (skip check)] this.{self::B::_foo}(iter)));
     }
     return result;
   }
 }
 static method main() → void {
-  core::List<dynamic>* list = [@vm.direct-call.metadata=#lib::B::_foo] [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic> (skip check)] new self::B::•().{self::B::_foo}([@vm.direct-call.metadata=dart.core::_GrowableList::iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<dart.core::int*>]<core::int*>[1, 2, 3].{core::Iterable::iterator});
+  core::List<dynamic>* list = [@vm.direct-call.metadata=#lib::B::_foo] [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic> (skip check)] new self::B::•().{self::B::_foo}([@vm.direct-call.metadata=dart.core::_GrowableList::iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<InterfaceType(Reference to root::dart:core::int*)>]<core::int*>[1, 2, 3].{core::Iterable::iterator});
   core::print(list);
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_37719.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37719.dart.expect
index de17976..bb1f31d 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_37719.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37719.dart.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-[@vm.unboxing-info.metadata=(b)->i]static method foo([@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int*>] core::List<core::int*>* x) → dynamic
+[@vm.unboxing-info.metadata=(b)->i]static method foo([@vm.inferred-type.metadata=dart.core::_GrowableList<InterfaceType(Reference to root::dart:core::int*)>] core::List<core::int*>* x) → dynamic
   return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] 1.{core::num::+}([@vm.direct-call.metadata=dart.core::_GrowableList::[]] [@vm.inferred-type.metadata=int? (skip check)] x.{core::List::[]}(0));
 static method main() → dynamic
   return [@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::print([@vm.inferred-type.metadata=int] self::foo(<core::int*>[1]));
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect
index ab1a24e..3b00d52 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect
@@ -117,7 +117,7 @@
 [@vm.inferred-type.metadata=dart.core::_Closure?]static field core::Function* unknown4 = () → dynamic => self::bb4;
 static method test1() → void {
   self::B1* bb = new self::B1::•();
-  let final self::B1* #t1 = bb in let final core::int* #t2 = 1 in let final core::int* #t3 = 2 in let final core::int* #t4 = 3 in let final core::int* #t5 = 4 in let final self::T1* #t6 = new self::T1::•() in [@vm.call-site-attributes.metadata=receiverType:#lib::A1*] [@vm.direct-call.metadata=#lib::A1::call] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::B1::aa1] [@vm.inferred-type.metadata=#lib::A1] #t1.{self::B1::aa1}.{self::A1::call}(#t2, #t3, #t4, #t5, #t6);
+  let final self::B1* #t1 = bb in let final core::int* #t2 = 1 in let final core::int* #t3 = 2 in let final core::int* #t4 = 3 in let final core::int* #t5 = 4 in let final self::T1* #t6 = new self::T1::•() in [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to #lib::A1*)] [@vm.direct-call.metadata=#lib::A1::call] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::B1::aa1] [@vm.inferred-type.metadata=#lib::A1] #t1.{self::B1::aa1}.{self::A1::call}(#t2, #t3, #t4, #t5, #t6);
   self::ok = false;
   [@vm.direct-call.metadata=#lib::T1::doTest1??] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::A1::foo] [@vm.inferred-type.metadata=#lib::T1?] [@vm.direct-call.metadata=#lib::B1::aa1] [@vm.inferred-type.metadata=#lib::A1] bb.{self::B1::aa1}.{self::A1::foo}.{self::T1::doTest1}();
   exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
@@ -130,7 +130,7 @@
   exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
 }
 static method getDynamic3() → dynamic
-  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown3.call();
+  return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] self::unknown3.call();
 static method test3() → void {
   self::getDynamic3().aa3(1, 2, 3, 4, 5, 6, new self::T3::•());
   self::ok = false;
@@ -138,7 +138,7 @@
   exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
 }
 static method getDynamic4() → dynamic
-  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown4.call();
+  return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] self::unknown4.call();
 static method test4() → void {
   self::getDynamic4().aa4(1, 2, 3, 4, 5, 6, 7, new self::T4::•());
   self::ok = false;
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect
index e3c2996..f2aa9f5 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect
@@ -25,5 +25,5 @@
   return new self::B::•();
 static method main(core::List<core::String*>* args) → dynamic {
   core::Function* closure = () → self::B* => new self::B::•();
-  new self::TearOffDynamicMethod::•([@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] closure.call());
+  new self::TearOffDynamicMethod::•([@vm.call-site-attributes.metadata=receiverType:InterfaceType(Reference to root::dart:core::Function*)] closure.call());
 }
diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md
index 6758942..cbe9222 100644
--- a/pkg/vm_service/CHANGELOG.md
+++ b/pkg/vm_service/CHANGELOG.md
@@ -1,8 +1,8 @@
 # Changelog
 
 ## 4.0.0
-- **breaking**: RPCs which can return a `Sentinel` will now throw the `Sentinel`
-  it is received as a response.
+- **breaking**: RPCs which can return a `Sentinel` will now throw a `SentinelException`
+  if a `Sential` is received as a response.
 - **breaking**: RPCs which can return multiple values now return
   `Future<Response>` rather than `Future<dynamic>`.
 - `RPCError` now implements `Exception`.
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index d7395fc..abf3f53 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -530,7 +530,10 @@
   ]
   args = []
   if (use_nnbd) {
-    args += [ "--enable-experiment=non-nullable" ]
+    args += [
+      "--enable-experiment=non-nullable",
+      "--null-safety",
+    ]
   }
   args += [
     "--deterministic",
diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc
index 0ac8065..886970e 100644
--- a/runtime/bin/file.cc
+++ b/runtime/bin/file.cc
@@ -763,7 +763,7 @@
   Namespace* namespc = Namespace::GetNamespace(args, 0);
   const char* path_1 = DartUtils::GetNativeStringArgument(args, 1);
   const char* path_2 = DartUtils::GetNativeStringArgument(args, 2);
-  File::Identical result = File::AreIdentical(namespc, path_1, path_2);
+  File::Identical result = File::AreIdentical(namespc, path_1, namespc, path_2);
   if (result == File::kError) {
     Dart_SetReturnValue(args, DartUtils::NewDartOSError());
   } else {
@@ -1455,7 +1455,7 @@
   CObjectString path1(request[1]);
   CObjectString path2(request[2]);
   File::Identical result =
-      File::AreIdentical(namespc, path1.CString(), path2.CString());
+      File::AreIdentical(namespc, path1.CString(), namespc, path2.CString());
   if (result == File::kError) {
     return CObject::NewOSError();
   }
diff --git a/runtime/bin/file.h b/runtime/bin/file.h
index ac89688..642ba9e 100644
--- a/runtime/bin/file.h
+++ b/runtime/bin/file.h
@@ -250,8 +250,9 @@
   static const char* PathSeparator();
   static const char* StringEscapedPathSeparator();
   static Type GetType(Namespace* namespc, const char* path, bool follow_links);
-  static Identical AreIdentical(Namespace* namespc,
+  static Identical AreIdentical(Namespace* namespc_1,
                                 const char* file_1,
+                                Namespace* namespc_2,
                                 const char* file_2);
   static StdioHandleType GetStdioHandleType(int fd);
 
diff --git a/runtime/bin/file_android.cc b/runtime/bin/file_android.cc
index 151c969..51a7599 100644
--- a/runtime/bin/file_android.cc
+++ b/runtime/bin/file_android.cc
@@ -702,22 +702,28 @@
   return kOther;
 }
 
-File::Identical File::AreIdentical(Namespace* namespc,
+File::Identical File::AreIdentical(Namespace* namespc_1,
                                    const char* file_1,
+                                   Namespace* namespc_2,
                                    const char* file_2) {
-  NamespaceScope ns1(namespc, file_1);
-  NamespaceScope ns2(namespc, file_2);
   struct stat file_1_info;
   struct stat file_2_info;
-  int status = TEMP_FAILURE_RETRY(
-      fstatat(ns1.fd(), ns1.path(), &file_1_info, AT_SYMLINK_NOFOLLOW));
-  if (status == -1) {
-    return File::kError;
+  int status;
+  {
+    NamespaceScope ns1(namespc_1, file_1);
+    status = TEMP_FAILURE_RETRY(
+        fstatat(ns1.fd(), ns1.path(), &file_1_info, AT_SYMLINK_NOFOLLOW));
+    if (status == -1) {
+      return File::kError;
+    }
   }
-  status = TEMP_FAILURE_RETRY(
-      fstatat(ns2.fd(), ns2.path(), &file_2_info, AT_SYMLINK_NOFOLLOW));
-  if (status == -1) {
-    return File::kError;
+  {
+    NamespaceScope ns2(namespc_2, file_2);
+    status = TEMP_FAILURE_RETRY(
+        fstatat(ns2.fd(), ns2.path(), &file_2_info, AT_SYMLINK_NOFOLLOW));
+    if (status == -1) {
+      return File::kError;
+    }
   }
   return ((file_1_info.st_ino == file_2_info.st_ino) &&
           (file_1_info.st_dev == file_2_info.st_dev))
diff --git a/runtime/bin/file_fuchsia.cc b/runtime/bin/file_fuchsia.cc
index 0fde6ae..354dd65 100644
--- a/runtime/bin/file_fuchsia.cc
+++ b/runtime/bin/file_fuchsia.cc
@@ -655,22 +655,28 @@
   return kOther;
 }
 
-File::Identical File::AreIdentical(Namespace* namespc,
+File::Identical File::AreIdentical(Namespace* namespc_1,
                                    const char* file_1,
+                                   Namespace* namespc_2,
                                    const char* file_2) {
-  NamespaceScope ns1(namespc, file_1);
-  NamespaceScope ns2(namespc, file_2);
   struct stat file_1_info;
   struct stat file_2_info;
-  int status = TEMP_FAILURE_RETRY(
-      fstatat(ns1.fd(), ns1.path(), &file_1_info, AT_SYMLINK_NOFOLLOW));
-  if (status == -1) {
-    return File::kError;
+  int status;
+  {
+    NamespaceScope ns1(namespc_1, file_1);
+    status = TEMP_FAILURE_RETRY(
+        fstatat(ns1.fd(), ns1.path(), &file_1_info, AT_SYMLINK_NOFOLLOW));
+    if (status == -1) {
+      return File::kError;
+    }
   }
-  status = TEMP_FAILURE_RETRY(
-      fstatat(ns2.fd(), ns2.path(), &file_2_info, AT_SYMLINK_NOFOLLOW));
-  if (status == -1) {
-    return File::kError;
+  {
+    NamespaceScope ns2(namespc_2, file_2);
+    status = TEMP_FAILURE_RETRY(
+        fstatat(ns2.fd(), ns2.path(), &file_2_info, AT_SYMLINK_NOFOLLOW));
+    if (status == -1) {
+      return File::kError;
+    }
   }
   return ((file_1_info.st_ino == file_2_info.st_ino) &&
           (file_1_info.st_dev == file_2_info.st_dev))
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index e8efaa1..16c1770 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -699,22 +699,28 @@
   return kOther;
 }
 
-File::Identical File::AreIdentical(Namespace* namespc,
+File::Identical File::AreIdentical(Namespace* namespc_1,
                                    const char* file_1,
+                                   Namespace* namespc_2,
                                    const char* file_2) {
-  NamespaceScope ns1(namespc, file_1);
-  NamespaceScope ns2(namespc, file_2);
   struct stat64 file_1_info;
   struct stat64 file_2_info;
-  int status = TEMP_FAILURE_RETRY(
-      fstatat64(ns1.fd(), ns1.path(), &file_1_info, AT_SYMLINK_NOFOLLOW));
-  if (status == -1) {
-    return File::kError;
+  int status;
+  {
+    NamespaceScope ns1(namespc_1, file_1);
+    status = TEMP_FAILURE_RETRY(
+        fstatat64(ns1.fd(), ns1.path(), &file_1_info, AT_SYMLINK_NOFOLLOW));
+    if (status == -1) {
+      return File::kError;
+    }
   }
-  status = TEMP_FAILURE_RETRY(
-      fstatat64(ns2.fd(), ns2.path(), &file_2_info, AT_SYMLINK_NOFOLLOW));
-  if (status == -1) {
-    return File::kError;
+  {
+    NamespaceScope ns2(namespc_2, file_2);
+    status = TEMP_FAILURE_RETRY(
+        fstatat64(ns2.fd(), ns2.path(), &file_2_info, AT_SYMLINK_NOFOLLOW));
+    if (status == -1) {
+      return File::kError;
+    }
   }
   return ((file_1_info.st_ino == file_2_info.st_ino) &&
           (file_1_info.st_dev == file_2_info.st_dev))
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc
index d763add..bc6ef93 100644
--- a/runtime/bin/file_macos.cc
+++ b/runtime/bin/file_macos.cc
@@ -619,9 +619,12 @@
   return kOther;
 }
 
-File::Identical File::AreIdentical(Namespace* namespc,
+File::Identical File::AreIdentical(Namespace* namespc_1,
                                    const char* file_1,
+                                   Namespace* namespc_2,
                                    const char* file_2) {
+  USE(namespc_1);
+  USE(namespc_2);
   struct stat file_1_info;
   struct stat file_2_info;
   if ((NO_RETRY_EXPECTED(lstat(file_1, &file_1_info)) == -1) ||
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
index bc4c6b1..2dc6b95 100644
--- a/runtime/bin/file_win.cc
+++ b/runtime/bin/file_win.cc
@@ -760,9 +760,12 @@
   return result;
 }
 
-File::Identical File::AreIdentical(Namespace* namespc,
+File::Identical File::AreIdentical(Namespace* namespc_1,
                                    const char* file_1,
+                                   Namespace* namespc_2,
                                    const char* file_2) {
+  USE(namespc_1);
+  USE(namespc_2);
   BY_HANDLE_FILE_INFORMATION file_info[2];
   const char* file_names[2] = {file_1, file_2};
   for (int i = 0; i < 2; ++i) {
diff --git a/runtime/bin/io_natives.cc b/runtime/bin/io_natives.cc
index f34671c..155d415 100644
--- a/runtime/bin/io_natives.cc
+++ b/runtime/bin/io_natives.cc
@@ -82,6 +82,7 @@
   V(Filter_Process, 4)                                                         \
   V(Filter_Processed, 3)                                                       \
   V(InternetAddress_Parse, 1)                                                  \
+  V(InternetAddress_RawAddrToString, 1)                                        \
   V(IOService_NewServicePort, 0)                                               \
   V(Namespace_Create, 2)                                                       \
   V(Namespace_GetDefault, 0)                                                   \
@@ -130,11 +131,14 @@
   V(SecurityContext_UseCertificateChainBytes, 3)                               \
   V(ServerSocket_Accept, 2)                                                    \
   V(ServerSocket_CreateBindListen, 7)                                          \
+  V(ServerSocket_CreateUnixDomainBindListen, 5)                                \
   V(SocketBase_IsBindError, 2)                                                 \
   V(Socket_Available, 1)                                                       \
   V(Socket_CreateBindConnect, 5)                                               \
+  V(Socket_CreateUnixDomainBindConnect, 4)                                     \
   V(Socket_CreateBindDatagram, 6)                                              \
   V(Socket_CreateConnect, 4)                                                   \
+  V(Socket_CreateUnixDomainConnect, 3)                                         \
   V(Socket_GetPort, 1)                                                         \
   V(Socket_GetRemotePeer, 1)                                                   \
   V(Socket_GetError, 1)                                                        \
diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc
index c96530b..1b79c66 100644
--- a/runtime/bin/socket.cc
+++ b/runtime/bin/socket.cc
@@ -6,6 +6,7 @@
 
 #include "bin/dartutils.h"
 #include "bin/eventhandler.h"
+#include "bin/file.h"
 #include "bin/io_buffer.h"
 #include "bin/isolate_data.h"
 #include "bin/lockers.h"
@@ -178,7 +179,7 @@
 
   Socket* socketfd = new Socket(fd);
   OSSocket* os_socket =
-      new OSSocket(addr, allocated_port, v6_only, shared, socketfd);
+      new OSSocket(addr, allocated_port, v6_only, shared, socketfd, NULL);
   os_socket->ref_count = 1;
   os_socket->next = first_os_socket;
 
@@ -192,6 +193,73 @@
   return Dart_True();
 }
 
+Dart_Handle ListeningSocketRegistry::CreateUnixDomainBindListen(
+    Dart_Handle socket_object,
+    Namespace* namespc,
+    const char* path,
+    intptr_t backlog,
+    bool shared) {
+  MutexLocker ml(&mutex_);
+
+  if (unix_domain_sockets_ != NULL && File::Exists(namespc, path)) {
+    // If there is a socket listening on this file. Ensure
+    // that it was created with `shared` mode and current `shared`
+    // is also true.
+    OSSocket* os_socket = unix_domain_sockets_;
+    OSSocket* os_socket_same_addr =
+        FindOSSocketWithPath(os_socket, namespc, path);
+    if (os_socket_same_addr != NULL) {
+      if (!os_socket_same_addr->shared || !shared) {
+        OSError os_error(-1,
+                         "The shared flag to bind() needs to be `true` if "
+                         "binding multiple times on the same path.",
+                         OSError::kUnknown);
+        return DartUtils::NewDartOSError(&os_error);
+      }
+
+      // This socket creation is the exact same as the one which originally
+      // created the socket. Feed the same fd and store it into the native field
+      // of dart socket_object. Sockets here will share same fd but contain a
+      // different port() through EventHandler_SendData.
+      Socket* socketfd = new Socket(os_socket->fd);
+      os_socket->ref_count++;
+      // We set as a side-effect the file descriptor on the dart
+      // socket_object.
+      Socket::ReuseSocketIdNativeField(socket_object, socketfd,
+                                       Socket::kFinalizerListening);
+      InsertByFd(socketfd, os_socket);
+      return Dart_True();
+    }
+  }
+
+  RawAddr addr;
+  Dart_Handle result =
+      SocketAddress::GetUnixDomainSockAddr(path, namespc, &addr);
+  if (!Dart_IsNull(result)) {
+    return result;
+  }
+
+  // There is no socket listening on that path, so we create new one.
+  intptr_t fd = ServerSocket::CreateUnixDomainBindListen(addr, backlog);
+
+  if (fd < 0) {
+    return DartUtils::NewDartOSError();
+  }
+
+  Socket* socketfd = new Socket(fd);
+  OSSocket* os_socket =
+      new OSSocket(addr, -1, false, shared, socketfd, namespc);
+  os_socket->ref_count = 1;
+  os_socket->next = unix_domain_sockets_;
+  unix_domain_sockets_ = os_socket;
+  InsertByFd(socketfd, os_socket);
+
+  Socket::ReuseSocketIdNativeField(socket_object, socketfd,
+                                   Socket::kFinalizerListening);
+
+  return Dart_True();
+}
+
 bool ListeningSocketRegistry::CloseOneSafe(OSSocket* os_socket,
                                            Socket* socket) {
   ASSERT(!mutex_.TryLock());
@@ -202,7 +270,12 @@
   if (os_socket->ref_count > 0) {
     return false;
   }
-
+  // Unlink the socket file, if os_socket contains unix domain sockets.
+  if (os_socket->address.addr.sa_family == AF_UNIX) {
+    unlink(os_socket->address.un.sun_path);
+    delete os_socket;
+    return true;
+  }
   OSSocket* prev = NULL;
   OSSocket* current = LookupByPort(os_socket->port);
   while (current != os_socket) {
@@ -298,6 +371,72 @@
   }
 }
 
+void FUNCTION_NAME(Socket_CreateUnixDomainBindConnect)(
+    Dart_NativeArguments args) {
+#if defined(HOST_OS_WINDOWS) || defined(HOST_OS_FUCHSIA)
+  OSError os_error(
+      -1, "Unix domain sockets are not available on this operating system.",
+      OSError::kUnknown);
+  Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
+#else
+  RawAddr addr;
+  Dart_Handle address = Dart_GetNativeArgument(args, 1);
+  ASSERT(Dart_IsString(address));
+  Dart_Handle result = SocketAddress::GetUnixDomainSockAddr(
+      DartUtils::GetStringValue(address), Namespace::GetNamespace(args, 3),
+      &addr);
+  if (!Dart_IsNull(result)) {
+    return Dart_SetReturnValue(args, result);
+  }
+
+  RawAddr sourceAddr;
+  address = Dart_GetNativeArgument(args, 2);
+  ASSERT(Dart_IsString(address));
+  result = SocketAddress::GetUnixDomainSockAddr(
+      DartUtils::GetStringValue(address), Namespace::GetNamespace(args, 3),
+      &sourceAddr);
+  if (!Dart_IsNull(result)) {
+    return Dart_SetReturnValue(args, result);
+  }
+
+  intptr_t socket = Socket::CreateUnixDomainBindConnect(addr, sourceAddr);
+  if (socket >= 0) {
+    Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket,
+                                   Socket::kFinalizerNormal);
+    Dart_SetReturnValue(args, Dart_True());
+  } else {
+    Dart_SetReturnValue(args, DartUtils::NewDartOSError());
+  }
+#endif  // defined(HOST_OS_WINDOWS) || defined(HOST_OS_FUCHSIA)
+}
+
+void FUNCTION_NAME(Socket_CreateUnixDomainConnect)(Dart_NativeArguments args) {
+#if defined(HOST_OS_WINDOWS) || defined(HOST_OS_FUCHSIA)
+  OSError os_error(
+      -1, "Unix domain sockets are only available on linux, android and macos.",
+      OSError::kUnknown);
+  Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
+#else
+  RawAddr addr;
+  Dart_Handle address = Dart_GetNativeArgument(args, 1);
+  ASSERT(Dart_IsString(address));
+  Dart_Handle result = SocketAddress::GetUnixDomainSockAddr(
+      DartUtils::GetStringValue(address), Namespace::GetNamespace(args, 2),
+      &addr);
+  if (!Dart_IsNull(result)) {
+    return Dart_SetReturnValue(args, result);
+  }
+  intptr_t socket = Socket::CreateUnixDomainConnect(addr);
+  if (socket >= 0) {
+    Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket,
+                                   Socket::kFinalizerNormal);
+    Dart_SetReturnValue(args, Dart_True());
+  } else {
+    Dart_SetReturnValue(args, DartUtils::NewDartOSError());
+  }
+#endif  // defined(HOST_OS_WINDOWS) || defined(HOST_OS_FUCHSIA)
+}
+
 void FUNCTION_NAME(Socket_CreateBindDatagram)(Dart_NativeArguments args) {
   RawAddr addr;
   SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 1), &addr);
@@ -423,18 +562,24 @@
 
   // Get the port and clear it in the sockaddr structure.
   int port = SocketAddress::GetAddrPort(addr);
+  // TODO(21403): Add checks for AF_UNIX, if unix domain sockets
+  // are used in SOCK_DGRAM.
+  enum internet_type { IPv4, IPv6 };
+  internet_type type;
   if (addr.addr.sa_family == AF_INET) {
     addr.in.sin_port = 0;
+    type = IPv4;
   } else {
     ASSERT(addr.addr.sa_family == AF_INET6);
     addr.in6.sin6_port = 0;
+    type = IPv6;
   }
   // Format the address to a string using the numeric format.
   char numeric_address[INET6_ADDRSTRLEN];
   SocketBase::FormatNumericAddress(addr, numeric_address, INET6_ADDRSTRLEN);
 
   // Create a Datagram object with the data and sender address and port.
-  const int kNumArgs = 4;
+  const int kNumArgs = 5;
   Dart_Handle dart_args[kNumArgs];
   dart_args[0] = data;
   dart_args[1] = Dart_NewStringFromCString(numeric_address);
@@ -443,6 +588,7 @@
   }
   dart_args[2] = SocketAddress::ToTypedData(addr);
   dart_args[3] = Dart_NewInteger(port);
+  dart_args[4] = Dart_NewInteger(type);
   if (Dart_IsError(dart_args[3])) {
     Dart_PropagateError(dart_args[3]);
   }
@@ -550,7 +696,7 @@
   if (port > 0) {
     Dart_SetIntegerReturnValue(args, port);
   } else {
-    Dart_ThrowException(DartUtils::NewDartOSError());
+    Dart_SetReturnValue(args, DartUtils::NewDartOSError());
   }
 }
 
@@ -561,14 +707,18 @@
   SocketAddress* addr = SocketBase::GetRemotePeer(socket->fd(), &port);
   if (addr != NULL) {
     Dart_Handle list = Dart_NewList(2);
-
-    Dart_Handle entry = Dart_NewList(3);
-    Dart_ListSetAt(entry, 0, Dart_NewInteger(addr->GetType()));
+    int type = addr->GetType();
+    Dart_Handle entry;
+    if (type == SocketAddress::TYPE_UNIX) {
+      entry = Dart_NewList(2);
+    } else {
+      entry = Dart_NewList(3);
+      RawAddr raw = addr->addr();
+      Dart_ListSetAt(entry, 2, SocketAddress::ToTypedData(raw));
+    }
+    Dart_ListSetAt(entry, 0, Dart_NewInteger(type));
     Dart_ListSetAt(entry, 1, Dart_NewStringFromCString(addr->as_string()));
 
-    RawAddr raw = addr->addr();
-    Dart_ListSetAt(entry, 2, SocketAddress::ToTypedData(raw));
-
     Dart_ListSetAt(list, 0, entry);
     Dart_ListSetAt(list, 1, Dart_NewInteger(port));
     Dart_SetReturnValue(args, list);
@@ -651,6 +801,29 @@
   Dart_SetReturnValue(args, result);
 }
 
+void FUNCTION_NAME(ServerSocket_CreateUnixDomainBindListen)(
+    Dart_NativeArguments args) {
+#if defined(HOST_OS_WINDOWS)
+  OSError os_error(
+      -1, "Unix domain sockets are only available on linux, android and macos.",
+      OSError::kUnknown);
+  Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error));
+#else
+  Dart_Handle address = Dart_GetNativeArgument(args, 1);
+  ASSERT(Dart_IsString(address));
+  const char* path = DartUtils::GetStringValue(address);
+  int64_t backlog = DartUtils::GetInt64ValueCheckRange(
+      Dart_GetNativeArgument(args, 2), 0, 65535);
+  bool shared = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3));
+  Namespace* namespc = Namespace::GetNamespace(args, 4);
+  Dart_Handle socket_object = Dart_GetNativeArgument(args, 0);
+  Dart_Handle result =
+      ListeningSocketRegistry::Instance()->CreateUnixDomainBindListen(
+          socket_object, namespc, path, backlog, shared);
+  Dart_SetReturnValue(args, result);
+#endif  // defined(HOST_OS_WINDOWS)
+}
+
 void FUNCTION_NAME(ServerSocket_Accept)(Dart_NativeArguments args) {
   Socket* socket =
       Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0));
diff --git a/runtime/bin/socket.h b/runtime/bin/socket.h
index c3ea9fe..caed3bb 100644
--- a/runtime/bin/socket.h
+++ b/runtime/bin/socket.h
@@ -7,6 +7,7 @@
 
 #include "bin/builtin.h"
 #include "bin/dartutils.h"
+#include "bin/file.h"
 #include "bin/reference_counting.h"
 #include "bin/socket_base.h"
 #include "bin/thread.h"
@@ -70,10 +71,13 @@
   // Creates a socket which is bound and connected. The port to connect to is
   // specified as the port component of the passed RawAddr structure.
   static intptr_t CreateConnect(const RawAddr& addr);
+  static intptr_t CreateUnixDomainConnect(const RawAddr& addr);
   // Creates a socket which is bound and connected. The port to connect to is
   // specified as the port component of the passed RawAddr structure.
   static intptr_t CreateBindConnect(const RawAddr& addr,
                                     const RawAddr& source_addr);
+  static intptr_t CreateUnixDomainBindConnect(const RawAddr& addr,
+                                              const RawAddr& source_addr);
   // Creates a datagram socket which is bound. The port to bind
   // to is specified as the port component of the RawAddr structure.
   static intptr_t CreateBindDatagram(const RawAddr& addr,
@@ -146,6 +150,8 @@
   static intptr_t CreateBindListen(const RawAddr& addr,
                                    intptr_t backlog,
                                    bool v6_only = false);
+  static intptr_t CreateUnixDomainBindListen(const RawAddr& addr,
+                                             intptr_t backlog);
 
   // Start accepting on a newly created listening socket. If it was unable to
   // start accepting incoming sockets, the fd is invalidated.
@@ -173,6 +179,8 @@
 
   static void Cleanup();
 
+  // Bind `socket_object` to `addr`.
+  // Return Dart_True() if succeed.
   // This function should be called from a dart runtime call in order to create
   // a new (potentially shared) socket.
   Dart_Handle CreateBindListen(Dart_Handle socket_object,
@@ -180,6 +188,15 @@
                                intptr_t backlog,
                                bool v6_only,
                                bool shared);
+  // Bind unix domain socket`socket_object` to `path`.
+  // Return Dart_True() if succeed.
+  // This function should be called from a dart runtime call in order to create
+  // a new socket.
+  Dart_Handle CreateUnixDomainBindListen(Dart_Handle socket_object,
+                                         Namespace* namespc,
+                                         const char* path,
+                                         intptr_t backlog,
+                                         bool shared);
 
   // This should be called from the event handler for every kCloseEvent it gets
   // on listening sockets.
@@ -202,6 +219,10 @@
     int ref_count;
     intptr_t fd;
 
+    // Only applicable to Unix domain socket, where address.addr.sa_family
+    // == AF_UNIX.
+    Namespace* namespc;
+
     // Singly linked lists of OSSocket instances which listen on the same port
     // but on different addresses.
     OSSocket* next;
@@ -210,12 +231,14 @@
              int port,
              bool v6_only,
              bool shared,
-             Socket* socketfd)
+             Socket* socketfd,
+             Namespace* namespc)
         : address(address),
           port(port),
           v6_only(v6_only),
           shared(shared),
           ref_count(0),
+          namespc(namespc),
           next(NULL) {
       fd = socketfd->fd();
     }
@@ -233,6 +256,20 @@
     return NULL;
   }
 
+  OSSocket* FindOSSocketWithPath(OSSocket* current,
+                                 Namespace* namespc,
+                                 const char* path) {
+    while (current != NULL) {
+      ASSERT(current->address.addr.sa_family == AF_UNIX);
+      if (File::AreIdentical(current->namespc, current->address.un.sun_path,
+                             namespc, path) == File::kIdentical) {
+        return current;
+      }
+      current = current->next;
+    }
+    return NULL;
+  }
+
   static bool SameIntptrValue(void* key1, void* key2) {
     return reinterpret_cast<intptr_t>(key1) == reinterpret_cast<intptr_t>(key2);
   }
@@ -259,6 +296,8 @@
   SimpleHashMap sockets_by_port_;
   SimpleHashMap sockets_by_fd_;
 
+  OSSocket* unix_domain_sockets_;
+
   Mutex mutex_;
 
   DISALLOW_COPY_AND_ASSIGN(ListeningSocketRegistry);
diff --git a/runtime/bin/socket_android.cc b/runtime/bin/socket_android.cc
index 78e1f8e..196cb36 100644
--- a/runtime/bin/socket_android.cc
+++ b/runtime/bin/socket_android.cc
@@ -37,7 +37,7 @@
   if (fd < 0) {
     return -1;
   }
-  if (!FDUtils::SetCloseOnExec(fd)) {
+  if (!FDUtils::SetCloseOnExec(fd) || !FDUtils::SetNonBlocking(fd)) {
     FDUtils::SaveErrorAndClose(fd);
     return -1;
   }
@@ -60,13 +60,23 @@
     return fd;
   }
 
-  if (!FDUtils::SetNonBlocking(fd)) {
-    FDUtils::SaveErrorAndClose(fd);
-    return -1;
-  }
   return Connect(fd, addr);
 }
 
+intptr_t Socket::CreateUnixDomainConnect(const RawAddr& addr) {
+  intptr_t fd = Create(addr);
+  if (fd < 0) {
+    return fd;
+  }
+  intptr_t result = TEMP_FAILURE_RETRY(connect(
+      fd, (struct sockaddr*)&addr.un, SocketAddress::GetAddrLength(addr)));
+  if (result == 0 || errno == EAGAIN) {
+    return fd;
+  }
+  FDUtils::SaveErrorAndClose(fd);
+  return -1;
+}
+
 intptr_t Socket::CreateBindConnect(const RawAddr& addr,
                                    const RawAddr& source_addr) {
   intptr_t fd = Create(addr);
@@ -76,7 +86,7 @@
 
   intptr_t result = TEMP_FAILURE_RETRY(
       bind(fd, &source_addr.addr, SocketAddress::GetAddrLength(source_addr)));
-  if ((result != 0) && (errno != EINPROGRESS)) {
+  if (result != 0) {
     FDUtils::SaveErrorAndClose(fd);
     return -1;
   }
@@ -84,6 +94,29 @@
   return Connect(fd, addr);
 }
 
+intptr_t Socket::CreateUnixDomainBindConnect(const RawAddr& addr,
+                                             const RawAddr& source_addr) {
+  intptr_t fd = Create(addr);
+  if (fd < 0) {
+    return fd;
+  }
+
+  intptr_t result = TEMP_FAILURE_RETRY(
+      bind(fd, &source_addr.addr, SocketAddress::GetAddrLength(source_addr)));
+  if (result != 0) {
+    FDUtils::SaveErrorAndClose(fd);
+    return -1;
+  }
+
+  result = TEMP_FAILURE_RETRY(connect(fd, (struct sockaddr*)&addr.un,
+                                      SocketAddress::GetAddrLength(addr)));
+  if (result == 0 || errno == EAGAIN) {
+    return fd;
+  }
+  FDUtils::SaveErrorAndClose(fd);
+  return -1;
+}
+
 intptr_t Socket::CreateBindDatagram(const RawAddr& addr,
                                     bool reuseAddress,
                                     bool reusePort,
@@ -189,6 +222,21 @@
   return fd;
 }
 
+intptr_t ServerSocket::CreateUnixDomainBindListen(const RawAddr& addr,
+                                                  intptr_t backlog) {
+  intptr_t fd = Create(addr);
+  if (NO_RETRY_EXPECTED(bind(fd, (struct sockaddr*)&addr.un,
+                             SocketAddress::GetAddrLength(addr))) < 0) {
+    FDUtils::SaveErrorAndClose(fd);
+    return -1;
+  }
+  if (NO_RETRY_EXPECTED(listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
+    FDUtils::SaveErrorAndClose(fd);
+    return -1;
+  }
+  return fd;
+}
+
 bool ServerSocket::StartAccept(intptr_t fd) {
   USE(fd);
   return true;
diff --git a/runtime/bin/socket_base.cc b/runtime/bin/socket_base.cc
index 8789c43..6fb402c 100644
--- a/runtime/bin/socket_base.cc
+++ b/runtime/bin/socket_base.cc
@@ -9,6 +9,7 @@
 #include "bin/isolate_data.h"
 #include "bin/lockers.h"
 #include "bin/thread.h"
+#include "bin/typed_data_utils.h"
 #include "bin/utils.h"
 
 #include "include/dart_api.h"
@@ -20,16 +21,33 @@
 namespace bin {
 
 int SocketAddress::GetType() {
-  if (addr_.ss.ss_family == AF_INET6) {
-    return TYPE_IPV6;
+  switch (addr_.ss.ss_family) {
+    case AF_INET6:
+      return TYPE_IPV6;
+    case AF_INET:
+      return TYPE_IPV4;
+    case AF_UNIX:
+      return TYPE_UNIX;
+    default:
+      UNREACHABLE();
+      return TYPE_ANY;
   }
-  return TYPE_IPV4;
 }
 
 intptr_t SocketAddress::GetAddrLength(const RawAddr& addr) {
-  ASSERT((addr.ss.ss_family == AF_INET) || (addr.ss.ss_family == AF_INET6));
-  return (addr.ss.ss_family == AF_INET6) ? sizeof(struct sockaddr_in6)
-                                         : sizeof(struct sockaddr_in);
+  ASSERT((addr.ss.ss_family == AF_INET) || (addr.ss.ss_family == AF_INET6) ||
+         (addr.ss.ss_family == AF_UNIX));
+  switch (addr.ss.ss_family) {
+    case AF_INET6:
+      return sizeof(struct sockaddr_in6);
+    case AF_INET:
+      return sizeof(struct sockaddr_in);
+    case AF_UNIX:
+      return sizeof(struct sockaddr_un);
+    default:
+      UNREACHABLE();
+      return 0;
+  }
 }
 
 intptr_t SocketAddress::GetInAddrLength(const RawAddr& addr) {
@@ -39,18 +57,24 @@
 }
 
 bool SocketAddress::AreAddressesEqual(const RawAddr& a, const RawAddr& b) {
+  if (a.ss.ss_family != b.ss.ss_family) {
+    return false;
+  }
   if (a.ss.ss_family == AF_INET) {
-    if (b.ss.ss_family != AF_INET) {
-      return false;
-    }
     return memcmp(&a.in.sin_addr, &b.in.sin_addr, sizeof(a.in.sin_addr)) == 0;
   } else if (a.ss.ss_family == AF_INET6) {
-    if (b.ss.ss_family != AF_INET6) {
-      return false;
-    }
     return memcmp(&a.in6.sin6_addr, &b.in6.sin6_addr,
                   sizeof(a.in6.sin6_addr)) == 0 &&
            a.in6.sin6_scope_id == b.in6.sin6_scope_id;
+  } else if (a.ss.ss_family == AF_UNIX) {
+    // This is not used anywhere. The comparison of file path is done via
+    // File::AreIdentical().
+    int len = sizeof(a.un.sun_path);
+    for (int i = 0; i < len; i++) {
+      if (a.un.sun_path[i] != b.un.sun_path[i]) return false;
+      if (a.un.sun_path[i] == '\0') return true;
+    }
+    return true;
   } else {
     UNREACHABLE();
     return false;
@@ -82,6 +106,25 @@
   Dart_TypedDataReleaseData(obj);
 }
 
+Dart_Handle SocketAddress::GetUnixDomainSockAddr(const char* path,
+                                                 Namespace* namespc,
+                                                 RawAddr* addr) {
+#if defined(HOST_OS_LINUX) || defined(HOST_OS_ANDROID)
+  NamespaceScope ns(namespc, path);
+  path = ns.path();
+#endif  // defined(HOST_OS_LINUX) || defined(HOST_OS_ANDROID)
+  if (sizeof(path) > sizeof(addr->un.sun_path)) {
+    OSError os_error(-1,
+                     "The length of path exceeds the limit. "
+                     "Check out man 7 unix page",
+                     OSError::kUnknown);
+    return DartUtils::NewDartOSError(&os_error);
+  }
+  addr->un.sun_family = AF_UNIX;
+  Utils::SNPrint(addr->un.sun_path, sizeof(addr->un.sun_path), "%s", path);
+  return Dart_Null();
+}
+
 int16_t SocketAddress::FromType(int type) {
   if (type == TYPE_ANY) {
     return AF_UNSPEC;
@@ -89,6 +132,9 @@
   if (type == TYPE_IPV4) {
     return AF_INET;
   }
+  if (type == TYPE_UNIX) {
+    return AF_UNIX;
+  }
   ASSERT((type == TYPE_IPV6) && "Invalid type");
   return AF_INET6;
 }
@@ -96,16 +142,23 @@
 void SocketAddress::SetAddrPort(RawAddr* addr, intptr_t port) {
   if (addr->ss.ss_family == AF_INET) {
     addr->in.sin_port = htons(port);
-  } else {
+  } else if (addr->ss.ss_family == AF_INET6) {
     addr->in6.sin6_port = htons(port);
+  } else {
+    UNREACHABLE();
   }
 }
 
 intptr_t SocketAddress::GetAddrPort(const RawAddr& addr) {
   if (addr.ss.ss_family == AF_INET) {
     return ntohs(addr.in.sin_port);
-  } else {
+  } else if (addr.ss.ss_family == AF_INET6) {
     return ntohs(addr.in6.sin6_port);
+  } else if (addr.ss.ss_family == AF_UNIX) {
+    return 0;
+  } else {
+    UNREACHABLE();
+    return -1;
   }
 }
 
@@ -176,16 +229,27 @@
   }
 }
 
+void FUNCTION_NAME(InternetAddress_RawAddrToString)(Dart_NativeArguments args) {
+  RawAddr addr;
+  SocketAddress::GetSockAddr(Dart_GetNativeArgument(args, 0), &addr);
+  // INET6_ADDRSTRLEN is larger than INET_ADDRSTRLEN
+  char str[INET6_ADDRSTRLEN];
+  bool ok = SocketBase::RawAddrToString(&addr, str);
+  if (!ok) {
+    str[0] = '\0';
+  }
+  Dart_SetReturnValue(args, ThrowIfError(DartUtils::NewString(str)));
+}
+
 void FUNCTION_NAME(NetworkInterface_ListSupported)(Dart_NativeArguments args) {
-  Dart_SetReturnValue(args,
-                      Dart_NewBoolean(SocketBase::ListInterfacesSupported()));
+  Dart_SetBooleanReturnValue(args, SocketBase::ListInterfacesSupported());
 }
 
 void FUNCTION_NAME(SocketBase_IsBindError)(Dart_NativeArguments args) {
   intptr_t error_number =
       DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 1));
   bool is_bind_error = SocketBase::IsBindError(error_number);
-  Dart_SetReturnValue(args, is_bind_error ? Dart_True() : Dart_False());
+  Dart_SetBooleanReturnValue(args, is_bind_error ? true : false);
 }
 
 }  // namespace bin
diff --git a/runtime/bin/socket_base.h b/runtime/bin/socket_base.h
index 404357b..8af4c59 100644
--- a/runtime/bin/socket_base.h
+++ b/runtime/bin/socket_base.h
@@ -23,6 +23,7 @@
 
 #include "bin/builtin.h"
 #include "bin/dartutils.h"
+#include "bin/file.h"
 #include "bin/thread.h"
 #include "bin/utils.h"
 #include "platform/allocation.h"
@@ -34,6 +35,7 @@
 union RawAddr {
   struct sockaddr_in in;
   struct sockaddr_in6 in6;
+  struct sockaddr_un un;
   struct sockaddr_storage ss;
   struct sockaddr addr;
 };
@@ -44,6 +46,7 @@
     TYPE_ANY = -1,
     TYPE_IPV4,
     TYPE_IPV6,
+    TYPE_UNIX,
   };
 
   enum {
@@ -55,7 +58,9 @@
     ADDRESS_LAST = ADDRESS_ANY_IP_V6,
   };
 
-  explicit SocketAddress(struct sockaddr* sa);
+  // Unix domain socket may be unnamed. In this case addr_.un.sun_path contains
+  // garbage and should not be inspected.
+  explicit SocketAddress(struct sockaddr* sa, bool unnamed_unix_socket = false);
 
   ~SocketAddress() {}
 
@@ -68,6 +73,9 @@
   static intptr_t GetInAddrLength(const RawAddr& addr);
   static bool AreAddressesEqual(const RawAddr& a, const RawAddr& b);
   static void GetSockAddr(Dart_Handle obj, RawAddr* addr);
+  static Dart_Handle GetUnixDomainSockAddr(const char* path,
+                                           Namespace* namespc,
+                                           RawAddr* addr);
   static int16_t FromType(int type);
   static void SetAddrPort(RawAddr* addr, intptr_t port);
   static intptr_t GetAddrPort(const RawAddr& addr);
@@ -77,7 +85,17 @@
   static intptr_t GetAddrScope(const RawAddr& addr);
 
  private:
+#if defined(HOST_OS_LINUX) || defined(HOST_OS_MACOS) || defined(HOST_OS_ANDROID)
+  // Unix domain address is only on Linux, Mac OS and Android now.
+  // unix(7) require sun_path to be 108 bytes on Linux and Android, 104 bytes on
+  // Mac OS.
+  static const intptr_t kMaxUnixPathLength =
+      sizeof(((struct sockaddr_un*)0)->sun_path);
+  char as_string_[kMaxUnixPathLength];
+#else
   char as_string_[INET6_ADDRSTRLEN];
+#endif  // defined(HOST_OS_LINUX) || defined(HOST_OS_MACOS) ||                 \
+        // defined(HOST_OS_ANDROID)
   RawAddr addr_;
 
   DISALLOW_COPY_AND_ASSIGN(SocketAddress);
@@ -214,6 +232,9 @@
                             OSError** os_error);
 
   static bool ParseAddress(int type, const char* address, RawAddr* addr);
+
+  // Convert address from byte representation to human readable string.
+  static bool RawAddrToString(RawAddr* addr, char* str);
   static bool FormatNumericAddress(const RawAddr& addr, char* address, int len);
 
   // Whether ListInterfaces is supported.
diff --git a/runtime/bin/socket_base_android.cc b/runtime/bin/socket_base_android.cc
index c72c276..6cea30d 100644
--- a/runtime/bin/socket_base_android.cc
+++ b/runtime/bin/socket_base_android.cc
@@ -26,11 +26,19 @@
 namespace dart {
 namespace bin {
 
-SocketAddress::SocketAddress(struct sockaddr* sa) {
-  ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
-  if (!SocketBase::FormatNumericAddress(*reinterpret_cast<RawAddr*>(sa),
-                                        as_string_, INET6_ADDRSTRLEN)) {
+SocketAddress::SocketAddress(struct sockaddr* sa, bool unnamed_unix_socket) {
+  if (unnamed_unix_socket) {
+    // This is an unnamed unix domain socket.
     as_string_[0] = 0;
+  } else if (sa->sa_family == AF_UNIX) {
+    struct sockaddr_un* un = ((struct sockaddr_un*)sa);
+    memmove(as_string_, un->sun_path, sizeof(un->sun_path));
+  } else {
+    ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
+    if (!SocketBase::FormatNumericAddress(*reinterpret_cast<RawAddr*>(sa),
+                                          as_string_, INET6_ADDRSTRLEN)) {
+      as_string_[0] = 0;
+    }
   }
   socklen_t salen = GetAddrLength(*reinterpret_cast<RawAddr*>(sa));
   memmove(reinterpret_cast<void*>(&addr_), sa, salen);
@@ -140,6 +148,13 @@
   if (NO_RETRY_EXPECTED(getpeername(fd, &raw.addr, &size))) {
     return NULL;
   }
+  // sockaddr_un contains sa_family_t sun_familty and char[] sun_path.
+  // If size is the size of sa_familty_t, this is an unnamed socket and
+  // sun_path contains garbage.
+  if (size == sizeof(sa_family_t)) {
+    *port = 0;
+    return new SocketAddress(&raw.addr, true);
+  }
   *port = SocketAddress::GetAddrPort(raw);
   return new SocketAddress(&raw.addr);
 }
@@ -244,6 +259,16 @@
   return (result == 1);
 }
 
+bool SocketBase::RawAddrToString(RawAddr* addr, char* str) {
+  if (addr->addr.sa_family == AF_INET) {
+    return inet_ntop(AF_INET, &addr->in.sin_addr, str, INET_ADDRSTRLEN) != NULL;
+  } else {
+    ASSERT(addr->addr.sa_family == AF_INET6);
+    return inet_ntop(AF_INET6, &addr->in6.sin6_addr, str, INET6_ADDRSTRLEN) !=
+           NULL;
+  }
+}
+
 static bool ShouldIncludeIfaAddrs(struct ifaddrs* ifa, int lookup_family) {
   if (ifa->ifa_addr == NULL) {
     // OpenVPN's virtual device tun0.
diff --git a/runtime/bin/socket_base_android.h b/runtime/bin/socket_base_android.h
index fb685be..9b10162 100644
--- a/runtime/bin/socket_base_android.h
+++ b/runtime/bin/socket_base_android.h
@@ -12,5 +12,6 @@
 #include <arpa/inet.h>
 #include <netdb.h>
 #include <sys/socket.h>
+#include <sys/un.h>
 
 #endif  // RUNTIME_BIN_SOCKET_BASE_ANDROID_H_
diff --git a/runtime/bin/socket_base_fuchsia.cc b/runtime/bin/socket_base_fuchsia.cc
index ba90aa9..d956dd0 100644
--- a/runtime/bin/socket_base_fuchsia.cc
+++ b/runtime/bin/socket_base_fuchsia.cc
@@ -54,7 +54,11 @@
 namespace dart {
 namespace bin {
 
-SocketAddress::SocketAddress(struct sockaddr* sa) {
+SocketAddress::SocketAddress(struct sockaddr* sa, bool unnamed_unix_socket) {
+  // Fuchsia does not support unix domain sockets.
+  if (unnamed_unix_socket) {
+    FATAL("Fuchsia does not support unix domain sockets.");
+  }
   ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
   if (!SocketBase::FormatNumericAddress(*reinterpret_cast<RawAddr*>(sa),
                                         as_string_, INET6_ADDRSTRLEN)) {
@@ -274,6 +278,16 @@
   return (result == 1);
 }
 
+bool SocketBase::RawAddrToString(RawAddr* addr, char* str) {
+  if (addr->addr.sa_family == AF_INET) {
+    return inet_ntop(AF_INET, &addr->in.sin_addr, str, INET_ADDRSTRLEN) != NULL;
+  } else {
+    ASSERT(addr->addr.sa_family == AF_INET6);
+    return inet_ntop(AF_INET6, &addr->in6.sin6_addr, str, INET6_ADDRSTRLEN) !=
+           NULL;
+  }
+}
+
 bool SocketBase::ListInterfacesSupported() {
   return true;
 }
diff --git a/runtime/bin/socket_base_fuchsia.h b/runtime/bin/socket_base_fuchsia.h
index 3ec3343..43d036b 100644
--- a/runtime/bin/socket_base_fuchsia.h
+++ b/runtime/bin/socket_base_fuchsia.h
@@ -12,5 +12,6 @@
 #include <arpa/inet.h>
 #include <netdb.h>
 #include <sys/socket.h>
+#include <sys/un.h>
 
 #endif  // RUNTIME_BIN_SOCKET_BASE_FUCHSIA_H_
diff --git a/runtime/bin/socket_base_linux.cc b/runtime/bin/socket_base_linux.cc
index 9a52d96..fb1e555 100644
--- a/runtime/bin/socket_base_linux.cc
+++ b/runtime/bin/socket_base_linux.cc
@@ -26,11 +26,19 @@
 namespace dart {
 namespace bin {
 
-SocketAddress::SocketAddress(struct sockaddr* sa) {
-  ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
-  if (!SocketBase::FormatNumericAddress(*reinterpret_cast<RawAddr*>(sa),
-                                        as_string_, INET6_ADDRSTRLEN)) {
+SocketAddress::SocketAddress(struct sockaddr* sa, bool unnamed_unix_socket) {
+  if (unnamed_unix_socket) {
+    // This is an unnamed unix domain socket.
     as_string_[0] = 0;
+  } else if (sa->sa_family == AF_UNIX) {
+    struct sockaddr_un* un = ((struct sockaddr_un*)sa);
+    memmove(as_string_, un->sun_path, sizeof(un->sun_path));
+  } else {
+    ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
+    if (!SocketBase::FormatNumericAddress(*reinterpret_cast<RawAddr*>(sa),
+                                          as_string_, INET6_ADDRSTRLEN)) {
+      as_string_[0] = 0;
+    }
   }
   socklen_t salen = GetAddrLength(*reinterpret_cast<RawAddr*>(sa));
   memmove(reinterpret_cast<void*>(&addr_), sa, salen);
@@ -140,6 +148,13 @@
   if (NO_RETRY_EXPECTED(getpeername(fd, &raw.addr, &size))) {
     return NULL;
   }
+  // sockaddr_un contains sa_family_t sun_familty and char[] sun_path.
+  // If size is the size of sa_familty_t, this is an unnamed socket and
+  // sun_path contains garbage.
+  if (size == sizeof(sa_family_t)) {
+    *port = 0;
+    return new SocketAddress(&raw.addr, true);
+  }
   *port = SocketAddress::GetAddrPort(raw);
   return new SocketAddress(&raw.addr);
 }
@@ -246,6 +261,16 @@
   return (result == 1);
 }
 
+bool SocketBase::RawAddrToString(RawAddr* addr, char* str) {
+  if (addr->addr.sa_family == AF_INET) {
+    return inet_ntop(AF_INET, &addr->in.sin_addr, str, INET_ADDRSTRLEN) != NULL;
+  } else {
+    ASSERT(addr->addr.sa_family == AF_INET6);
+    return inet_ntop(AF_INET6, &addr->in6.sin6_addr, str, INET6_ADDRSTRLEN) !=
+           NULL;
+  }
+}
+
 static bool ShouldIncludeIfaAddrs(struct ifaddrs* ifa, int lookup_family) {
   if (ifa->ifa_addr == NULL) {
     // OpenVPN's virtual device tun0.
diff --git a/runtime/bin/socket_base_linux.h b/runtime/bin/socket_base_linux.h
index 0cca9bc..42f5439 100644
--- a/runtime/bin/socket_base_linux.h
+++ b/runtime/bin/socket_base_linux.h
@@ -12,5 +12,6 @@
 #include <arpa/inet.h>
 #include <netdb.h>
 #include <sys/socket.h>
+#include <sys/un.h>
 
 #endif  // RUNTIME_BIN_SOCKET_BASE_LINUX_H_
diff --git a/runtime/bin/socket_base_macos.cc b/runtime/bin/socket_base_macos.cc
index a448911..e8bea83 100644
--- a/runtime/bin/socket_base_macos.cc
+++ b/runtime/bin/socket_base_macos.cc
@@ -25,11 +25,19 @@
 namespace dart {
 namespace bin {
 
-SocketAddress::SocketAddress(struct sockaddr* sa) {
-  ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
-  if (!SocketBase::FormatNumericAddress(*reinterpret_cast<RawAddr*>(sa),
-                                        as_string_, INET6_ADDRSTRLEN)) {
+SocketAddress::SocketAddress(struct sockaddr* sa, bool unnamed_unix_socket) {
+  if (unnamed_unix_socket) {
+    // This is an unnamed unix domain socket.
     as_string_[0] = 0;
+  } else if (sa->sa_family == AF_UNIX) {
+    struct sockaddr_un* un = ((struct sockaddr_un*)sa);
+    memmove(as_string_, un->sun_path, sizeof(un->sun_path));
+  } else {
+    ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
+    if (!SocketBase::FormatNumericAddress(*reinterpret_cast<RawAddr*>(sa),
+                                          as_string_, INET6_ADDRSTRLEN)) {
+      as_string_[0] = 0;
+    }
   }
   socklen_t salen = GetAddrLength(*reinterpret_cast<RawAddr*>(sa));
   memmove(reinterpret_cast<void*>(&addr_), sa, salen);
@@ -139,6 +147,13 @@
   if (NO_RETRY_EXPECTED(getpeername(fd, &raw.addr, &size))) {
     return NULL;
   }
+  // sockaddr_un contains sa_family_t sun_familty and char[] sun_path.
+  // If size is the size of sa_familty_t, this is an unnamed socket and
+  // sun_path contains garbage.
+  if (size == sizeof(sa_family_t)) {
+    *port = 0;
+    return new SocketAddress(&raw.addr, true);
+  }
   *port = SocketAddress::GetAddrPort(raw);
   return new SocketAddress(&raw.addr);
 }
@@ -236,6 +251,16 @@
   return (result == 1);
 }
 
+bool SocketBase::RawAddrToString(RawAddr* addr, char* str) {
+  if (addr->addr.sa_family == AF_INET) {
+    return inet_ntop(AF_INET, &addr->in.sin_addr, str, INET_ADDRSTRLEN) != NULL;
+  } else {
+    ASSERT(addr->addr.sa_family == AF_INET6);
+    return inet_ntop(AF_INET6, &addr->in6.sin6_addr, str, INET6_ADDRSTRLEN) !=
+           NULL;
+  }
+}
+
 static bool ShouldIncludeIfaAddrs(struct ifaddrs* ifa, int lookup_family) {
   if (ifa->ifa_addr == NULL) {
     // OpenVPN's virtual device tun0.
diff --git a/runtime/bin/socket_base_macos.h b/runtime/bin/socket_base_macos.h
index c382401..d919063 100644
--- a/runtime/bin/socket_base_macos.h
+++ b/runtime/bin/socket_base_macos.h
@@ -12,5 +12,6 @@
 #include <arpa/inet.h>
 #include <netdb.h>
 #include <sys/socket.h>
+#include <sys/un.h>
 
 #endif  // RUNTIME_BIN_SOCKET_BASE_MACOS_H_
diff --git a/runtime/bin/socket_base_win.cc b/runtime/bin/socket_base_win.cc
index b24dc05..4ce3fc0 100644
--- a/runtime/bin/socket_base_win.cc
+++ b/runtime/bin/socket_base_win.cc
@@ -20,7 +20,10 @@
 namespace dart {
 namespace bin {
 
-SocketAddress::SocketAddress(struct sockaddr* sockaddr) {
+SocketAddress::SocketAddress(struct sockaddr* sockaddr,
+                             bool unnamed_unix_socket) {
+  // Unix domain sockets not supported on Win. Remove this assert if enabled.
+  ASSERT(!unnamed_unix_socket);
   ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
   RawAddr* raw = reinterpret_cast<RawAddr*>(sockaddr);
 
@@ -246,6 +249,31 @@
   return result == 1;
 }
 
+bool SocketBase::RawAddrToString(RawAddr* addr, char* str) {
+  // According to InetNtopW(), buffer should be large enough for at least 46
+  // characters for IPv6 and 16 for IPv4.
+  COMPILE_ASSERT(INET6_ADDRSTRLEN >= 46);
+  wchar_t tmp_buffer[INET6_ADDRSTRLEN];
+  if (addr->addr.sa_family == AF_INET) {
+    if (InetNtop(AF_INET, &addr->in.sin_addr, tmp_buffer, INET_ADDRSTRLEN) ==
+        NULL) {
+      return false;
+    }
+  } else {
+    ASSERT(addr->addr.sa_family == AF_INET6);
+    if (InetNtop(AF_INET6, &addr->in6.sin6_addr, tmp_buffer,
+                 INET6_ADDRSTRLEN) == NULL) {
+      return false;
+    }
+  }
+  WideToUtf8Scope wide_to_utf8_scope(tmp_buffer);
+  if (wide_to_utf8_scope.length() <= INET6_ADDRSTRLEN) {
+    strncpy(str, wide_to_utf8_scope.utf8(), INET6_ADDRSTRLEN);
+    return true;
+  }
+  return false;
+}
+
 bool SocketBase::ListInterfacesSupported() {
   return true;
 }
diff --git a/runtime/bin/socket_base_win.h b/runtime/bin/socket_base_win.h
index 55ab91d..9bfbe8c 100644
--- a/runtime/bin/socket_base_win.h
+++ b/runtime/bin/socket_base_win.h
@@ -9,6 +9,7 @@
 #error Do not include socket_base_win.h directly. Use socket_base.h.
 #endif
 
+#include <afunix.h>
 #include <iphlpapi.h>
 #include <mswsock.h>
 #include <winsock2.h>
diff --git a/runtime/bin/socket_fuchsia.cc b/runtime/bin/socket_fuchsia.cc
index b4c0b10..fa8a958 100644
--- a/runtime/bin/socket_fuchsia.cc
+++ b/runtime/bin/socket_fuchsia.cc
@@ -109,12 +109,25 @@
   return Connect(fd, addr);
 }
 
+intptr_t Socket::CreateUnixDomainConnect(const RawAddr& addr) {
+  // Fuchsia does not support unix domain socket
+  errno = ENOSYS;
+  return -1;
+}
+
 intptr_t Socket::CreateBindConnect(const RawAddr& addr,
                                    const RawAddr& source_addr) {
   errno = ENOSYS;
   return -1;
 }
 
+intptr_t Socket::CreateUnixDomainBindConnect(const RawAddr& addr,
+                                             const RawAddr& source_addr) {
+  // Fuchsia does not support unix domain socket
+  errno = ENOSYS;
+  return -1;
+}
+
 intptr_t Socket::CreateBindDatagram(const RawAddr& addr,
                                     bool reuseAddress,
                                     bool reusePort,
@@ -192,6 +205,13 @@
   return reinterpret_cast<intptr_t>(io_handle);
 }
 
+intptr_t ServerSocket::CreateUnixDomainBindListen(const RawAddr& addr,
+                                                  intptr_t backlog) {
+  // Fuchsia does not support unix domain socket.
+  errno = ENOSYS;
+  return -1;
+}
+
 bool ServerSocket::StartAccept(intptr_t fd) {
   USE(fd);
   return true;
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc
index c993fcb..e6b7e5c 100644
--- a/runtime/bin/socket_linux.cc
+++ b/runtime/bin/socket_linux.cc
@@ -48,7 +48,7 @@
   if ((result == 0) || (errno == EINPROGRESS)) {
     return fd;
   }
-  FDUtils::FDUtils::SaveErrorAndClose(fd);
+  FDUtils::SaveErrorAndClose(fd);
   return -1;
 }
 
@@ -60,6 +60,20 @@
   return Connect(fd, addr);
 }
 
+intptr_t Socket::CreateUnixDomainConnect(const RawAddr& addr) {
+  intptr_t fd = Create(addr);
+  if (fd < 0) {
+    return fd;
+  }
+  intptr_t result = TEMP_FAILURE_RETRY(connect(
+      fd, (struct sockaddr*)&addr.un, SocketAddress::GetAddrLength(addr)));
+  if (result == 0 || errno == EAGAIN) {
+    return fd;
+  }
+  FDUtils::SaveErrorAndClose(fd);
+  return -1;
+}
+
 intptr_t Socket::CreateBindConnect(const RawAddr& addr,
                                    const RawAddr& source_addr) {
   intptr_t fd = Create(addr);
@@ -69,7 +83,7 @@
 
   intptr_t result = TEMP_FAILURE_RETRY(
       bind(fd, &source_addr.addr, SocketAddress::GetAddrLength(source_addr)));
-  if ((result != 0) && (errno != EINPROGRESS)) {
+  if (result != 0) {
     FDUtils::SaveErrorAndClose(fd);
     return -1;
   }
@@ -77,6 +91,29 @@
   return Connect(fd, addr);
 }
 
+intptr_t Socket::CreateUnixDomainBindConnect(const RawAddr& addr,
+                                             const RawAddr& source_addr) {
+  intptr_t fd = Create(addr);
+  if (fd < 0) {
+    return fd;
+  }
+
+  intptr_t result = TEMP_FAILURE_RETRY(
+      bind(fd, &source_addr.addr, SocketAddress::GetAddrLength(source_addr)));
+  if (result != 0) {
+    FDUtils::SaveErrorAndClose(fd);
+    return -1;
+  }
+
+  result = TEMP_FAILURE_RETRY(connect(fd, (struct sockaddr*)&addr.un,
+                                      SocketAddress::GetAddrLength(addr)));
+  if (result == 0 || errno == EAGAIN) {
+    return fd;
+  }
+  FDUtils::SaveErrorAndClose(fd);
+  return -1;
+}
+
 intptr_t Socket::CreateBindDatagram(const RawAddr& addr,
                                     bool reuseAddress,
                                     bool reusePort,
@@ -182,6 +219,21 @@
   return fd;
 }
 
+intptr_t ServerSocket::CreateUnixDomainBindListen(const RawAddr& addr,
+                                                  intptr_t backlog) {
+  intptr_t fd = Create(addr);
+  if (NO_RETRY_EXPECTED(bind(fd, (struct sockaddr*)&addr.un,
+                             sizeof(struct sockaddr_un))) < 0) {
+    FDUtils::SaveErrorAndClose(fd);
+    return -1;
+  }
+  if (NO_RETRY_EXPECTED(listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
+    FDUtils::SaveErrorAndClose(fd);
+    return -1;
+  }
+  return fd;
+}
+
 bool ServerSocket::StartAccept(intptr_t fd) {
   USE(fd);
   return true;
diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc
index f87482e..8c6be8b 100644
--- a/runtime/bin/socket_macos.cc
+++ b/runtime/bin/socket_macos.cc
@@ -66,6 +66,14 @@
   return Connect(fd, addr);
 }
 
+intptr_t Socket::CreateUnixDomainConnect(const RawAddr& addr) {
+  intptr_t fd = Create(addr);
+  if (fd < 0) {
+    return fd;
+  }
+  return Connect(fd, addr);
+}
+
 intptr_t Socket::CreateBindConnect(const RawAddr& addr,
                                    const RawAddr& source_addr) {
   intptr_t fd = Create(addr);
@@ -75,7 +83,24 @@
 
   intptr_t result = TEMP_FAILURE_RETRY(
       bind(fd, &source_addr.addr, SocketAddress::GetAddrLength(source_addr)));
-  if ((result != 0) && (errno != EINPROGRESS)) {
+  if (result != 0) {
+    FDUtils::SaveErrorAndClose(fd);
+    return -1;
+  }
+
+  return Connect(fd, addr);
+}
+
+intptr_t Socket::CreateUnixDomainBindConnect(const RawAddr& addr,
+                                             const RawAddr& source_addr) {
+  intptr_t fd = Create(addr);
+  if (fd < 0) {
+    return fd;
+  }
+
+  intptr_t result = TEMP_FAILURE_RETRY(
+      bind(fd, &source_addr.addr, SocketAddress::GetAddrLength(source_addr)));
+  if (result != 0) {
     FDUtils::SaveErrorAndClose(fd);
     return -1;
   }
@@ -199,6 +224,37 @@
   return fd;
 }
 
+intptr_t ServerSocket::CreateUnixDomainBindListen(const RawAddr& addr,
+                                                  intptr_t backlog) {
+  intptr_t fd;
+  fd = NO_RETRY_EXPECTED(socket(addr.ss.ss_family, SOCK_STREAM, 0));
+  if (fd < 0) {
+    return -1;
+  }
+
+  if (!FDUtils::SetCloseOnExec(fd)) {
+    FDUtils::SaveErrorAndClose(fd);
+    return -1;
+  }
+
+  if (NO_RETRY_EXPECTED(
+          bind(fd, &addr.addr, SocketAddress::GetAddrLength(addr))) < 0) {
+    FDUtils::SaveErrorAndClose(fd);
+    return -1;
+  }
+
+  if (NO_RETRY_EXPECTED(listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
+    FDUtils::SaveErrorAndClose(fd);
+    return -1;
+  }
+
+  if (!FDUtils::SetNonBlocking(fd)) {
+    FDUtils::SaveErrorAndClose(fd);
+    return -1;
+  }
+  return fd;
+}
+
 bool ServerSocket::StartAccept(intptr_t fd) {
   USE(fd);
   return true;
diff --git a/runtime/bin/socket_win.cc b/runtime/bin/socket_win.cc
index 5d476e9..4e393dc 100644
--- a/runtime/bin/socket_win.cc
+++ b/runtime/bin/socket_win.cc
@@ -131,6 +131,13 @@
   return Connect(fd, addr, bind_addr);
 }
 
+intptr_t Socket::CreateUnixDomainConnect(const RawAddr& addr) {
+  // TODO(21403): Support unix domain socket on Windows
+  // https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/
+  SetLastError(ERROR_NOT_SUPPORTED);
+  return -1;
+}
+
 intptr_t Socket::CreateBindConnect(const RawAddr& addr,
                                    const RawAddr& source_addr) {
   intptr_t fd = Create(addr);
@@ -141,6 +148,12 @@
   return Connect(fd, addr, source_addr);
 }
 
+intptr_t Socket::CreateUnixDomainBindConnect(const RawAddr& addr,
+                                             const RawAddr& source_addr) {
+  SetLastError(ERROR_NOT_SUPPORTED);
+  return -1;
+}
+
 intptr_t ServerSocket::Accept(intptr_t fd) {
   ListenSocket* listen_socket = reinterpret_cast<ListenSocket*>(fd);
   ClientSocket* client_socket = listen_socket->Accept();
@@ -271,6 +284,14 @@
   return reinterpret_cast<intptr_t>(listen_socket);
 }
 
+intptr_t ServerSocket::CreateUnixDomainBindListen(const RawAddr& addr,
+                                                  intptr_t backlog) {
+  // TODO(21403): Support unix domain socket on Windows
+  // https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/
+  SetLastError(ERROR_NOT_SUPPORTED);
+  return -1;
+}
+
 bool ServerSocket::StartAccept(intptr_t fd) {
   ListenSocket* listen_socket = reinterpret_cast<ListenSocket*>(fd);
   listen_socket->EnsureInitialized(EventHandler::delegate());
diff --git a/runtime/bin/sync_socket_android.cc b/runtime/bin/sync_socket_android.cc
index b051e3a..80094f7 100644
--- a/runtime/bin/sync_socket_android.cc
+++ b/runtime/bin/sync_socket_android.cc
@@ -38,7 +38,7 @@
     return fd;
   }
   ASSERT(errno != EINPROGRESS);
-  FDUtils::FDUtils::SaveErrorAndClose(fd);
+  FDUtils::SaveErrorAndClose(fd);
   return -1;
 }
 
diff --git a/runtime/bin/sync_socket_fuchsia.cc b/runtime/bin/sync_socket_fuchsia.cc
index 3a6fe0d..23461f4f 100644
--- a/runtime/bin/sync_socket_fuchsia.cc
+++ b/runtime/bin/sync_socket_fuchsia.cc
@@ -38,7 +38,7 @@
     return fd;
   }
   ASSERT(errno != EINPROGRESS);
-  FDUtils::FDUtils::SaveErrorAndClose(fd);
+  FDUtils::SaveErrorAndClose(fd);
   return -1;
 }
 
diff --git a/runtime/bin/sync_socket_linux.cc b/runtime/bin/sync_socket_linux.cc
index 1fb564b..963787b 100644
--- a/runtime/bin/sync_socket_linux.cc
+++ b/runtime/bin/sync_socket_linux.cc
@@ -38,7 +38,7 @@
     return fd;
   }
   ASSERT(errno != EINPROGRESS);
-  FDUtils::FDUtils::SaveErrorAndClose(fd);
+  FDUtils::SaveErrorAndClose(fd);
   return -1;
 }
 
diff --git a/runtime/bin/sync_socket_macos.cc b/runtime/bin/sync_socket_macos.cc
index 5ee9b68c..e266341 100644
--- a/runtime/bin/sync_socket_macos.cc
+++ b/runtime/bin/sync_socket_macos.cc
@@ -41,7 +41,7 @@
     return fd;
   }
   ASSERT(errno != EINPROGRESS);
-  FDUtils::FDUtils::SaveErrorAndClose(fd);
+  FDUtils::SaveErrorAndClose(fd);
   return -1;
 }
 
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 0da49b0..b01cedc 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -530,6 +530,7 @@
   bool load_vmservice_library;
   bool unsafe_trust_strong_mode_types;
   bool copy_parent_code;
+  bool null_safety;
 } Dart_IsolateFlags;
 
 /**
diff --git a/runtime/observatory/.packages b/runtime/observatory/.packages
index 0b5a10a..8521bd7 100644
--- a/runtime/observatory/.packages
+++ b/runtime/observatory/.packages
@@ -8,7 +8,6 @@
 path:../../third_party/observatory_pub_packages/packages/path/lib
 quiver:../../third_party/observatory_pub_packages/packages/quiver/lib
 stack_trace:../../third_party/observatory_pub_packages/packages/stack_trace/lib
-unittest:../../third_party/observatory_pub_packages/packages/unittest/lib
 usage:../../third_party/observatory_pub_packages/packages/usage/lib
 observatory:lib
 
@@ -17,6 +16,7 @@
 boolean_selector:../../third_party/pkg/boolean_selector/lib
 charcode:../../third_party/pkg/charcode/lib
 dart_internal:../../pkg/dart_internal/lib
+expect:../../pkg/expect/lib
 http:../../third_party/pkg/http/lib
 http_parser:../../third_party/pkg/http_parser/lib
 matcher:../../third_party/pkg/matcher/lib
diff --git a/runtime/observatory/lib/object_graph.dart b/runtime/observatory/lib/object_graph.dart
index 6f7cfe5..ce48c8b 100644
--- a/runtime/observatory/lib/object_graph.dart
+++ b/runtime/observatory/lib/object_graph.dart
@@ -260,7 +260,7 @@
 
   _SnapshotObject._new(this._id, this._graph, this.label);
 
-  bool operator ==(other) {
+  bool operator ==(Object other) {
     if (other is _SnapshotObject) {
       return _id == other._id && _graph == other._graph;
     }
@@ -378,7 +378,13 @@
 
   _SnapshotMergedDominator._new(this._id, this._graph, this._parent);
 
-  bool operator ==(other) => _id == other._id && _graph == other._graph;
+  bool operator ==(Object other) {
+    if (other is _SnapshotMergedDominator) {
+      return _id == other._id && _graph == other._graph;
+    }
+    return false;
+  }
+
   int get hashCode => _id ^ _graph.hashCode;
 
   String get description => "$instanceCount instances of ${klass.name}";
@@ -742,7 +748,7 @@
     _totalExternalSize = stream.readUnsigned();
 
     var K = stream.readUnsigned();
-    var classes = new List<_SnapshotClass>(K + 1);
+    var classes = new List<_SnapshotClass>.filled(K + 1, null);
     classes[0] = _SnapshotClass._new(this, 0, "Root", "", "");
 
     for (var cid = 1; cid <= K; cid++) {
diff --git a/runtime/observatory/lib/src/app/analytics.dart b/runtime/observatory/lib/src/app/analytics.dart
index 484f7da..a34c2da 100644
--- a/runtime/observatory/lib/src/app/analytics.dart
+++ b/runtime/observatory/lib/src/app/analytics.dart
@@ -4,10 +4,17 @@
 
 part of app;
 
+// TODO(eernst): Use 'bool.fromEnvironment' below when possible;
+// for now we use a dual `defaultValue` rewrite.
+const _obsVer = (String.fromEnvironment('OBS_VER', defaultValue: '1') ==
+        String.fromEnvironment('OBS_VER', defaultValue: '2'))
+    ? String.fromEnvironment('OBS_VER')
+    : null;
+
 class Analytics {
   static final _UA = 'UA-26406144-17';
   static final _name = 'Observatory';
-  static final _version = const String.fromEnvironment('OBS_VER');
+  static final _version = _obsVer;
   static final _googleAnalytics = new AnalyticsHtml(_UA, _name, _version);
 
   static initialize() {
diff --git a/runtime/observatory/lib/src/app/application.dart b/runtime/observatory/lib/src/app/application.dart
index 42ffe2e..e3c4d7b 100644
--- a/runtime/observatory/lib/src/app/application.dart
+++ b/runtime/observatory/lib/src/app/application.dart
@@ -12,7 +12,7 @@
   final TargetRepository targets = new TargetRepository(isConnectedVMTarget);
   final EventRepository events = new EventRepository();
   final NotificationRepository notifications = new NotificationRepository();
-  final _pageRegistry = new List<Page>();
+  final _pageRegistry = <Page>[];
   LocationManager _locationManager;
   LocationManager get locationManager => _locationManager;
   Page currentPage;
diff --git a/runtime/observatory/lib/src/app/view_model.dart b/runtime/observatory/lib/src/app/view_model.dart
index d312cb3..f210e13 100644
--- a/runtime/observatory/lib/src/app/view_model.dart
+++ b/runtime/observatory/lib/src/app/view_model.dart
@@ -24,7 +24,7 @@
 
 class SortedTable {
   final List<SortedTableColumn> columns;
-  final List<SortedTableRow> rows = new List<SortedTableRow>();
+  final List<SortedTableRow> rows = <SortedTableRow>[];
   final List<int> sortedRows = [];
 
   SortedTable(this.columns);
diff --git a/runtime/observatory/lib/src/cli/command.dart b/runtime/observatory/lib/src/cli/command.dart
index b2a1ab7..0a0fc42 100644
--- a/runtime/observatory/lib/src/cli/command.dart
+++ b/runtime/observatory/lib/src/cli/command.dart
@@ -61,7 +61,7 @@
 
   // Returns a list of local subcommands which match the args.
   List<Command> _matchLocal(String argWithSpace, bool preferExact) {
-    var matches = new List<Command>();
+    var matches = <Command>[];
     var arg = argWithSpace.trimRight();
     for (var child in _children) {
       if (child.name.startsWith(arg)) {
diff --git a/runtime/observatory/lib/src/elements/context_ref.dart b/runtime/observatory/lib/src/elements/context_ref.dart
index 1f92a48..f88bf00 100644
--- a/runtime/observatory/lib/src/elements/context_ref.dart
+++ b/runtime/observatory/lib/src/elements/context_ref.dart
@@ -101,7 +101,7 @@
     if (_loadedContext == null) {
       return [new SpanElement()..text = 'Loading...'];
     }
-    var members = new List<Element>();
+    var members = <Element>[];
     if (_loadedContext.parentContext != null) {
       members.add(new DivElement()
         ..classes = ['memberItem']
diff --git a/runtime/observatory/lib/src/elements/heap_snapshot.dart b/runtime/observatory/lib/src/elements/heap_snapshot.dart
index c5cd6cf..f6505be 100644
--- a/runtime/observatory/lib/src/elements/heap_snapshot.dart
+++ b/runtime/observatory/lib/src/elements/heap_snapshot.dart
@@ -434,7 +434,7 @@
     rootDiff.name = root;
     rootDiff.sizeA = graphA.processPartitions[root] ?? 0;
     rootDiff.sizeB = graphB.processPartitions[root] ?? 0;
-    rootDiff.children = new List<PartitionDiff>();
+    rootDiff.children = <PartitionDiff>[];
     partitions.remove(root);
 
     var childrenA = 0;
@@ -518,7 +518,7 @@
       SnapshotGraph graphA, SnapshotGraph graphB) {
     // Matching classes by SnapshotClass.qualifiedName.
     var classesB = new Map<String, SnapshotClass>();
-    var classesDiff = new List<SnapshotClassDiff>();
+    var classesDiff = <SnapshotClassDiff>[];
     for (var classB in graphB.classes) {
       classesB[classB.qualifiedName] = classB;
     }
@@ -581,7 +581,7 @@
     // dominator tree can be arbitrarily deep. We need to compute the full
     // tree to compute areas, so we do this eagerly to avoid having to
     // repeatedly test for initialization.
-    var worklist = new List<MergedDominatorDiff>();
+    var worklist = <MergedDominatorDiff>[];
     worklist.add(root);
     // Compute children top-down.
     for (var i = 0; i < worklist.length; i++) {
@@ -597,7 +597,7 @@
 
   void _computeChildren(List<MergedDominatorDiff> worklist) {
     assert(children == null);
-    children = new List<MergedDominatorDiff>();
+    children = <MergedDominatorDiff>[];
 
     // Matching children by MergedObjectVertex.klass.qualifiedName.
     final childrenB = <String, SnapshotMergedDominator>{};
@@ -681,7 +681,7 @@
   M.ObjectRepository _objects;
   SnapshotReader _reader;
   String _status;
-  List<SnapshotGraph> _loadedSnapshots = new List<SnapshotGraph>();
+  List<SnapshotGraph> _loadedSnapshots = <SnapshotGraph>[];
   SnapshotGraph _snapshotA;
   SnapshotGraph _snapshotB;
   HeapSnapshotTreeMode _mode = HeapSnapshotTreeMode.mergedDominatorTreeMap;
diff --git a/runtime/observatory/lib/src/elements/helpers/tag.dart b/runtime/observatory/lib/src/elements/helpers/tag.dart
index 1ad74c7..65c269a 100644
--- a/runtime/observatory/lib/src/elements/helpers/tag.dart
+++ b/runtime/observatory/lib/src/elements/helpers/tag.dart
@@ -11,7 +11,7 @@
   static Expando reverseElements = new Expando();
   static CustomElement reverse(HtmlElement element) => reverseElements[element];
 
-  static List<CustomElement> toBeAttached = new List<CustomElement>();
+  static List<CustomElement> toBeAttached = <CustomElement>[];
   static void drainAttached() {
     // Send 'attached' to elements that have been attached to the document.
     bool fired = false;
diff --git a/runtime/observatory/lib/src/elements/retaining_path.dart b/runtime/observatory/lib/src/elements/retaining_path.dart
index 7dca764..c27b912 100644
--- a/runtime/observatory/lib/src/elements/retaining_path.dart
+++ b/runtime/observatory/lib/src/elements/retaining_path.dart
@@ -87,7 +87,7 @@
       return [new SpanElement()..text = 'Loading'];
     }
 
-    var elements = new List<Element>();
+    var elements = <Element>[];
     bool first = true;
     for (var item in _path.elements) {
       elements.add(_createItem(item, first));
diff --git a/runtime/observatory/lib/src/repositories/flag.dart b/runtime/observatory/lib/src/repositories/flag.dart
index a3db15d..13ab784 100644
--- a/runtime/observatory/lib/src/repositories/flag.dart
+++ b/runtime/observatory/lib/src/repositories/flag.dart
@@ -22,7 +22,7 @@
   FlagsRepository(this.vm);
 
   Future<Iterable<Flag>> list() async {
-    var result = new List<Flag>();
+    var result = <Flag>[];
     for (var map in ((await vm.getFlagList()) as S.ServiceMap)['flags']) {
       result.add(_toFlag(map));
     }
diff --git a/runtime/observatory/lib/src/repositories/notification.dart b/runtime/observatory/lib/src/repositories/notification.dart
index 78a81c4..19eb99e 100644
--- a/runtime/observatory/lib/src/repositories/notification.dart
+++ b/runtime/observatory/lib/src/repositories/notification.dart
@@ -10,7 +10,7 @@
 }
 
 class NotificationRepository implements M.NotificationRepository {
-  final List<M.Notification> _list = new List<M.Notification>();
+  final List<M.Notification> _list = <M.Notification>[];
 
   final StreamController<M.NotificationChangeEvent> _onChange =
       new StreamController<M.NotificationChangeEvent>.broadcast();
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index dcbe861..1e4bf9f 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -1061,7 +1061,7 @@
   int get sum => _sum;
   int _sum = 0;
   TagProfileSnapshot(this.seconds, int countersLength)
-      : counters = new List<int>(countersLength);
+      : counters = new List<int>.filled(countersLength, 0);
 
   /// Set [counters] and update [sum].
   void set(List<int> counters) {
@@ -1097,8 +1097,8 @@
 }
 
 class TagProfile {
-  final List<String> names = new List<String>();
-  final List<TagProfileSnapshot> snapshots = new List<TagProfileSnapshot>();
+  final List<String> names = <String>[];
+  final List<TagProfileSnapshot> snapshots = <TagProfileSnapshot>[];
   double get updatedAtSeconds => _seconds;
   double _seconds;
   TagProfileSnapshot _maxSnapshot;
@@ -1404,7 +1404,7 @@
     return M.IsolateStatus.loading;
   }
 
-  final List<String> extensionRPCs = new List<String>();
+  final List<String> extensionRPCs = <String>[];
 
   Map<String, ServiceObject> _cache = new Map<String, ServiceObject>();
   final TagProfile tagProfile = new TagProfile(20);
@@ -1601,7 +1601,7 @@
   SnapshotReader _snapshotFetch;
 
   List<Thread> get threads => _threads;
-  final List<Thread> _threads = new List<Thread>();
+  final List<Thread> _threads = <Thread>[];
 
   int get zoneHighWatermark => _zoneHighWatermark;
   int _zoneHighWatermark = 0;
@@ -2054,7 +2054,7 @@
 }
 
 class ObjectStore extends ServiceObject implements M.ObjectStore {
-  List<NamedField> fields = new List<NamedField>();
+  List<NamedField> fields = <NamedField>[];
 
   ObjectStore._empty(ServiceObjectOwner owner) : super._empty(owner);
 
@@ -2911,7 +2911,7 @@
     twoByteBytecode = map['_twoByteBytecode'];
 
     if (map['fields'] != null) {
-      var fields = new List<BoundField>();
+      var fields = <BoundField>[];
       for (var f in map['fields']) {
         fields.add(new BoundField(f['decl'], f['value']));
       }
@@ -2930,7 +2930,7 @@
       // Should be:
       // elements = map['elements'].map((e) => new Guarded<Instance>(e)).toList();
       // some times we obtain object that are not InstanceRef
-      var localElements = new List<Guarded<HeapObject>>();
+      var localElements = <Guarded<HeapObject>>[];
       for (var element in map['elements']) {
         localElements.add(new Guarded<HeapObject>(element));
       }
@@ -3051,7 +3051,7 @@
     if (map['variables'] == null) {
       variables = <ContextElement>[];
     } else {
-      var localVariables = new List<ContextElement>();
+      var localVariables = <ContextElement>[];
       for (var element in map['variables']) {
         localVariables.add(new ContextElement(element));
       }
@@ -3465,15 +3465,18 @@
   factory CallSite.fromMap(Map siteMap, Script script) {
     var name = siteMap['name'];
     var tokenPos = siteMap['tokenPos'];
-    var entries = new List<CallSiteEntry>();
+    var entries = <CallSiteEntry>[];
     for (var entryMap in siteMap['cacheEntries']) {
       entries.add(new CallSiteEntry.fromMap(entryMap));
     }
     return new CallSite(name, script, tokenPos, entries);
   }
 
-  operator ==(other) {
-    return (script == other.script) && (tokenPos == other.tokenPos);
+  bool operator ==(Object other) {
+    if (other is CallSite) {
+      return (script == other.script) && (tokenPos == other.tokenPos);
+    }
+    return false;
   }
 
   int get hashCode => (script.hashCode << 8) | tokenPos;
@@ -4239,7 +4242,7 @@
 class CodeInlineInterval {
   final int start;
   final int end;
-  final List<ServiceFunction> functions = new List<ServiceFunction>();
+  final List<ServiceFunction> functions = <ServiceFunction>[];
   bool contains(int pc) => (pc >= start) && (pc < end);
   CodeInlineInterval(this.start, this.end);
 }
diff --git a/runtime/observatory/lib/utils.dart b/runtime/observatory/lib/utils.dart
index 286b512..821e88f 100644
--- a/runtime/observatory/lib/utils.dart
+++ b/runtime/observatory/lib/utils.dart
@@ -251,7 +251,7 @@
   static bool runningInJavaScript() => identical(1.0, 1);
 
   static formatStringAsLiteral(String value, [bool wasTruncated = false]) {
-    var result = new List<int>();
+    var result = <int>[];
     result.add("'".codeUnitAt(0));
     for (int codeUnit in value.codeUnits) {
       if (codeUnit == '\n'.codeUnitAt(0))
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 6d5f293..34feaf0 100644
--- a/runtime/observatory/tests/service/add_breakpoint_rpc_kernel_test.dart
+++ b/runtime/observatory/tests/service/add_breakpoint_rpc_kernel_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/allocations_test.dart b/runtime/observatory/tests/service/allocations_test.dart
index b3a5c04..b2d9085 100644
--- a/runtime/observatory/tests/service/allocations_test.dart
+++ b/runtime/observatory/tests/service/allocations_test.dart
@@ -5,7 +5,7 @@
 library allocations_test;
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 class Foo {}
diff --git a/runtime/observatory/tests/service/async_generator_breakpoint_test.dart b/runtime/observatory/tests/service/async_generator_breakpoint_test.dart
index af14028..44f5c2a 100644
--- a/runtime/observatory/tests/service/async_generator_breakpoint_test.dart
+++ b/runtime/observatory/tests/service/async_generator_breakpoint_test.dart
@@ -6,7 +6,7 @@
 
 import 'dart:async';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 printSync() {
diff --git a/runtime/observatory/tests/service/async_scope_test.dart b/runtime/observatory/tests/service/async_scope_test.dart
index 106e053..3e01b1d 100644
--- a/runtime/observatory/tests/service/async_scope_test.dart
+++ b/runtime/observatory/tests/service/async_scope_test.dart
@@ -5,7 +5,7 @@
 import 'dart:async';
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/auth_token_test.dart b/runtime/observatory/tests/service/auth_token_test.dart
index 8c6ae7f..f2ba275 100644
--- a/runtime/observatory/tests/service/auth_token_test.dart
+++ b/runtime/observatory/tests/service/auth_token_test.dart
@@ -5,8 +5,9 @@
 import 'dart:async';
 import 'dart:developer';
 import 'dart:io' as io;
+import 'package:expect/expect.dart';
 import 'package:observatory/service_io.dart' as S;
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 Future<Null> testeeBefore() async {
@@ -14,11 +15,11 @@
   print(await Service.getInfo());
   // Start the web server.
   ServiceProtocolInfo info = await Service.controlWebServer(enable: true);
-  expect(info.serverUri, isNotNull);
+  Expect.isNotNull(info.serverUri);
   // Ensure that we have the auth token in the path segments.
-  expect(info.serverUri.pathSegments.length, greaterThan(1));
+  Expect.isTrue(info.serverUri.pathSegments.length > 1);
   // Sanity check the length of the auth token.
-  expect(info.serverUri.pathSegments[0].length, greaterThan(8));
+  Expect.isTrue(info.serverUri.pathSegments[0].length > 8);
 
   // Try connecting to the server without the auth token, it should throw
   // an exception.
@@ -27,17 +28,16 @@
   var httpClient = new io.HttpClient();
   try {
     var request = await httpClient.getUrl(url);
-    expect(true, false);
+    fail('expected exception');
   } catch (e) {
-    expect(true, true);
+    // Expected
   }
 
   // Try connecting to the server with the auth token, it should succeed.
   try {
     var request = await httpClient.getUrl(info.serverUri);
-    expect(true, true);
   } catch (e) {
-    expect(true, false);
+    fail('could not connect');
   }
 }
 
@@ -46,7 +46,6 @@
     await isolate.reload();
     // Just getting here means that the testee enabled the service protocol
     // web server.
-    expect(true, true);
   }
 ];
 
diff --git a/runtime/observatory/tests/service/awaiter_async_stack_contents_2_test.dart b/runtime/observatory/tests/service/awaiter_async_stack_contents_2_test.dart
index b2ba9cd..e9b971c 100644
--- a/runtime/observatory/tests/service/awaiter_async_stack_contents_2_test.dart
+++ b/runtime/observatory/tests/service/awaiter_async_stack_contents_2_test.dart
@@ -7,7 +7,7 @@
 import 'dart:developer';
 import 'package:observatory/models.dart' as M;
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/awaiter_async_stack_contents_test.dart b/runtime/observatory/tests/service/awaiter_async_stack_contents_test.dart
index 2887925..0aef00e 100644
--- a/runtime/observatory/tests/service/awaiter_async_stack_contents_test.dart
+++ b/runtime/observatory/tests/service/awaiter_async_stack_contents_test.dart
@@ -7,7 +7,7 @@
 import 'dart:developer';
 import 'package:observatory/models.dart' as M;
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/bad_reload_test.dart b/runtime/observatory/tests/service/bad_reload_test.dart
index ff6396c..9c4219c 100644
--- a/runtime/observatory/tests/service/bad_reload_test.dart
+++ b/runtime/observatory/tests/service/bad_reload_test.dart
@@ -10,7 +10,7 @@
 import 'service_test_common.dart';
 import 'package:observatory/service.dart';
 import 'package:path/path.dart' as path;
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 // Chop off the file name.
 String baseDirectory = path.dirname(Platform.script.path) + '/';
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 62bbfb3..08df24d 100644
--- a/runtime/observatory/tests/service/bad_web_socket_address_test.dart
+++ b/runtime/observatory/tests/service/bad_web_socket_address_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:logging/logging.dart';
 import "package:observatory/service_io.dart";
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 void testBadWebSocket() {
   var vm = new WebSocketVM(new WebSocketVMTarget('ws://karatekid/ws'));
diff --git a/runtime/observatory/tests/service/break_on_activation_test.dart b/runtime/observatory/tests/service/break_on_activation_test.dart
index 64ae8bf..fac2684 100644
--- a/runtime/observatory/tests/service/break_on_activation_test.dart
+++ b/runtime/observatory/tests/service/break_on_activation_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 genRepeater(value) {
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 b5bf200..dd52294 100644
--- a/runtime/observatory/tests/service/break_on_async_function_test.dart
+++ b/runtime/observatory/tests/service/break_on_async_function_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 import 'dart:developer';
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 8f5d9e5..bc504c74 100644
--- a/runtime/observatory/tests/service/break_on_default_constructor_test.dart
+++ b/runtime/observatory/tests/service/break_on_default_constructor_test.dart
@@ -7,7 +7,7 @@
 import 'package:observatory/debugger.dart';
 import 'package:observatory/service.dart' as S;
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'service_test_common.dart';
 import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/break_on_function_test.dart b/runtime/observatory/tests/service/break_on_function_test.dart
index 83cfbc9..89f60fb 100644
--- a/runtime/observatory/tests/service/break_on_function_test.dart
+++ b/runtime/observatory/tests/service/break_on_function_test.dart
@@ -4,7 +4,7 @@
 // VMOptions=--verbose_debug
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 import 'dart:developer';
diff --git a/runtime/observatory/tests/service/breakpoint_async_break_test.dart b/runtime/observatory/tests/service/breakpoint_async_break_test.dart
index c33d670..b59613e 100644
--- a/runtime/observatory/tests/service/breakpoint_async_break_test.dart
+++ b/runtime/observatory/tests/service/breakpoint_async_break_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 import 'dart:async';
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 7656a7b..0bc3c1f 100644
--- a/runtime/observatory/tests/service/breakpoint_non_debuggable_library_test.dart
+++ b/runtime/observatory/tests/service/breakpoint_non_debuggable_library_test.dart
@@ -5,7 +5,7 @@
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
 import 'package:path/path.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
@@ -69,7 +69,6 @@
   },
   resumeIsolate,
   hasStoppedAtExit,
-  resumeIsolate
 ];
 
 main(args) => runIsolateTests(args, tests,
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 8c21890..4723545 100644
--- a/runtime/observatory/tests/service/breakpoint_two_args_checked_test.dart
+++ b/runtime/observatory/tests/service/breakpoint_two_args_checked_test.dart
@@ -7,7 +7,7 @@
 // to create a breakpoint for fast Smi ops.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 import 'dart:developer';
diff --git a/runtime/observatory/tests/service/caching_test.dart b/runtime/observatory/tests/service/caching_test.dart
index b54f241..0c89eca 100644
--- a/runtime/observatory/tests/service/caching_test.dart
+++ b/runtime/observatory/tests/service/caching_test.dart
@@ -9,7 +9,7 @@
 library caching_test;
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/capture_stdio_test.dart b/runtime/observatory/tests/service/capture_stdio_test.dart
index 64386323..b02e476 100644
--- a/runtime/observatory/tests/service/capture_stdio_test.dart
+++ b/runtime/observatory/tests/service/capture_stdio_test.dart
@@ -6,7 +6,7 @@
 import 'dart:developer';
 import 'dart:io';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/causal_async_stack_contents_test.dart b/runtime/observatory/tests/service/causal_async_stack_contents_test.dart
index 10a3669..ed77ae6 100644
--- a/runtime/observatory/tests/service/causal_async_stack_contents_test.dart
+++ b/runtime/observatory/tests/service/causal_async_stack_contents_test.dart
@@ -7,7 +7,7 @@
 import 'dart:developer';
 import 'package:observatory/models.dart' as M;
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/causal_async_stack_presence_test.dart b/runtime/observatory/tests/service/causal_async_stack_presence_test.dart
index 02d92ff..0e57f47 100644
--- a/runtime/observatory/tests/service/causal_async_stack_presence_test.dart
+++ b/runtime/observatory/tests/service/causal_async_stack_presence_test.dart
@@ -6,7 +6,7 @@
 
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/causal_async_star_stack_contents_test.dart b/runtime/observatory/tests/service/causal_async_star_stack_contents_test.dart
index feb529e..8efcecc 100644
--- a/runtime/observatory/tests/service/causal_async_star_stack_contents_test.dart
+++ b/runtime/observatory/tests/service/causal_async_star_stack_contents_test.dart
@@ -7,7 +7,7 @@
 import 'dart:developer';
 import 'package:observatory/models.dart' as M;
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/causal_async_star_stack_presence_test.dart b/runtime/observatory/tests/service/causal_async_star_stack_presence_test.dart
index 9456579..df29834 100644
--- a/runtime/observatory/tests/service/causal_async_star_stack_presence_test.dart
+++ b/runtime/observatory/tests/service/causal_async_star_stack_presence_test.dart
@@ -6,7 +6,7 @@
 
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/client_name_rpc_test.dart b/runtime/observatory/tests/service/client_name_rpc_test.dart
index b143bd5..41cbe4f 100644
--- a/runtime/observatory/tests/service/client_name_rpc_test.dart
+++ b/runtime/observatory/tests/service/client_name_rpc_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
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 3a57471..427706f 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
@@ -5,7 +5,7 @@
 import 'dart:async';
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'client_resume_approvals_common.dart';
 import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/client_resume_approvals_common.dart b/runtime/observatory/tests/service/client_resume_approvals_common.dart
index 3323484..a2221e5 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_common.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_common.dart
@@ -5,7 +5,6 @@
 import 'dart:async';
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
 import 'service_test_common.dart';
 
 const String clientName = 'TestClient';
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 0dc0402..9d23522 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_disconnect_test.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_disconnect_test.dart
@@ -5,7 +5,7 @@
 import 'dart:async';
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'client_resume_approvals_common.dart';
 import 'service_test_common.dart';
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 ffbbc06..d3a09a9 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
@@ -5,7 +5,7 @@
 import 'dart:async';
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'client_resume_approvals_common.dart';
 import 'service_test_common.dart';
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 65989ee..5f26a9c 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
@@ -5,7 +5,7 @@
 import 'dart:async';
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'client_resume_approvals_common.dart';
 import 'service_test_common.dart';
@@ -36,7 +36,7 @@
     );
     client3 = await createClient(isolate.owner, clientName: 'DummyClient');
 
-    Future resumeFuture = waitForResume(isolate);
+    final resumeFuture = waitForResume(isolate);
     expect(await isPausedAtStart(isolate), true);
     await resume(client2, isolate);
     expect(await isPausedAtStart(isolate), true);
@@ -51,13 +51,10 @@
       isolate,
       pauseOnExit: true,
     );
-    final resumeFuture = waitForResume(isolate);
     await resume(client1, isolate);
     expect(await isPausedAtExit(isolate), true);
     await resume(client2, isolate);
-    await resumeFuture;
-    await isolate.reload();
-    expect(await isPausedAtExit(isolate), false);
+    await waitForTargetVMExit(isolate.vm);
   },
 ];
 
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 9f0f52d..3d33112 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
@@ -5,7 +5,7 @@
 import 'dart:async';
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'client_resume_approvals_common.dart';
 import 'service_test_common.dart';
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 db0b852..250d349 100644
--- a/runtime/observatory/tests/service/client_resume_approvals_reload_test.dart
+++ b/runtime/observatory/tests/service/client_resume_approvals_reload_test.dart
@@ -5,7 +5,7 @@
 import 'dart:async';
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'client_resume_approvals_common.dart';
 import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/code_test.dart b/runtime/observatory/tests/service/code_test.dart
index c904e8b..c08ef61 100644
--- a/runtime/observatory/tests/service/code_test.dart
+++ b/runtime/observatory/tests/service/code_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'dart:async';
 
diff --git a/runtime/observatory/tests/service/collect_all_garbage_test.dart b/runtime/observatory/tests/service/collect_all_garbage_test.dart
index 8db2921..a9c0377 100644
--- a/runtime/observatory/tests/service/collect_all_garbage_test.dart
+++ b/runtime/observatory/tests/service/collect_all_garbage_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/command_test.dart b/runtime/observatory/tests/service/command_test.dart
index 86e40d5..57ca485 100644
--- a/runtime/observatory/tests/service/command_test.dart
+++ b/runtime/observatory/tests/service/command_test.dart
@@ -5,7 +5,7 @@
 import 'dart:async';
 
 import 'package:observatory/cli.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 class TestCommand extends Command {
   TestCommand(this.out, name, children) : super(name, children);
diff --git a/runtime/observatory/tests/service/complex_reload_test.dart b/runtime/observatory/tests/service/complex_reload_test.dart
index 2e6e35e..f0c8b93 100644
--- a/runtime/observatory/tests/service/complex_reload_test.dart
+++ b/runtime/observatory/tests/service/complex_reload_test.dart
@@ -10,7 +10,7 @@
 import 'service_test_common.dart';
 import 'package:observatory/service.dart';
 import 'package:path/path.dart' as path;
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 // Chop off the file name.
 String baseDirectory = path.dirname(Platform.script.path) + '/';
diff --git a/runtime/observatory/tests/service/contexts_test.dart b/runtime/observatory/tests/service/contexts_test.dart
index ecc9b44..ad17f38 100644
--- a/runtime/observatory/tests/service/contexts_test.dart
+++ b/runtime/observatory/tests/service/contexts_test.dart
@@ -5,7 +5,7 @@
 library inbound_references_test;
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 var cleanBlock, copyingBlock, fullBlock, fullBlockWithChain;
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 a89b0e9..a85a9c3 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
@@ -4,7 +4,7 @@
 
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/coverage_leaf_function_test.dart b/runtime/observatory/tests/service/coverage_leaf_function_test.dart
index a90ec86..c36441b 100644
--- a/runtime/observatory/tests/service/coverage_leaf_function_test.dart
+++ b/runtime/observatory/tests/service/coverage_leaf_function_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'service_test_common.dart';
 import 'dart:developer';
@@ -44,12 +44,12 @@
 
     var expectedRange = {
       'scriptIndex': 0,
-      'startPos': 392,
-      'endPos': 442,
+      'startPos': 384,
+      'endPos': 434,
       'compiled': true,
       'coverage': {
         'hits': [],
-        'misses': [392]
+        'misses': [384]
       }
     };
 
@@ -85,11 +85,11 @@
 
     var expectedRange = {
       'scriptIndex': 0,
-      'startPos': 392,
-      'endPos': 442,
+      'startPos': 384,
+      'endPos': 434,
       'compiled': true,
       'coverage': {
-        'hits': [392],
+        'hits': [384],
         'misses': []
       }
     };
diff --git a/runtime/observatory/tests/service/coverage_optimized_function_test.dart b/runtime/observatory/tests/service/coverage_optimized_function_test.dart
index 8d68907..ad57d161 100644
--- a/runtime/observatory/tests/service/coverage_optimized_function_test.dart
+++ b/runtime/observatory/tests/service/coverage_optimized_function_test.dart
@@ -4,7 +4,7 @@
 // VMOptions=--no_background_compilation --optimization_counter_threshold=10
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'service_test_common.dart';
 import 'dart:developer';
@@ -37,11 +37,11 @@
 
     var expectedRange = {
       'scriptIndex': 0,
-      'startPos': 469,
-      'endPos': 536,
+      'startPos': 461,
+      'endPos': 528,
       'compiled': true,
       'coverage': {
-        'hits': [469, 509, 520, 524],
+        'hits': [461, 501, 512, 516],
         'misses': []
       }
     };
diff --git a/runtime/observatory/tests/service/debugger_inspect_test.dart b/runtime/observatory/tests/service/debugger_inspect_test.dart
index 767fb64..1501b32 100644
--- a/runtime/observatory/tests/service/debugger_inspect_test.dart
+++ b/runtime/observatory/tests/service/debugger_inspect_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'dart:async';
 import 'dart:developer';
diff --git a/runtime/observatory/tests/service/debugger_location_second_test.dart b/runtime/observatory/tests/service/debugger_location_second_test.dart
index 03c40b3..e8d6739 100644
--- a/runtime/observatory/tests/service/debugger_location_second_test.dart
+++ b/runtime/observatory/tests/service/debugger_location_second_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:observatory/service_io.dart';
 import 'package:observatory/debugger.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 import 'dart:async';
diff --git a/runtime/observatory/tests/service/debugger_location_test.dart b/runtime/observatory/tests/service/debugger_location_test.dart
index 0ffd76c..77b939c 100644
--- a/runtime/observatory/tests/service/debugger_location_test.dart
+++ b/runtime/observatory/tests/service/debugger_location_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:observatory/service_io.dart';
 import 'package:observatory/debugger.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 import 'dart:async';
@@ -82,17 +82,19 @@
 // Parse script + line
   (Isolate isolate) async {
     var debugger = await initDebugger(isolate);
-    var loc = await DebuggerLocation.parse(debugger, 'unittest.dart:15');
+    var loc = await DebuggerLocation.parse(
+        debugger, 'debugger_location_test.dart:16');
     expect(loc.valid, isTrue);
-    expect(loc.toString(), equals('unittest.dart:15'));
+    expect(loc.toString(), equals('debugger_location_test.dart:16'));
   },
 
 // Parse script + line + col
   (Isolate isolate) async {
     var debugger = await initDebugger(isolate);
-    var loc = await DebuggerLocation.parse(debugger, 'unittest.dart:15:10');
+    var loc = await DebuggerLocation.parse(
+        debugger, 'debugger_location_test.dart:16:11');
     expect(loc.valid, isTrue);
-    expect(loc.toString(), equals('unittest.dart:15:10'));
+    expect(loc.toString(), equals('debugger_location_test.dart:16:11'));
   },
 
 // Parse bad script
diff --git a/runtime/observatory/tests/service/debugging_inlined_finally_test.dart b/runtime/observatory/tests/service/debugging_inlined_finally_test.dart
index 424952c..9012cf3 100644
--- a/runtime/observatory/tests/service/debugging_inlined_finally_test.dart
+++ b/runtime/observatory/tests/service/debugging_inlined_finally_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 import 'dart:developer';
diff --git a/runtime/observatory/tests/service/debugging_test.dart b/runtime/observatory/tests/service/debugging_test.dart
index 9435ad2..55a6e05 100644
--- a/runtime/observatory/tests/service/debugging_test.dart
+++ b/runtime/observatory/tests/service/debugging_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'dart:async';
 
diff --git a/runtime/observatory/tests/service/dev_fs_http_put_test.dart b/runtime/observatory/tests/service/dev_fs_http_put_test.dart
index faa2fa6..107778d 100644
--- a/runtime/observatory/tests/service/dev_fs_http_put_test.dart
+++ b/runtime/observatory/tests/service/dev_fs_http_put_test.dart
@@ -6,7 +6,7 @@
 import 'dart:convert';
 import 'dart:io';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 Future<String> readResponse(HttpClientResponse response) {
diff --git a/runtime/observatory/tests/service/dev_fs_http_put_weird_char_test.dart b/runtime/observatory/tests/service/dev_fs_http_put_weird_char_test.dart
index 8126f45..7801775 100644
--- a/runtime/observatory/tests/service/dev_fs_http_put_weird_char_test.dart
+++ b/runtime/observatory/tests/service/dev_fs_http_put_weird_char_test.dart
@@ -6,7 +6,7 @@
 import 'dart:convert';
 import 'dart:io';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 Future<String> readResponse(HttpClientResponse response) {
diff --git a/runtime/observatory/tests/service/dev_fs_spawn_test.dart b/runtime/observatory/tests/service/dev_fs_spawn_test.dart
index 1221a58..4e76990 100644
--- a/runtime/observatory/tests/service/dev_fs_spawn_test.dart
+++ b/runtime/observatory/tests/service/dev_fs_spawn_test.dart
@@ -6,7 +6,7 @@
 import 'dart:convert';
 import 'package:observatory/models.dart' as M;
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/dev_fs_test.dart b/runtime/observatory/tests/service/dev_fs_test.dart
index eca5e3ca..920a152 100644
--- a/runtime/observatory/tests/service/dev_fs_test.dart
+++ b/runtime/observatory/tests/service/dev_fs_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:convert';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 var tests = <VMTest>[
diff --git a/runtime/observatory/tests/service/dev_fs_uri_test.dart b/runtime/observatory/tests/service/dev_fs_uri_test.dart
index 2fda4d7..42e5150 100644
--- a/runtime/observatory/tests/service/dev_fs_uri_test.dart
+++ b/runtime/observatory/tests/service/dev_fs_uri_test.dart
@@ -6,7 +6,7 @@
 import 'dart:convert';
 import 'dart:io';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 Future<String> readResponse(HttpClientResponse response) {
diff --git a/runtime/observatory/tests/service/dev_fs_weird_char_test.dart b/runtime/observatory/tests/service/dev_fs_weird_char_test.dart
index bab7d69..f2fddce 100644
--- a/runtime/observatory/tests/service/dev_fs_weird_char_test.dart
+++ b/runtime/observatory/tests/service/dev_fs_weird_char_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:convert';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 var tests = <VMTest>[
diff --git a/runtime/observatory/tests/service/developer_extension_test.dart b/runtime/observatory/tests/service/developer_extension_test.dart
index ad1a386..d210539 100644
--- a/runtime/observatory/tests/service/developer_extension_test.dart
+++ b/runtime/observatory/tests/service/developer_extension_test.dart
@@ -5,9 +5,10 @@
 import 'dart:async';
 import 'dart:convert';
 import 'dart:developer';
+import 'package:expect/expect.dart';
 import 'package:observatory/service_io.dart';
 import 'package:observatory/sample_profile.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
@@ -60,7 +61,8 @@
   } catch (e) {
     exceptionThrown = true;
   }
-  expect(exceptionThrown, isTrue);
+  // This check is running in the target process so we can't used package:test.
+  Expect.isTrue(exceptionThrown);
 }
 
 var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/developer_server_control_test.dart b/runtime/observatory/tests/service/developer_server_control_test.dart
index a4b99f3..24347ea 100644
--- a/runtime/observatory/tests/service/developer_server_control_test.dart
+++ b/runtime/observatory/tests/service/developer_server_control_test.dart
@@ -4,8 +4,8 @@
 
 import 'dart:async';
 import 'dart:developer';
+import 'package:expect/expect.dart';
 import 'package:observatory/service_io.dart' as S;
-import 'package:unittest/unittest.dart';
 import 'test_helper.dart';
 
 int majorVersion;
@@ -21,39 +21,39 @@
   majorVersion = info.majorVersion;
   minorVersion = info.minorVersion;
   serverUri = info.serverUri;
-  expect(info.serverUri, isNull);
+  Expect.isNull(info.serverUri);
   {
     // Now, start the web server and store the URI which is expected to be
     // non NULL in the top level variable.
     ServiceProtocolInfo info = await Service.controlWebServer(enable: true);
-    expect(info.majorVersion, equals(majorVersion));
-    expect(info.minorVersion, equals(minorVersion));
-    expect(info.serverUri, isNotNull);
+    Expect.equals(info.majorVersion, majorVersion);
+    Expect.equals(info.minorVersion, minorVersion);
+    Expect.isNotNull(info.serverUri);
     serverUri = info.serverUri;
   }
   {
     // Now try starting the web server again, this should just return the
     // existing state without any change (port number does not change).
     ServiceProtocolInfo info = await Service.controlWebServer(enable: true);
-    expect(info.majorVersion, equals(majorVersion));
-    expect(info.minorVersion, equals(minorVersion));
-    expect(info.serverUri, equals(serverUri));
+    Expect.equals(info.majorVersion, majorVersion);
+    Expect.equals(info.minorVersion, minorVersion);
+    Expect.equals(info.serverUri, serverUri);
   }
   {
     // Try turning off the web server, this should turn off the server and
     // the Uri returned should be null.
     ServiceProtocolInfo info = await Service.controlWebServer(enable: false);
-    expect(info.majorVersion, equals(majorVersion));
-    expect(info.minorVersion, equals(minorVersion));
-    expect(info.serverUri, isNull);
+    Expect.equals(info.majorVersion, majorVersion);
+    Expect.equals(info.minorVersion, minorVersion);
+    Expect.isNull(info.serverUri);
   }
   {
     // Try turning off the web server again, this should be a nop
     // and the Uri returned should be null.
     ServiceProtocolInfo info = await Service.controlWebServer(enable: false);
-    expect(info.majorVersion, equals(majorVersion));
-    expect(info.minorVersion, equals(minorVersion));
-    expect(info.serverUri, isNull);
+    Expect.equals(info.majorVersion, majorVersion);
+    Expect.equals(info.minorVersion, minorVersion);
+    Expect.isNull(info.serverUri);
   }
   {
     // Start the web server again for the test below.
@@ -61,9 +61,9 @@
     majorVersion = info.majorVersion;
     minorVersion = info.minorVersion;
     serverUri = info.serverUri;
-    expect(info.majorVersion, equals(majorVersion));
-    expect(info.minorVersion, equals(minorVersion));
-    expect(info.serverUri, equals(serverUri));
+    Expect.equals(info.majorVersion, majorVersion);
+    Expect.equals(info.minorVersion, minorVersion);
+    Expect.equals(info.serverUri, serverUri);
   }
 }
 
@@ -72,7 +72,7 @@
     await isolate.reload();
     // Just getting here means that the testee enabled the service protocol
     // web server.
-    expect(true, true);
+    Expect.equals(true, true);
   }
 ];
 
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 4400e47..1539e07 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
@@ -7,7 +7,7 @@
 import 'dart:isolate' as Core;
 
 import 'package:observatory/service_io.dart' as Service;
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/dominator_tree_vm_test.dart b/runtime/observatory/tests/service/dominator_tree_vm_test.dart
index be63548..ebb9c77 100644
--- a/runtime/observatory/tests/service/dominator_tree_vm_test.dart
+++ b/runtime/observatory/tests/service/dominator_tree_vm_test.dart
@@ -7,7 +7,7 @@
 
 import 'package:observatory/models.dart' as M;
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 // small example from [Lenguaer & Tarjan 1979]
diff --git a/runtime/observatory/tests/service/dominator_tree_vm_with_double_field_test.dart b/runtime/observatory/tests/service/dominator_tree_vm_with_double_field_test.dart
index 9edaf23..858f10a 100644
--- a/runtime/observatory/tests/service/dominator_tree_vm_with_double_field_test.dart
+++ b/runtime/observatory/tests/service/dominator_tree_vm_with_double_field_test.dart
@@ -7,8 +7,9 @@
 
 import 'dart:typed_data';
 
+import 'package:expect/expect.dart';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 double getDoubleWithHeapObjectTag() {
@@ -119,7 +120,7 @@
   k.y = r;
   l.x = h;
 
-  expect(r.fld, getDoubleWithHeapObjectTag());
+  Expect.equals(r.fld, getDoubleWithHeapObjectTag());
 }
 
 var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/echo_test.dart b/runtime/observatory/tests/service/echo_test.dart
index eda2f81..49ebe73 100644
--- a/runtime/observatory/tests/service/echo_test.dart
+++ b/runtime/observatory/tests/service/echo_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:async';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/enable_service_port_fallback_positive_test.dart b/runtime/observatory/tests/service/enable_service_port_fallback_positive_test.dart
index c2159eb..ca25d5f 100644
--- a/runtime/observatory/tests/service/enable_service_port_fallback_positive_test.dart
+++ b/runtime/observatory/tests/service/enable_service_port_fallback_positive_test.dart
@@ -5,7 +5,7 @@
 import 'dart:io';
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 // Tests that the --enable-service-port-fallback flag works correctly by trying to bind to
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 e5fdef0..ea63b8b 100644
--- a/runtime/observatory/tests/service/enable_service_port_fallback_test.dart
+++ b/runtime/observatory/tests/service/enable_service_port_fallback_test.dart
@@ -5,7 +5,7 @@
 import 'dart:io';
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 // Tests that the --enable-service-port-fallback flag works correctly by trying to bind to
diff --git a/runtime/observatory/tests/service/eval_internal_class_test.dart b/runtime/observatory/tests/service/eval_internal_class_test.dart
index 0abee5e..98b5840 100644
--- a/runtime/observatory/tests/service/eval_internal_class_test.dart
+++ b/runtime/observatory/tests/service/eval_internal_class_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/eval_regression_flutter20255_test.dart b/runtime/observatory/tests/service/eval_regression_flutter20255_test.dart
index 6e06387..28f07d7 100644
--- a/runtime/observatory/tests/service/eval_regression_flutter20255_test.dart
+++ b/runtime/observatory/tests/service/eval_regression_flutter20255_test.dart
@@ -6,7 +6,7 @@
 import 'dart:developer';
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'service_test_common.dart';
 import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/eval_test.dart b/runtime/observatory/tests/service/eval_test.dart
index a83ef37..0eafc1e 100644
--- a/runtime/observatory/tests/service/eval_test.dart
+++ b/runtime/observatory/tests/service/eval_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
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 9fc206a..e1a78c4 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
@@ -7,7 +7,7 @@
 
 import 'dart:async';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'service_test_common.dart';
 
diff --git a/runtime/observatory/tests/service/evaluate_activation_test.dart b/runtime/observatory/tests/service/evaluate_activation_test.dart
index 01f1e63..059d769 100644
--- a/runtime/observatory/tests/service/evaluate_activation_test.dart
+++ b/runtime/observatory/tests/service/evaluate_activation_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 import 'dart:async';
diff --git a/runtime/observatory/tests/service/evaluate_async_closure_test.dart b/runtime/observatory/tests/service/evaluate_async_closure_test.dart
index bcffa6b..4b64e63 100644
--- a/runtime/observatory/tests/service/evaluate_async_closure_test.dart
+++ b/runtime/observatory/tests/service/evaluate_async_closure_test.dart
@@ -5,7 +5,7 @@
 import 'dart:async';
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
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 0909420..48b6530 100644
--- a/runtime/observatory/tests/service/evaluate_class_type_parameters_test.dart
+++ b/runtime/observatory/tests/service/evaluate_class_type_parameters_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
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 9e63186..1f8fcd0 100644
--- a/runtime/observatory/tests/service/evaluate_function_type_parameters_test.dart
+++ b/runtime/observatory/tests/service/evaluate_function_type_parameters_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
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 0e021dc..6607b89 100644
--- a/runtime/observatory/tests/service/evaluate_in_async_activation_test.dart
+++ b/runtime/observatory/tests/service/evaluate_in_async_activation_test.dart
@@ -5,7 +5,7 @@
 import 'dart:async';
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
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 34c4358..4d6771a 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
@@ -4,7 +4,7 @@
 
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
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 5ec7dfd..2e47197 100644
--- a/runtime/observatory/tests/service/evaluate_in_frame_rpc_test.dart
+++ b/runtime/observatory/tests/service/evaluate_in_frame_rpc_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
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 e9724f5..fecc245 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
@@ -5,7 +5,7 @@
 import 'dart:developer';
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'service_test_common.dart';
 import 'test_helper.dart';
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 c29a44c..bbaf78f 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
@@ -4,7 +4,7 @@
 
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
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 bb87130..7849fc7 100644
--- a/runtime/observatory/tests/service/evaluate_with_escaping_closure_test.dart
+++ b/runtime/observatory/tests/service/evaluate_with_escaping_closure_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 dynamic escapedClosure;
diff --git a/runtime/observatory/tests/service/evaluate_with_scope_test.dart b/runtime/observatory/tests/service/evaluate_with_scope_test.dart
index 5b6ee5c..90ea063 100644
--- a/runtime/observatory/tests/service/evaluate_with_scope_test.dart
+++ b/runtime/observatory/tests/service/evaluate_with_scope_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 var thing1;
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 4feafac..2778167 100644
--- a/runtime/observatory/tests/service/external_service_asynchronous_invocation_test.dart
+++ b/runtime/observatory/tests/service/external_service_asynchronous_invocation_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'dart:io' show WebSocket;
 import 'dart:convert' show jsonDecode, jsonEncode;
diff --git a/runtime/observatory/tests/service/external_service_disappear_test.dart b/runtime/observatory/tests/service/external_service_disappear_test.dart
index 6a7a0d6..eafe5a6 100644
--- a/runtime/observatory/tests/service/external_service_disappear_test.dart
+++ b/runtime/observatory/tests/service/external_service_disappear_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'dart:io' show WebSocket;
 import 'dart:convert' show jsonDecode, jsonEncode;
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 37547cb..3b1e695 100644
--- a/runtime/observatory/tests/service/external_service_notification_invocation_test.dart
+++ b/runtime/observatory/tests/service/external_service_notification_invocation_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'dart:io' show WebSocket;
 import 'dart:convert' show jsonDecode, jsonEncode;
@@ -57,7 +57,7 @@
 
     client_invoker.first.then((_) {
       expect(false, isTrue, reason: 'shouldn\'t get here');
-    }).catchError((e) => e);
+    }).catchError((_) => null);
 
     // Testing serial invocation of service which succedes
     for (var iteration = 0; iteration < repetition; iteration++) {
diff --git a/runtime/observatory/tests/service/external_service_registration_test.dart b/runtime/observatory/tests/service/external_service_registration_test.dart
index bee0eec..2ec0d95 100644
--- a/runtime/observatory/tests/service/external_service_registration_test.dart
+++ b/runtime/observatory/tests/service/external_service_registration_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'dart:io' show WebSocket;
 import 'dart:convert' show jsonDecode, jsonEncode;
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 857b292..333c24e 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
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'dart:io' show WebSocket;
 import 'dart:convert' show jsonDecode, jsonEncode;
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 69ab333..97917b3 100644
--- a/runtime/observatory/tests/service/external_service_synchronous_invocation_test.dart
+++ b/runtime/observatory/tests/service/external_service_synchronous_invocation_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'dart:io' show WebSocket;
 import 'dart:convert' show jsonDecode, jsonEncode;
diff --git a/runtime/observatory/tests/service/field_script_test.dart b/runtime/observatory/tests/service/field_script_test.dart
index 1267101..17be1b1 100644
--- a/runtime/observatory/tests/service/field_script_test.dart
+++ b/runtime/observatory/tests/service/field_script_test.dart
@@ -5,7 +5,7 @@
 library field_script_test;
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'service_test_common.dart';
 
diff --git a/runtime/observatory/tests/service/file_service_test.dart b/runtime/observatory/tests/service/file_service_test.dart
index 8eb2dcf..08c6d71 100644
--- a/runtime/observatory/tests/service/file_service_test.dart
+++ b/runtime/observatory/tests/service/file_service_test.dart
@@ -6,8 +6,9 @@
 import 'dart:convert';
 import 'dart:developer';
 import 'dart:io' as io;
+import 'package:expect/expect.dart';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 Future setupFiles() async {
@@ -55,7 +56,7 @@
       await utilFile.writeAsString('foobar');
       var readTemp = new io.File(writeTemp);
       var result = await readTemp.readAsString();
-      expect(result, equals('foobar'));
+      Expect.equals(result, 'foobar');
     } catch (e) {
       closeDown();
       throw e;
diff --git a/runtime/observatory/tests/service/gc_test.dart b/runtime/observatory/tests/service/gc_test.dart
index c0cab5f..20efc34 100644
--- a/runtime/observatory/tests/service/gc_test.dart
+++ b/runtime/observatory/tests/service/gc_test.dart
@@ -13,7 +13,7 @@
     if (iterations <= 0) {
       return;
     }
-    new List<int>(size);
+    new List<int>.filled(size, 0);
     new Timer(duration, () => grow(iterations - 1, size, duration));
   };
   grow(100, 1 << 24, new Duration(seconds: 1));
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 85b2aff..d1c81e0 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
@@ -4,7 +4,7 @@
 
 import 'dart:async';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
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 8d5c88e..05ab7c8 100644
--- a/runtime/observatory/tests/service/get_allocation_profile_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_allocation_profile_rpc_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:async';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/get_allocation_samples_test.dart b/runtime/observatory/tests/service/get_allocation_samples_test.dart
index 38dabcf..2370433 100644
--- a/runtime/observatory/tests/service/get_allocation_samples_test.dart
+++ b/runtime/observatory/tests/service/get_allocation_samples_test.dart
@@ -6,7 +6,7 @@
 import 'package:observatory/models.dart' as M;
 import 'package:observatory/service_io.dart';
 import 'package:observatory/sample_profile.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
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 a3af0a6..d503a91 100644
--- a/runtime/observatory/tests/service/get_client_name_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_client_name_rpc_test.dart
@@ -5,7 +5,7 @@
 import 'dart:async';
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
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 5b7d1ec..db43578 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
@@ -4,7 +4,7 @@
 
 import 'package:observatory/src/repositories/timeline_base.dart';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
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 542b476..93a7353 100644
--- a/runtime/observatory/tests/service/get_cpu_samples_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_cpu_samples_rpc_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
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 35484f6..f1c2c54 100644
--- a/runtime/observatory/tests/service/get_flag_list_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_flag_list_rpc_test.dart
@@ -5,7 +5,7 @@
 import 'dart:async';
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/get_heap_map_rpc_test.dart b/runtime/observatory/tests/service/get_heap_map_rpc_test.dart
index d5ff5c0..c85a561 100644
--- a/runtime/observatory/tests/service/get_heap_map_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_heap_map_rpc_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/get_instances_rpc_test.dart b/runtime/observatory/tests/service/get_instances_rpc_test.dart
index 8479483..0f234be 100644
--- a/runtime/observatory/tests/service/get_instances_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_instances_rpc_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
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 e61d1b1..814cb7b 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
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'service_test_common.dart';
 
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
index 4a7e076..425eb53 100644
--- a/runtime/observatory/tests/service/get_isolate_after_language_error_test.dart
+++ b/runtime/observatory/tests/service/get_isolate_after_language_error_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'service_test_common.dart';
 
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 0db543b..ab1c05d 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
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'service_test_common.dart';
 
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 cdf2763..8d0db3c 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
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'service_test_common.dart';
 
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 8a834d9..1bdb6bd 100644
--- a/runtime/observatory/tests/service/get_isolate_group_memory_usage.dart
+++ b/runtime/observatory/tests/service/get_isolate_group_memory_usage.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/get_isolate_rpc_test.dart b/runtime/observatory/tests/service/get_isolate_rpc_test.dart
index 1b89f8c..2346282 100644
--- a/runtime/observatory/tests/service/get_isolate_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_isolate_rpc_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/get_memory_usage.dart b/runtime/observatory/tests/service/get_memory_usage.dart
index 96832c2..19ce0d2 100644
--- a/runtime/observatory/tests/service/get_memory_usage.dart
+++ b/runtime/observatory/tests/service/get_memory_usage.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
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 7ade11d..31f5325 100644
--- a/runtime/observatory/tests/service/get_native_allocation_samples_test.dart
+++ b/runtime/observatory/tests/service/get_native_allocation_samples_test.dart
@@ -7,7 +7,7 @@
 import 'package:observatory/sample_profile.dart';
 import 'package:observatory/models.dart' as M;
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 void verifyHelper(var root, bool exclusive) {
diff --git a/runtime/observatory/tests/service/get_object_rpc_test.dart b/runtime/observatory/tests/service/get_object_rpc_test.dart
index a19a869..faf5eca 100644
--- a/runtime/observatory/tests/service/get_object_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_object_rpc_test.dart
@@ -7,13 +7,13 @@
 import 'dart:typed_data';
 import 'dart:convert' show base64Decode;
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
 class _DummyClass {
   static var dummyVar = 11;
-  final List<String> dummyList = new List<String>(20);
+  final List<String> dummyList = new List<String>.filled(20, null);
   void dummyFunction() {}
 }
 
diff --git a/runtime/observatory/tests/service/get_object_store_rpc_test.dart b/runtime/observatory/tests/service/get_object_store_rpc_test.dart
index a98b595..cf50555 100644
--- a/runtime/observatory/tests/service/get_object_store_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_object_store_rpc_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:observatory/models.dart' as M;
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/get_ports_rpc_test.dart b/runtime/observatory/tests/service/get_ports_rpc_test.dart
index 343bb48..61b6678 100644
--- a/runtime/observatory/tests/service/get_ports_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_ports_rpc_test.dart
@@ -6,7 +6,7 @@
 
 import 'dart:isolate' hide Isolate;
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/get_retained_size_rpc_test.dart b/runtime/observatory/tests/service/get_retained_size_rpc_test.dart
index 318c511..7060f13 100644
--- a/runtime/observatory/tests/service/get_retained_size_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_retained_size_rpc_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
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 e9f6e55..78cacc0 100644
--- a/runtime/observatory/tests/service/get_retaining_path_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_retaining_path_rpc_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/get_scripts_rpc_test.dart b/runtime/observatory/tests/service/get_scripts_rpc_test.dart
index c22da46..9331adb 100644
--- a/runtime/observatory/tests/service/get_scripts_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_scripts_rpc_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/get_source_report_test.dart b/runtime/observatory/tests/service/get_source_report_test.dart
index 7abd05e..731e2f3 100644
--- a/runtime/observatory/tests/service/get_source_report_test.dart
+++ b/runtime/observatory/tests/service/get_source_report_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'service_test_common.dart';
 import 'dart:developer';
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 ff2d41b..db85b1a 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
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'service_test_common.dart';
 import 'dart:developer';
diff --git a/runtime/observatory/tests/service/get_stack_rpc_test.dart b/runtime/observatory/tests/service/get_stack_rpc_test.dart
index a322752..db1695f 100644
--- a/runtime/observatory/tests/service/get_stack_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_stack_rpc_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:observatory/models.dart' as M;
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 import 'dart:async';
diff --git a/runtime/observatory/tests/service/get_user_level_retaining_path_rpc_test.dart b/runtime/observatory/tests/service/get_user_level_retaining_path_rpc_test.dart
index e65dddf..9f69aeb 100644
--- a/runtime/observatory/tests/service/get_user_level_retaining_path_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_user_level_retaining_path_rpc_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart
index 4503f6e..caaa488 100644
--- a/runtime/observatory/tests/service/get_version_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_version_rpc_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/get_vm_rpc_test.dart b/runtime/observatory/tests/service/get_vm_rpc_test.dart
index 0e924a3..97f973a 100644
--- a/runtime/observatory/tests/service/get_vm_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_vm_rpc_test.dart
@@ -6,7 +6,7 @@
 import 'dart:io';
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/get_vm_timeline_micros_rpc_test.dart b/runtime/observatory/tests/service/get_vm_timeline_micros_rpc_test.dart
index e8fa8e6..98a5150 100644
--- a/runtime/observatory/tests/service/get_vm_timeline_micros_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_vm_timeline_micros_rpc_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
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 25bcec0..b149a7e 100644
--- a/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart
@@ -6,7 +6,7 @@
 import 'dart:io';
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/get_zone_memory_info_rpc_test.dart b/runtime/observatory/tests/service/get_zone_memory_info_rpc_test.dart
index d4d5467..428c42e 100644
--- a/runtime/observatory/tests/service/get_zone_memory_info_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_zone_memory_info_rpc_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/http_enable_timeline_logging_service_test.dart b/runtime/observatory/tests/service/http_enable_timeline_logging_service_test.dart
index f880308..d3b3df8 100644
--- a/runtime/observatory/tests/service/http_enable_timeline_logging_service_test.dart
+++ b/runtime/observatory/tests/service/http_enable_timeline_logging_service_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:async';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
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 2b28be5..ebe21f5 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
@@ -6,8 +6,8 @@
 import 'dart:convert';
 import 'dart:developer';
 import 'dart:io' as io;
+import 'package:expect/expect.dart';
 import 'package:observatory/service_io.dart' as S;
-import 'package:unittest/unittest.dart';
 import 'test_helper.dart';
 
 Future<String> getIsolateGroupId(
@@ -36,7 +36,7 @@
   print(await Service.getInfo());
   // Start the web server.
   final ServiceProtocolInfo info = await Service.controlWebServer(enable: true);
-  expect(info.serverUri, isNotNull);
+  Expect.isNotNull(info.serverUri);
   final httpClient = new io.HttpClient();
 
   // Build the request.
@@ -63,13 +63,13 @@
         .transform(json.decoder)
         .first;
     final result = jsonResponse['result'];
-    expect(result['type'], equals('IsolateGroup'));
-    expect(result['id'], startsWith('isolateGroups/'));
-    expect(result['number'], new isInstanceOf<String>());
-    expect(result['isolates'].length, isPositive);
-    expect(result['isolates'][0]['type'], equals('@Isolate'));
+    Expect.equals(result['type'], 'IsolateGroup');
+    Expect.isTrue(result['id'].startsWith('isolateGroups/'));
+    Expect.type<String>(result['number']);
+    Expect.isTrue(result['isolates'].length > 0);
+    Expect.equals(result['isolates'][0]['type'], '@Isolate');
   } catch (e) {
-    fail('invalid request: $e');
+    Expect.fail('invalid request: $e');
   }
 }
 
@@ -78,6 +78,5 @@
     await isolate.reload();
     // Just getting here means that the testee enabled the service protocol
     // web server.
-    expect(true, true);
   }
 ];
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 f49e5a4..6d487c2 100644
--- a/runtime/observatory/tests/service/http_get_isolate_rpc_common.dart
+++ b/runtime/observatory/tests/service/http_get_isolate_rpc_common.dart
@@ -6,8 +6,8 @@
 import 'dart:convert';
 import 'dart:developer';
 import 'dart:io' as io;
+import 'package:expect/expect.dart';
 import 'package:observatory/service_io.dart' as S;
-import 'package:unittest/unittest.dart';
 import 'test_helper.dart';
 
 Future<String> getIsolateId(io.HttpClient httpClient, Uri serverUri) async {
@@ -35,7 +35,7 @@
   print(await Service.getInfo());
   // Start the web server.
   ServiceProtocolInfo info = await Service.controlWebServer(enable: true);
-  expect(info.serverUri, isNotNull);
+  Expect.isNotNull(info.serverUri);
   var httpClient = new io.HttpClient();
 
   // Build the request.
@@ -61,26 +61,26 @@
         .transform(json.decoder)
         .first;
     Map result = response['result'];
-    expect(result['type'], equals('Isolate'));
-    expect(result['id'], startsWith('isolates/'));
-    expect(result['number'], new isInstanceOf<String>());
-    expect(result['_originNumber'], equals(result['number']));
-    expect(result['startTime'], isPositive);
-    expect(result['livePorts'], isPositive);
-    expect(result['pauseOnExit'], isFalse);
-    expect(result['pauseEvent']['type'], equals('Event'));
-    expect(result['error'], isNull);
-    expect(result['_numZoneHandles'], isPositive);
-    expect(result['_numScopedHandles'], isPositive);
-    expect(result['rootLib']['type'], equals('@Library'));
-    expect(result['libraries'].length, isPositive);
-    expect(result['libraries'][0]['type'], equals('@Library'));
-    expect(result['breakpoints'].length, isZero);
-    expect(result['_heaps']['new']['type'], equals('HeapSpace'));
-    expect(result['_heaps']['old']['type'], equals('HeapSpace'));
-    expect(result['isolate_group']['type'], equals('@IsolateGroup'));
+    Expect.equals(result['type'], 'Isolate');
+    Expect.isTrue(result['id'].startsWith('isolates/'));
+    Expect.type<String>(result['number']);
+    Expect.equals(result['_originNumber'], result['number']);
+    Expect.isTrue(result['startTime'] > 0);
+    Expect.isTrue(result['livePorts'] > 0);
+    Expect.isFalse(result['pauseOnExit']);
+    Expect.equals(result['pauseEvent']['type'], 'Event');
+    Expect.isNull(result['error']);
+    Expect.isTrue(result['_numZoneHandles'] > 0);
+    Expect.isTrue(result['_numScopedHandles'] > 0);
+    Expect.equals(result['rootLib']['type'], '@Library');
+    Expect.isTrue(result['libraries'].length > 0);
+    Expect.equals(result['libraries'][0]['type'], '@Library');
+    Expect.equals(result['breakpoints'].length, 0);
+    Expect.equals(result['_heaps']['new']['type'], 'HeapSpace');
+    Expect.equals(result['_heaps']['old']['type'], 'HeapSpace');
+    Expect.equals(result['isolate_group']['type'], '@IsolateGroup');
   } catch (e) {
-    fail('invalid request: $e');
+    Expect.fail('invalid request: $e');
   }
 }
 
@@ -89,6 +89,5 @@
     await isolate.reload();
     // Just getting here means that the testee enabled the service protocol
     // web server.
-    expect(true, true);
   }
 ];
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 18a0abe..b9b405e 100644
--- a/runtime/observatory/tests/service/http_get_vm_rpc_common.dart
+++ b/runtime/observatory/tests/service/http_get_vm_rpc_common.dart
@@ -6,8 +6,8 @@
 import 'dart:convert';
 import 'dart:developer';
 import 'dart:io' as io;
+import 'package:expect/expect.dart';
 import 'package:observatory/service_io.dart' as S;
-import 'package:unittest/unittest.dart';
 import 'test_helper.dart';
 
 Future<Null> testeeBefore() async {
@@ -15,7 +15,7 @@
   print(await Service.getInfo());
   // Start the web server.
   ServiceProtocolInfo info = await Service.controlWebServer(enable: true);
-  expect(info.serverUri, isNotNull);
+  Expect.isNotNull(info.serverUri);
   var httpClient = new io.HttpClient();
 
   // Build the request.
@@ -36,20 +36,20 @@
         .transform(json.decoder)
         .first;
     Map result = response['result'];
-    expect(result['type'], equals('VM'));
-    expect(result['name'], equals('vm'));
-    expect(result['architectureBits'], isPositive);
-    expect(result['targetCPU'], new isInstanceOf<String>());
-    expect(result['hostCPU'], new isInstanceOf<String>());
-    expect(result['version'], new isInstanceOf<String>());
-    expect(result['pid'], new isInstanceOf<int>());
-    expect(result['startTime'], isPositive);
-    expect(result['isolates'].length, isPositive);
-    expect(result['isolates'][0]['type'], equals('@Isolate'));
-    expect(result['isolateGroups'].length, isPositive);
-    expect(result['isolateGroups'][0]['type'], equals('@IsolateGroup'));
+    Expect.equals(result['type'], 'VM');
+    Expect.equals(result['name'], 'vm');
+    Expect.isTrue(result['architectureBits'] > 0);
+    Expect.type<String>(result['targetCPU']);
+    Expect.type<String>(result['hostCPU']);
+    Expect.type<String>(result['version']);
+    Expect.type<int>(result['pid']);
+    Expect.isTrue(result['startTime'] > 0);
+    Expect.isTrue(result['isolates'].length > 0);
+    Expect.equals(result['isolates'][0]['type'], '@Isolate');
+    Expect.isTrue(result['isolateGroups'].length > 0);
+    Expect.equals(result['isolateGroups'][0]['type'], '@IsolateGroup');
   } catch (e) {
-    fail('invalid request: $e');
+    Expect.fail('invalid request: $e');
   }
 }
 
@@ -58,6 +58,5 @@
     await isolate.reload();
     // Just getting here means that the testee enabled the service protocol
     // web server.
-    expect(true, true);
   }
 ];
diff --git a/runtime/observatory/tests/service/implicit_getter_setter_test.dart b/runtime/observatory/tests/service/implicit_getter_setter_test.dart
index 25423e3..30710d5 100644
--- a/runtime/observatory/tests/service/implicit_getter_setter_test.dart
+++ b/runtime/observatory/tests/service/implicit_getter_setter_test.dart
@@ -6,7 +6,7 @@
 
 import 'dart:async';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 class A {
diff --git a/runtime/observatory/tests/service/inbound_references_test.dart b/runtime/observatory/tests/service/inbound_references_test.dart
index fddc8ba..4c1e496 100644
--- a/runtime/observatory/tests/service/inbound_references_test.dart
+++ b/runtime/observatory/tests/service/inbound_references_test.dart
@@ -5,7 +5,7 @@
 library inbound_references_test;
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 class Node {
diff --git a/runtime/observatory/tests/service/instance_field_order_rpc_test.dart b/runtime/observatory/tests/service/instance_field_order_rpc_test.dart
index c531ad6..9ff16e4 100644
--- a/runtime/observatory/tests/service/instance_field_order_rpc_test.dart
+++ b/runtime/observatory/tests/service/instance_field_order_rpc_test.dart
@@ -5,7 +5,7 @@
 library get_object_rpc_test;
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 class Super {
diff --git a/runtime/observatory/tests/service/invoke_skip_breakpoint.dart b/runtime/observatory/tests/service/invoke_skip_breakpoint.dart
index d2d258c..825f94b 100644
--- a/runtime/observatory/tests/service/invoke_skip_breakpoint.dart
+++ b/runtime/observatory/tests/service/invoke_skip_breakpoint.dart
@@ -4,7 +4,7 @@
 
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/invoke_test.dart b/runtime/observatory/tests/service/invoke_test.dart
index 437a86d..8a9ebb7 100644
--- a/runtime/observatory/tests/service/invoke_test.dart
+++ b/runtime/observatory/tests/service/invoke_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/isolate_lifecycle_test.dart b/runtime/observatory/tests/service/isolate_lifecycle_test.dart
index 57d3eb0..a4a364b 100644
--- a/runtime/observatory/tests/service/isolate_lifecycle_test.dart
+++ b/runtime/observatory/tests/service/isolate_lifecycle_test.dart
@@ -8,7 +8,7 @@
 
 import 'package:observatory/service_io.dart';
 import 'package:observatory/models.dart' as M;
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/issue_25465_test.dart b/runtime/observatory/tests/service/issue_25465_test.dart
index 41cb026..4b17e14 100644
--- a/runtime/observatory/tests/service/issue_25465_test.dart
+++ b/runtime/observatory/tests/service/issue_25465_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'service_test_common.dart';
 import 'dart:async';
diff --git a/runtime/observatory/tests/service/issue_30555_test.dart b/runtime/observatory/tests/service/issue_30555_test.dart
index b804d9e..22f6a2b 100644
--- a/runtime/observatory/tests/service/issue_30555_test.dart
+++ b/runtime/observatory/tests/service/issue_30555_test.dart
@@ -5,7 +5,7 @@
 import 'dart:async';
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/kill_paused_test.dart b/runtime/observatory/tests/service/kill_paused_test.dart
index cf88edd..ad42edc 100644
--- a/runtime/observatory/tests/service/kill_paused_test.dart
+++ b/runtime/observatory/tests/service/kill_paused_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_common.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 import 'dart:developer';
diff --git a/runtime/observatory/tests/service/kill_running_test.dart b/runtime/observatory/tests/service/kill_running_test.dart
index 5fe16b7..c62a85c 100644
--- a/runtime/observatory/tests/service/kill_running_test.dart
+++ b/runtime/observatory/tests/service/kill_running_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_common.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 import 'service_test_common.dart';
diff --git a/runtime/observatory/tests/service/library_dependency_test.dart b/runtime/observatory/tests/service/library_dependency_test.dart
index a485b78..99df38d 100644
--- a/runtime/observatory/tests/service/library_dependency_test.dart
+++ b/runtime/observatory/tests/service/library_dependency_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 export 'dart:collection';
diff --git a/runtime/observatory/tests/service/local_variable_declaration_test.dart b/runtime/observatory/tests/service/local_variable_declaration_test.dart
index 2c59824..f7e696a 100644
--- a/runtime/observatory/tests/service/local_variable_declaration_test.dart
+++ b/runtime/observatory/tests/service/local_variable_declaration_test.dart
@@ -4,7 +4,7 @@
 // VMOptions=--verbose_debug
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 import 'dart:developer';
diff --git a/runtime/observatory/tests/service/logging_test.dart b/runtime/observatory/tests/service/logging_test.dart
index 5e24f01..4acf8b0 100644
--- a/runtime/observatory/tests/service/logging_test.dart
+++ b/runtime/observatory/tests/service/logging_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:developer' as developer;
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'package:logging/logging.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
diff --git a/runtime/observatory/tests/service/malformed_test.dart b/runtime/observatory/tests/service/malformed_test.dart
index 5738afe..5fff3fd 100644
--- a/runtime/observatory/tests/service/malformed_test.dart
+++ b/runtime/observatory/tests/service/malformed_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/metrics_test.dart b/runtime/observatory/tests/service/metrics_test.dart
index 328a2ca..b35806c 100644
--- a/runtime/observatory/tests/service/metrics_test.dart
+++ b/runtime/observatory/tests/service/metrics_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 import 'dart:developer';
diff --git a/runtime/observatory/tests/service/mirror_references_test.dart b/runtime/observatory/tests/service/mirror_references_test.dart
index f0c9019..1567d2d 100644
--- a/runtime/observatory/tests/service/mirror_references_test.dart
+++ b/runtime/observatory/tests/service/mirror_references_test.dart
@@ -6,7 +6,7 @@
 
 import 'dart:mirrors';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 class Foo {}
diff --git a/runtime/observatory/tests/service/native_metrics_test.dart b/runtime/observatory/tests/service/native_metrics_test.dart
index e8afd57..0cb1394 100644
--- a/runtime/observatory/tests/service/native_metrics_test.dart
+++ b/runtime/observatory/tests/service/native_metrics_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 import 'dart:developer';
diff --git a/runtime/observatory/tests/service/network_profiling_test.dart b/runtime/observatory/tests/service/network_profiling_test.dart
index 9ec766f6..c02b278 100644
--- a/runtime/observatory/tests/service/network_profiling_test.dart
+++ b/runtime/observatory/tests/service/network_profiling_test.dart
@@ -8,7 +8,7 @@
 import 'dart:io' as io;
 import 'dart:isolate';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/object_graph_vm_test.dart b/runtime/observatory/tests/service/object_graph_vm_test.dart
index 669d096..852c823 100644
--- a/runtime/observatory/tests/service/object_graph_vm_test.dart
+++ b/runtime/observatory/tests/service/object_graph_vm_test.dart
@@ -5,7 +5,7 @@
 import 'package:observatory/models.dart' as M;
 import 'package:observatory/object_graph.dart';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 class Foo {
diff --git a/runtime/observatory/tests/service/observatory_assets_test.dart b/runtime/observatory/tests/service/observatory_assets_test.dart
index 43054f6..4b8f8e2 100644
--- a/runtime/observatory/tests/service/observatory_assets_test.dart
+++ b/runtime/observatory/tests/service/observatory_assets_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:io';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
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 7c8623a..03285f4 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
@@ -6,7 +6,7 @@
 import 'package:observatory/service_io.dart';
 import 'test_helper.dart';
 import 'dart:developer';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'service_test_common.dart';
 
diff --git a/runtime/observatory/tests/service/pause_idle_isolate_test.dart b/runtime/observatory/tests/service/pause_idle_isolate_test.dart
index cefff87..672b13a 100644
--- a/runtime/observatory/tests/service/pause_idle_isolate_test.dart
+++ b/runtime/observatory/tests/service/pause_idle_isolate_test.dart
@@ -7,7 +7,7 @@
 import 'dart:isolate' show ReceivePort;
 import 'package:observatory/models.dart' as M;
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/pause_on_exceptions_test.dart b/runtime/observatory/tests/service/pause_on_exceptions_test.dart
index b30206b..05dae04 100644
--- a/runtime/observatory/tests/service/pause_on_exceptions_test.dart
+++ b/runtime/observatory/tests/service/pause_on_exceptions_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'dart:async';
 
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 1326441..f1aff65 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
@@ -4,7 +4,7 @@
 
 import 'package:observatory/models.dart' as M;
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'dart:async';
 
diff --git a/runtime/observatory/tests/service/pause_on_start_and_exit_with_child_test.dart b/runtime/observatory/tests/service/pause_on_start_and_exit_with_child_test.dart
index 756d169..1d3a8bf 100644
--- a/runtime/observatory/tests/service/pause_on_start_and_exit_with_child_test.dart
+++ b/runtime/observatory/tests/service/pause_on_start_and_exit_with_child_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:observatory/models.dart' as M;
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'dart:async';
 import 'dart:isolate' as isolate;
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 4791e6d..93cefb4 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
@@ -4,7 +4,7 @@
 
 import 'package:observatory/models.dart' as M;
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'dart:async';
 
diff --git a/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions2_test.dart b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions2_test.dart
index bc12e54..850177a 100644
--- a/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions2_test.dart
+++ b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions2_test.dart
@@ -8,7 +8,7 @@
 
 import 'package:observatory/service_io.dart';
 import 'package:observatory/models.dart' as M;
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'service_test_common.dart';
 
diff --git a/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions3_test.dart b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions3_test.dart
index e46654b..5871f60 100644
--- a/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions3_test.dart
+++ b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions3_test.dart
@@ -6,7 +6,7 @@
 // function. Regression test for https://dartbug.com/38697.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'service_test_common.dart';
 
diff --git a/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions_test.dart b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions_test.dart
index c9ab632..05cf750 100644
--- a/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions_test.dart
+++ b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions_test.dart
@@ -6,7 +6,7 @@
 
 import 'package:observatory/service_io.dart';
 import 'package:observatory/models.dart' as M;
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'service_test_common.dart';
 
diff --git a/runtime/observatory/tests/service/pause_on_unhandled_exceptions_test.dart b/runtime/observatory/tests/service/pause_on_unhandled_exceptions_test.dart
index 3921ac7..62cf7df 100644
--- a/runtime/observatory/tests/service/pause_on_unhandled_exceptions_test.dart
+++ b/runtime/observatory/tests/service/pause_on_unhandled_exceptions_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'service_test_common.dart';
 
diff --git a/runtime/observatory/tests/service/positive_token_pos_test.dart b/runtime/observatory/tests/service/positive_token_pos_test.dart
index 72d54dd..ee8dbad 100644
--- a/runtime/observatory/tests/service/positive_token_pos_test.dart
+++ b/runtime/observatory/tests/service/positive_token_pos_test.dart
@@ -5,7 +5,7 @@
 
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/process_service_test.dart b/runtime/observatory/tests/service/process_service_test.dart
index 045ed2c..02e71fc 100644
--- a/runtime/observatory/tests/service/process_service_test.dart
+++ b/runtime/observatory/tests/service/process_service_test.dart
@@ -9,7 +9,7 @@
 
 import 'package:observatory/service_io.dart';
 import 'package:path/path.dart' as path;
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/reachable_size_test.dart b/runtime/observatory/tests/service/reachable_size_test.dart
index 800ebb2..6bc92f5 100644
--- a/runtime/observatory/tests/service/reachable_size_test.dart
+++ b/runtime/observatory/tests/service/reachable_size_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:async';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'service_test_common.dart';
 
diff --git a/runtime/observatory/tests/service/regexp_function_test.dart b/runtime/observatory/tests/service/regexp_function_test.dart
index 6fb09bc..a44cb5b 100644
--- a/runtime/observatory/tests/service/regexp_function_test.dart
+++ b/runtime/observatory/tests/service/regexp_function_test.dart
@@ -4,8 +4,9 @@
 // VMOptions=
 // VMOptions=--interpret_irregexp
 
+import 'package:expect/expect.dart';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 var regex0;
@@ -17,7 +18,7 @@
   regex = new RegExp(r"(\w+)");
   String str = "Parse my string";
   Iterable<Match> matches = regex.allMatches(str); // Run to generate bytecode.
-  expect(matches.length, equals(3));
+  Expect.equals(matches.length, 3);
 }
 
 var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/regress_28443_test.dart b/runtime/observatory/tests/service/regress_28443_test.dart
index bd585b9..ccdec12 100644
--- a/runtime/observatory/tests/service/regress_28443_test.dart
+++ b/runtime/observatory/tests/service/regress_28443_test.dart
@@ -6,7 +6,7 @@
 import 'test_helper.dart';
 import 'service_test_common.dart';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 const int LINE_A = 28, LINE_B = 33;
 
diff --git a/runtime/observatory/tests/service/regress_28980_test.dart b/runtime/observatory/tests/service/regress_28980_test.dart
index 65a59ae..56fac2a 100644
--- a/runtime/observatory/tests/service/regress_28980_test.dart
+++ b/runtime/observatory/tests/service/regress_28980_test.dart
@@ -6,7 +6,7 @@
 import 'test_helper.dart';
 import 'service_test_common.dart';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 const int LINE_A = 19, LINE_B = 38;
 
diff --git a/runtime/observatory/tests/service/regress_34841_test.dart b/runtime/observatory/tests/service/regress_34841_test.dart
index c53a9e9..05bb56a 100644
--- a/runtime/observatory/tests/service/regress_34841_test.dart
+++ b/runtime/observatory/tests/service/regress_34841_test.dart
@@ -8,7 +8,7 @@
 // (i.e. not actual) positions in this file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'service_test_common.dart';
 import 'dart:developer';
diff --git a/runtime/observatory/tests/service/rewind_optimized_out_test.dart b/runtime/observatory/tests/service/rewind_optimized_out_test.dart
index 304678d..97aca1c 100644
--- a/runtime/observatory/tests/service/rewind_optimized_out_test.dart
+++ b/runtime/observatory/tests/service/rewind_optimized_out_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/rewind_test.dart b/runtime/observatory/tests/service/rewind_test.dart
index 059d5f1..87e46ec 100644
--- a/runtime/observatory/tests/service/rewind_test.dart
+++ b/runtime/observatory/tests/service/rewind_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/service_test_common.dart b/runtime/observatory/tests/service/service_test_common.dart
index 57227cd..85df4f6 100644
--- a/runtime/observatory/tests/service/service_test_common.dart
+++ b/runtime/observatory/tests/service/service_test_common.dart
@@ -8,7 +8,8 @@
 import 'dart:io' show Platform;
 import 'package:observatory/models.dart' as M;
 import 'package:observatory/service_common.dart';
-import 'package:unittest/unittest.dart';
+import 'package:observatory/service_io.dart';
+import 'package:test/test.dart';
 
 typedef Future IsolateTest(Isolate isolate);
 typedef Future VMTest(VM vm);
@@ -579,3 +580,5 @@
   }
   return result;
 }
+
+Future<void> waitForTargetVMExit(VM vm) async => await vm.onDisconnect;
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 2a14bbb..1a5c8fd 100644
--- a/runtime/observatory/tests/service/set_library_debuggable_rpc_test.dart
+++ b/runtime/observatory/tests/service/set_library_debuggable_rpc_test.dart
@@ -5,7 +5,7 @@
 library set_library_debuggable_rpc_test;
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/set_library_debuggable_test.dart b/runtime/observatory/tests/service/set_library_debuggable_test.dart
index 6550a89..4ffbcb6 100644
--- a/runtime/observatory/tests/service/set_library_debuggable_test.dart
+++ b/runtime/observatory/tests/service/set_library_debuggable_test.dart
@@ -6,7 +6,7 @@
 
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/set_name_rpc_test.dart b/runtime/observatory/tests/service/set_name_rpc_test.dart
index 186e4e0..1e4253d 100644
--- a/runtime/observatory/tests/service/set_name_rpc_test.dart
+++ b/runtime/observatory/tests/service/set_name_rpc_test.dart
@@ -4,7 +4,7 @@
 // VMOptions=--vm-name=Walter
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'dart:async';
 
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 3a7c62c..67ad461 100644
--- a/runtime/observatory/tests/service/set_vm_name_rpc_test.dart
+++ b/runtime/observatory/tests/service/set_vm_name_rpc_test.dart
@@ -5,7 +5,7 @@
 
 import 'dart:async';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 var tests = <VMTest>[
diff --git a/runtime/observatory/tests/service/simple_reload_test.dart b/runtime/observatory/tests/service/simple_reload_test.dart
index 3ae8295..f67c95d 100644
--- a/runtime/observatory/tests/service/simple_reload_test.dart
+++ b/runtime/observatory/tests/service/simple_reload_test.dart
@@ -12,7 +12,7 @@
 import 'service_test_common.dart';
 import 'package:observatory/service.dart';
 import 'package:path/path.dart' as path;
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 // Chop off the file name.
 String baseDirectory = path.dirname(Platform.script.path) + '/';
diff --git a/runtime/observatory/tests/service/steal_breakpoint_test.dart b/runtime/observatory/tests/service/steal_breakpoint_test.dart
index 540eda4..4fe7d08 100644
--- a/runtime/observatory/tests/service/steal_breakpoint_test.dart
+++ b/runtime/observatory/tests/service/steal_breakpoint_test.dart
@@ -4,7 +4,7 @@
 // VMOptions=--steal-breakpoints
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 import 'dart:async';
 
diff --git a/runtime/observatory/tests/service/step_over_await_test.dart b/runtime/observatory/tests/service/step_over_await_test.dart
index 3471106..e8103b2 100644
--- a/runtime/observatory/tests/service/step_over_await_test.dart
+++ b/runtime/observatory/tests/service/step_over_await_test.dart
@@ -11,7 +11,7 @@
 
 import 'package:observatory/models.dart' as M;
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 const int LINE_A = 22;
 const int LINE_B = 24;
diff --git a/runtime/observatory/tests/service/step_test.dart b/runtime/observatory/tests/service/step_test.dart
index 973a208..01aaeb0 100644
--- a/runtime/observatory/tests/service/step_test.dart
+++ b/runtime/observatory/tests/service/step_test.dart
@@ -6,7 +6,7 @@
 import 'test_helper.dart';
 import 'service_test_common.dart';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 const int LINE_A = 14;
 
diff --git a/runtime/observatory/tests/service/string_escaping_test.dart b/runtime/observatory/tests/service/string_escaping_test.dart
index 81783d6..8a11dfb 100644
--- a/runtime/observatory/tests/service/string_escaping_test.dart
+++ b/runtime/observatory/tests/service/string_escaping_test.dart
@@ -6,7 +6,7 @@
 
 import 'dart:async';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 var ascii;
diff --git a/runtime/observatory/tests/service/tcp_socket_closing_service_test.dart b/runtime/observatory/tests/service/tcp_socket_closing_service_test.dart
index 740a138..8996577 100644
--- a/runtime/observatory/tests/service/tcp_socket_closing_service_test.dart
+++ b/runtime/observatory/tests/service/tcp_socket_closing_service_test.dart
@@ -6,7 +6,7 @@
 import 'dart:convert';
 import 'dart:io' as io;
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 /// Test that we correctly remove sockets that have been closed from the list
diff --git a/runtime/observatory/tests/service/tcp_socket_service_test.dart b/runtime/observatory/tests/service/tcp_socket_service_test.dart
index 889c50d..9e61a01 100644
--- a/runtime/observatory/tests/service/tcp_socket_service_test.dart
+++ b/runtime/observatory/tests/service/tcp_socket_service_test.dart
@@ -6,7 +6,7 @@
 import 'dart:convert';
 import 'dart:io' as io;
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 Future setupTCP() async {
diff --git a/runtime/observatory/tests/service/test_helper.dart b/runtime/observatory/tests/service/test_helper.dart
index ad76a66..1dd5989 100644
--- a/runtime/observatory/tests/service/test_helper.dart
+++ b/runtime/observatory/tests/service/test_helper.dart
@@ -8,6 +8,7 @@
 import 'dart:convert';
 import 'dart:io';
 import 'package:observatory/service_io.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 export 'service_test_common.dart' show IsolateTest, VMTest;
 
@@ -53,7 +54,7 @@
       bool pause_on_exit: false}) async {
     if (!pause_on_start) {
       if (testeeBefore != null) {
-        var result = testeeBefore();
+        final result = testeeBefore();
         if (result is Future) {
           await result;
         }
@@ -61,7 +62,7 @@
       print(''); // Print blank line to signal that testeeBefore has run.
     }
     if (testeeConcurrent != null) {
-      var result = testeeConcurrent();
+      final result = testeeConcurrent();
       if (result is Future) {
         await result;
       }
@@ -150,9 +151,9 @@
       List<String> executableArgs) {
     assert(!_shouldLaunchSkyShell());
 
-    String dartExecutable = Platform.executable;
+    final String dartExecutable = Platform.executable;
 
-    var fullArgs = <String>[];
+    final fullArgs = <String>[];
     if (pause_on_start) {
       fullArgs.add('--pause-isolates-on-start');
     }
@@ -189,10 +190,10 @@
       List<String> executableArgs) {
     assert(_shouldLaunchSkyShell());
 
-    String dartExecutable = _skyShellPath();
+    final String dartExecutable = _skyShellPath();
 
-    var dartFlags = <String>[];
-    var fullArgs = <String>[];
+    final dartFlags = <String>[];
+    final fullArgs = <String>[];
     if (pause_on_start) {
       dartFlags.add('--pause_isolates_on_start');
       fullArgs.add('--start-paused');
@@ -221,8 +222,8 @@
 
   Future<Process> _spawnCommon(String executable, List<String> arguments,
       Map<String, String> dartEnvironment) {
-    var environment = _TESTEE_SPAWN_ENV;
-    var bashEnvironment = new StringBuffer();
+    final environment = _TESTEE_SPAWN_ENV;
+    final bashEnvironment = new StringBuffer();
     environment.forEach((k, v) => bashEnvironment.write("$k=$v "));
     if (dartEnvironment != null) {
       dartEnvironment.forEach((k, v) {
@@ -336,10 +337,11 @@
       executableArgs = Platform.executableArguments;
     }
 
-    var process = new _ServiceTesteeLauncher();
-    bool testsDone = false;
-    runZoned(() {
-      process
+    final process = new _ServiceTesteeLauncher();
+    final name = Platform.script.pathSegments.last;
+    WebSocketVM vm;
+    setUp(() async {
+      await process
           .launch(
               pause_on_start,
               pause_on_exit,
@@ -351,23 +353,26 @@
               executableArgs)
           .then((Uri serverAddress) async {
         if (mainArgs.contains("--gdb")) {
-          var pid = process.process.pid;
-          var wait = new Duration(seconds: 10);
+          final pid = process.process.pid;
+          final wait = new Duration(seconds: 10);
           print("Testee has pid $pid, waiting $wait before continuing");
           sleep(wait);
         }
         setupAddresses(serverAddress);
-        var name = Platform.script.pathSegments.last;
-        var vm =
-            new WebSocketVM(new WebSocketVMTarget(serviceWebsocketAddress));
+        vm = new WebSocketVM(new WebSocketVMTarget(serviceWebsocketAddress));
         print('Loading VM...');
         await vm.load();
         print('Done loading VM');
+      });
+    });
 
+    test(
+      name,
+      () async {
         // Run vm tests.
         if (vmTests != null) {
-          var testIndex = 1;
-          var totalTests = vmTests.length;
+          int testIndex = 1;
+          final totalTests = vmTests.length;
           for (var test in vmTests) {
             vm.verbose = verbose_vm;
             print('Running $name [$testIndex/$totalTests]');
@@ -378,9 +383,9 @@
 
         // Run isolate tests.
         if (isolateTests != null) {
-          var isolate = await getFirstIsolate(vm);
-          var testIndex = 1;
-          var totalTests = isolateTests.length;
+          final isolate = await getFirstIsolate(vm);
+          int testIndex = 1;
+          final totalTests = isolateTests.length;
           for (var test in isolateTests) {
             vm.verbose = verbose_vm;
             print('Running $name [$testIndex/$totalTests]');
@@ -388,26 +393,21 @@
             await test(isolate);
           }
         }
+      },
+      retry: 0,
+      // Some service tests run fairly long (e.g., valid_source_locations_test).
+      timeout: Timeout.none,
+    );
 
-        print('All service tests completed successfully.');
-        testsDone = true;
-        process.requestExit();
-      });
-    }, onError: (error, stackTrace) {
-      if (testsDone) {
-        print('Ignoring late exception during process exit:\n'
-            '$error\n#stackTrace');
-      } else {
-        process.requestExit();
-        print('Unexpected exception in service tests: $error\n$stackTrace');
-        throw error;
-      }
+    tearDown(() {
+      print('All service tests completed successfully.');
+      process.requestExit();
     });
   }
 
   Future<Isolate> getFirstIsolate(WebSocketVM vm) async {
     if (vm.isolates.isNotEmpty) {
-      var isolate = await vm.isolates.first.load();
+      final isolate = await vm.isolates.first.load();
       if (isolate is Isolate) {
         return isolate;
       }
diff --git a/runtime/observatory/tests/service/type_arguments_test.dart b/runtime/observatory/tests/service/type_arguments_test.dart
index fe3f925..1c2a6ac 100644
--- a/runtime/observatory/tests/service/type_arguments_test.dart
+++ b/runtime/observatory/tests/service/type_arguments_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/typed_data_test.dart b/runtime/observatory/tests/service/typed_data_test.dart
index 1459af5..d96583a 100644
--- a/runtime/observatory/tests/service/typed_data_test.dart
+++ b/runtime/observatory/tests/service/typed_data_test.dart
@@ -6,7 +6,7 @@
 
 import 'dart:typed_data';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 var int8List;
diff --git a/runtime/observatory/tests/service/udp_socket_service_test.dart b/runtime/observatory/tests/service/udp_socket_service_test.dart
index 01b88d3..e49aa97 100644
--- a/runtime/observatory/tests/service/udp_socket_service_test.dart
+++ b/runtime/observatory/tests/service/udp_socket_service_test.dart
@@ -6,7 +6,7 @@
 import 'dart:convert';
 import 'dart:io' as io;
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 Future setupUDP() async {
diff --git a/runtime/observatory/tests/service/verify_http_timeline_test.dart b/runtime/observatory/tests/service/verify_http_timeline_test.dart
index f7809c8..a555b11 100644
--- a/runtime/observatory/tests/service/verify_http_timeline_test.dart
+++ b/runtime/observatory/tests/service/verify_http_timeline_test.dart
@@ -4,11 +4,11 @@
 // VMOptions=--timeline_streams=Dart
 
 import 'dart:async';
-import 'dart:developer';
 import 'dart:io';
 import 'dart:math';
+import 'package:expect/expect.dart';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 import 'test_helper.dart';
 
@@ -80,8 +80,8 @@
 
 Future<void> testMain() async {
   // Ensure there's a chance some requests will be interrupted.
-  expect(maxRequestDelayMs > serverShutdownDelayMs, isTrue);
-  expect(maxResponseDelayMs < serverShutdownDelayMs, isTrue);
+  Expect.isTrue(maxRequestDelayMs > serverShutdownDelayMs);
+  Expect.isTrue(maxResponseDelayMs < serverShutdownDelayMs);
 
   final server = await startServer();
   HttpClient.enableTimelineLogging = true;
diff --git a/runtime/observatory/tests/service/vm_test.dart b/runtime/observatory/tests/service/vm_test.dart
index 55b060a..862e54f 100644
--- a/runtime/observatory/tests/service/vm_test.dart
+++ b/runtime/observatory/tests/service/vm_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/vm_timeline_events_test.dart b/runtime/observatory/tests/service/vm_timeline_events_test.dart
index 9586771..1b77ed1 100644
--- a/runtime/observatory/tests/service/vm_timeline_events_test.dart
+++ b/runtime/observatory/tests/service/vm_timeline_events_test.dart
@@ -5,7 +5,7 @@
 import 'dart:async';
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/vm_timeline_flags_test.dart b/runtime/observatory/tests/service/vm_timeline_flags_test.dart
index 5f5365f..32c42b0 100644
--- a/runtime/observatory/tests/service/vm_timeline_flags_test.dart
+++ b/runtime/observatory/tests/service/vm_timeline_flags_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/service/weak_properties_test.dart b/runtime/observatory/tests/service/weak_properties_test.dart
index e9ba05f..bc08b35 100644
--- a/runtime/observatory/tests/service/weak_properties_test.dart
+++ b/runtime/observatory/tests/service/weak_properties_test.dart
@@ -6,7 +6,7 @@
 
 import 'dart:mirrors';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'test_helper.dart';
 
 class Foo {}
diff --git a/runtime/observatory/tests/service/yield_positions_with_finally_test.dart b/runtime/observatory/tests/service/yield_positions_with_finally_test.dart
index af9643b..9a462b5 100644
--- a/runtime/observatory/tests/service/yield_positions_with_finally_test.dart
+++ b/runtime/observatory/tests/service/yield_positions_with_finally_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
diff --git a/runtime/observatory/tests/ui/retainingPath.dart b/runtime/observatory/tests/ui/retainingPath.dart
index 119998d..0a2c30f 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>(10);
+  var list = new List<Foo>.filled(10, null);
   list[5] = new Foo(42.toString(), new Foo(87.toString(), 17.toString()));
   while (true) {}
 }
diff --git a/runtime/platform/atomic.h b/runtime/platform/atomic.h
index 5fb1d45..7a966f5 100644
--- a/runtime/platform/atomic.h
+++ b/runtime/platform/atomic.h
@@ -7,13 +7,10 @@
 
 #include <atomic>
 
-#include "platform/allocation.h"
-#include "platform/globals.h"
-
 namespace dart {
 
 // Like std::atomic, but operations default to relaxed ordering instead of
-// acquire-release ordering.
+// sequential consistency.
 template <typename T>
 class RelaxedAtomic {
  public:
@@ -21,29 +18,37 @@
   constexpr RelaxedAtomic(T arg) : value_(arg) {}           // NOLINT
   RelaxedAtomic(const RelaxedAtomic& arg) : value_(arg) {}  // NOLINT
 
-  T load() const { return value_.load(std::memory_order_relaxed); }
-  void store(T arg) { value_.store(arg, std::memory_order_relaxed); }
-
-  T fetch_add(T arg) {
-    return value_.fetch_add(arg, std::memory_order_relaxed);
+  T load(std::memory_order order = std::memory_order_relaxed) const {
+    return value_.load(order);
   }
-  T fetch_sub(T arg) {
-    return value_.fetch_sub(arg, std::memory_order_relaxed);
-  }
-  T fetch_or(T arg) { return value_.fetch_or(arg, std::memory_order_relaxed); }
-  T fetch_and(T arg) {
-    return value_.fetch_and(arg, std::memory_order_relaxed);
+  void store(T arg, std::memory_order order = std::memory_order_relaxed) {
+    value_.store(arg, order);
   }
 
-  bool compare_exchange_weak(T& expected, T desired) {  // NOLINT
-    return value_.compare_exchange_weak(expected, desired,
-                                        std::memory_order_relaxed,
-                                        std::memory_order_relaxed);
+  T fetch_add(T arg, std::memory_order order = std::memory_order_relaxed) {
+    return value_.fetch_add(arg, order);
   }
-  bool compare_exchange_strong(T& expected, T desired) {  // NOLINT
-    return value_.compare_exchange_strong(expected, desired,
-                                          std::memory_order_relaxed,
-                                          std::memory_order_relaxed);
+  T fetch_sub(T arg, std::memory_order order = std::memory_order_relaxed) {
+    return value_.fetch_sub(arg, order);
+  }
+  T fetch_or(T arg, std::memory_order order = std::memory_order_relaxed) {
+    return value_.fetch_or(arg, order);
+  }
+  T fetch_and(T arg, std::memory_order order = std::memory_order_relaxed) {
+    return value_.fetch_and(arg, order);
+  }
+
+  bool compare_exchange_weak(
+      T& expected,  // NOLINT
+      T desired,
+      std::memory_order order = std::memory_order_relaxed) {
+    return value_.compare_exchange_weak(expected, desired, order, order);
+  }
+  bool compare_exchange_strong(
+      T& expected,  // NOLINT
+      T desired,
+      std::memory_order order = std::memory_order_relaxed) {
+    return value_.compare_exchange_strong(expected, desired, order, order);
   }
 
   operator T() const { return load(); }
@@ -63,6 +68,59 @@
   std::atomic<T> value_;
 };
 
+// Like std::atomic, but operations default to acquire for load, release for
+// stores, and acquire-release for read-and-updates.
+template <typename T>
+class AcqRelAtomic {
+ public:
+  constexpr AcqRelAtomic() : value_() {}
+  constexpr AcqRelAtomic(T arg) : value_(arg) {}  // NOLINT
+  AcqRelAtomic(const AcqRelAtomic& arg) = delete;
+
+  T load(std::memory_order order = std::memory_order_acquire) const {
+    return value_.load(order);
+  }
+  void store(T arg, std::memory_order order = std::memory_order_release) {
+    value_.store(arg, order);
+  }
+
+  T fetch_add(T arg, std::memory_order order = std::memory_order_acq_rel) {
+    return value_.fetch_add(arg, order);
+  }
+  T fetch_sub(T arg, std::memory_order order = std::memory_order_acq_rel) {
+    return value_.fetch_sub(arg, order);
+  }
+  T fetch_or(T arg, std::memory_order order = std::memory_order_acq_rel) {
+    return value_.fetch_or(arg, order);
+  }
+  T fetch_and(T arg, std::memory_order order = std::memory_order_acq_rel) {
+    return value_.fetch_and(arg, order);
+  }
+
+  bool compare_exchange_weak(
+      T& expected,  // NOLINT
+      T desired,
+      std::memory_order order = std::memory_order_acq_rel) {
+    return value_.compare_exchange_weak(expected, desired, order, order);
+  }
+  bool compare_exchange_strong(
+      T& expected,  // NOLINT
+      T desired,
+      std::memory_order order = std::memory_order_acq_rel) {
+    return value_.compare_exchange_strong(expected, desired, order, order);
+  }
+
+  // Require explicit loads and stores.
+  operator T() const = delete;
+  T operator=(T arg) = delete;
+  T operator=(const AcqRelAtomic& arg) = delete;
+  T operator+=(T arg) = delete;
+  T operator-=(T arg) = delete;
+
+ private:
+  std::atomic<T> value_;
+};
+
 }  // namespace dart
 
 #endif  // RUNTIME_PLATFORM_ATOMIC_H_
diff --git a/runtime/tests/vm/dart/causal_stacks/utils.dart b/runtime/tests/vm/dart/causal_stacks/utils.dart
index 6501440..50d9527 100644
--- a/runtime/tests/vm/dart/causal_stacks/utils.dart
+++ b/runtime/tests/vm/dart/causal_stacks/utils.dart
@@ -647,7 +647,7 @@
             r'^#26     Future._completeError ',
             r'^#27     _AsyncAwaitCompleter.completeError ',
             r'^#28     allYield ',
-            r'^#29     _asyncErrorWrapperHelper.<anonymous closure> ',
+            r'^#29     _asyncErrorWrapperHelper.errorCallback ',
             r'^#30     _RootZone.runBinary ',
             r'^#31     _FutureListener.handleError ',
             r'^#32     Future._propagateToListeners.handleError ',
@@ -655,7 +655,7 @@
             r'^#34     Future._completeError ',
             r'^#35     _AsyncAwaitCompleter.completeError ',
             r'^#36     allYield2 ',
-            r'^#37     _asyncErrorWrapperHelper.<anonymous closure> ',
+            r'^#37     _asyncErrorWrapperHelper.errorCallback ',
             r'^#38     _RootZone.runBinary ',
             r'^#39     _FutureListener.handleError ',
             r'^#40     Future._propagateToListeners.handleError ',
@@ -691,7 +691,7 @@
             r'^#19     _AsyncAwaitCompleter.complete ',
             r'^#20     _completeOnAsyncReturn ',
             r'^#21     doTestAwait ',
-            r'^#22     _asyncErrorWrapperHelper.<anonymous closure> ',
+            r'^#22     _asyncErrorWrapperHelper.errorCallback ',
             r'^#23     _RootZone.runBinary ',
             r'^#24     _FutureListener.handleError ',
             r'^#25     Future._propagateToListeners.handleError ',
@@ -699,7 +699,7 @@
             r'^#27     Future._completeError ',
             r'^#28     _AsyncAwaitCompleter.completeError ',
             r'^#29     noYields ',
-            r'^#30     _asyncErrorWrapperHelper.<anonymous closure> ',
+            r'^#30     _asyncErrorWrapperHelper.errorCallback ',
             r'^#31     _RootZone.runBinary ',
             r'^#32     _FutureListener.handleError ',
             r'^#33     Future._propagateToListeners.handleError ',
@@ -707,7 +707,7 @@
             r'^#35     Future._completeError ',
             r'^#36     _AsyncAwaitCompleter.completeError ',
             r'^#37     noYields2 ',
-            r'^#38     _asyncErrorWrapperHelper.<anonymous closure> ',
+            r'^#38     _asyncErrorWrapperHelper.errorCallback ',
             r'^#39     _RootZone.runBinary ',
             r'^#40     _FutureListener.handleError ',
             r'^#41     Future._propagateToListeners.handleError ',
@@ -737,7 +737,7 @@
             r'^#19     _AsyncAwaitCompleter.complete ',
             r'^#20     _completeOnAsyncReturn ',
             r'^#21     doTestAwaitThen ',
-            r'^#22     _asyncErrorWrapperHelper.<anonymous closure> ',
+            r'^#22     _asyncErrorWrapperHelper.errorCallback ',
             r'^#23     _RootZone.runBinary ',
             r'^#24     _FutureListener.handleError ',
             r'^#25     Future._propagateToListeners.handleError ',
@@ -745,7 +745,7 @@
             r'^#27     Future._completeError ',
             r'^#28     _AsyncAwaitCompleter.completeError ',
             r'^#29     noYields ',
-            r'^#30     _asyncErrorWrapperHelper.<anonymous closure> ',
+            r'^#30     _asyncErrorWrapperHelper.errorCallback ',
             r'^#31     _RootZone.runBinary ',
             r'^#32     _FutureListener.handleError ',
             r'^#33     Future._propagateToListeners.handleError ',
@@ -753,7 +753,7 @@
             r'^#35     Future._completeError ',
             r'^#36     _AsyncAwaitCompleter.completeError ',
             r'^#37     noYields2 ',
-            r'^#38     _asyncErrorWrapperHelper.<anonymous closure> ',
+            r'^#38     _asyncErrorWrapperHelper.errorCallback ',
             r'^#39     _RootZone.runBinary ',
             r'^#40     _FutureListener.handleError ',
             r'^#41     Future._propagateToListeners.handleError ',
diff --git a/runtime/tests/vm/dart/regress_39747_test.dart b/runtime/tests/vm/dart/regress_39747_test.dart
index 605198c..0d3d1f7 100644
--- a/runtime/tests/vm/dart/regress_39747_test.dart
+++ b/runtime/tests/vm/dart/regress_39747_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.7
+
 // Regression test for https://github.com/dart-lang/sdk/issues/39747.
 // Verifies that compiler doesn't crash on a particular piece of code.
 
diff --git a/runtime/tests/vm/dart/regress_39767_test.dart b/runtime/tests/vm/dart/regress_39767_test.dart
index 273023c..24e9b13 100644
--- a/runtime/tests/vm/dart/regress_39767_test.dart
+++ b/runtime/tests/vm/dart/regress_39767_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.7
+
 // VMOptions=--optimization_counter_threshold=1 --deterministic
 
 // Regression test for https://github.com/dart-lang/sdk/issues/39767.
diff --git a/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart b/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart
index 0f1ff19..b0584ca 100644
--- a/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart
+++ b/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart
@@ -40,6 +40,11 @@
       if (stripFlag) '--strip',
       useBare ? '--use-bare-instructions' : '--no-use-bare-instructions',
       "--write-v8-snapshot-profile-to=$profilePath",
+      // Regression test for dartbug.com/41149. We don't assume forced
+      // disassembler support in Product mode.
+      if (!const bool.fromEnvironment('dart.vm.product'))
+        '--disassemble',
+      '--ignore-unrecognized-flags',
       dillPath,
     ];
 
diff --git a/runtime/vm/class_table.cc b/runtime/vm/class_table.cc
index 261728a..d19460a 100644
--- a/runtime/vm/class_table.cc
+++ b/runtime/vm/class_table.cc
@@ -27,28 +27,27 @@
     ASSERT(kInitialCapacity >= kNumPredefinedCids);
     capacity_ = kInitialCapacity;
     // Note that [calloc] will zero-initialize the memory.
-    table_ = reinterpret_cast<RelaxedAtomic<intptr_t>*>(
-        calloc(capacity_, sizeof(RelaxedAtomic<intptr_t>)));
+    table_.store(reinterpret_cast<RelaxedAtomic<intptr_t>*>(
+        calloc(capacity_, sizeof(RelaxedAtomic<intptr_t>))));
   } else {
     // Duplicate the class table from the VM isolate.
     auto vm_shared_class_table = Dart::vm_isolate()->group()->class_table();
     capacity_ = vm_shared_class_table->capacity_;
     // Note that [calloc] will zero-initialize the memory.
-    table_ = reinterpret_cast<RelaxedAtomic<intptr_t>*>(
+    RelaxedAtomic<intptr_t>* table = reinterpret_cast<RelaxedAtomic<intptr_t>*>(
         calloc(capacity_, sizeof(RelaxedAtomic<intptr_t>)));
     // The following cids don't have a corresponding class object in Dart code.
     // We therefore need to initialize them eagerly.
     for (intptr_t i = kObjectCid; i < kInstanceCid; i++) {
-      table_[i] = vm_shared_class_table->SizeAt(i);
+      table[i] = vm_shared_class_table->SizeAt(i);
     }
-    table_[kTypeArgumentsCid] =
-        vm_shared_class_table->SizeAt(kTypeArgumentsCid);
-    table_[kFreeListElement] = vm_shared_class_table->SizeAt(kFreeListElement);
-    table_[kForwardingCorpse] =
-        vm_shared_class_table->SizeAt(kForwardingCorpse);
-    table_[kDynamicCid] = vm_shared_class_table->SizeAt(kDynamicCid);
-    table_[kVoidCid] = vm_shared_class_table->SizeAt(kVoidCid);
-    table_[kNeverCid] = vm_shared_class_table->SizeAt(kNeverCid);
+    table[kTypeArgumentsCid] = vm_shared_class_table->SizeAt(kTypeArgumentsCid);
+    table[kFreeListElement] = vm_shared_class_table->SizeAt(kFreeListElement);
+    table[kForwardingCorpse] = vm_shared_class_table->SizeAt(kForwardingCorpse);
+    table[kDynamicCid] = vm_shared_class_table->SizeAt(kDynamicCid);
+    table[kVoidCid] = vm_shared_class_table->SizeAt(kVoidCid);
+    table[kNeverCid] = vm_shared_class_table->SizeAt(kNeverCid);
+    table_.store(table);
   }
 #if defined(SUPPORT_UNBOXED_INSTANCE_FIELDS)
   // Note that [calloc] will zero-initialize the memory.
@@ -57,8 +56,8 @@
 #endif  // defined(SUPPORT_UNBOXED_INSTANCE_FIELDS)
 #ifndef PRODUCT
   // Note that [calloc] will zero-initialize the memory.
-  trace_allocation_table_ =
-      static_cast<uint8_t*>(calloc(capacity_, sizeof(uint8_t)));
+  trace_allocation_table_.store(
+      static_cast<uint8_t*>(calloc(capacity_, sizeof(uint8_t))));
 #endif  // !PRODUCT
 }
 SharedClassTable::~SharedClassTable() {
@@ -66,10 +65,10 @@
     FreeOldTables();
     delete old_tables_;
   }
-  free(table_);
+  free(table_.load());
   free(unboxed_fields_map_);
 
-  NOT_IN_PRODUCT(free(trace_allocation_table_));
+  NOT_IN_PRODUCT(free(trace_allocation_table_.load()));
 }
 
 ClassTable::ClassTable(SharedClassTable* shared_class_table)
@@ -82,24 +81,26 @@
     ASSERT(kInitialCapacity >= kNumPredefinedCids);
     capacity_ = kInitialCapacity;
     // Note that [calloc] will zero-initialize the memory.
-    table_ = static_cast<RawClass**>(calloc(capacity_, sizeof(RawClass*)));
+    table_.store(static_cast<RawClass**>(calloc(capacity_, sizeof(RawClass*))));
   } else {
     // Duplicate the class table from the VM isolate.
     ClassTable* vm_class_table = Dart::vm_isolate()->class_table();
     capacity_ = vm_class_table->capacity_;
     // Note that [calloc] will zero-initialize the memory.
-    table_ = static_cast<RawClass**>(calloc(capacity_, sizeof(RawClass*)));
+    RawClass** table =
+        static_cast<RawClass**>(calloc(capacity_, sizeof(RawClass*)));
     // The following cids don't have a corresponding class object in Dart code.
     // We therefore need to initialize them eagerly.
     for (intptr_t i = kObjectCid; i < kInstanceCid; i++) {
-      table_[i] = vm_class_table->At(i);
+      table[i] = vm_class_table->At(i);
     }
-    table_[kTypeArgumentsCid] = vm_class_table->At(kTypeArgumentsCid);
-    table_[kFreeListElement] = vm_class_table->At(kFreeListElement);
-    table_[kForwardingCorpse] = vm_class_table->At(kForwardingCorpse);
-    table_[kDynamicCid] = vm_class_table->At(kDynamicCid);
-    table_[kVoidCid] = vm_class_table->At(kVoidCid);
-    table_[kNeverCid] = vm_class_table->At(kNeverCid);
+    table[kTypeArgumentsCid] = vm_class_table->At(kTypeArgumentsCid);
+    table[kFreeListElement] = vm_class_table->At(kFreeListElement);
+    table[kForwardingCorpse] = vm_class_table->At(kForwardingCorpse);
+    table[kDynamicCid] = vm_class_table->At(kDynamicCid);
+    table[kVoidCid] = vm_class_table->At(kVoidCid);
+    table[kNeverCid] = vm_class_table->At(kNeverCid);
+    table_.store(table);
   }
 }
 
@@ -108,7 +109,7 @@
     FreeOldTables();
     delete old_class_tables_;
   }
-  free(table_);
+  free(table_.load());
 }
 
 void ClassTable::AddOldTable(RawClass** old_class_table) {
@@ -149,8 +150,8 @@
 
   if (index != kIllegalCid) {
     ASSERT(index > 0 && index < kNumPredefinedCids && index < top_);
-    ASSERT(table_[index] == nullptr);
-    table_[index] = cls.raw();
+    ASSERT(table_.load()[index] == nullptr);
+    table_.load()[index] = cls.raw();
   } else {
     if (top_ == capacity_) {
       const intptr_t new_capacity = capacity_ + kCapacityIncrement;
@@ -158,7 +159,7 @@
     }
     ASSERT(top_ < capacity_);
     cls.set_id(top_);
-    table_[top_] = cls.raw();
+    table_.load()[top_] = cls.raw();
     top_++;  // Increment next index.
   }
   ASSERT(expected_cid == cls.id());
@@ -183,7 +184,7 @@
       Grow(new_capacity);
     }
     ASSERT(top_ < capacity_);
-    table_[top_] = size;
+    table_.load()[top_] = size;
     return top_++;  // Increment next index.
   }
 }
@@ -198,7 +199,7 @@
     Grow(new_capacity);
   }
 
-  ASSERT(table_[index] == nullptr);
+  ASSERT(table_.load()[index] == nullptr);
   if (index >= top_) {
     top_ = index + 1;
   }
@@ -210,13 +211,14 @@
 void ClassTable::Grow(intptr_t new_capacity) {
   ASSERT(new_capacity > capacity_);
 
+  auto old_table = table_.load();
   auto new_table = static_cast<RawClass**>(
       malloc(new_capacity * sizeof(RawClass*)));  // NOLINT
-  memmove(new_table, table_, capacity_ * sizeof(RawClass*));
+  memmove(new_table, old_table, capacity_ * sizeof(RawClass*));
   memset(new_table + capacity_, 0,
          (new_capacity - capacity_) * sizeof(RawClass*));
-  old_class_tables_->Add(table_);
-  table_ = new_table;  // TODO(koda): This should use atomics.
+  old_class_tables_->Add(old_table);
+  table_.store(new_table);
 
   capacity_ = new_capacity;
 }
@@ -230,7 +232,7 @@
     Grow(new_capacity);
   }
 
-  ASSERT(table_[index] == 0);
+  ASSERT(table_.load()[index] == 0);
   if (index >= top_) {
     top_ = index + 1;
   }
@@ -239,27 +241,28 @@
 void SharedClassTable::Grow(intptr_t new_capacity) {
   ASSERT(new_capacity >= capacity_);
 
+  RelaxedAtomic<intptr_t>* old_table = table_.load();
   RelaxedAtomic<intptr_t>* new_table =
       reinterpret_cast<RelaxedAtomic<intptr_t>*>(
           malloc(new_capacity * sizeof(RelaxedAtomic<intptr_t>)));  // NOLINT
 
-  memmove(new_table, table_, capacity_ * sizeof(intptr_t));
+  memmove(new_table, old_table, capacity_ * sizeof(intptr_t));
   memset(new_table + capacity_, 0,
          (new_capacity - capacity_) * sizeof(intptr_t));
 
 #if !defined(PRODUCT)
+  auto old_trace_table = trace_allocation_table_.load();
   auto new_trace_table =
       static_cast<uint8_t*>(malloc(new_capacity * sizeof(uint8_t)));  // NOLINT
-  memmove(new_trace_table, trace_allocation_table_,
-          capacity_ * sizeof(uint8_t));
+  memmove(new_trace_table, old_trace_table, capacity_ * sizeof(uint8_t));
   memset(new_trace_table + capacity_, 0,
          (new_capacity - capacity_) * sizeof(uint8_t));
 #endif
 
-  old_tables_->Add(table_);
-  table_ = new_table;  // TODO(koda): This should use atomics.
-  NOT_IN_PRODUCT(old_tables_->Add(trace_allocation_table_));
-  NOT_IN_PRODUCT(trace_allocation_table_ = new_trace_table);
+  old_tables_->Add(old_table);
+  table_.store(new_table);
+  NOT_IN_PRODUCT(old_tables_->Add(old_trace_table));
+  NOT_IN_PRODUCT(trace_allocation_table_.store(new_trace_table));
 
 #if defined(SUPPORT_UNBOXED_INSTANCE_FIELDS)
   auto new_unboxed_fields_map = static_cast<UnboxedFieldBitmap*>(
@@ -277,11 +280,11 @@
 
 void ClassTable::Unregister(intptr_t index) {
   shared_class_table_->Unregister(index);
-  table_[index] = nullptr;
+  table_.load()[index] = nullptr;
 }
 
 void SharedClassTable::Unregister(intptr_t index) {
-  table_[index] = 0;
+  table_.load()[index] = 0;
 #if defined(SUPPORT_UNBOXED_INSTANCE_FIELDS)
   unboxed_fields_map_[index].Reset();
 #endif  // defined(SUPPORT_UNBOXED_INSTANCE_FIELDS)
@@ -291,9 +294,10 @@
   ASSERT(Thread::Current()->IsAtSafepoint());
   const intptr_t num_cids = NumCids();
   std::unique_ptr<RawClass*[]> cls_by_old_cid(new RawClass*[num_cids]);
-  memmove(cls_by_old_cid.get(), table_, sizeof(RawClass*) * num_cids);
+  auto* table = table_.load();
+  memmove(cls_by_old_cid.get(), table, sizeof(RawClass*) * num_cids);
   for (intptr_t i = 0; i < num_cids; i++) {
-    table_[old_to_new_cid[i]] = cls_by_old_cid[i];
+    table[old_to_new_cid[i]] = cls_by_old_cid[i];
   }
 }
 
@@ -301,11 +305,12 @@
   ASSERT(Thread::Current()->IsAtSafepoint());
   const intptr_t num_cids = NumCids();
   std::unique_ptr<intptr_t[]> size_by_old_cid(new intptr_t[num_cids]);
+  auto* table = table_.load();
   for (intptr_t i = 0; i < num_cids; i++) {
-    size_by_old_cid[i] = table_[i];
+    size_by_old_cid[i] = table[i];
   }
   for (intptr_t i = 0; i < num_cids; i++) {
-    table_[old_to_new_cid[i]] = size_by_old_cid[i];
+    table[old_to_new_cid[i]] = size_by_old_cid[i];
   }
 
 #if defined(SUPPORT_UNBOXED_INSTANCE_FIELDS)
@@ -323,8 +328,11 @@
 void ClassTable::VisitObjectPointers(ObjectPointerVisitor* visitor) {
   ASSERT(visitor != NULL);
   visitor->set_gc_root_type("class table");
-  for (intptr_t i = 0; i < top_; i++) {
-    visitor->VisitPointer(reinterpret_cast<RawObject**>(&(table_[i])));
+  if (top_ != 0) {
+    auto* table = table_.load();
+    RawObject** from = reinterpret_cast<RawObject**>(&table[0]);
+    RawObject** to = reinterpret_cast<RawObject**>(&table[top_ - 1]);
+    visitor->VisitPointers(from, to);
   }
   visitor->clear_gc_root_type();
 }
@@ -376,7 +384,7 @@
   const intptr_t size =
       raw_cls == nullptr ? 0 : Class::host_instance_size(raw_cls);
   shared_class_table_->SetSizeAt(index, size);
-  table_[index] = raw_cls;
+  table_.load()[index] = raw_cls;
 }
 
 #ifndef PRODUCT
diff --git a/runtime/vm/class_table.h b/runtime/vm/class_table.h
index 3498946..eb5a431 100644
--- a/runtime/vm/class_table.h
+++ b/runtime/vm/class_table.h
@@ -71,13 +71,13 @@
   // Thread-safe.
   intptr_t SizeAt(intptr_t index) const {
     ASSERT(IsValidIndex(index));
-    return table_[index];
+    return table_.load()[index];
   }
 
   bool HasValidClassAt(intptr_t index) const {
     ASSERT(IsValidIndex(index));
-    ASSERT(table_[index] >= 0);
-    return table_[index] != 0;
+    ASSERT(table_.load()[index] >= 0);
+    return table_.load()[index] != 0;
   }
 
   void SetSizeAt(intptr_t index, intptr_t size) {
@@ -86,7 +86,7 @@
     // Ensure we never change size for a given cid from one non-zero size to
     // another non-zero size.
     intptr_t old_size = 0;
-    if (!table_[index].compare_exchange_strong(old_size, size)) {
+    if (!table_.load()[index].compare_exchange_strong(old_size, size)) {
       RELEASE_ASSERT(old_size == size);
     }
   }
@@ -119,12 +119,12 @@
   void SetTraceAllocationFor(intptr_t cid, bool trace) {
     ASSERT(cid > 0);
     ASSERT(cid < top_);
-    trace_allocation_table_[cid] = trace ? 1 : 0;
+    trace_allocation_table_.load()[cid] = trace ? 1 : 0;
   }
   bool TraceAllocationFor(intptr_t cid) {
     ASSERT(cid > 0);
     ASSERT(cid < top_);
-    return trace_allocation_table_[cid] != 0;
+    return trace_allocation_table_.load()[cid] != 0;
   }
 #endif  // !defined(PRODUCT)
 
@@ -134,14 +134,14 @@
     const intptr_t num_cids = NumCids();
     const intptr_t bytes = sizeof(intptr_t) * num_cids;
     auto size_table = static_cast<intptr_t*>(malloc(bytes));
-    memmove(size_table, table_, sizeof(intptr_t) * num_cids);
+    memmove(size_table, table_.load(), sizeof(intptr_t) * num_cids);
     *copy_num_cids = num_cids;
     *copy = size_table;
   }
 
   void ResetBeforeHotReload() {
     // The [IsolateReloadContext] is now source-of-truth for GC.
-    memset(table_, 0, sizeof(intptr_t) * top_);
+    memset(table_.load(), 0, sizeof(intptr_t) * top_);
   }
 
   void ResetAfterHotReload(intptr_t* old_table,
@@ -151,7 +151,7 @@
     // return, so we restore size information for all classes.
     if (is_rollback) {
       SetNumCids(num_old_cids);
-      memmove(table_, old_table, sizeof(intptr_t) * num_old_cids);
+      memmove(table_.load(), old_table, sizeof(intptr_t) * num_old_cids);
     }
 
     // Can't free this table immediately as another thread (e.g., concurrent
@@ -207,7 +207,7 @@
 #ifndef PRODUCT
   // Copy-on-write is used for trace_allocation_table_, with old copies stored
   // in old_tables_.
-  uint8_t* trace_allocation_table_ = nullptr;
+  AcqRelAtomic<uint8_t*> trace_allocation_table_ = {nullptr};
 #endif  // !PRODUCT
 
   void AddOldTable(intptr_t* old_table);
@@ -219,7 +219,7 @@
 
   // Copy-on-write is used for table_, with old copies stored in old_tables_.
   // Maps the cid to the instance size.
-  RelaxedAtomic<intptr_t>* table_ = nullptr;
+  AcqRelAtomic<RelaxedAtomic<intptr_t>*> table_ = {nullptr};
   MallocGrowableArray<void*>* old_tables_;
 
   IsolateGroupReloadContext* reload_context_ = nullptr;
@@ -247,7 +247,7 @@
     const intptr_t num_cids = NumCids();
     const intptr_t bytes = sizeof(RawClass*) * num_cids;
     auto class_table = static_cast<RawClass**>(malloc(bytes));
-    memmove(class_table, table_, sizeof(RawClass*) * num_cids);
+    memmove(class_table, table_.load(), sizeof(RawClass*) * num_cids);
     *copy_num_cids = num_cids;
     *copy = class_table;
   }
@@ -267,7 +267,7 @@
     // return, so we restore size information for all classes.
     if (is_rollback) {
       SetNumCids(num_old_cids);
-      memmove(table_, old_table, sizeof(RawClass*) * num_old_cids);
+      memmove(table_.load(), old_table, sizeof(RawClass*) * num_old_cids);
     } else {
       CopySizesFromClassObjects();
     }
@@ -282,7 +282,7 @@
   // Thread-safe.
   RawClass* At(intptr_t index) const {
     ASSERT(IsValidIndex(index));
-    return table_[index];
+    return table_.load()[index];
   }
 
   intptr_t SizeAt(intptr_t index) const {
@@ -297,7 +297,7 @@
 
   bool HasValidClassAt(intptr_t index) const {
     ASSERT(IsValidIndex(index));
-    return table_[index] != nullptr;
+    return table_.load()[index] != nullptr;
   }
 
   intptr_t NumCids() const { return shared_class_table_->NumCids(); }
@@ -375,7 +375,7 @@
 
   // Copy-on-write is used for table_, with old copies stored in
   // old_class_tables_.
-  RawClass** table_;
+  AcqRelAtomic<RawClass**> table_;
   MallocGrowableArray<RawClass**>* old_class_tables_;
   SharedClassTable* shared_class_table_;
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index 63b0431..95841cb 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -2373,7 +2373,8 @@
     // 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 (FLAG_null_safety && (dst_type.IsNullable() || dst_type.IsLegacy())) {
+    if (isolate()->null_safety() &&
+        (dst_type.IsNullable() || dst_type.IsLegacy())) {
       __ CompareObject(TypeTestABI::kInstanceReg, Object::null_object());
       __ BranchIf(EQUAL, done);
     }
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index b1bdb6b..deec0f6 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -310,19 +310,14 @@
     return GenerateSubtype1TestCacheLookup(
         token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
   }
-  // If one type argument only, check if type argument is Object or dynamic.
+  // If one type argument only, check if type argument is a top type.
   if (type_arguments.Length() == 1) {
     const AbstractType& tp_argument =
         AbstractType::ZoneHandle(zone(), type_arguments.TypeAt(0));
-    if (tp_argument.IsType()) {
-      ASSERT(tp_argument.HasTypeClass());
-      // Check if type argument is dynamic, Object, or void.
-      const Type& object_type = Type::Handle(zone(), Type::ObjectType());
-      if (object_type.IsSubtypeOf(tp_argument, Heap::kOld)) {
-        // Instance class test only necessary.
-        return GenerateSubtype1TestCacheLookup(
-            token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
-      }
+    if (tp_argument.IsTopType()) {
+      // Instance class test only necessary.
+      return GenerateSubtype1TestCacheLookup(
+          token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
     }
   }
 
@@ -482,10 +477,12 @@
                    compiler::target::TypeArguments::type_at_offset(
                        type_param.index())));
     // R3: concrete type of type.
-    // Check if type argument is dynamic, Object, or void.
+    // Check if type argument is dynamic, Object?, or void.
     __ CompareObject(R3, Object::dynamic_type());
     __ b(is_instance_lbl, EQ);
-    __ CompareObject(R3, Type::ZoneHandle(zone(), Type::ObjectType()));
+    __ CompareObject(
+        R3, Type::ZoneHandle(
+                zone(), isolate()->object_store()->nullable_object_type()));
     __ b(is_instance_lbl, EQ);
     __ CompareObject(R3, Object::void_type());
     __ b(is_instance_lbl, EQ);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index f4a6885..59c4bb7 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -298,18 +298,14 @@
     return GenerateSubtype1TestCacheLookup(
         token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
   }
-  // If one type argument only, check if type argument is Object or dynamic.
+  // If one type argument only, check if type argument is a top type.
   if (type_arguments.Length() == 1) {
     const AbstractType& tp_argument =
         AbstractType::ZoneHandle(zone(), type_arguments.TypeAt(0));
-    if (tp_argument.IsType()) {
-      // Check if type argument is dynamic, Object, or void.
-      const Type& object_type = Type::Handle(zone(), Type::ObjectType());
-      if (object_type.IsSubtypeOf(tp_argument, Heap::kOld)) {
-        // Instance class test only necessary.
-        return GenerateSubtype1TestCacheLookup(
-            token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
-      }
+    if (tp_argument.IsTopType()) {
+      // Instance class test only necessary.
+      return GenerateSubtype1TestCacheLookup(
+          token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
     }
   }
   // Regular subtype test cache involving instance's type arguments.
@@ -463,10 +459,12 @@
     __ LoadFieldFromOffset(R3, kTypeArgumentsReg,
                            TypeArguments::type_at_offset(type_param.index()));
     // R3: concrete type of type.
-    // Check if type argument is dynamic, Object, or void.
+    // Check if type argument is dynamic, Object?, or void.
     __ CompareObject(R3, Object::dynamic_type());
     __ b(is_instance_lbl, EQ);
-    __ CompareObject(R3, Type::ZoneHandle(zone(), Type::ObjectType()));
+    __ CompareObject(
+        R3, Type::ZoneHandle(
+                zone(), isolate()->object_store()->nullable_object_type()));
     __ b(is_instance_lbl, EQ);
     __ CompareObject(R3, Object::void_type());
     __ b(is_instance_lbl, EQ);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
index d7fcd3e..e5e0a06 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
@@ -286,18 +286,14 @@
     return GenerateSubtype1TestCacheLookup(
         token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
   }
-  // If one type argument only, check if type argument is Object or dynamic.
+  // If one type argument only, check if type argument is a top type.
   if (type_arguments.Length() == 1) {
     const AbstractType& tp_argument =
         AbstractType::ZoneHandle(zone(), type_arguments.TypeAt(0));
-    if (tp_argument.IsType()) {
-      // Check if type argument is dynamic, Object, or void.
-      const Type& object_type = Type::Handle(zone(), Type::ObjectType());
-      if (object_type.IsSubtypeOf(tp_argument, Heap::kOld)) {
-        // Instance class test only necessary.
-        return GenerateSubtype1TestCacheLookup(
-            token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
-      }
+    if (tp_argument.IsTopType()) {
+      // Instance class test only necessary.
+      return GenerateSubtype1TestCacheLookup(
+          token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
     }
   }
   // Regular subtype test cache involving instance's type arguments.
@@ -458,10 +454,12 @@
                      kTypeArgumentsReg,
                      TypeArguments::type_at_offset(type_param.index())));
     // EDI: concrete type of type.
-    // Check if type argument is dynamic, Object, or void.
+    // Check if type argument is dynamic, Object?, or void.
     __ CompareObject(EDI, Object::dynamic_type());
     __ j(EQUAL, is_instance_lbl);
-    __ CompareObject(EDI, Type::ZoneHandle(zone(), Type::ObjectType()));
+    __ CompareObject(
+        EDI, Type::ZoneHandle(
+                 zone(), isolate()->object_store()->nullable_object_type()));
     __ j(EQUAL, is_instance_lbl);
     __ CompareObject(EDI, Object::void_type());
     __ j(EQUAL, is_instance_lbl);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index 3f62944..82fdc74 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -308,19 +308,14 @@
     return GenerateSubtype1TestCacheLookup(
         token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
   }
-  // If one type argument only, check if type argument is Object or dynamic.
+  // If one type argument only, check if type argument is a top type.
   if (type_arguments.Length() == 1) {
     const AbstractType& tp_argument =
         AbstractType::ZoneHandle(zone(), type_arguments.TypeAt(0));
-    if (tp_argument.IsType()) {
-      ASSERT(tp_argument.HasTypeClass());
-      // Check if type argument is dynamic, Object, or void.
-      const Type& object_type = Type::Handle(zone(), Type::ObjectType());
-      if (object_type.IsSubtypeOf(tp_argument, Heap::kOld)) {
-        // Instance class test only necessary.
-        return GenerateSubtype1TestCacheLookup(
-            token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
-      }
+    if (tp_argument.IsTopType()) {
+      // Instance class test only necessary.
+      return GenerateSubtype1TestCacheLookup(
+          token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
     }
   }
 
@@ -486,11 +481,12 @@
                      kTypeArgumentsReg,
                      TypeArguments::type_at_offset(type_param.index())));
     // RDI: Concrete type of type.
-    // Check if type argument is dynamic, Object, or void.
+    // Check if type argument is dynamic, Object?, or void.
     __ CompareObject(RDI, Object::dynamic_type());
     __ j(EQUAL, is_instance_lbl);
-    const Type& object_type = Type::ZoneHandle(zone(), Type::ObjectType());
-    __ CompareObject(RDI, object_type);
+    __ CompareObject(
+        RDI, Type::ZoneHandle(
+                 zone(), isolate()->object_store()->nullable_object_type()));
     __ j(EQUAL, is_instance_lbl);
     __ CompareObject(RDI, Object::void_type());
     __ j(EQUAL, is_instance_lbl);
diff --git a/runtime/vm/compiler/frontend/constant_reader.cc b/runtime/vm/compiler/frontend/constant_reader.cc
index 1136484..23a30d3 100644
--- a/runtime/vm/compiler/frontend/constant_reader.cc
+++ b/runtime/vm/compiler/frontend/constant_reader.cc
@@ -104,6 +104,7 @@
 
 RawInstance* ConstantReader::ReadConstantInternal(intptr_t constant_offset) {
   // Get reader directly into raw bytes of constant table.
+  bool null_safety = H.thread()->isolate()->null_safety();
   KernelReaderHelper reader(Z, &H, script_, H.constants_table(), 0);
   reader.ReadUInt();  // skip variable-sized int for adjusted constant offset
   reader.SetOffset(reader.ReaderOffset() + constant_offset);
@@ -182,8 +183,9 @@
       const auto& list_class =
           Class::Handle(Z, corelib.LookupClassAllowPrivate(Symbols::_List()));
       // Build type from the raw bytes (needs temporary translator).
-      TypeTranslator type_translator(&reader, this, active_class_, true,
-                                     active_class_->RequireLegacyErasure());
+      TypeTranslator type_translator(
+          &reader, this, active_class_, true,
+          active_class_->RequireLegacyErasure(null_safety));
       auto& type_arguments =
           TypeArguments::Handle(Z, TypeArguments::New(1, Heap::kOld));
       AbstractType& type = type_translator.BuildType();
@@ -224,8 +226,9 @@
       ASSERT(klass.is_enum_class() || klass.is_const());
       instance = Instance::New(klass, Heap::kOld);
       // Build type from the raw bytes (needs temporary translator).
-      TypeTranslator type_translator(&reader, this, active_class_, true,
-                                     active_class_->RequireLegacyErasure());
+      TypeTranslator type_translator(
+          &reader, this, active_class_, true,
+          active_class_->RequireLegacyErasure(null_safety));
       const intptr_t number_of_type_arguments = reader.ReadUInt();
       if (klass.NumTypeArguments() > 0) {
         auto& type_arguments = TypeArguments::Handle(
@@ -267,8 +270,9 @@
       ASSERT(!constant.IsNull());
 
       // Build type from the raw bytes (needs temporary translator).
-      TypeTranslator type_translator(&reader, this, active_class_, true,
-                                     active_class_->RequireLegacyErasure());
+      TypeTranslator type_translator(
+          &reader, this, active_class_, true,
+          active_class_->RequireLegacyErasure(null_safety));
       const intptr_t number_of_type_arguments = reader.ReadUInt();
       ASSERT(number_of_type_arguments > 0);
       auto& type_arguments = TypeArguments::Handle(
@@ -301,8 +305,9 @@
     }
     case kTypeLiteralConstant: {
       // Build type from the raw bytes (needs temporary translator).
-      TypeTranslator type_translator(&reader, this, active_class_, true,
-                                     active_class_->RequireLegacyErasure());
+      TypeTranslator type_translator(
+          &reader, this, active_class_, true,
+          active_class_->RequireLegacyErasure(null_safety));
       instance = type_translator.BuildType().raw();
       break;
     }
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 6a8b7cd..4b59c97 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -2932,6 +2932,7 @@
       BuildTypeArguments(length);  // read type arguments.
   result_ =
       Type::New(klass, type_arguments, TokenPosition::kNoSource, nullability);
+  result_ = result_.NormalizeFutureOrType(Heap::kOld);
   if (finalize_) {
     ASSERT(active_class_->klass != NULL);
     result_ = ClassFinalizer::FinalizeType(*active_class_->klass, result_);
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index 2de2002..4597fb6 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -1294,8 +1294,8 @@
     return member->IsFactory();
   }
 
-  bool RequireLegacyErasure() const {
-    return klass != nullptr && !FLAG_null_safety &&
+  bool RequireLegacyErasure(bool null_safety) const {
+    return klass != nullptr && !null_safety &&
            Library::Handle(klass->library()).nnbd_compiled_mode() ==
                NNBDCompiledMode::kAgnostic;
   }
diff --git a/runtime/vm/compiler/frontend/prologue_builder.cc b/runtime/vm/compiler/frontend/prologue_builder.cc
index d3367e4..71fff65 100644
--- a/runtime/vm/compiler/frontend/prologue_builder.cc
+++ b/runtime/vm/compiler/frontend/prologue_builder.cc
@@ -291,6 +291,7 @@
   } else {
     ASSERT(num_opt_named_params > 0);
 
+    bool null_safety = Isolate::Current()->null_safety();
     const intptr_t first_name_offset =
         compiler::target::ArgumentsDescriptor::first_named_entry_offset() -
         compiler::target::Array::data_offset();
@@ -384,7 +385,7 @@
       // We had no match. If the param is required, throw a NoSuchMethod error.
       // Otherwise just load the default constant.
       Fragment not_good(missing);
-      if (FLAG_null_safety && function_.IsRequiredAt(opt_param_position[i])) {
+      if (null_safety && function_.IsRequiredAt(opt_param_position[i])) {
         not_good += Goto(nsm);
       } else {
         not_good += Constant(
diff --git a/runtime/vm/compiler/jit/compiler.cc b/runtime/vm/compiler/jit/compiler.cc
index 9995ebc..401c96d 100644
--- a/runtime/vm/compiler/jit/compiler.cc
+++ b/runtime/vm/compiler/jit/compiler.cc
@@ -7,7 +7,6 @@
 #include "vm/compiler/assembler/assembler.h"
 
 #include "vm/code_patcher.h"
-#include "vm/compiler/aot/precompiler.h"
 #include "vm/compiler/assembler/disassembler.h"
 #include "vm/compiler/backend/block_scheduler.h"
 #include "vm/compiler/backend/branch_optimizer.h"
@@ -863,10 +862,7 @@
 
 RawObject* Compiler::CompileFunction(Thread* thread, const Function& function) {
 #if defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_IA32)
-  if (FLAG_precompiled_mode) {
-    return Precompiler::CompileFunction(
-        /* precompiler = */ NULL, thread, thread->zone(), function);
-  }
+  RELEASE_ASSERT(!FLAG_precompiled_mode);
 #endif
 
 #if defined(DART_PRECOMPILED_RUNTIME)
@@ -1203,9 +1199,11 @@
       Function& function = Function::Handle(zone);
       {
         MonitorLocker ml(&queue_monitor_);
-        function = function_queue()->PeekFunction();
+        if (running_) {
+          function = function_queue()->PeekFunction();
+        }
       }
-      while (running_ && !function.IsNull()) {
+      while (!function.IsNull()) {
         if (is_optimizing()) {
           Compiler::CompileOptimizedFunction(thread, function,
                                              Compiler::kNoOSRDeoptId);
@@ -1217,7 +1215,7 @@
         QueueElement* qelem = NULL;
         {
           MonitorLocker ml(&queue_monitor_);
-          if (function_queue()->IsEmpty()) {
+          if (!running_ || function_queue()->IsEmpty()) {
             // We are shutting down, queue was cleared.
             function = Function::null();
           } else {
diff --git a/runtime/vm/cpu_arm.cc b/runtime/vm/cpu_arm.cc
index 3ae65c1..6ab6eee 100644
--- a/runtime/vm/cpu_arm.cc
+++ b/runtime/vm/cpu_arm.cc
@@ -200,6 +200,8 @@
   bool is_krait = CpuInfo::FieldContains(kCpuInfoHardware, "QCT APQ8064");
   bool is_armada_370xp =
       CpuInfo::FieldContains(kCpuInfoHardware, "Marvell Armada 370/XP");
+  bool is_virtual_machine =
+      CpuInfo::FieldContains(kCpuInfoHardware, "Dummy Virtual Machine");
 #if defined(HOST_OS_ANDROID)
   bool is_android = true;
 #else
@@ -217,6 +219,10 @@
     integer_division_supported_ = false;
   } else if (is_armada_370xp) {
     integer_division_supported_ = false;
+  } else if (is_android && !is_arm64 && is_virtual_machine) {
+    // Some Android ARM emulators claim support for integer division in
+    // /proc/cpuinfo but do not actually support it.
+    integer_division_supported_ = false;
   } else {
     integer_division_supported_ =
         (CpuInfo::FieldContains(kCpuInfoFeatures, "idiva") || is_arm64) &&
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index bbf0ea3..77f7ea6 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -907,6 +907,8 @@
 #else
 #error What architecture?
 #endif
+
+    ADD_ISOLATE_FLAG(null_safety, null_safety, FLAG_null_safety);
   }
 
   if (Dart::non_nullable_flag()) {
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 498e600..833f9c8 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1339,13 +1339,14 @@
           old_space->set_tasks(0);
           ml.NotifyAll();
         }
-
-        spawning_group->Shutdown();
       });
     }
 
     Thread::ExitIsolateGroupAsHelper(kBypassSafepoint);
   }
+
+  spawning_group->Shutdown();
+
   Dart_EnterIsolate(Api::CastIsolate(isolate));
   ASSERT(Thread::Current()->isolate_group() == isolate->group());
 
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index a756343..c82582f 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -2283,6 +2283,9 @@
 
     const intptr_t kBufferSize = 100;
     void* buffer = malloc(kBufferSize);
+    // The buffer becomes readable by Dart, so ensure it is initialized to
+    // satisfy our eager MSAN check.
+    memset(buffer, 0, kBufferSize);
     Dart_Handle byte_data = Dart_NewExternalTypedDataWithFinalizer(
         Dart_TypedData_kByteData, buffer, kBufferSize, buffer, kBufferSize,
         ByteDataFinalizer);
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index 93124b1..3057977 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -358,9 +358,6 @@
 // Materializes all deferred objects.  Returns the total number of
 // artificial arguments used during deoptimization.
 intptr_t DeoptContext::MaterializeDeferredObjects() {
-  // This region is initialized by a mixture of C++ and generated code.
-  MSAN_UNPOISON(dest_frame_, dest_frame_size_ * kWordSize);
-
   // Populate slots with references to all unboxed "primitive" values (doubles,
   // mints, simd) and deferred objects. Deferred objects are only allocated
   // but not filled with data. This is done later because deferred objects
diff --git a/runtime/vm/dwarf.cc b/runtime/vm/dwarf.cc
index be78898..c70ed6a 100644
--- a/runtime/vm/dwarf.cc
+++ b/runtime/vm/dwarf.cc
@@ -124,7 +124,8 @@
   ASSERT(name != nullptr);
   ASSERT(payload_start >= 0);
   auto const virtual_address = elf_->NextMemoryOffset() + payload_start;
-  elf_->AddStaticSymbol(elf_->NextSectionIndex(), name, virtual_address);
+  elf_->AddStaticSymbol(elf_->NextSectionIndex(), name, virtual_address,
+                        code.Size());
 
   ASSERT(!code.IsNull());
   ASSERT(code_to_address_.Lookup(&code) == nullptr);
diff --git a/runtime/vm/elf.cc b/runtime/vm/elf.cc
index 60e9b62..9654d8e 100644
--- a/runtime/vm/elf.cc
+++ b/runtime/vm/elf.cc
@@ -5,10 +5,10 @@
 #include "vm/elf.h"
 
 #include "platform/elf.h"
-#include "platform/text_buffer.h"
 #include "vm/cpu.h"
 #include "vm/hash_map.h"
 #include "vm/thread.h"
+#include "vm/zone_text_buffer.h"
 
 namespace dart {
 
@@ -347,7 +347,7 @@
                 /*executable=*/false,
                 /*writable=*/false),
         dynamic_(allocate),
-        text_(128),
+        text_(Thread::Current()->zone(), 128),
         text_indices_() {
     text_.AddChar('\0');
     text_indices_.Insert({"", 1});
@@ -357,7 +357,7 @@
   intptr_t MemorySize() { return dynamic_ ? FileSize() : 0; }
 
   void Write(Elf* stream) {
-    stream->WriteBytes(reinterpret_cast<const uint8_t*>(text_.buf()),
+    stream->WriteBytes(reinterpret_cast<const uint8_t*>(text_.buffer()),
                        text_.length());
   }
 
@@ -371,7 +371,7 @@
   }
 
   const bool dynamic_;
-  TextBuffer text_;
+  ZoneTextBuffer text_;
   // To avoid kNoValue for intptr_t (0), we store an index n as n + 1.
   CStringMap<intptr_t> text_indices_;
 };
@@ -561,7 +561,7 @@
     }
   }
 
-  class Entry {
+  class Entry : public ZoneAllocated {
    public:
     intptr_t tag;
     intptr_t value;
@@ -650,7 +650,8 @@
 
 void Elf::AddStaticSymbol(intptr_t section,
                           const char* name,
-                          size_t memory_offset) {
+                          intptr_t address,
+                          intptr_t size) {
   // Lazily allocate the static string and symbol tables, as we only add static
   // symbols in unstripped ELF files.
   if (strtab_ == nullptr) {
@@ -661,8 +662,8 @@
 
   auto const name_index = strtab_->AddString(name);
   auto const info = (elf::STB_GLOBAL << 4) | elf::STT_FUNC;
-  Symbol* symbol = new (zone_)
-      Symbol(name, name_index, info, section, memory_offset, /*size=*/0);
+  Symbol* symbol =
+      new (zone_) Symbol(name, name_index, info, section, address, size);
   symtab_->AddSymbol(symbol);
 }
 
diff --git a/runtime/vm/elf.h b/runtime/vm/elf.h
index f270dac..4cd877a 100644
--- a/runtime/vm/elf.h
+++ b/runtime/vm/elf.h
@@ -33,7 +33,8 @@
   void AddDebug(const char* name, const uint8_t* bytes, intptr_t size);
   void AddStaticSymbol(intptr_t section,
                        const char* name,
-                       size_t memory_offset);
+                       intptr_t address,
+                       intptr_t size);
 
   void Finalize();
 
diff --git a/runtime/vm/instructions_arm64.cc b/runtime/vm/instructions_arm64.cc
index a421c27..3e3db82 100644
--- a/runtime/vm/instructions_arm64.cc
+++ b/runtime/vm/instructions_arm64.cc
@@ -332,6 +332,10 @@
     if (instr->RnField() == PP) {
       // PP is untagged on ARM64.
       ASSERT(Utils::IsAligned(offset, 8));
+      // A code object may have an object pool attached in bare instructions
+      // mode if the v8 snapshot profile writer is active, but this pool cannot
+      // be used for object loading.
+      if (FLAG_use_bare_instructions) return false;
       intptr_t index = ObjectPool::IndexFromOffset(offset - kHeapObjectTag);
       const ObjectPool& pool = ObjectPool::Handle(code.object_pool());
       if (!pool.IsNull()) {
diff --git a/runtime/vm/instructions_x64.cc b/runtime/vm/instructions_x64.cc
index d25854f..2225a3e 100644
--- a/runtime/vm/instructions_x64.cc
+++ b/runtime/vm/instructions_x64.cc
@@ -31,6 +31,31 @@
 
   uint8_t* bytes = reinterpret_cast<uint8_t*>(pc);
 
+  COMPILE_ASSERT(THR == R14);
+  if ((bytes[0] == 0x49) || (bytes[0] == 0x4d)) {
+    if ((bytes[1] == 0x8b) || (bytes[1] == 0x3b)) {   // movq, cmpq
+      if ((bytes[2] & 0xc7) == (0x80 | (THR & 7))) {  // [r14+disp32]
+        int32_t offset = *reinterpret_cast<int32_t*>(pc + 3);
+        return Thread::ObjectAtOffset(offset, obj);
+      }
+      if ((bytes[2] & 0xc7) == (0x40 | (THR & 7))) {  // [r14+disp8]
+        uint8_t offset = *reinterpret_cast<uint8_t*>(pc + 3);
+        return Thread::ObjectAtOffset(offset, obj);
+      }
+    }
+  }
+
+  if (((bytes[0] == 0x41) && (bytes[1] == 0xff) && (bytes[2] == 0x76))) {
+    // push [r14+disp8]
+    uint8_t offset = *reinterpret_cast<uint8_t*>(pc + 3);
+    return Thread::ObjectAtOffset(offset, obj);
+  }
+
+  // A code object may have an object pool attached in bare instructions mode
+  // if the v8 snapshot profile writer is active, but this pool cannot be used
+  // for object loading.
+  if (FLAG_use_bare_instructions) return false;
+
   COMPILE_ASSERT(PP == R15);
   if ((bytes[0] == 0x49) || (bytes[0] == 0x4d)) {
     if ((bytes[1] == 0x8b) || (bytes[1] == 0x3b)) {  // movq, cmpq
@@ -57,25 +82,6 @@
     }
   }
 
-  COMPILE_ASSERT(THR == R14);
-  if ((bytes[0] == 0x49) || (bytes[0] == 0x4d)) {
-    if ((bytes[1] == 0x8b) || (bytes[1] == 0x3b)) {   // movq, cmpq
-      if ((bytes[2] & 0xc7) == (0x80 | (THR & 7))) {  // [r14+disp32]
-        int32_t offset = *reinterpret_cast<int32_t*>(pc + 3);
-        return Thread::ObjectAtOffset(offset, obj);
-      }
-      if ((bytes[2] & 0xc7) == (0x40 | (THR & 7))) {  // [r14+disp8]
-        uint8_t offset = *reinterpret_cast<uint8_t*>(pc + 3);
-        return Thread::ObjectAtOffset(offset, obj);
-      }
-    }
-  }
-  if (((bytes[0] == 0x41) && (bytes[1] == 0xff) && (bytes[2] == 0x76))) {
-    // push [r14+disp8]
-    uint8_t offset = *reinterpret_cast<uint8_t*>(pc + 3);
-    return Thread::ObjectAtOffset(offset, obj);
-  }
-
   return false;
 }
 
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 633d468..bf0ad70 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -267,7 +267,7 @@
 }
 
 void IsolateGroup::RunWithLockedGroup(std::function<void()> fun) {
-  SafepointReadRwLocker ml(Thread::Current(), isolates_lock_.get());
+  SafepointWriteRwLocker ml(Thread::Current(), isolates_lock_.get());
   fun();
 }
 
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 554398b..621dfd2 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -160,6 +160,7 @@
   V(NONPRODUCT, use_field_guards, UseFieldGuards, use_field_guards,            \
     FLAG_use_field_guards)                                                     \
   V(NONPRODUCT, use_osr, UseOsr, use_osr, FLAG_use_osr)                        \
+  V(PRODUCT, null_safety, NullSafety, null_safety, FLAG_null_safety)           \
   V(PRECOMPILER, obfuscate, Obfuscate, obfuscate, false_by_default)            \
   V(PRODUCT, unsafe_trust_strong_mode_types, UnsafeTrustStrongModeTypes,       \
     unsafe_trust_strong_mode_types,                                            \
@@ -1258,6 +1259,7 @@
   V(UseOsr)                                                                    \
   V(Obfuscate)                                                                 \
   V(ShouldLoadVmService)                                                       \
+  V(NullSafety)                                                                \
   V(UnsafeTrustStrongModeTypes)
 
   // Isolate specific flags.
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index e3cb9c9..67d8ad5 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -2062,7 +2062,10 @@
         delayed_function_type_arguments_(TypeArguments::Handle(zone)) {}
 
   void CheckStatics(const GrowableArray<const Field*>& fields) {
-    HANDLESCOPE(Thread::Current());
+    Thread* thread = Thread::Current();
+    Isolate* isolate = thread->isolate();
+    bool null_safety = isolate->null_safety();
+    HANDLESCOPE(thread);
     instantiator_type_arguments_ = TypeArguments::null();
     for (intptr_t i = 0; i < fields.length(); i++) {
       const Field& field = *fields[i];
@@ -2074,24 +2077,27 @@
       }
       value_ = field.StaticValue();
       if (value_.raw() != Object::sentinel().raw()) {
-        CheckValueType(value_, field);
+        CheckValueType(null_safety, value_, field);
       }
     }
   }
 
   void CheckInstances(const GrowableArray<const Instance*>& instances) {
+    Thread* thread = Thread::Current();
+    Isolate* isolate = thread->isolate();
+    bool null_safety = isolate->null_safety();
     for (intptr_t i = 0; i < instances.length(); i++) {
       // This handle scope does run very frequently, but is a net-win by
       // preventing us from spending too much time in malloc for new handle
       // blocks.
-      HANDLESCOPE(Thread::Current());
-      CheckInstance(*instances[i]);
+      HANDLESCOPE(thread);
+      CheckInstance(null_safety, *instances[i]);
     }
   }
 
  private:
   DART_FORCE_INLINE
-  void CheckInstance(const Instance& instance) {
+  void CheckInstance(bool null_safety, const Instance& instance) {
     cls_ = instance.clazz();
     if (cls_.NumTypeArguments() > 0) {
       instantiator_type_arguments_ = instance.GetTypeArguments();
@@ -2105,12 +2111,14 @@
         continue;
       }
       const Field& field = Field::Cast(entry_);
-      CheckInstanceField(instance, field);
+      CheckInstanceField(null_safety, instance, field);
     }
   }
 
   DART_FORCE_INLINE
-  void CheckInstanceField(const Instance& instance, const Field& field) {
+  void CheckInstanceField(bool null_safety,
+                          const Instance& instance,
+                          const Field& field) {
     if (field.needs_load_guard()) {
       return;  // Already guarding.
     }
@@ -2121,12 +2129,14 @@
       field.set_needs_load_guard(true);
       return;
     }
-    CheckValueType(value_, field);
+    CheckValueType(null_safety, value_, field);
   }
 
   DART_FORCE_INLINE
-  void CheckValueType(const Instance& value, const Field& field) {
-    if (!FLAG_null_safety && value.IsNull()) {
+  void CheckValueType(bool null_safety,
+                      const Instance& value,
+                      const Field& field) {
+    if (!null_safety && value.IsNull()) {
       return;
     }
     type_ = field.type();
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index 845d10e..a326820 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -93,6 +93,7 @@
 #if !defined(DART_PRECOMPILER)
     api_flags.use_osr = true;
 #endif
+    api_flags.null_safety = false;
 
     isolate = reinterpret_cast<Isolate*>(
         create_group_callback(KernelIsolate::kName, KernelIsolate::kName, NULL,
@@ -759,7 +760,8 @@
 
     Dart_CObject null_safety;
     null_safety.type = Dart_CObject_kBool;
-    null_safety.value.as_bool = FLAG_null_safety;
+    null_safety.value.as_bool =
+        isolate != NULL ? isolate->null_safety() : FLAG_null_safety;
 
     intptr_t num_experimental_flags = experimental_flags->length();
     Dart_CObject** experimental_flags_array =
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 7771db0..fd193c8 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -1030,13 +1030,13 @@
   library.set_is_nnbd(library_helper.IsNonNullableByDefault());
   const NNBDCompiledMode mode =
       library_helper.GetNonNullableByDefaultCompiledMode();
-  if (!FLAG_null_safety && mode == NNBDCompiledMode::kStrong) {
+  if (!I->null_safety() && mode == NNBDCompiledMode::kStrong) {
     H.ReportError(
         "Library '%s' was compiled with null safety (in strong mode) and it "
         "requires --null-safety option at runtime",
         String::Handle(library.url()).ToCString());
   }
-  if (FLAG_null_safety && (mode == NNBDCompiledMode::kWeak ||
+  if (I->null_safety() && (mode == NNBDCompiledMode::kWeak ||
                            mode == NNBDCompiledMode::kDisabled)) {
     H.ReportError(
         "Library '%s' was compiled without null safety (in weak mode) and it "
@@ -1958,6 +1958,9 @@
       (function.is_static() && (library.raw() == Library::InternalLibrary()))) {
     function.set_is_reflectable(false);
   }
+  if (procedure_helper.IsMemberSignature()) {
+    function.set_is_reflectable(false);
+  }
 
   ActiveMemberScope active_member(&active_class_, &function);
 
diff --git a/runtime/vm/native_api_impl.cc b/runtime/vm/native_api_impl.cc
index 895d5d6..75d9cd6 100644
--- a/runtime/vm/native_api_impl.cc
+++ b/runtime/vm/native_api_impl.cc
@@ -269,7 +269,7 @@
 
   } else if (strcmp(command, "is-mutator-in-native") == 0) {
     Isolate* const isolate = reinterpret_cast<Isolate*>(arg);
-    if (isolate->mutator_thread()->execution_state() ==
+    if (isolate->mutator_thread()->execution_state_cross_thread_for_testing() ==
         Thread::kThreadInNative) {
       return arg;
     } else {
diff --git a/runtime/vm/native_symbol.h b/runtime/vm/native_symbol.h
index 29dda98..84aad3c 100644
--- a/runtime/vm/native_symbol.h
+++ b/runtime/vm/native_symbol.h
@@ -16,7 +16,7 @@
  public:
   static void Init();
   static void Cleanup();
-  static char* LookupSymbolName(uintptr_t pc, uintptr_t* start);
+  static char* LookupSymbolName(uword pc, uword* start);
   static bool LookupSharedObject(uword pc, uword* dso_base, char** dso_name);
   static void FreeSymbolName(char* name);
   static void AddSymbols(const char* dso_name, void* buffer, size_t size);
diff --git a/runtime/vm/native_symbol_android.cc b/runtime/vm/native_symbol_android.cc
index 9cfd7cb..34a3492 100644
--- a/runtime/vm/native_symbol_android.cc
+++ b/runtime/vm/native_symbol_android.cc
@@ -17,7 +17,7 @@
 
 void NativeSymbolResolver::Cleanup() {}
 
-char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc, uintptr_t* start) {
+char* NativeSymbolResolver::LookupSymbolName(uword pc, uword* start) {
   Dl_info info;
   int r = dladdr(reinterpret_cast<void*>(pc), &info);
   if (r == 0) {
@@ -27,7 +27,7 @@
     return NULL;
   }
   if (start != NULL) {
-    *start = reinterpret_cast<uintptr_t>(info.dli_saddr);
+    *start = reinterpret_cast<uword>(info.dli_saddr);
   }
   int status = 0;
   size_t len = 0;
diff --git a/runtime/vm/native_symbol_fuchsia.cc b/runtime/vm/native_symbol_fuchsia.cc
index 70aa0b5..aed0b2a 100644
--- a/runtime/vm/native_symbol_fuchsia.cc
+++ b/runtime/vm/native_symbol_fuchsia.cc
@@ -100,16 +100,16 @@
   }
 }
 
-char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc, uintptr_t* start) {
+char* NativeSymbolResolver::LookupSymbolName(uword pc, uword* start) {
   Dl_info info;
   int r = dladdr(reinterpret_cast<void*>(pc), &info);
   if (r == 0) {
     return NULL;
   }
 
-  const char* dso_name = info.dli_fname;
-  uword dso_base = reinterpret_cast<uword>(info.dli_fbase);
-  uword dso_offset = pc - dso_base;
+  auto const dso_name = info.dli_fname;
+  const auto dso_base = reinterpret_cast<uword>(info.dli_fbase);
+  const auto dso_offset = pc - dso_base;
 
   for (NativeSymbols* symbols = symbols_; symbols != NULL;
        symbols = symbols->next()) {
diff --git a/runtime/vm/native_symbol_linux.cc b/runtime/vm/native_symbol_linux.cc
index a4af553..69fc1df 100644
--- a/runtime/vm/native_symbol_linux.cc
+++ b/runtime/vm/native_symbol_linux.cc
@@ -18,7 +18,7 @@
 
 void NativeSymbolResolver::Cleanup() {}
 
-char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc, uintptr_t* start) {
+char* NativeSymbolResolver::LookupSymbolName(uword pc, uword* start) {
   Dl_info info;
   int r = dladdr(reinterpret_cast<void*>(pc), &info);
   if (r == 0) {
@@ -28,7 +28,7 @@
     return NULL;
   }
   if (start != NULL) {
-    *start = reinterpret_cast<uintptr_t>(info.dli_saddr);
+    *start = reinterpret_cast<uword>(info.dli_saddr);
   }
   int status = 0;
   size_t len = 0;
diff --git a/runtime/vm/native_symbol_macos.cc b/runtime/vm/native_symbol_macos.cc
index d3a6489..88af47b 100644
--- a/runtime/vm/native_symbol_macos.cc
+++ b/runtime/vm/native_symbol_macos.cc
@@ -17,7 +17,7 @@
 
 void NativeSymbolResolver::Cleanup() {}
 
-char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc, uintptr_t* start) {
+char* NativeSymbolResolver::LookupSymbolName(uword pc, uword* start) {
   Dl_info info;
   int r = dladdr(reinterpret_cast<void*>(pc), &info);
   if (r == 0) {
@@ -27,7 +27,7 @@
     return NULL;
   }
   if (start != NULL) {
-    *start = reinterpret_cast<uintptr_t>(info.dli_saddr);
+    *start = reinterpret_cast<uword>(info.dli_saddr);
   }
   int status;
   char* demangled = abi::__cxa_demangle(info.dli_sname, NULL, NULL, &status);
diff --git a/runtime/vm/native_symbol_win.cc b/runtime/vm/native_symbol_win.cc
index d138ab0..a4f2f45 100644
--- a/runtime/vm/native_symbol_win.cc
+++ b/runtime/vm/native_symbol_win.cc
@@ -49,7 +49,7 @@
   }
 }
 
-char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc, uintptr_t* start) {
+char* NativeSymbolResolver::LookupSymbolName(uword pc, uword* start) {
   static const intptr_t kMaxNameLength = 2048;
   static const intptr_t kSymbolInfoSize = sizeof(SYMBOL_INFO);  // NOLINT.
   static char buffer[kSymbolInfoSize + kMaxNameLength];
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 85b1d32..b841c86 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -7499,7 +7499,9 @@
     return false;
   }
   // Verify that all argument names are valid parameter names.
-  Zone* zone = Thread::Current()->zone();
+  Thread* thread = Thread::Current();
+  Isolate* isolate = thread->isolate();
+  Zone* zone = thread->zone();
   String& argument_name = String::Handle(zone);
   String& parameter_name = String::Handle(zone);
   const intptr_t num_positional_args = num_arguments - num_named_arguments;
@@ -7528,7 +7530,7 @@
       return false;
     }
   }
-  if (FLAG_null_safety) {
+  if (isolate->null_safety()) {
     // Verify that all required named parameters are filled.
     for (intptr_t j = num_positional_args; j < num_parameters; j++) {
       if (IsRequiredAt(j)) {
@@ -7966,10 +7968,6 @@
       return false;
     }
   }
-  // Check the names and types of optional named parameters.
-  if (other_num_opt_named_params == 0) {
-    return true;
-  }
   // Check that for each optional named parameter of type T of the other
   // function type, there exists an optional named parameter of this function
   // type with an identical name and with a type S that is a supertype of T.
@@ -7983,7 +7981,6 @@
   for (intptr_t i = other_num_fixed_params; i < other_num_params; i++) {
     other_param_name = other.ParameterNameAt(i);
     ASSERT(other_param_name.IsSymbol());
-    const bool other_is_required = other.IsRequiredAt(i);
     found_param_name = false;
     for (intptr_t j = num_fixed_params; j < num_params; j++) {
       ASSERT(String::Handle(zone, ParameterNameAt(j)).IsSymbol());
@@ -7992,9 +7989,6 @@
         if (!IsContravariantParameter(j, other, i, space)) {
           return false;
         }
-        if (FLAG_null_safety && IsRequiredAt(j) && !other_is_required) {
-          return false;
-        }
         break;
       }
     }
@@ -8002,6 +7996,30 @@
       return false;
     }
   }
+  if (FLAG_null_safety) {
+    // Check that for each required named parameter in this function, there's a
+    // corresponding required named parameter in the other function.
+    String& param_name = other_param_name;
+    for (intptr_t j = num_fixed_params; j < num_params; j++) {
+      if (IsRequiredAt(j)) {
+        param_name = ParameterNameAt(j);
+        ASSERT(param_name.IsSymbol());
+        bool found = false;
+        for (intptr_t i = other_num_fixed_params; i < other_num_params; i++) {
+          ASSERT(String::Handle(zone, other.ParameterNameAt(i)).IsSymbol());
+          if (other.ParameterNameAt(i) == param_name.raw()) {
+            found = true;
+            if (!other.IsRequiredAt(i)) {
+              return false;
+            }
+          }
+        }
+        if (!found) {
+          return false;
+        }
+      }
+    }
+  }
   return true;
 }
 
@@ -17629,7 +17647,7 @@
   // In weak mode type casts, whether in legacy or opted-in libraries, the null
   // instance is detected and handled in inlined code and therefore cannot be
   // encountered here as a Dart null receiver.
-  ASSERT(FLAG_null_safety || !IsNull());
+  ASSERT(Isolate::Current()->null_safety() || !IsNull());
   // In strong mode, compute NNBD_SUBTYPE(runtimeType, other).
   // In weak mode, compute LEGACY_SUBTYPE(runtimeType, other).
   return RuntimeTypeIsSubtypeOf(other, other_instantiator_type_arguments,
@@ -17671,8 +17689,12 @@
 }
 
 bool Instance::NullIsAssignableTo(const AbstractType& other) {
+  Thread* thread = Thread::Current();
+  Isolate* isolate = thread->isolate();
+  Zone* zone = thread->zone();
+
   // In weak mode, Null is a bottom type (according to LEGACY_SUBTYPE).
-  if (!FLAG_null_safety) {
+  if (!isolate->null_safety()) {
     return true;
   }
   // "Left Null" rule: null is assignable when destination type is either
@@ -17682,7 +17704,8 @@
     return true;
   }
   if (other.IsFutureOrType()) {
-    return NullIsAssignableTo(AbstractType::Handle(other.UnwrapFutureOr()));
+    return NullIsAssignableTo(
+        AbstractType::Handle(zone, other.UnwrapFutureOr()));
   }
   return false;
 }
@@ -17699,12 +17722,13 @@
   if (other.IsTopType()) {
     return true;
   }
+  Thread* thread = Thread::Current();
+  Isolate* isolate = thread->isolate();
+  Zone* zone = thread->zone();
   // In weak testing mode, Null type is a subtype of any type.
-  if (IsNull() && !FLAG_null_safety) {
+  if (IsNull() && !isolate->null_safety()) {
     return true;
   }
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
   const Class& cls = Class::Handle(zone, clazz());
   if (cls.IsClosureClass()) {
     if (other.IsDartFunctionType() || other.IsDartClosureType()) {
@@ -17766,7 +17790,7 @@
     return false;
   }
   if (IsNull()) {
-    ASSERT(FLAG_null_safety);
+    ASSERT(isolate->null_safety());
     if (instantiated_other.IsNullType()) {
       return true;
     }
@@ -18062,17 +18086,27 @@
       .SetInstantiatedNullability(type_param, space);
 }
 
-RawAbstractType* AbstractType::NormalizeInstantiatedType() const {
+RawAbstractType* AbstractType::NormalizeFutureOrType(Heap::Space space) const {
   if (Dart::non_nullable_flag()) {
-    // Normalize FutureOr<T>.
     if (IsFutureOrType()) {
       const AbstractType& unwrapped_type =
           AbstractType::Handle(UnwrapFutureOr());
       const classid_t cid = unwrapped_type.type_class_id();
-      if (cid == kDynamicCid || cid == kVoidCid || cid == kInstanceCid) {
+      if (cid == kDynamicCid || cid == kVoidCid) {
         return unwrapped_type.raw();
       }
-      if (cid == kNeverCid && IsNonNullable()) {
+      if (cid == kInstanceCid) {
+        if (IsNonNullable()) {
+          return unwrapped_type.raw();
+        }
+        if (IsNullable() || unwrapped_type.IsNullable()) {
+          return Type::Cast(unwrapped_type)
+              .ToNullability(Nullability::kNullable, space);
+        }
+        return Type::Cast(unwrapped_type)
+            .ToNullability(Nullability::kLegacy, space);
+      }
+      if (cid == kNeverCid && unwrapped_type.IsNonNullable()) {
         ObjectStore* object_store = Isolate::Current()->object_store();
         if (object_store->non_nullable_future_never_type() == Type::null()) {
           const Class& cls = Class::Handle(object_store->future_class());
@@ -18087,7 +18121,9 @@
           type ^= type.Canonicalize();
           object_store->set_non_nullable_future_never_type(type);
         }
-        return object_store->non_nullable_future_never_type();
+        const Type& future_never_type =
+            Type::Handle(object_store->non_nullable_future_never_type());
+        return future_never_type.ToNullability(nullability(), space);
       }
       if (cid == kNullCid) {
         ObjectStore* object_store = Isolate::Current()->object_store();
@@ -18106,6 +18142,10 @@
         }
         return object_store->nullable_future_null_type();
       }
+      if (IsNullable() && unwrapped_type.IsNullable()) {
+        return Type::Cast(*this).ToNullability(Nullability::kNonNullable,
+                                               space);
+      }
     }
   }
   return raw();
@@ -18449,7 +18489,7 @@
   if (cid == kInstanceCid) {  // Object type.
     // NNBD weak mode uses LEGACY_SUBTYPE for assignability / 'as' tests,
     // and non-nullable Object is a top type according to LEGACY_SUBTYPE.
-    return !FLAG_null_safety || !IsNonNullable();
+    return !Isolate::Current()->null_safety() || !IsNonNullable();
   }
   if (cid == kFutureOrCid) {
     // FutureOr<T> where T is a top type behaves as a top type.
@@ -18560,6 +18600,7 @@
     return Instance::NullIsAssignableTo(other);
   }
   Thread* thread = Thread::Current();
+  Isolate* isolate = thread->isolate();
   Zone* zone = thread->zone();
   // Type parameters cannot be handled by Class::IsSubtypeOf().
   // When comparing two uninstantiated function types, one returning type
@@ -18596,7 +18637,7 @@
   if (other.IsTypeParameter()) {
     return false;
   }
-  if (FLAG_null_safety && IsNullable() && other.IsNonNullable()) {
+  if (isolate->null_safety() && IsNullable() && other.IsNonNullable()) {
     return false;
   }
   const Class& type_cls = Class::Handle(zone, type_class());
@@ -18972,7 +19013,7 @@
     }
   }
   // Canonicalization is not part of instantiation.
-  return instantiated_type.NormalizeInstantiatedType();
+  return instantiated_type.NormalizeFutureOrType(space);
 }
 
 bool Type::IsEquivalent(const Instance& other,
@@ -19001,8 +19042,12 @@
   }
   Nullability this_type_nullability = nullability();
   Nullability other_type_nullability = other_type.nullability();
+  Thread* thread = Thread::Current();
+  Isolate* isolate = thread->isolate();
+  Zone* zone = thread->zone();
   if (kind == TypeEquality::kInSubtypeTest) {
-    if (FLAG_null_safety && this_type_nullability == Nullability::kNullable &&
+    if (isolate->null_safety() &&
+        this_type_nullability == Nullability::kNullable &&
         other_type_nullability == Nullability::kNonNullable) {
       return false;
     }
@@ -19028,8 +19073,6 @@
       (signature() == other_type.signature())) {
     return true;
   }
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
   if (arguments() != other_type.arguments()) {
     const Class& cls = Class::Handle(zone, type_class());
     const intptr_t num_type_params = cls.NumTypeParameters(thread);
@@ -19722,7 +19765,7 @@
   Nullability this_type_param_nullability = nullability();
   Nullability other_type_param_nullability = other_type_param.nullability();
   if (kind == TypeEquality::kInSubtypeTest) {
-    if (FLAG_null_safety &&
+    if (Isolate::Current()->null_safety() &&
         (this_type_param_nullability == Nullability::kNullable) &&
         (other_type_param_nullability == Nullability::kNonNullable)) {
       return false;
@@ -19836,7 +19879,7 @@
     AbstractType& result =
         AbstractType::Handle(function_type_arguments.TypeAt(index()));
     result = result.SetInstantiatedNullability(*this, space);
-    return result.NormalizeInstantiatedType();
+    return result.NormalizeFutureOrType(space);
   }
   ASSERT(IsClassTypeParameter());
   if (instantiator_type_arguments.IsNull()) {
@@ -19854,7 +19897,7 @@
   AbstractType& result =
       AbstractType::Handle(instantiator_type_arguments.TypeAt(index()));
   result = result.SetInstantiatedNullability(*this, space);
-  return result.NormalizeInstantiatedType();
+  return result.NormalizeFutureOrType(space);
   // There is no need to canonicalize the instantiated type parameter, since all
   // type arguments are canonicalized at type finalization time. It would be too
   // early to canonicalize the returned type argument here, since instantiation
@@ -23432,18 +23475,27 @@
                                         : Code::Cast(code).PayloadStart();
         uword return_addr = start + pc_offset;
         uword call_addr = return_addr - 1;
+        buffer.Printf("    #%02" Pd " abs %" Pp "", frame_index, call_addr);
         uword dso_base;
         char* dso_name;
         if (NativeSymbolResolver::LookupSharedObject(call_addr, &dso_base,
                                                      &dso_name)) {
           uword dso_offset = call_addr - dso_base;
-          buffer.Printf("    #%02" Pd " abs %" Pp " virt %" Pp " %s\n",
-                        frame_index, call_addr, dso_offset, dso_name);
+          buffer.Printf(" virt %" Pp "", dso_offset);
+          uword symbol_start;
+          if (auto const symbol_name = NativeSymbolResolver::LookupSymbolName(
+                  call_addr, &symbol_start)) {
+            uword symbol_offset = call_addr - symbol_start;
+            buffer.Printf(" %s+0x%" Px "", symbol_name, symbol_offset);
+            NativeSymbolResolver::FreeSymbolName(symbol_name);
+          } else {
+            buffer.Printf(" %s", dso_name);
+          }
           NativeSymbolResolver::FreeSymbolName(dso_name);
         } else {
-          buffer.Printf("    #%02" Pd " abs %" Pp " <unknown>\n", frame_index,
-                        call_addr);
+          buffer.Printf(" <unknown>");
         }
+        buffer.Printf("\n");
         frame_index++;
       }
     }
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 3706d9e..1c620c9 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -7463,7 +7463,7 @@
   virtual RawAbstractType* SetInstantiatedNullability(
       const TypeParameter& type_param,
       Heap::Space space) const;
-  virtual RawAbstractType* NormalizeInstantiatedType() const;
+  virtual RawAbstractType* NormalizeFutureOrType(Heap::Space space) const;
 
   virtual bool HasTypeClass() const { return type_class_id() != kIllegalCid; }
   virtual classid_t type_class_id() const;
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
index a982bb6..e568c4a 100644
--- a/runtime/vm/object_graph.cc
+++ b/runtime/vm/object_graph.cc
@@ -983,10 +983,10 @@
     writer_->WriteUnsigned(writer_->GetObjectId(weak_persistent_handle->raw()));
     writer_->WriteUnsigned(weak_persistent_handle->external_size());
     // Attempt to include a native symbol name.
-    char* name = NativeSymbolResolver::LookupSymbolName(
-        reinterpret_cast<uintptr_t>(weak_persistent_handle->callback()), NULL);
-    writer_->WriteUtf8((name == NULL) ? "Unknown native function" : name);
-    if (name != NULL) {
+    auto const name = NativeSymbolResolver::LookupSymbolName(
+        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/profiler.cc b/runtime/vm/profiler.cc
index 0e09117..69eaf42 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -457,12 +457,12 @@
 }
 
 static void DumpStackFrame(intptr_t frame_index, uword pc, uword fp) {
-  uintptr_t start = 0;
-  char* native_symbol_name = NativeSymbolResolver::LookupSymbolName(pc, &start);
-  if (native_symbol_name != NULL) {
-    OS::PrintErr("  pc 0x%" Pp " fp 0x%" Pp " %s\n", pc, fp,
-                 native_symbol_name);
-    NativeSymbolResolver::FreeSymbolName(native_symbol_name);
+  uword start = 0;
+  if (auto const name = NativeSymbolResolver::LookupSymbolName(pc, &start)) {
+    uword offset = pc - start;
+    OS::PrintErr("  pc 0x%" Pp " fp 0x%" Pp " %s+0x%" Px "\n", pc, fp, name,
+                 offset);
+    NativeSymbolResolver::FreeSymbolName(name);
     return;
   }
 
diff --git a/runtime/vm/profiler_service.cc b/runtime/vm/profiler_service.cc
index c05cd6a..08770d8 100644
--- a/runtime/vm/profiler_service.cc
+++ b/runtime/vm/profiler_service.cc
@@ -1424,7 +1424,7 @@
     // We haven't seen this pc yet.
 
     // Check NativeSymbolResolver for pc.
-    uintptr_t native_start = 0;
+    uword native_start = 0;
     char* native_name =
         NativeSymbolResolver::LookupSymbolName(pc, &native_start);
     if (native_name == NULL) {
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 5821da5..1a097cc 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -799,7 +799,7 @@
   ASSERT(!dst_type.IsDynamicType());  // No need to check assignment.
   // A null instance is already detected and allowed in inlined code, unless
   // strong checking is enabled.
-  ASSERT(!src_instance.IsNull() || FLAG_null_safety);
+  ASSERT(!src_instance.IsNull() || isolate->null_safety());
   const bool is_instance_of = src_instance.IsAssignableTo(
       dst_type, instantiator_type_arguments, function_type_arguments);
 
@@ -2845,6 +2845,14 @@
 static void CopySavedRegisters(uword saved_registers_address,
                                fpu_register_t** fpu_registers,
                                intptr_t** cpu_registers) {
+  // Tell MemorySanitizer this region is initialized by generated code. This
+  // region isn't already (fully) unpoisoned by FrameSetIterator::Unpoison
+  // because it is in an exit frame and stack frame iteration doesn't have
+  // access to true SP for exit frames.
+  MSAN_UNPOISON(reinterpret_cast<void*>(saved_registers_address),
+                kNumberOfSavedFpuRegisters * kFpuRegisterSize +
+                    kNumberOfSavedCpuRegisters * kWordSize);
+
   ASSERT(sizeof(fpu_register_t) == kFpuRegisterSize);
   fpu_register_t* fpu_registers_copy =
       new fpu_register_t[kNumberOfSavedFpuRegisters];
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 72ce179..2f451ce 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -4155,9 +4155,9 @@
         reinterpret_cast<uintptr_t>(weak_persistent_handle->callback()));
     // Attempt to include a native symbol name.
     char* name = NativeSymbolResolver::LookupSymbolName(
-        reinterpret_cast<uintptr_t>(weak_persistent_handle->callback()), NULL);
-    obj.AddProperty("callbackSymbolName", (name == NULL) ? "" : name);
-    if (name != NULL) {
+        reinterpret_cast<uword>(weak_persistent_handle->callback()), nullptr);
+    obj.AddProperty("callbackSymbolName", (name == nullptr) ? "" : name);
+    if (name != nullptr) {
       NativeSymbolResolver::FreeSymbolName(name);
     }
     obj.AddPropertyF("externalSize", "%" Pd "",
diff --git a/runtime/vm/service_isolate.cc b/runtime/vm/service_isolate.cc
index 4817ab9..7e084ab 100644
--- a/runtime/vm/service_isolate.cc
+++ b/runtime/vm/service_isolate.cc
@@ -346,6 +346,7 @@
 
     Dart_IsolateFlags api_flags;
     Isolate::FlagsInitialize(&api_flags);
+    api_flags.null_safety = false;
 
     isolate = reinterpret_cast<Isolate*>(
         create_group_callback(ServiceIsolate::kName, ServiceIsolate::kName,
diff --git a/runtime/vm/signal_handler_android.cc b/runtime/vm/signal_handler_android.cc
index f9f6944..cdef00f 100644
--- a/runtime/vm/signal_handler_android.cc
+++ b/runtime/vm/signal_handler_android.cc
@@ -95,11 +95,27 @@
 }
 
 void SignalHandler::InstallImpl(SignalAction action) {
+  // Bionic implementation of setjmp temporary mangles SP register
+  // in place which breaks signal delivery on the thread stack - when
+  // kernel tries to deliver SIGPROF and we are in the middle of
+  // setjmp SP value is invalid - might be pointing to random memory
+  // or outside of writable space at all. In the first case we
+  // get memory corruption and in the second case kernel would send
+  // SIGSEGV to the process. See b/152210274 for details.
+  // To work around this issue we are using alternative signal stack
+  // to handle SIGPROF signals.
+  stack_t ss;
+  ss.ss_size = SIGSTKSZ;
+  ss.ss_sp = malloc(ss.ss_size);
+  ss.ss_flags = 0;
+  int r = sigaltstack(&ss, NULL);
+  ASSERT(r == 0);
+
   struct sigaction act = {};
   act.sa_sigaction = action;
   sigemptyset(&act.sa_mask);
-  act.sa_flags = SA_RESTART | SA_SIGINFO;
-  int r = sigaction(SIGPROF, &act, NULL);
+  act.sa_flags = SA_RESTART | SA_SIGINFO | SA_ONSTACK;
+  r = sigaction(SIGPROF, &act, NULL);
   ASSERT(r == 0);
 }
 
@@ -111,6 +127,13 @@
   sigemptyset(&act.sa_mask);
   int r = sigaction(SIGPROF, &act, NULL);
   ASSERT(r == 0);
+
+  // Disable and delete alternative signal stack.
+  stack_t ss, old_ss;
+  ss.ss_flags = SS_DISABLE;
+  r = sigaltstack(&ss, &old_ss);
+  ASSERT(r == 0);
+  free(old_ss.ss_sp);
 }
 
 }  // namespace dart
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index c1b0d03..1132a6e 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -751,6 +751,11 @@
   ExecutionState execution_state() const {
     return static_cast<ExecutionState>(execution_state_);
   }
+  // Normally execution state is only accessed for the current thread.
+  NO_SANITIZE_THREAD
+  ExecutionState execution_state_cross_thread_for_testing() const {
+    return static_cast<ExecutionState>(execution_state_);
+  }
   void set_execution_state(ExecutionState state) {
     execution_state_ = static_cast<uword>(state);
   }
diff --git a/runtime/vm/type_testing_stubs.cc b/runtime/vm/type_testing_stubs.cc
index 07ac698..45ea803 100644
--- a/runtime/vm/type_testing_stubs.cc
+++ b/runtime/vm/type_testing_stubs.cc
@@ -92,8 +92,9 @@
     const AbstractType& type,
     bool lazy_specialize /* = true */) {
   if (type.IsTypeRef()) {
-    return FLAG_null_safety ? StubCode::DefaultTypeTest().raw()
-                            : StubCode::DefaultNullableTypeTest().raw();
+    return Isolate::Current()->null_safety()
+               ? StubCode::DefaultTypeTest().raw()
+               : StubCode::DefaultNullableTypeTest().raw();
   }
 
   // During bootstrapping we have no access to stubs yet, so we'll just return
@@ -459,7 +460,8 @@
     // Weak NNBD mode uses LEGACY_SUBTYPE which ignores nullability.
     // We don't need to check nullability of LHS for nullable and legacy RHS
     // ("Right Legacy", "Right Nullable" rules).
-    if (FLAG_null_safety && !type_arg.IsNullable() && !type_arg.IsLegacy()) {
+    if (Isolate::Current()->null_safety() && !type_arg.IsNullable() &&
+        !type_arg.IsLegacy()) {
       compiler::Label skip_nullable_check;
       // Nullable type is not a subtype of non-nullable type.
       // TODO(dartbug.com/40736): Allocate a register for instance type argument
@@ -623,7 +625,11 @@
     if (instantiator_type_arguments_.IsNull()) {
       return Type::DynamicType();
     }
-    return instantiator_type_arguments_.TypeAt(parameter.index());
+    AbstractType& result = AbstractType::Handle(
+        instantiator_type_arguments_.TypeAt(parameter.index()));
+    result = result.SetInstantiatedNullability(TypeParameter::Cast(type),
+                                               Heap::kOld);
+    return result.NormalizeFutureOrType(Heap::kOld);
   } else if (type.IsFunctionType()) {
     // No support for function types yet.
     UNREACHABLE();
@@ -847,7 +853,7 @@
   // eagerly and avoid doing it down inside the loop.
   type = Type::DynamicType();
   UseTypeInAssertAssignable(type);
-  type = Type::ObjectType();
+  type = Type::ObjectType();  // TODO(regis): Add nullable Object?
   UseTypeInAssertAssignable(type);
 
   for (intptr_t cid = 0; cid < cid_count; ++cid) {
diff --git a/runtime/vm/version_in.cc b/runtime/vm/version_in.cc
index ae3cff7..b4f1e2d 100644
--- a/runtime/vm/version_in.cc
+++ b/runtime/vm/version_in.cc
@@ -39,7 +39,7 @@
 }
 
 const char* Version::snapshot_hash_ = "{{SNAPSHOT_HASH}}";
-const char* Version::str_ = "{{VERSION_STR}} ({{COMMIT_TIME}})";
+const char* Version::str_ = "{{VERSION_STR}} ({{CHANNEL}}) ({{COMMIT_TIME}})";
 const char* Version::commit_ = "{{VERSION_STR}}";
 
 }  // namespace dart
diff --git a/runtime/vm/zone_text_buffer.cc b/runtime/vm/zone_text_buffer.cc
index c7548eb..446f952 100644
--- a/runtime/vm/zone_text_buffer.cc
+++ b/runtime/vm/zone_text_buffer.cc
@@ -44,6 +44,13 @@
   return len;
 }
 
+void ZoneTextBuffer::AddChar(char ch) {
+  EnsureCapacity(sizeof(ch));
+  buffer_[length_] = ch;
+  length_++;
+  buffer_[length_] = '\0';
+}
+
 void ZoneTextBuffer::AddString(const char* s) {
   Printf("%s", s);
 }
diff --git a/runtime/vm/zone_text_buffer.h b/runtime/vm/zone_text_buffer.h
index 3d5207b..f4e2f31 100644
--- a/runtime/vm/zone_text_buffer.h
+++ b/runtime/vm/zone_text_buffer.h
@@ -21,6 +21,7 @@
   ~ZoneTextBuffer() {}
 
   intptr_t Printf(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
+  void AddChar(char ch);
   void AddString(const char* s);
   void AddString(const String& s);
 
diff --git a/samples-dev/samples-dev.status b/samples-dev/samples-dev.status
deleted file mode 100644
index 66ee67b..0000000
--- a/samples-dev/samples-dev.status
+++ /dev/null
@@ -1,27 +0,0 @@
-# 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.
-
-[ $compiler == dart2analyzer ]
-swarm/test/swarm_test: StaticWarning
-swarm/test/swarm_ui_lib/layout/layout_test: StaticWarning
-swarm/test/swarm_ui_lib/observable/observable_test: StaticWarning
-swarm/test/swarm_ui_lib/touch/touch_test: StaticWarning
-swarm/test/swarm_ui_lib/util/util_test: StaticWarning
-swarm/test/swarm_ui_lib/view/view_test: StaticWarning
-
-[ $runtime == safari ]
-swarm/test/swarm_test: Pass, Fail # Issue 14523
-
-[ $runtime == vm ]
-swarm: Skip
-
-[ $browser ]
-swarm/test/swarm_ui_lib/touch/touch_test: Fail # This may be related to issue 157, Expectation: Solver. Expect.approxEquals(expected:9, actual:8.990625000000001, tolerance:0.0009) fails
-
-[ $compiler == dart2js && $runtime == chromeOnAndroid ]
-swarm/test/swarm_test: Fail # TODO(kasperl): Please triage.
-swarm/test/swarm_ui_lib/layout/layout_test: Fail # TODO(kasperl): Please triage.
-
-[ $compiler == dart2js && $runtime == ff ]
-swarm/test/swarm_test: Fail # Issue 5633
diff --git a/samples-dev/swarm/test/swarm_test.dart b/samples-dev/swarm/test/swarm_test.dart
deleted file mode 100644
index c7f39f9..0000000
--- a/samples-dev/swarm/test/swarm_test.dart
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for 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 swarm_tests;
-
-import 'dart:html';
-import 'dart:async';
-import 'package:expect/expect.dart';
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
-import '../swarmlib.dart';
-import '../swarm_ui_lib/base/base.dart';
-import '../swarm_ui_lib/util/utilslib.dart';
-
-// TODO(jmesserly): these would probably be easier to debug if they were written
-// in the WebKit layout test style, so we could easy compare that the DOM is
-// what we expect it to be after performing some simulated user actions.
-
-void main() {
-  useHtmlConfiguration();
-  Swarm swarm = new Swarm(useCannedData: true);
-  UIStateProxy state = new UIStateProxy(swarm.sections);
-  swarm.state = state;
-  swarm.run();
-  // TODO(jmesserly): should be adding the full stylesheet here
-  Dom.addStyle('''
-      .story-content {
-        -webkit-column-width: 300px;
-        -webkit-column-gap: 26px; /* 2em */
-      }''');
-
-  getStoryNode() => swarm.frontView.storyView.node;
-
-  getView(Section section) {
-    return CollectionUtils.find(
-        swarm.frontView.sections.childViews, (view) => view.section == section);
-  }
-
-  getHistory(Article article) {
-    final feed = article.dataSource;
-    return {
-      'section': CollectionUtils
-          .find(swarm.sections, (s) => s.feeds.indexOf(feed, 0) >= 0)
-          .id,
-      'feed': feed.id,
-      'article': article.id
-    };
-  }
-
-  test('BackButton', () {
-    _serialInvokeAsync([
-      () {
-        Expect.equals(null, swarm.frontView.storyView); // verify initial state
-
-        // Make sure we've transitioned to the section
-        // In the real app, this isn't needed because ConveyorView fires the
-        // transition end event before we can click a story.
-        SectionView section = getView(swarm.sections[0]);
-        section.showSources();
-      },
-      () {
-        final item = swarm.sections[0].feeds[2].articles[1];
-        state.loadFromHistory(getHistory(item));
-
-        Expect.equals(item, state.currentArticle.value);
-
-        Expect.isFalse(getStoryNode().classes.contains(CSS.HIDDEN_STORY));
-
-        state.loadFromHistory({});
-
-        Expect.equals(null, state.currentArticle.value);
-        Expect.isTrue(getStoryNode().classes.contains(CSS.HIDDEN_STORY));
-      }
-    ]);
-  });
-
-  test('StoryView', () {
-    state.clearHistory();
-
-    Expect.isTrue(getStoryNode().classes.contains(CSS.HIDDEN_STORY));
-
-    final dataSourceView =
-        swarm.frontView.currentSection.dataSourceView.getSubview(0);
-    final itemView = dataSourceView.itemsView.getSubview(0);
-    // TODO(jacobr): remove  this null check. This is likely due to tests
-    // running without the correct CSS to size the window so that some items
-    // are visible.
-    if (itemView != null) {
-      click(itemView.node);
-      state.expectHistory([getHistory(itemView.item)]);
-    }
-  });
-
-  test('SliderMenu', () {
-    Expect.equals(getView(swarm.sections[0]), swarm.frontView.currentSection);
-
-    // Find the first slider menu item, and click on the one next after it.
-    click(document.querySelectorAll('.${CSS.SM_ITEM}')[1]);
-
-    Expect.equals(getView(swarm.sections[1]), swarm.frontView.currentSection);
-
-    // Find the first menu item again and click on it.
-    click(document.querySelector('.${CSS.SM_ITEM}'));
-
-    Expect.equals(getView(swarm.sections[0]), swarm.frontView.currentSection);
-  });
-}
-
-/** Triggers the click event, like [http://api.jquery.com/click/] */
-click(Element element) {
-  // TODO(rnystrom): This should be on the DOM API somewhere.
-  MouseEvent event = new MouseEvent('click');
-  element.dispatchEvent(event);
-}
-
-/** A proxy so we can intercept history calls */
-class UIStateProxy extends SwarmState {
-  List<Map<String, String>> history;
-
-  UIStateProxy(Sections dataModel) : super(dataModel) {
-    clearHistory();
-  }
-
-  void pushToHistory() {
-    history.add(toHistory());
-    super.pushToHistory();
-  }
-
-  void clearHistory() {
-    history = new List<Map<String, String>>();
-  }
-
-  void expectHistory(List<Map<String, String>> entries) {
-    Expect.equals(entries.length, history.length);
-    for (int i = 0; i < entries.length; i++) {
-      Map e = entries[i];
-      Map h = history[i];
-      Expect.equals(e['article'], h['article']);
-    }
-    clearHistory();
-  }
-}
-
-void _serialInvokeAsync(List closures) {
-  final length = closures.length;
-  if (length > 0) {
-    int i = 0;
-    void invokeNext() {
-      closures[i]();
-      i++;
-      if (i < length) {
-        Timer.run(expectAsync(invokeNext));
-      }
-    }
-
-    Timer.run(expectAsync(invokeNext));
-  }
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/layout/css.dart b/samples-dev/swarm/test/swarm_ui_lib/layout/css.dart
deleted file mode 100644
index e066463..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/layout/css.dart
+++ /dev/null
@@ -1,351 +0,0 @@
-// File generated by Dart CSS from source file layout.scss
-// Do not edit.
-
-part of layout_tests;
-
-class AdaptiveLayout {
-  // selector, properties<propertyName, value>
-  static const selectors = const {
-    '#grid': const {
-      'display': '-dart-grid',
-      'grid-columns': 'auto minmax(min-content, 1fr)',
-      'grid-rows': 'auto minmax(min-content, 1fr) auto',
-    },
-    '#title': const {
-      'grid-column': '1',
-      'grid-row': '1',
-    },
-    '#score': const {
-      'grid-column': '1',
-      'grid-row': '3',
-    },
-    '#stats': const {
-      'grid-column': '1',
-      'grid-row': '2',
-      'grid-row-align': 'start',
-    },
-    '#board': const {
-      'grid-column': '2',
-      'grid-row': '1',
-      'grid-row-span': '2',
-    },
-    '#controls': const {
-      'grid-column': '2',
-      'grid-row': '3',
-      'grid-column-align': 'center',
-    },
-  };
-}
-
-class SourceIndependencePortrait {
-  // selector, properties<propertyName, value>
-  static const selectors = const {
-    '#grid': const {
-      'display': '-dart-grid',
-      'grid-template': '"ta" "sa" "bb" "cc"',
-      'grid-columns': 'auto minmax(min-content, 1fr)',
-      'grid-rows': 'auto auto minmax(min-content, 1fr) auto',
-    },
-    '#title': const {
-      'grid-cell': '"t"',
-    },
-    '#score': const {
-      'grid-cell': '"s"',
-    },
-    '#stats': const {
-      'grid-cell': '"a"',
-    },
-    '#board': const {
-      'grid-cell': '"b"',
-    },
-    '#controls': const {
-      'grid-cell': '"c"',
-    },
-  };
-}
-
-class SourceIndependenceLandscape {
-  // selector, properties<propertyName, value>
-  static const selectors = const {
-    '#grid': const {
-      'display': '-dart-grid',
-      'grid-template': '"tb" "ab" "sc"',
-      'grid-columns': 'auto minmax(min-content, 1fr)',
-      'grid-rows': 'auto minmax(min-content, 1fr) auto',
-    },
-    '#title': const {
-      'grid-cell': '"t"',
-    },
-    '#score': const {
-      'grid-cell': '"s"',
-    },
-    '#stats': const {
-      'grid-cell': '"a"',
-    },
-    '#board': const {
-      'grid-cell': '"b"',
-    },
-    '#controls': const {
-      'grid-cell': '"c"',
-    },
-  };
-}
-
-class GridLayering {
-  // selector, properties<propertyName, value>
-  static const selectors = const {
-    '#grid': const {
-      'display': '-dart-grid',
-      'grid-columns':
-          '"start" auto "track-start" 0.5fr "thumb-start" auto "fill-split" auto "thumb-end" 0.5fr "track-end" auto "end"',
-    },
-    '#lower-label': const {
-      'grid-column': '"start"',
-    },
-    '#track': const {
-      'grid-column': '"track-start" "track-end"',
-      'grid-row-align': 'center',
-    },
-    '#upper-label': const {
-      'grid-column': '"track-end"',
-    },
-    '#lower-fill': const {
-      'grid-column': '"track-start" "fill-split"',
-      'grid-row-align': 'center',
-      'grid-layer': '5',
-    },
-    '#upper-fill': const {
-      'grid-column': '"fill-split" "track-end"',
-      'grid-row-align': 'center',
-      'grid-layer': '5',
-    },
-    '#thumb': const {
-      'grid-column': '"thumb-start" "thumb-end"',
-      'grid-layer': '10',
-    },
-  };
-}
-
-class GridLines_5 {
-  // selector, properties<propertyName, value>
-  static const selectors = const {
-    '#grid': const {
-      'display': '-dart-grid',
-      'grid-columns': '150px 1fr',
-      'grid-rows': '50px 1fr 50px',
-    },
-    '#item1': const {
-      'grid-column': '2',
-      'grid-row': '1 4',
-    },
-  };
-}
-
-class GridLines_6 {
-  // selector, properties<propertyName, value>
-  static const selectors = const {
-    '#grid': const {
-      'display': '-dart-grid',
-      'grid-columns': '150px "item1-start" 1fr "item1-end"',
-      'grid-rows': '"item1-start" 50px 1fr 50px "item1-end"',
-    },
-    '#item1': const {
-      'grid-column': '"item1-start" "item1-end"',
-      'grid-row': '"item1-start" "item1-end"',
-    },
-  };
-}
-
-class GridCells {
-  // selector, properties<propertyName, value>
-  static const selectors = const {
-    '#grid': const {
-      'display': '-dart-grid',
-      'grid-template': '"ad" "bd" "cd"',
-      'grid-columns': '150px 1fr',
-      'grid-rows': '50px 1fr 50px',
-    },
-    '#item2': const {
-      'grid-cell': '"b"',
-      'grid-row-align': 'start',
-    },
-    '#item3': const {
-      'grid-cell': '"b"',
-      'grid-column-align': 'end',
-      'grid-row-align': 'end',
-    },
-  };
-}
-
-class StartEndingGridlines11a {
-  // selector, properties<propertyName, value>
-  static const selectors = const {
-    '#grid': const {
-      'display': '-dart-grid',
-      'grid-columns': '50px 1fr',
-      'grid-rows': '"first" 250px 1fr 250px "last"',
-    },
-    '#item': const {
-      'grid-column': '1 3',
-      'grid-row': '"first" "last"',
-    },
-  };
-}
-
-class StartEndingGridlines11b {
-  // selector, properties<propertyName, value>
-  static const selectors = const {
-    '#grid': const {
-      'display': '-dart-grid',
-      'grid-columns': '50px 1fr',
-      'grid-rows': '"first" 250px 1fr 250px "last"',
-    },
-    '#item': const {
-      'grid-column': 'start end',
-      'grid-row': 'start end',
-    },
-  };
-}
-
-class RepeatingColumnsRows {
-  // selector, properties<propertyName, value>
-  static const selectors = const {
-    '#grid': const {
-      'display': '-dart-grid',
-      'grid-columns': '10px ("content" 1fr 10px) [4]',
-      'grid-rows': '1fr',
-    },
-    '#col2': const {
-      'grid-column': '2',
-    },
-    '#col4': const {
-      'grid-column': '4',
-    },
-    '#col6': const {
-      'grid-column': '6',
-    },
-    '#col8': const {
-      'grid-column': '8',
-    },
-  };
-}
-
-class AnonymousGridCells {
-  // selector, properties<propertyName, value>
-  static const selectors = const {
-    '#grid': const {
-      'display': '-dart-grid',
-      'grid-rows': '"header" auto "main" 1fr "footer" auto',
-      'grid-columns': '1fr',
-    },
-    '#header': const {
-      'grid-row': '"header"',
-      'grid-column': 'start',
-    },
-    '#main': const {
-      'grid-row': '"main"',
-      'grid-column': 'start',
-    },
-    '#footer': const {
-      'grid-row': '"footer"',
-      'grid-column': 'start',
-    },
-  };
-}
-
-class ImplicitColumnsRows {
-  // selector, properties<propertyName, value>
-  static const selectors = const {
-    '#grid': const {
-      'display': '-dart-grid',
-      'grid-columns': '20px',
-      'grid-rows': '20px',
-    },
-    '#A': const {
-      'grid-column': '1',
-      'grid-row': '1',
-      'grid-column-align': 'start',
-      'grid-row-align': 'start',
-    },
-    '#B': const {
-      'grid-column': '5',
-      'grid-row': '1',
-      'grid-row-span': '2',
-    },
-    '#C': const {
-      'grid-column': '1',
-      'grid-row': '2',
-      'grid-column-span': '2',
-    },
-  };
-}
-
-class AlignGridItems {
-  // selector, properties<propertyName, value>
-  static const selectors = const {
-    '#grid': const {
-      'display': '-dart-grid',
-      'grid-columns': '1fr 1fr',
-      'grid-rows': '1fr 1fr',
-    },
-    '#A': const {
-      'grid-column': '1',
-      'grid-row': '1',
-      'grid-column-align': 'start',
-      'grid-row-align': 'start',
-    },
-    '#B': const {
-      'grid-column': '2',
-      'grid-row': '2',
-      'grid-column-align': 'end',
-      'grid-row-align': 'end',
-    },
-  };
-}
-
-class DrawOrderGridItems {
-  // selector, properties<propertyName, value>
-  static const selectors = const {
-    '#grid': const {
-      'display': '-dart-grid',
-      'grid-columns': '1fr 1fr',
-      'grid-rows': '1fr 1fr',
-    },
-    '#A': const {
-      'grid-column': '1',
-      'grid-row': '2',
-      'grid-column-span': '2',
-      'grid-row-align': 'end',
-    },
-    '#B': const {
-      'grid-column': '1',
-      'grid-row': '1',
-      'grid-layer': '10',
-    },
-    '#C': const {
-      'grid-column': '2',
-      'grid-row': '1',
-      'grid-row-align': 'start',
-      'margin-left': '-20px',
-    },
-    '#D': const {
-      'grid-column': '2',
-      'grid-row': '2',
-      'grid-column-align': 'end',
-      'grid-row-align': 'start',
-    },
-    '#E': const {
-      'grid-column': '1',
-      'grid-row': '1',
-      'grid-column-span': '2',
-      'grid-row-span': '2',
-      'grid-layer': '5',
-      'grid-column-align': 'center',
-      'grid-row-align': 'center',
-    },
-  };
-}
-
-class CSS {
-  // CSS class selectors:
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/layout/grid_examples.dart b/samples-dev/swarm/test/swarm_ui_lib/layout/grid_examples.dart
deleted file mode 100644
index 3db78c7..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/layout/grid_examples.dart
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for 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 layout_tests;
-
-/**
- * The examples from the spec: [http://dev.w3.org/csswg/css3-grid-align/]
- */
-// I've omitted examples that are subsumed by other examples, or examples
-// that illustrate features (such as grid-flow) that are currently
-// unsupported.
-class GridExamples {
-  // Note: controls is positioned in row 3 in the example. Might be a bug in
-  // the example, or they're using flow.
-  // TODO(jmesserly): also needed to set "display: inline-block" to get
-  // horizontal content sizing to work.
-  static const styles = const {
-    '1 Adaptive Layouts': AdaptiveLayout.selectors,
-    '2a Source Independence: Portrait': SourceIndependencePortrait.selectors,
-    '2b Source Independence: Landscape': SourceIndependenceLandscape.selectors,
-    '3 Grid Layering of Elements': GridLayering.selectors,
-    '5 Grid Lines': GridLines_5.selectors,
-    '6 Grid Lines': GridLines_6.selectors,
-    '7 Grid Cells': GridCells.selectors,
-    '11a Starting and Ending Grid Lines': StartEndingGridlines11a.selectors,
-    '11b Starting and Ending Grid Lines': StartEndingGridlines11b.selectors,
-    '12 Repeating Columns and Rows': RepeatingColumnsRows.selectors,
-    '17 Anonymous Grid Cells': AnonymousGridCells.selectors,
-    '20 Implicit Columns and Rows': ImplicitColumnsRows.selectors,
-    '22 Grid Item Alignment': AlignGridItems.selectors,
-    '23 Drawing Order of Grid Items': DrawOrderGridItems.selectors
-  };
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/layout/grid_layout_demo.dart b/samples-dev/swarm/test/swarm_ui_lib/layout/grid_layout_demo.dart
deleted file mode 100644
index e12f234..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/layout/grid_layout_demo.dart
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for 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 layout_tests;
-
-/**
- * An app for testing the grid layout system.
- */
-
-/** Creates a grid view structure given the CSS styles. */
-View createGrid(Map<String, Map<String, String>> styles) {
-  final gridStyle = styles['#grid'];
-
-  final children = new List<MockView>();
-  for (final String id in styles.keys) {
-    // All selectors in this test are id selectors string the # prefix.
-    assert(id.startsWith('#'));
-    String elemId = id.substring(1);
-    if (elemId != 'grid') {
-      children.add(new MockView(elemId, styles[id]));
-    }
-  }
-
-  return new MockCompositeView('grid', gridStyle, children);
-}
-
-void _onLoad() {
-  var query = SwarmUri.parsequerySelector(window.location.search)['q'];
-  if (query != null && query.length == 1) {
-    query = SwarmUri.decodeComponent(query[0]);
-    addGridStyles('100%', '100%', 'margin:0px;');
-    final view = createGrid(GridExamples.styles[query]);
-    view.addToDocument(document.body);
-    _addColorStyles();
-    printMetrics(query);
-  } else {
-    final html = new StringBuffer();
-    for (String ex in GridExamples.styles.keys) {
-      html.write('<div><a href="?q=$ex">Grid Example $ex</a></div>');
-    }
-    document.body.innerHtml = html.toString();
-  }
-}
-
-void addGridStyles(String width, String height, [String margin = '']) {
-  // Use monospace font and fixed line-height so the text size is predictable.
-  // TODO(jmesserly): only tested on Chromium Mac/Linux
-  Dom.addStyle('''
-    body { $margin }
-    #grid {
-      position: absolute;
-      width: $width;
-      height: $height;
-      border-color: black;
-    }
-    .grid-item {
-      border: solid 2px;
-      border-radius: 8px;
-      font-family:monospace;
-      font-size:16px;
-      line-height:20px;
-    }
-    ''');
-}
-
-void _addColorStyles() {
-  final grid = document.body.querySelector('#grid');
-  final colors = const [
-    'darkred',
-    'darkorange',
-    'darkgoldenrod',
-    'darkgreen',
-    'darkblue',
-    'darkviolet'
-  ];
-  int c = 0;
-  var node = grid.children[0];
-  while (node != null) {
-    if (node.id != '') {
-      node.style.cssText += "color:" + colors[c++];
-    }
-    node = node.nextElementSibling;
-  }
-}
-
-class MockCompositeView extends CompositeView {
-  MockCompositeView(String id, Map styles, List childViews) : super('') {
-    node.id = id;
-    CollectionUtils.copyMap(customStyle, styles);
-
-    for (final v in childViews) {
-      addChild(v);
-    }
-  }
-}
-
-class MockView extends View {
-  MockView(String id, Map styles)
-      : super.fromNode(
-            new Element.html('<div class="grid-item">MockView-$id</div>')) {
-    node.id = id;
-    CollectionUtils.copyMap(customStyle, styles);
-    // TODO(jmesserly): this is needed to get horizontal content-sizing to work
-    node.style.display = 'inline-block';
-  }
-}
-
-void printMetrics(String example) {
-  final node = document.body.querySelector('#grid');
-  String exampleId = example.split(' ')[0];
-  final sb = new StringBuffer();
-  sb.write("test('Spec Example $exampleId', () {\n");
-  sb.write("  verifyExample('$example', {\n");
-  final children = node.children;
-
-  scheduleMicrotask(() {
-    for (int i = 0; i < children.length; i++) {
-      _appendMetrics(sb, children[i], '    ');
-    }
-    sb.write('  });\n');
-    sb.write('});\n\n');
-    window.console.log(sb.toString());
-  });
-}
-
-void _appendMetrics(StringBuffer sb, Element node, [String indent = '']) {
-  String id = node.id;
-  num left = node.offsetLeft, top = node.offsetTop;
-  num width = node.offsetWidth, height = node.offsetHeight;
-  sb.write("${indent}'$id': [$left, $top, $width, $height],\n");
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/layout/grid_layout_demo.html b/samples-dev/swarm/test/swarm_ui_lib/layout/grid_layout_demo.html
deleted file mode 100644
index 6d199ec..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/layout/grid_layout_demo.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>Grid Layout Demos</title>
-    <style type="text/css">
-    </style>
-    <script type="application/dart" src="grid_layout_demo.dart"></script>
-  </head>
-  <body>
-   <script src="http://dart.googlecode.com/svn/branches/bleeding_edge/dart/client/dart.js"></script>
-  </body>
-</html>
diff --git a/samples-dev/swarm/test/swarm_ui_lib/layout/layout.css b/samples-dev/swarm/test/swarm_ui_lib/layout/layout.css
deleted file mode 100644
index cc4296e..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/layout/layout.css
+++ /dev/null
@@ -1,18 +0,0 @@
-/* File generated by SCSS from source layout.scss
- * Do not edit.
- */
-
-/* @stylet export as AdaptiveLayout */
-/* @stylet export as SourceIndependencePortrait */
-/* @stylet export as SourceIndependenceLandscape */
-/* @stylet export as GridLayering */
-/* @stylet export as GridLines_5 */
-/* @stylet export as GridLines_6 */
-/* @stylet export as GridCells */
-/* @stylet export as StartEndingGridlines11a */
-/* @stylet export as StartEndingGridlines11b */
-/* @stylet export as RepeatingColumnsRows */
-/* @stylet export as AnonymousGridCells */
-/* @stylet export as ImplicitColumnsRows */
-/* @stylet export as AlignGridItems */
-/* @stylet export as DrawOrderGridItems */
diff --git a/samples-dev/swarm/test/swarm_ui_lib/layout/layout.scss b/samples-dev/swarm/test/swarm_ui_lib/layout/layout.scss
deleted file mode 100644
index 2bff753..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/layout/layout.scss
+++ /dev/null
@@ -1,316 +0,0 @@
-/* Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file */
-/* for details. All rights reserved. Use of this source code is governed by a */
-/* BSD-style license that can be found in the LICENSE file. */
-
-@stylet AdaptiveLayout {
-  #grid {
-    display: -dart-grid;
-    grid-columns: auto minmax(min-content, 1fr);
-    grid-rows: auto minmax(min-content, 1fr) auto;
-  }
-  #title {
-    grid-column: 1;
-    grid-row: 1;
-  }
-  #score {
-    grid-column: 1;
-    grid-row: 3;
-  }
-  #stats {
-    grid-column: 1;
-    grid-row: 2;
-    grid-row-align: start;
-  }
-  #board {
-    grid-column: 2;
-    grid-row: 1;
-    grid-row-span: 2;
-  }
-  #controls {
-    grid-column: 2;
-    grid-row: 3;
-    grid-column-align: center;
-  }
-}
-
-@stylet SourceIndependencePortrait {
-  #grid {
-    display: -dart-grid;
-    grid-template: "ta"
-                   "sa"
-                   "bb"
-                   "cc";
-    grid-columns: auto minmax(min-content, 1fr);
-    grid-rows: auto auto minmax(min-content, 1fr) auto;
-  }
-  #title {
-    grid-cell: "t";
-  }
-  #score {
-    grid-cell: "s";
-  }
-  #stats {
-    grid-cell: "a";
-  }
-  #board {
-    grid-cell: "b";
-  }
-  #controls {
-    grid-cell: "c";
-  }
-}
-
-@stylet SourceIndependenceLandscape {
-  #grid {
-    display: -dart-grid;
-    grid-template: "tb"
-                   "ab"
-                   "sc";
-    grid-columns: auto minmax(min-content, 1fr);
-    grid-rows: auto minmax(min-content, 1fr) auto;
-  }
-  #title {
-    grid-cell: "t";
-  }
-  #score {
-    grid-cell: "s";
-  }
-  #stats {
-    grid-cell: "a";
-  }
-  #board {
-    grid-cell: "b";
-  }
-  #controls {
-    grid-cell: "c";
-  }
-}
-
-@stylet GridLayering {
-  #grid {
-    display: -dart-grid;
-    grid-columns: "start"        auto
-                  "track-start"  0.5fr
-                  "thumb-start"  auto
-                  "fill-split"   auto
-                  "thumb-end"    0.5fr
-                  "track-end"    auto
-                  "end";
-  }
-  #lower-label {
-    grid-column: "start";
-  }
-  #track {
-    grid-column: "track-start" "track-end";
-    grid-row-align: center;
-  }
-  #upper-label {
-    grid-column: "track-end";
-  }
-  #lower-fill {
-    grid-column: "track-start" "fill-split";
-    grid-row-align: center; grid-layer: 5;
-  }
-  #upper-fill {
-    grid-column: "fill-split" "track-end";
-    grid-row-align: center;
-    grid-layer: 5;
-  }
-  #thumb {
-    grid-column: "thumb-start" "thumb-end";
-    grid-layer: 10;
-  }
-}
-
-@stylet GridLines_5 {
-  #grid {
-    display: -dart-grid;
-    grid-columns: 150px 1fr;
-    grid-rows: 50px 1fr 50px;
-  }
-  #item1 {
-    grid-column: 2;
-    grid-row: 1 4;
-  }
-}
-
-@stylet GridLines_6 {
-  #grid {
-    display: -dart-grid;
-    grid-columns: 150px "item1-start" 1fr "item1-end";
-    grid-rows: "item1-start" 50px 1fr 50px "item1-end";
-  }
-
-  #item1 {
-    grid-column: "item1-start" "item1-end";
-    grid-row: "item1-start" "item1-end";
-  }
-}
-
-@stylet GridCells {
-  #grid  {
-    display: -dart-grid;
-    grid-template: "ad"
-                   "bd"
-                   "cd";
-    grid-columns: 150px 1fr;
-    grid-rows: 50px 1fr 50px;
-  }
-  #item2 {
-    grid-cell: "b";
-    grid-row-align: start;
-  }
-  #item3 {
-    grid-cell: "b";
-    grid-column-align: end;
-    grid-row-align: end;
-  }
-}
-
-@stylet StartEndingGridlines11a {
-  #grid {
-    display: -dart-grid;
-    grid-columns: 50px 1fr;
-    grid-rows: "first" 250px 1fr 250px "last";
-  }
-  #item {
-    grid-column:1 3;
-    grid-row: "first" "last";
-  }
-}
-
-@stylet StartEndingGridlines11b {
-  #grid {
-    display: -dart-grid;
-    grid-columns: 50px 1fr;
-    grid-rows: "first" 250px 1fr 250px "last";
-  }
-  #item {
-    grid-column: start end;
-    grid-row: start end;
-  }
-}
-
-@stylet RepeatingColumnsRows {
-  #grid {
-    display: -dart-grid;
-    grid-columns: 10px ("content" 1fr 10px)[4];
-    grid-rows: 1fr;
-  }
-  #col2 {
-    grid-column: 2;
-  }
-  #col4 {
-    grid-column: 4;
-  }
-  #col6 {
-    grid-column: 6;
-  }
-  #col8 {
-    grid-column: 8;
-  }
-}
-
-@stylet AnonymousGridCells {
-  #grid {
-    display: -dart-grid;
-    grid-rows: "header" auto "main" 1fr "footer" auto;
-    grid-columns: 1fr;
-  }
-  #header {
-    grid-row: "header";
-    grid-column: start;
-  }
-  #main {
-    grid-row: "main";
-    grid-column: start;
-  }
-  #footer {
-    grid-row: "footer";
-    grid-column: start;
-  }
-}
-
-@stylet ImplicitColumnsRows {
-  #grid {
-    display: -dart-grid;
-    grid-columns: 20px;
-    grid-rows: 20px;
-  }
-  #A {
-    grid-column: 1;
-    grid-row: 1;
-    grid-column-align: start;
-    grid-row-align: start;
-  }
-  #B {
-    grid-column: 5;
-    grid-row: 1;
-    grid-row-span: 2;
-  }
-  #C {
-    grid-column: 1;
-    grid-row: 2;
-    grid-column-span: 2;
-  }
-}
-
-@stylet AlignGridItems {
-  #grid {
-    display: -dart-grid;
-    grid-columns: 1fr 1fr;
-    grid-rows: 1fr 1fr;
-   }
-  #A {
-    grid-column: 1;
-    grid-row: 1;
-    grid-column-align: start;
-    grid-row-align: start;
-  }
-  #B {
-    grid-column: 2;
-    grid-row: 2;
-    grid-column-align: end;
-    grid-row-align: end;
-  }
-}
-
-@stylet DrawOrderGridItems {
-  #grid {
-    display: -dart-grid;
-    grid-columns: 1fr 1fr;
-    grid-rows: 1fr 1fr;
-  }
-  #A {
-    grid-column: 1;
-    grid-row: 2;
-    grid-column-span: 2;
-    grid-row-align: end;
-  }
-  #B {
-    grid-column: 1;
-    grid-row: 1;
-    grid-layer: 10;
-  }
-  #C {
-    grid-column: 2;
-    grid-row: 1;
-    grid-row-align: start;
-    margin-left: -20px;
-  }
-  #D {
-    grid-column: 2;
-    grid-row: 2;
-    grid-column-align: end;
-    grid-row-align: start;
-  }
-  #E {
-    grid-column: 1; grid-row: 1;
-    grid-column-span: 2;
-    grid-row-span: 2;
-    grid-layer: 5;
-    grid-column-align: center;
-    grid-row-align: center;
-  }
- }
- 
\ No newline at end of file
diff --git a/samples-dev/swarm/test/swarm_ui_lib/layout/layout_test.dart b/samples-dev/swarm/test/swarm_ui_lib/layout/layout_test.dart
deleted file mode 100644
index 4b1cf60..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/layout/layout_test.dart
+++ /dev/null
@@ -1,193 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for 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 layout_tests;
-
-import 'package:expect/expect.dart';
-import 'dart:async';
-import 'dart:html';
-import '../../../swarm_ui_lib/base/base.dart';
-import '../../../swarm_ui_lib/layout/layout.dart';
-import '../../../swarm_ui_lib/view/view.dart';
-import '../../../swarm_ui_lib/util/utilslib.dart';
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
-
-part 'grid_layout_demo.dart';
-part 'grid_examples.dart';
-part 'css.dart';
-
-// TODO(jmesserly): these tests would be easier to work with if they were WebKit
-// layout tests. The way content shell works is exactly what we want for
-// testing layout: run the example and then print the element tree with metrics.
-// The UnitTestSuite wrapper gets in our way here, because you can't "see" the
-// test layout visually when you're debugging.
-// See these links for more info:
-//   http://www.webkit.org/quality/testwriting.html
-//   http://www.w3.org/Style/CSS/Test/guidelines.html
-
-// TODO(jmesserly): need parser unit tests, especially error conditions
-
-/**
- * Tests the grid layout. Currently based on examples from the spec at:
- * [http://dev.w3.org/csswg/css3-grid-align/]
- */
-main() {
-  useHtmlConfiguration();
-  addGridStyles('400px', '400px');
-
-  test('Spec Example 1', () {
-    return verifyExample('1 Adaptive Layouts', {
-      'title': [0, 0, 144, 24],
-      'score': [0, 376, 144, 24],
-      'stats': [0, 24, 144, 24],
-      'board': [144, 0, 256, 376],
-      'controls': [185, 376, 174, 24],
-    });
-  });
-
-  test('Spec Example 2a', () {
-    return verifyExample('2a Source Independence: Portrait', {
-      'title': [0, 0, 144, 24],
-      'score': [0, 24, 144, 24],
-      'stats': [144, 0, 256, 48],
-      'board': [0, 48, 400, 328],
-      'controls': [0, 376, 400, 24],
-    });
-  });
-
-  test('Spec Example 2b', () {
-    return verifyExample('2b Source Independence: Landscape', {
-      'title': [0, 0, 144, 24],
-      'score': [0, 376, 144, 24],
-      'stats': [0, 24, 144, 352],
-      'board': [144, 0, 256, 376],
-      'controls': [144, 376, 256, 24],
-    });
-  });
-
-  // Not currently supported, issue with
-  // http://dev.w3.org/csswg/css3-grid-layout/#function-CalculateNormalizedFractionBreadth
-  //test('Spec Example 3', () {
-  //  return verifyExample('3 Grid Layering of Elements', {
-  //    'lower-label': [0, 0, 204, 24],
-  //    'track': [204, 0, 144, 24],
-  //    'upper-label': [348, 0, 204, 24],
-  //    'lower-fill': [204, 0, 72, 24],
-  //    'upper-fill': [276, 0, 72, 24],
-  //    'thumb': [204, 0, 144, 24],
-  //  });
-  //});
-
-  test('Spec Example 5', () {
-    return verifyExample('5 Grid Lines', {
-      'item1': [125, 0, 275, 400],
-    });
-  });
-
-  test('Spec Example 6', () {
-    return verifyExample('6 Grid Lines', {
-      'item1': [125, 0, 275, 400],
-    });
-  });
-
-  test('Spec Example 7', () {
-    return verifyExample('7 Grid Cells', {
-      'item2': [0, 50, 125, 24],
-      'item3': [-19, 326, 144, 24],
-    });
-  });
-
-  test('Spec Example 11a', () {
-    return verifyExample('11a Starting and Ending Grid Lines', {
-      'item': [0, 0, 400, 400],
-    });
-  });
-
-  test('Spec Example 11b', () {
-    return verifyExample('11b Starting and Ending Grid Lines', {
-      'item': [0, 0, 400, 400],
-    });
-  });
-
-  test('Spec Example 12', () {
-    return verifyExample('12 Repeating Columns and Rows', {
-      'col2': [10, 0, 88, 400],
-      'col4': [108, 0, 87, 400],
-      'col6': [205, 0, 88, 400],
-      'col8': [303, 0, 87, 400],
-    });
-  });
-
-  test('Spec Example 17', () {
-    return verifyExample('17 Anonymous Grid Cells', {
-      'header': [0, 0, 400, 24],
-      'main': [0, 24, 400, 352],
-      'footer': [0, 376, 400, 24],
-    });
-  });
-
-  // Not currently supported, issue with
-  // http://dev.w3.org/csswg/css3-grid-layout/#function-CalculateNormalizedFractionBreadth
-  //test('Spec Example 20', () {
-  //  return verifyExample('20 Implicit Columns and Rows', {
-  //    'A': [0, 0, 104, 24],
-  //    'B': [104, 0, 104, 44],
-  //    'C': [0, 20, 104, 24],
-  //  });
-  //});
-
-  test('Spec Example 22', () {
-    return verifyExample('22 Grid Item Alignment', {
-      'A': [0, 0, 104, 24],
-      'B': [296, 376, 104, 24],
-    });
-  });
-
-  test('Spec Example 23', () {
-    return verifyExample('23 Drawing Order of Grid Items', {
-      'A': [0, 376, 400, 24],
-      'B': [0, 0, 200, 200],
-      'C': [200, 0, 200, 24],
-      'D': [296, 200, 104, 24],
-      'E': [148, 188, 104, 24],
-    });
-  });
-}
-
-// Note: to debug failures, best bet is to use GridLayoutDemo to run an
-// individual asyncTest and see the resulting layout.
-
-Future usingGrid(String example, Future test_(View grid)) {
-  final grid = createGrid(GridExamples.styles[example]);
-  grid.addToDocument(document.body);
-  return new Future.delayed(new Duration()).then((_) {
-    return test_(grid);
-  }).then((_) {
-    grid.removeFromDocument();
-  });
-}
-
-Future verifyGrid(String example, [Map expected = null]) {
-  printMetrics(example);
-  if (expected == null) {
-    return new Future.value();
-  }
-
-  for (String name in expected.keys) {
-    final values = expected[name];
-    final node = document.body.querySelector('#$name');
-    Expect.isNotNull(node);
-    return new Future.value().then((_) {
-      Expect.equals(values[0], node.offsetLeft);
-      Expect.equals(values[1], node.offsetTop);
-      Expect.equals(values[2], node.offsetWidth);
-      Expect.equals(values[3], node.offsetHeight);
-    });
-  }
-}
-
-Future verifyExample(String example, [Map expected = null]) {
-  return usingGrid(example, (grid) => verifyGrid(example, expected));
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/observable/abstract_observable_tests.dart b/samples-dev/swarm/test/swarm_ui_lib/observable/abstract_observable_tests.dart
deleted file mode 100644
index 49c8e85..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/observable/abstract_observable_tests.dart
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for 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 observable_tests;
-
-testAbstractObservable() {
-  group('addChangeListener()', () {
-    test('adding the same listener twice returns false the second time', () {
-      final target = new AbstractObservable();
-      final listener = (e) {};
-
-      expect(target.addChangeListener(listener), isTrue);
-      expect(target.addChangeListener(listener), isFalse);
-    });
-
-    test('modifies listeners list', () {
-      // check that add/remove works, see contents of listeners too
-      final target = new AbstractObservable();
-      final l1 = (e) {};
-      final l2 = (e) {};
-      final l3 = (e) {};
-      final l4 = (e) {};
-
-      expect(target.listeners, orderedEquals([]));
-
-      target.addChangeListener(l1);
-      expect(target.listeners, orderedEquals([l1]));
-
-      target.addChangeListener(l2);
-      expect(target.listeners, orderedEquals([l1, l2]));
-
-      target.addChangeListener(l3);
-      target.addChangeListener(l4);
-      expect(target.listeners, orderedEquals([l1, l2, l3, l4]));
-
-      target.removeChangeListener(l4);
-      expect(target.listeners, orderedEquals([l1, l2, l3]));
-
-      target.removeChangeListener(l2);
-      expect(target.listeners, orderedEquals([l1, l3]));
-
-      target.removeChangeListener(l1);
-      expect(target.listeners, orderedEquals([l3]));
-
-      target.removeChangeListener(l3);
-      expect(target.listeners, orderedEquals([]));
-    });
-  });
-
-  test('fires immediately if no batch', () {
-    // If no batch is created, a summary should be automatically created and
-    // fired on each property change.
-    final target = new AbstractObservable();
-    EventSummary res = null;
-    target.addChangeListener((summary) {
-      expect(res, isNull);
-      res = summary;
-      expect(res, isNotNull);
-    });
-
-    target.recordPropertyUpdate('pM', 10, 11);
-
-    expect(res, isNotNull);
-    expect(res.events, hasLength(1));
-    validateUpdate(res.events[0], target, 'pM', null, 10, 11);
-    res = null;
-
-    target.recordPropertyUpdate('pL', '11', '13');
-
-    expect(res, isNotNull);
-    expect(res.events, hasLength(1));
-    validateUpdate(res.events[0], target, 'pL', null, '11', '13');
-  });
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/observable/change_event_tests.dart b/samples-dev/swarm/test/swarm_ui_lib/observable/change_event_tests.dart
deleted file mode 100644
index 1819fb6..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/observable/change_event_tests.dart
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for 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 observable_tests;
-
-testChangeEvent() {
-  test('constructor', () {
-    // create property, list, global and check the proper initialization.
-    final target = new AbstractObservable();
-
-    validateUpdate(new ChangeEvent.property(target, 'pK', 33, '12'), target,
-        'pK', null, 33, '12');
-
-    validateUpdate(
-        new ChangeEvent.list(target, ChangeEvent.UPDATE, 3, 33, '12'),
-        target,
-        null,
-        3,
-        33,
-        '12');
-
-    validateInsert(
-        new ChangeEvent.list(target, ChangeEvent.INSERT, 3, 33, null),
-        target,
-        null,
-        3,
-        33);
-
-    validateRemove(
-        new ChangeEvent.list(target, ChangeEvent.REMOVE, 3, null, '12'),
-        target,
-        null,
-        3,
-        '12');
-
-    validateGlobal(
-        new ChangeEvent.list(target, ChangeEvent.GLOBAL, null, null, null),
-        target);
-  });
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/observable/event_batch_tests.dart b/samples-dev/swarm/test/swarm_ui_lib/observable/event_batch_tests.dart
deleted file mode 100644
index 0e7a7cc..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/observable/event_batch_tests.dart
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for 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 observable_tests;
-
-testEventBatch() {
-  test('EventBatch', () {
-    // check that all events are fired at the end. Use all record methods
-    // in abstract observable
-    final target = new AbstractObservable();
-    EventSummary res = null;
-    target.addChangeListener((summary) {
-      expect(res, isNull);
-      res = summary;
-      expect(res, isNotNull);
-    });
-
-    final f = EventBatch.wrap((e) {
-      target.recordPropertyUpdate('pM', 10, 11);
-      target.recordPropertyUpdate('pL', '11', '13');
-      target.recordListUpdate(2, 'a', 'b');
-      target.recordListInsert(5, 'a');
-      target.recordListRemove(4, 'c');
-      target.recordGlobalChange();
-    });
-
-    expect(res, isNull);
-    f(null);
-    expect(res, isNotNull);
-
-    expect(res.events, hasLength(6));
-    validateUpdate(res.events[0], target, 'pM', null, 10, 11);
-    validateUpdate(res.events[1], target, 'pL', null, '11', '13');
-    validateUpdate(res.events[2], target, null, 2, 'a', 'b');
-    validateInsert(res.events[3], target, null, 5, 'a');
-    validateRemove(res.events[4], target, null, 4, 'c');
-    validateGlobal(res.events[5], target);
-  });
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/observable/observable_list_tests.dart b/samples-dev/swarm/test/swarm_ui_lib/observable/observable_list_tests.dart
deleted file mode 100644
index aaffb92..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/observable/observable_list_tests.dart
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for 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 observable_tests;
-
-testObservableList() {
-  test('ObservableList', () {
-    final arr = new ObservableList<int>();
-
-    // Add some initial data before listening
-    arr.add(1);
-    arr.add(2);
-    arr.add(3);
-    arr.add(1);
-    arr.add(3);
-    arr.add(4);
-
-    expect(arr, orderedEquals([1, 2, 3, 1, 3, 4]));
-
-    // Add a listener that saves the events
-    EventSummary res = null;
-    arr.addChangeListener((summary) {
-      expect(res, isNull);
-      res = summary;
-      expect(res, isNotNull);
-    });
-
-    // execute some code with readonly operations only
-    expect(res, isNull);
-    bool called = false;
-    EventBatch.wrap((e) {
-      expect(arr, hasLength(6));
-      expect(arr[0], equals(1));
-      // TODO(sigmund): why we need write startIndex? it should be optional.
-      expect(arr.indexOf(4, 0), equals(5));
-      expect(arr.indexOf(1, 0), equals(0));
-      expect(arr.indexOf(1, 1), equals(3));
-      // TODO(rnystrom): Get rid of second arg when lastIndexOf has default.
-      expect(arr.lastIndexOf(1, arr.length - 1), equals(3));
-      expect(arr.last, equals(4));
-      final copy = new List<int>();
-      arr.forEach((i) {
-        copy.add(i);
-      });
-      expect(copy, orderedEquals([1, 2, 3, 1, 3, 4]));
-      called = true;
-    })(null);
-    expect(called, isTrue);
-    expect(res, isNull); // no change from read-only operators
-
-    // execute some code with mutations
-    expect(res, isNull);
-    called = false;
-    expect(arr, orderedEquals([1, 2, 3, 1, 3, 4]));
-    EventBatch.wrap((e) {
-      arr.add(5); // 1 2 3 1 3 4(5)
-      arr.add(6); // 1 2 3 1 3 4 5(6)
-      arr[1] = arr[arr.length - 1]; // 1(6)3 1 3 4 5 6
-      arr.add(7); // 1 6 3 1 3 4 5 6(7)
-      arr[5] = arr[8]; // 1 6 3 1 3(7)5 6 7
-      arr.add(42); // 1 6 3 1 3 7 5 6 7(42)
-      expect(arr.removeAt(3), equals(1)); // 1 6 3( )3 7 5 6 7 42
-      expect(arr.removeFirstElement(3), isTrue); // 1 6( )  3 7 5 6 7 42
-      expect(arr.removeLast(), equals(42)); // 1 6     3 7 5 6 7(  )
-      expect(arr.removeAllElements(6), equals(2)); // 1( )    3 7 5( )7
-      called = true;
-    })(null);
-    expect(called, isTrue);
-    expect(res, isNotNull);
-    expect(res.events, hasLength(11));
-    validateInsert(res.events[0], arr, null, 6, 5);
-    validateInsert(res.events[1], arr, null, 7, 6);
-    validateUpdate(res.events[2], arr, null, 1, 6, 2);
-    validateInsert(res.events[3], arr, null, 8, 7);
-    validateUpdate(res.events[4], arr, null, 5, 7, 4);
-    validateInsert(res.events[5], arr, null, 9, 42);
-    validateRemove(res.events[6], arr, null, 3, 1);
-    validateRemove(res.events[7], arr, null, 2, 3);
-    validateRemove(res.events[8], arr, null, 7, 42);
-    validateRemove(res.events[9], arr, null, 1, 6);
-    validateRemove(res.events[10], arr, null, 4, 6);
-    expect(arr, orderedEquals([1, 3, 7, 5, 7]));
-
-    res = null;
-    expect(res, isNull);
-    called = false;
-    // execute global mutations like sort and clear
-    EventBatch.wrap((e) {
-      arr.add(1);
-      arr.add(4);
-      arr.add(10);
-      arr.add(9);
-      arr.sort((int a, int b) {
-        return a - b;
-      });
-      called = true;
-    })(null);
-    expect(called, isTrue);
-    expect(res, isNotNull);
-    expect(res.events.length, equals(5));
-    validateInsert(res.events[0], arr, null, 5, 1);
-    validateInsert(res.events[1], arr, null, 6, 4);
-    validateInsert(res.events[2], arr, null, 7, 10);
-    validateInsert(res.events[3], arr, null, 8, 9);
-    validateGlobal(res.events[4], arr);
-    expect(arr, orderedEquals([1, 1, 3, 4, 5, 7, 7, 9, 10]));
-
-    res = null;
-    expect(res, isNull);
-    called = false;
-    EventBatch.wrap((e) {
-      arr.clear();
-      called = true;
-    })(null);
-    expect(called, isTrue);
-    expect(res, isNotNull);
-    expect(res.events, hasLength(1));
-    validateGlobal(res.events[0], arr);
-    expect(arr, orderedEquals([]));
-  });
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/observable/observable_test.dart b/samples-dev/swarm/test/swarm_ui_lib/observable/observable_test.dart
deleted file mode 100644
index 296ecbe..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/observable/observable_test.dart
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for 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 observable_tests;
-
-import '../../../swarm_ui_lib/observable/observable.dart';
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
-
-part 'abstract_observable_tests.dart';
-part 'change_event_tests.dart';
-part 'event_batch_tests.dart';
-part 'observable_list_tests.dart';
-part 'observable_value_tests.dart';
-
-void main() {
-  useHtmlConfiguration();
-  group('AbstractObservable', testAbstractObservable);
-  group('ChangeEvent', testChangeEvent);
-  group('EventBatch', testEventBatch);
-  group('ObservableList', testObservableList);
-  group('ObservableValue', testObservableValue);
-}
-
-void validateEvent(ChangeEvent e, target, pName, index, type, newVal, oldVal) {
-  expect(e.target, equals(target));
-  expect(e.propertyName, equals(pName));
-  expect(e.index, equals(index));
-  expect(e.type, equals(type));
-  expect(e.newValue, equals(newVal));
-  expect(e.oldValue, equals(oldVal));
-}
-
-void validateGlobal(ChangeEvent e, target) {
-  validateEvent(e, target, null, null, ChangeEvent.GLOBAL, null, null);
-}
-
-void validateInsert(ChangeEvent e, target, pName, index, newVal) {
-  validateEvent(e, target, pName, index, ChangeEvent.INSERT, newVal, null);
-}
-
-void validateRemove(ChangeEvent e, target, pName, index, oldVal) {
-  validateEvent(e, target, pName, index, ChangeEvent.REMOVE, null, oldVal);
-}
-
-void validateUpdate(ChangeEvent e, target, pName, index, newVal, oldVal) {
-  validateEvent(e, target, pName, index, ChangeEvent.UPDATE, newVal, oldVal);
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/observable/observable_value_tests.dart b/samples-dev/swarm/test/swarm_ui_lib/observable/observable_value_tests.dart
deleted file mode 100644
index 2ee55c1..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/observable/observable_value_tests.dart
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for 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 observable_tests;
-
-testObservableValue() {
-  test('ObservableValue', () {
-    final value = new ObservableValue<String>('initial');
-    expect(value.value, equals('initial'));
-
-    // Set value.
-    value.value = 'new';
-    expect(value.value, equals('new'));
-
-    // Change event is sent when value is changed.
-    EventSummary result = null;
-    value.addChangeListener((summary) {
-      expect(result, isNull);
-      result = summary;
-      expect(result, isNotNull);
-    });
-
-    value.value = 'newer';
-
-    expect(result, isNotNull);
-    expect(result.events.length, equals(1));
-    validateUpdate(result.events[0], value, 'value', null, 'newer', 'new');
-  });
-
-  test('does not raise event if unchanged', () {
-    final value = new ObservableValue<String>('foo');
-    expect(value.value, equals('foo'));
-
-    bool called = false;
-    value.addChangeListener((summary) {
-      called = true;
-    });
-
-    // Set it to the same value.
-    value.value = 'foo';
-
-    // Should not have gotten an event.
-    expect(called, isFalse);
-  });
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/touch/touch_test.dart b/samples-dev/swarm/test/swarm_ui_lib/touch/touch_test.dart
deleted file mode 100644
index 1bd3436..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/touch/touch_test.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for 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 touchTests;
-
-import 'dart:html'; // TODO(rnystrom): Only needed to tell architecture.py
-// that this is a web test. Come up with cleaner solution.
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
-import '../../../swarm_ui_lib/touch/touch.dart';
-
-main() {
-  useHtmlConfiguration();
-  test('Solver', () {
-    expect(Solver.solve((x) => x * x, 81, 10), closeTo(9, 0.1));
-    expect(Solver.solve((x) => x * x, 0, 10), closeTo(0, 0.1));
-    expect(Solver.solve((x) => x * x, 1.5625, 10), closeTo(1.25, 0.1));
-    expect(Solver.solve((x) => 1 / x, 10, 1), closeTo(0.1, 0.1));
-  });
-
-  group('Momentum', () {
-    test('SingleDimensionPhysics', () {
-      expect(new SingleDimensionPhysics().solve(0, 0, 1), equals(0));
-      expect(new SingleDimensionPhysics().solve(0, 5, 1), equals(0));
-      expect(new SingleDimensionPhysics().solve(0, 100, 1), equals(0));
-      expect(new SingleDimensionPhysics().solve(0, 100, 0.5), equals(0));
-    });
-
-    test('TimeoutMomentum()', () {
-      final delegate = new TestMomentumDelegate();
-      final momentum = new TimeoutMomentum(null);
-    });
-  });
-}
-
-class TestMomentumDelegate {
-  Function onDecelerateCallback;
-  Function onDecelerationEndCallback;
-
-  void onDecelerate(num x, num y,
-      [num duration = 0, String timingFunction = null]) {
-    onDecelerateCallback(x, y, duration, timingFunction);
-  }
-
-  /**
-   * Callback for end of deceleration.
-   */
-  void onDecelerationEnd() {
-    onDecelerationEndCallback();
-  }
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/util/util_test.dart b/samples-dev/swarm/test/swarm_ui_lib/util/util_test.dart
deleted file mode 100644
index 97b5890..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/util/util_test.dart
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for 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 util_tests;
-
-import 'dart:html';
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
-import '../../../swarm_ui_lib/util/utilslib.dart';
-
-main() {
-  useHtmlConfiguration();
-  test('insertAt', () {
-    var a = [];
-    CollectionUtils.insertAt(a, 0, 1);
-    expect(a, orderedEquals([1]));
-
-    CollectionUtils.insertAt(a, 0, 2);
-    expect(a, orderedEquals([2, 1]));
-
-    CollectionUtils.insertAt(a, 0, 5);
-    CollectionUtils.insertAt(a, 0, 4);
-    CollectionUtils.insertAt(a, 0, 3);
-    expect(a, orderedEquals([3, 4, 5, 2, 1]));
-
-    a = [];
-    CollectionUtils.insertAt(a, 0, 1);
-    expect(a, orderedEquals([1]));
-
-    CollectionUtils.insertAt(a, 1, 2);
-    expect(a, orderedEquals([1, 2]));
-
-    CollectionUtils.insertAt(a, 1, 3);
-    CollectionUtils.insertAt(a, 3, 4);
-    CollectionUtils.insertAt(a, 3, 5);
-    expect(a, orderedEquals([1, 3, 2, 5, 4]));
-  });
-
-  test('defaultString', () {
-    expect(StringUtils.defaultString(null), isEmpty);
-    expect(StringUtils.defaultString(''), isEmpty);
-    expect(StringUtils.defaultString('test'), equals('test'));
-  });
-}
diff --git a/samples-dev/swarm/test/swarm_ui_lib/view/view_test.dart b/samples-dev/swarm/test/swarm_ui_lib/view/view_test.dart
deleted file mode 100644
index 663b45b..0000000
--- a/samples-dev/swarm/test/swarm_ui_lib/view/view_test.dart
+++ /dev/null
@@ -1,233 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for 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 view_tests;
-
-import 'dart:html';
-import '../../../swarm_ui_lib/view/view.dart';
-import 'package:unittest/html_config.dart';
-import 'package:unittest/unittest.dart';
-
-void main() {
-  useHtmlConfiguration();
-  test('does not render immediately', () {
-    final view = new TestView();
-    expect(view.isRendered, isFalse);
-
-    view.addToDocument(document.body);
-    expect(view.isRendered, isTrue);
-  });
-
-  group('addToDocument()', () {
-    test('causes view to render', () {
-      final view = new TestView();
-      view.addToDocument(document.body);
-      expect(view.isRendered, isTrue);
-    });
-
-    test('calls afterRender()', () {
-      var result = '';
-      final view = new TestView();
-      view.renderFn = () {
-        result = '${result}render';
-        return new Element.html('<div class="test"></div>');
-      };
-
-      view.afterRenderFn = (node) {
-        result = '${result}after';
-      };
-
-      view.addToDocument(document.body);
-      expect(result, equals('renderafter'));
-    });
-
-    test('calls enterDocument()', () {
-      final view = new TestView();
-      bool entered = false;
-      view.enterDocumentFn = () {
-        entered = true;
-      };
-
-      view.addToDocument(document.body);
-      expect(entered, isTrue);
-    });
-  });
-
-  group('afterRender()', () {
-    test('passes rendered node', () {
-      final rendered = new Element.html('<div class="node"></div>');
-      final view = new TestView();
-      view.renderFn = () => rendered;
-      view.afterRenderFn = (node) {
-        expect(node, equals(rendered));
-      };
-
-      view.addToDocument(document.body);
-    });
-  });
-
-  group('childViewAdded()', () {
-    test('calls enterDocument() if parent is in document', () {
-      final parent = new TestView();
-      parent.addToDocument(document.body);
-
-      bool entered = false;
-      final child = new TestView();
-      child.enterDocumentFn = () {
-        entered = true;
-      };
-
-      // Add the child.
-      parent.childViews = [child];
-      parent.childViewAdded(child);
-
-      expect(entered, isTrue);
-    });
-
-    test('does not call enterDocument() if parent is not in document', () {
-      final parent = new TestView();
-
-      bool entered = false;
-      final child = new TestView();
-      child.enterDocumentFn = () {
-        entered = true;
-      };
-
-      // Add the child.
-      parent.childViews = [child];
-      parent.childViewAdded(child);
-
-      expect(entered, isFalse);
-    });
-
-    test('calls enterDocument() each time added', () {
-      final parent = new TestView();
-      parent.addToDocument(document.body);
-
-      var entered = 0;
-      final child = new TestView();
-      child.enterDocumentFn = () {
-        entered++;
-      };
-
-      // Add the child.
-      parent.childViews = [child];
-      parent.childViewAdded(child);
-      parent.childViewRemoved(child);
-      parent.childViewAdded(child);
-      parent.childViewRemoved(child);
-      parent.childViewAdded(child);
-      parent.childViewRemoved(child);
-
-      expect(entered, equals(3));
-    });
-  });
-
-  group('childViewRemoved()', () {
-    test('calls exitDocument() if parent is in document', () {
-      final parent = new TestView();
-      parent.addToDocument(document.body);
-
-      bool exited = false;
-      final child = new TestView();
-      child.exitDocumentFn = () {
-        exited = true;
-      };
-
-      // Remove the child.
-      parent.childViews = [];
-      parent.childViewRemoved(child);
-
-      expect(exited, isTrue);
-    });
-
-    test('does not call exitDocument() if parent is not in document', () {
-      final parent = new TestView();
-
-      bool exited = false;
-      final child = new TestView();
-      child.exitDocumentFn = () {
-        exited = true;
-      };
-
-      // Remove the child.
-      parent.childViews = [];
-      parent.childViewRemoved(child);
-
-      expect(exited, isFalse);
-    });
-
-    test('calls exitDocument() each time removed', () {
-      final parent = new TestView();
-      parent.addToDocument(document.body);
-
-      var exited = 0;
-      final child = new TestView();
-      child.exitDocumentFn = () {
-        exited++;
-      };
-
-      // Add the child.
-      parent.childViews = [child];
-      parent.childViewAdded(child);
-      parent.childViewRemoved(child);
-      parent.childViewAdded(child);
-      parent.childViewRemoved(child);
-      parent.childViewAdded(child);
-      parent.childViewRemoved(child);
-
-      expect(exited, equals(3));
-    });
-  });
-
-  group('enterDocument()', () {
-    test('children are called before parents', () {
-      var result = '';
-
-      final parent = new TestView();
-      parent.enterDocumentFn = () {
-        result = '${result}parent';
-      };
-
-      final child = new TestView();
-      child.enterDocumentFn = () {
-        result = '${result}child';
-      };
-
-      parent.childViews = [child];
-
-      parent.addToDocument(document.body);
-      expect(result, equals('childparent'));
-    });
-  });
-}
-
-class TestView extends View {
-  Function renderFn;
-  Function afterRenderFn;
-  Function enterDocumentFn;
-  Function exitDocumentFn;
-  List<View> childViews;
-
-  TestView() : childViews = [] {
-    // Default behavior.
-    renderFn = () => new Element.html('<div class="test"></div>');
-    afterRenderFn = (node) {};
-    enterDocumentFn = () {};
-    exitDocumentFn = () {};
-  }
-
-  Element render() => renderFn();
-  void afterRender(Element node) {
-    afterRenderFn(node);
-  }
-
-  void enterDocument() {
-    enterDocumentFn();
-  }
-
-  void exitDocument() {
-    exitDocumentFn();
-  }
-}
diff --git a/sdk/lib/_http/http.dart b/sdk/lib/_http/http.dart
index f841bc5..6883fbc 100644
--- a/sdk/lib/_http/http.dart
+++ b/sdk/lib/_http/http.dart
@@ -753,6 +753,11 @@
  * [HeaderValue] can be used to conveniently build and parse header
  * values on this form.
  *
+ * Parameter values can be omitted, in which case the value is parsed as `null`.
+ * Values can be doubled quoted to allow characters outside of the RFC 7230
+ * token characters and backslash sequences can be used to represent the double
+ * quote and backslash characters themselves.
+ *
  * To build an [:accepts:] header with the value
  *
  *     text/plain; q=0.3, text/html
@@ -779,7 +784,8 @@
   /**
    * Creates a new header value object setting the value and parameters.
    */
-  factory HeaderValue([String value = "", Map<String, String> parameters]) {
+  factory HeaderValue(
+      [String value = "", Map<String, String> parameters = const {}]) {
     return new _HeaderValue(value, parameters);
   }
 
@@ -892,7 +898,7 @@
    * or in `parameters`, will have its value converted to lower-case.
    */
   factory ContentType(String primaryType, String subType,
-      {String charset, Map<String, String> parameters}) {
+      {String charset, Map<String, String> parameters = const {}}) {
     return new _ContentType(primaryType, subType, charset, parameters);
   }
 
diff --git a/sdk/lib/_http/http_headers.dart b/sdk/lib/_http/http_headers.dart
index d152153..e271935 100644
--- a/sdk/lib/_http/http_headers.dart
+++ b/sdk/lib/_http/http_headers.dart
@@ -641,8 +641,8 @@
   Map<String, String> _parameters;
   Map<String, String> _unmodifiableParameters;
 
-  _HeaderValue([this._value = "", Map<String, String> parameters]) {
-    if (parameters != null) {
+  _HeaderValue([this._value = "", Map<String, String> parameters = const {}]) {
+    if (parameters != null && parameters.isNotEmpty) {
       _parameters = new HashMap<String, String>.from(parameters);
     }
   }
@@ -659,18 +659,25 @@
 
   String get value => _value;
 
-  void _ensureParameters() {
-    if (_parameters == null) {
-      _parameters = new HashMap<String, String>();
-    }
-  }
+  Map<String, String> _ensureParameters() => _parameters ??= <String, String>{};
 
-  Map<String, String> get parameters {
-    _ensureParameters();
-    if (_unmodifiableParameters == null) {
-      _unmodifiableParameters = new UnmodifiableMapView(_parameters);
+  Map<String, String> get parameters =>
+      _unmodifiableParameters ??= UnmodifiableMapView(_ensureParameters());
+
+  static bool _isToken(String token) {
+    if (token.isEmpty) {
+      return false;
     }
-    return _unmodifiableParameters;
+    final delimiters = "\"(),/:;<=>?@[\]{}";
+    for (int i = 0; i < token.length; i++) {
+      int codeUnit = token.codeUnitAt(i);
+      if (codeUnit <= 32 ||
+          codeUnit >= 127 ||
+          delimiters.indexOf(token[i]) >= 0) {
+        return false;
+      }
+    }
+    return true;
   }
 
   String toString() {
@@ -678,7 +685,27 @@
     sb.write(_value);
     if (parameters != null && parameters.length > 0) {
       _parameters.forEach((String name, String value) {
-        sb..write("; ")..write(name)..write("=")..write(value);
+        sb..write("; ")..write(name);
+        if (value != null) {
+          sb.write("=");
+          if (_isToken(value)) {
+            sb.write(value);
+          } else {
+            sb.write('"');
+            int start = 0;
+            for (int i = 0; i < value.length; i++) {
+              // Can use codeUnitAt here instead.
+              int codeUnit = value.codeUnitAt(i);
+              if (codeUnit == 92 /* backslash */ ||
+                  codeUnit == 34 /* double quote */) {
+                sb.write(value.substring(start, i));
+                sb.write(r'\');
+                start = i;
+              }
+            }
+            sb..write(value.substring(start))..write('"');
+          }
+        }
       });
     }
     return sb.toString();
@@ -716,8 +743,12 @@
       index++;
     }
 
-    void maybeExpect(String expected) {
-      if (s[index] == expected) index++;
+    bool maybeExpect(String expected) {
+      if (done() || !s.startsWith(expected, index)) {
+        return false;
+      }
+      index++;
+      return true;
     }
 
     void parseParameters() {
@@ -753,16 +784,15 @@
               index++;
             } else if (s[index] == "\"") {
               index++;
-              break;
+              return sb.toString();
             }
             sb.write(s[index]);
             index++;
           }
-          return sb.toString();
+          throw new HttpException("Failed to parse header value");
         } else {
           // Parse non-quoted value.
-          var val = parseValue();
-          return val == "" ? null : val;
+          return parseValue();
         }
       }
 
@@ -771,23 +801,18 @@
         if (done()) return;
         String name = parseParameterName();
         skipWS();
-        if (done()) {
+        if (maybeExpect("=")) {
+          skipWS();
+          String value = parseParameterValue();
+          if (name == 'charset' && this is _ContentType) {
+            // Charset parameter of ContentTypes are always lower-case.
+            value = value.toLowerCase();
+          }
+          parameters[name] = value;
+          skipWS();
+        } else if (name.isNotEmpty) {
           parameters[name] = null;
-          return;
         }
-        maybeExpect("=");
-        skipWS();
-        if (done()) {
-          parameters[name] = null;
-          return;
-        }
-        String value = parseParameterValue();
-        if (name == 'charset' && this is _ContentType && value != null) {
-          // Charset parameter of ContentTypes are always lower-case.
-          value = value.toLowerCase();
-        }
-        parameters[name] = value;
-        skipWS();
         if (done()) return;
         // TODO: Implement support for multi-valued parameters.
         if (s[index] == valueSeparator) return;
@@ -821,7 +846,7 @@
       parameters.forEach((String key, String value) {
         String lowerCaseKey = key.toLowerCase();
         if (lowerCaseKey == "charset") {
-          value = value.toLowerCase();
+          value = value?.toLowerCase();
         }
         this._parameters[lowerCaseKey] = value;
       });
diff --git a/sdk/lib/_http/http_impl.dart b/sdk/lib/_http/http_impl.dart
index 890a570..761c12e 100644
--- a/sdk/lib/_http/http_impl.dart
+++ b/sdk/lib/_http/http_impl.dart
@@ -1760,9 +1760,9 @@
     request.headers
       ..host = host
       ..port = port
-      .._add(HttpHeaders.acceptEncodingHeader, "gzip");
+      ..add(HttpHeaders.acceptEncodingHeader, "gzip");
     if (_httpClient.userAgent != null) {
-      request.headers._add(HttpHeaders.userAgentHeader, _httpClient.userAgent);
+      request.headers.add(HttpHeaders.userAgentHeader, _httpClient.userAgent);
     }
     if (proxy.isAuthenticated) {
       // If the proxy configuration contains user information use that
@@ -2560,6 +2560,10 @@
           outgoing,
           _httpServer.defaultResponseHeaders,
           _httpServer.serverHeader);
+      // Parser found badRequest and sent out Response.
+      if (incoming.statusCode == HttpStatus.badRequest) {
+        response.statusCode = HttpStatus.badRequest;
+      }
       var request = new _HttpRequest(response, incoming, _httpServer, this);
       _streamFuture = outgoing.done.then((_) {
         response.deadline = null;
diff --git a/sdk/lib/_http/http_parser.dart b/sdk/lib/_http/http_parser.dart
index 0a17e19..6153ffa 100644
--- a/sdk/lib/_http/http_parser.dart
+++ b/sdk/lib/_http/http_parser.dart
@@ -249,6 +249,8 @@
   final List<int> _uriOrReasonPhrase = [];
   final List<int> _headerField = [];
   final List<int> _headerValue = [];
+  // The limit for method, uriOrReasonPhrase, header field and value
+  int _headerSizeLimit = 8 * 1024;
 
   int _httpVersion;
   int _transferLength = -1;
@@ -258,9 +260,14 @@
 
   bool _noMessageBody = false;
   int _remainingContent = -1;
+  bool _contentLength = false;
+  bool _transferEncoding = false;
 
   _HttpHeaders _headers;
 
+  // The limit for parsing chunk size
+  int _chunkSizeLimit = 0x7FFFFFFF;
+
   // The current incoming connection.
   _HttpIncoming _incoming;
   StreamSubscription<Uint8List> _socketSubscription;
@@ -433,7 +440,7 @@
             if (!_isTokenChar(byte)) {
               throw HttpException("Invalid request method");
             }
-            _method.add(byte);
+            _addWithValidation(_method, byte);
             if (!_requestParser) {
               throw HttpException("Invalid response line");
             }
@@ -458,12 +465,12 @@
           } else {
             // Did not parse HTTP version. Expect method instead.
             for (int i = 0; i < _httpVersionIndex; i++) {
-              _method.add(_Const.HTTP[i]);
+              _addWithValidation(_method, _Const.HTTP[i]);
             }
             if (byte == _CharCode.SP) {
               _state = _State.REQUEST_LINE_URI;
             } else {
-              _method.add(byte);
+              _addWithValidation(_method, byte);
               _httpVersion = _HttpVersion.UNDETERMINED;
               if (!_requestParser) {
                 throw HttpException("Invalid response line");
@@ -509,7 +516,7 @@
                 byte == _CharCode.LF) {
               throw HttpException("Invalid request method");
             }
-            _method.add(byte);
+            _addWithValidation(_method, byte);
           }
           break;
 
@@ -524,7 +531,7 @@
             if (byte == _CharCode.CR || byte == _CharCode.LF) {
               throw HttpException("Invalid request, unexpected $byte in URI");
             }
-            _uriOrReasonPhrase.add(byte);
+            _addWithValidation(_uriOrReasonPhrase, byte);
           }
           break;
 
@@ -591,7 +598,7 @@
               throw HttpException(
                   "Invalid response, unexpected $byte in reason phrase");
             }
-            _uriOrReasonPhrase.add(byte);
+            _addWithValidation(_uriOrReasonPhrase, byte);
           }
           break;
 
@@ -614,7 +621,7 @@
             _index--; // Make the new state see the LF again.
           } else {
             // Start of new header field.
-            _headerField.add(_toLowerCaseByte(byte));
+            _addWithValidation(_headerField, _toLowerCaseByte(byte));
             _state = _State.HEADER_FIELD;
           }
           break;
@@ -626,7 +633,7 @@
             if (!_isTokenChar(byte)) {
               throw HttpException("Invalid header field name, with $byte");
             }
-            _headerField.add(_toLowerCaseByte(byte));
+            _addWithValidation(_headerField, _toLowerCaseByte(byte));
           }
           break;
 
@@ -637,7 +644,7 @@
             _state = _State.HEADER_VALUE_FOLD_OR_END;
           } else if (byte != _CharCode.SP && byte != _CharCode.HT) {
             // Start of new header value.
-            _headerValue.add(byte);
+            _addWithValidation(_headerValue, byte);
             _state = _State.HEADER_VALUE;
           }
           break;
@@ -648,7 +655,7 @@
           } else if (byte == _CharCode.LF) {
             _state = _State.HEADER_VALUE_FOLD_OR_END;
           } else {
-            _headerValue.add(byte);
+            _addWithValidation(_headerValue, byte);
           }
           break;
 
@@ -663,9 +670,21 @@
           } else {
             String headerField = new String.fromCharCodes(_headerField);
             String headerValue = new String.fromCharCodes(_headerValue);
-            if (headerField == HttpHeaders.transferEncodingHeader &&
-                _caseInsensitiveCompare("chunked".codeUnits, _headerValue)) {
-              _chunked = true;
+            if (headerField == HttpHeaders.contentLengthHeader) {
+              // Content Length header should not have more than one occurance
+              // or coexist with Transfer Encoding header.
+              if (_contentLength || _transferEncoding) {
+                _statusCode = HttpStatus.badRequest;
+              }
+              _contentLength = true;
+            } else if (headerField == HttpHeaders.transferEncodingHeader) {
+              _transferEncoding = true;
+              if (_caseInsensitiveCompare("chunked".codeUnits, _headerValue)) {
+                _chunked = true;
+              }
+              if (_contentLength) {
+                _statusCode = HttpStatus.badRequest;
+              }
             }
             if (headerField == HttpHeaders.connectionHeader) {
               List<String> tokens = _tokenizeFieldValue(headerValue);
@@ -680,10 +699,10 @@
                     (isUpgrade && isResponse && isUpgradeCode)) {
                   _connectionUpgrade = true;
                 }
-                _headers._add(headerField, tokens[i]);
+                _headers.add(headerField, tokens[i]);
               }
             } else {
-              _headers._add(headerField, headerValue);
+              _headers.add(headerField, headerValue);
             }
             _headerField.clear();
             _headerValue.clear();
@@ -695,8 +714,8 @@
               _index--; // Make the new state see the LF again.
             } else {
               // Start of new header field.
-              _headerField.add(_toLowerCaseByte(byte));
               _state = _State.HEADER_FIELD;
+              _addWithValidation(_headerField, _toLowerCaseByte(byte));
             }
           }
           break;
@@ -725,6 +744,10 @@
             _state = _State.CHUNK_SIZE_EXTENSION;
           } else {
             int value = _expectHexDigit(byte);
+            // Checks whether (_remaingingContent * 16 + value) overflows.
+            if (_remainingContent > _chunkSizeLimit >> 4) {
+              throw HttpException('Chunk size overflows the integer');
+            }
             _remainingContent = _remainingContent * 16 + value;
           }
           break;
@@ -918,6 +941,9 @@
     _noMessageBody = false;
     _remainingContent = -1;
 
+    _contentLength = false;
+    _transferEncoding = false;
+
     _headers = null;
   }
 
@@ -990,6 +1016,48 @@
     }
   }
 
+  void _addWithValidation(List<int> list, int byte) {
+    if (list.length < _headerSizeLimit) {
+      list.add(byte);
+    } else {
+      _reportSizeLimitError();
+    }
+  }
+
+  void _reportSizeLimitError() {
+    String method = "";
+    switch (_state) {
+      case _State.START:
+      case _State.METHOD_OR_RESPONSE_HTTP_VERSION:
+      case _State.REQUEST_LINE_METHOD:
+        method = "Method";
+        break;
+
+      case _State.REQUEST_LINE_URI:
+        method = "URI";
+        break;
+
+      case _State.RESPONSE_LINE_REASON_PHRASE:
+        method = "Reason phrase";
+        break;
+
+      case _State.HEADER_START:
+      case _State.HEADER_FIELD:
+        method = "Header field";
+        break;
+
+      case _State.HEADER_VALUE_START:
+      case _State.HEADER_VALUE:
+        method = "Header value";
+        break;
+
+      default:
+        throw UnsupportedError("Unexpected state: $_state");
+        break;
+    }
+    throw HttpException("$method exceeds the $_headerSizeLimit size limit");
+  }
+
   void _createIncoming(int transferLength) {
     assert(_incoming == null);
     assert(_bodyController == null);
diff --git a/sdk/lib/_http/websocket.dart b/sdk/lib/_http/websocket.dart
index 77b5008..45cc5117 100644
--- a/sdk/lib/_http/websocket.dart
+++ b/sdk/lib/_http/websocket.dart
@@ -331,11 +331,14 @@
   static const int CLOSED = closed;
 
   /**
-   * Set and get the interval for sending ping signals. If a ping message is not
-   * answered by a pong message from the peer, the `WebSocket` is assumed
-   * disconnected and the connection is closed with a
-   * [WebSocketStatus.goingAway] close code. When a ping signal is sent, the
-   * pong message must be received within [pingInterval].
+   * The interval between ping signals.
+   *
+   * A ping message is sent every [pingInterval], starting at the first
+   * [pingInterval] after a new value has been assigned or a pong message has
+   * been received. If a ping message is not answered by a pong message from the
+   * peer, the `WebSocket` is assumed disconnected and the connection is closed
+   * with a [WebSocketStatus.goingAway] close code. When a ping signal is sent,
+   * the pong message must be received within [pingInterval].
    *
    * There are never two outstanding pings at any given time, and the next ping
    * timer starts when the pong is received.
diff --git a/sdk/lib/_http/websocket_impl.dart b/sdk/lib/_http/websocket_impl.dart
index ce015bb..820dd69 100644
--- a/sdk/lib/_http/websocket_impl.dart
+++ b/sdk/lib/_http/websocket_impl.dart
@@ -1205,8 +1205,12 @@
       if (_writeClosed) return;
       _consumer.add(new _WebSocketPing());
       _pingTimer = new Timer(_pingInterval, () {
+        _closeTimer?.cancel();
         // No pong received.
         _close(WebSocketStatus.goingAway);
+        _closeCode = _outCloseCode;
+        _closeReason = _outCloseReason;
+        _controller.close();
       });
     });
   }
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 2e1587c..0000252 100644
--- a/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart
+++ b/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart
@@ -72,9 +72,6 @@
 
   @JSExportName('as')
   static Object _as_Object(Object o) => o;
-
-  @JSExportName('_check')
-  static Object _check_Object(Object o) => o;
 }
 
 @patch
@@ -89,14 +86,7 @@
   static Object _as_Null(Object o) {
     // Avoid extra function call to core.Null.is() by manually inlining.
     if (o == null) return o;
-    return dart.cast(o, dart.unwrapType(Null), false);
-  }
-
-  @JSExportName('_check')
-  static Object _check_Null(Object o) {
-    // Avoid extra function call to core.Null.is() by manually inlining.
-    if (o == null) return o;
-    return dart.cast(o, dart.unwrapType(Null), true);
+    return dart.cast(o, dart.unwrapType(Null));
   }
 }
 
@@ -135,14 +125,7 @@
   static Object _as_Function(Object o) {
     // Avoid extra function call to core.Function.is() by manually inlining.
     if (JS<Object>('!', 'typeof $o == "function"') || o == null) return o;
-    return dart.cast(o, dart.unwrapType(Function), false);
-  }
-
-  @JSExportName('_check')
-  static Object _check_Function(Object o) {
-    // Avoid extra function call to core.Function.is() by manually inlining.
-    if (JS<Object>('!', 'typeof $o == "function"') || o == null) return o;
-    return dart.cast(o, dart.unwrapType(Function), true);
+    return dart.cast(o, dart.unwrapType(Function));
   }
 }
 
@@ -217,17 +200,7 @@
         o == null) {
       return o;
     }
-    return dart.cast(o, dart.unwrapType(int), false);
-  }
-
-  @JSExportName('_check')
-  static Object _check_int(Object o) {
-    // Avoid extra function call to core.int.is() by manually inlining.
-    if (JS<bool>('!', '(typeof $o == "number" && Math.floor($o) == $o)') ||
-        o == null) {
-      return o;
-    }
-    return dart.cast(o, dart.unwrapType(int), true);
+    return dart.cast(o, dart.unwrapType(int));
   }
 }
 
@@ -253,14 +226,7 @@
   static Object _as_double(o) {
     // Avoid extra function call to core.double.is() by manually inlining.
     if (JS<bool>('!', 'typeof $o == "number"') || o == null) return o;
-    return dart.cast(o, dart.unwrapType(double), false);
-  }
-
-  @JSExportName('_check')
-  static Object _check_double(o) {
-    // Avoid extra function call to core.double.is() by manually inlining.
-    if (JS<bool>('!', 'typeof $o == "number"') || o == null) return o;
-    return dart.cast(o, dart.unwrapType(double), true);
+    return dart.cast(o, dart.unwrapType(double));
   }
 }
 
@@ -275,14 +241,7 @@
   static Object _as_num(o) {
     // Avoid extra function call to core.num.is() by manually inlining.
     if (JS<bool>('!', 'typeof $o == "number"') || o == null) return o;
-    return dart.cast(o, dart.unwrapType(num), false);
-  }
-
-  @JSExportName('_check')
-  static Object _check_num(o) {
-    // Avoid extra function call to core.num.is() by manually inlining.
-    if (JS<bool>('!', 'typeof $o == "number"') || o == null) return o;
-    return dart.cast(o, dart.unwrapType(num), true);
+    return dart.cast(o, dart.unwrapType(num));
   }
 }
 
@@ -657,14 +616,7 @@
   static Object _as_String(Object o) {
     // Avoid extra function call to core.String.is() by manually inlining.
     if (JS<bool>('!', 'typeof $o == "string"') || o == null) return o;
-    return dart.cast(o, dart.unwrapType(String), false);
-  }
-
-  @JSExportName('_check')
-  static Object _check_String(Object o) {
-    // Avoid extra function call to core.String.is() by manually inlining.
-    if (JS<bool>('!', 'typeof $o == "string"') || o == null) return o;
-    return dart.cast(o, dart.unwrapType(String), true);
+    return dart.cast(o, dart.unwrapType(String));
   }
 }
 
@@ -695,14 +647,7 @@
   static Object _as_bool(Object o) {
     // Avoid extra function call to core.bool.is() by manually inlining.
     if (JS<bool>("!", '$o === true || $o === false') || o == null) return o;
-    return dart.cast(o, dart.unwrapType(bool), false);
-  }
-
-  @JSExportName('_check')
-  static Object _check_bool(Object o) {
-    // Avoid extra function call to core.bool.is() by manually inlining.
-    if (JS<bool>("!", '$o === true || $o === false') || o == null) return o;
-    return dart.cast(o, dart.unwrapType(bool), true);
+    return dart.cast(o, dart.unwrapType(bool));
   }
 }
 
diff --git a/sdk/lib/_internal/js_dev_runtime/patch/io_patch.dart b/sdk/lib/_internal/js_dev_runtime/patch/io_patch.dart
index 514ffcb..48a0969 100644
--- a/sdk/lib/_internal/js_dev_runtime/patch/io_patch.dart
+++ b/sdk/lib/_internal/js_dev_runtime/patch/io_patch.dart
@@ -406,9 +406,16 @@
   }
 
   @patch
-  factory InternetAddress(String address) {
+  factory InternetAddress(String address, {InternetAddressType type}) {
     throw UnsupportedError("InternetAddress");
   }
+
+  @patch
+  factory InternetAddress.fromRawAddress(Uint8List rawAddress,
+      {InternetAddressType type}) {
+    throw new UnsupportedError("InternetAddress.fromRawAddress");
+  }
+
   @patch
   static Future<List<InternetAddress>> lookup(String host,
       {InternetAddressType type = InternetAddressType.any}) {
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 862dd7e..04b4f2f 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
@@ -535,16 +535,7 @@
       '',
       '''#.as = function as_C(obj) {
     if (obj == null || obj[#]) return obj;
-    return #(obj, this, false);
-  }''',
-      ctor,
-      isClass,
-      cast);
-  JS(
-      '',
-      '''#._check = function check_C(obj) {
-    if (obj == null || obj[#]) return obj;
-    return #(obj, this, true);
+    return #(obj, this);
   }''',
       ctor,
       isClass,
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 4a5813d..699f415 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
@@ -38,11 +38,10 @@
       null, Symbol('<Unexpected Null Value>'), null, null, null);
 }
 
-castError(obj, expectedType, [@notNull bool isImplicit = false]) {
+castError(obj, expectedType) {
   var actualType = getReifiedType(obj);
   var message = _castErrorMessage(actualType, expectedType);
-  var error = isImplicit ? TypeErrorImpl(message) : CastErrorImpl(message);
-  throw error;
+  throw TypeErrorImpl(message);
 }
 
 String _castErrorMessage(from, to) {
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 2bd044b..a89ec92 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
@@ -134,7 +134,7 @@
   if (f != null) {
     var setterType = getSetterType(getType(obj), f);
     if (setterType != null) {
-      return JS('', '#[#] = #._check(#)', obj, f, setterType, value);
+      return JS('', '#[#] = #.as(#)', obj, f, setterType, value);
     }
     // Always allow for JS interop objects.
     if (isJsInterop(obj)) return JS('', '#[#] = #', obj, f, value);
@@ -179,14 +179,14 @@
   }
   // Now that we know the signature matches, we can perform type checks.
   for (var i = 0; i < requiredCount; ++i) {
-    JS('', '#[#]._check(#[#])', required, i, actuals, i);
+    JS('', '#[#].as(#[#])', required, i, actuals, i);
   }
   for (var i = 0; i < extras; ++i) {
-    JS('', '#[#]._check(#[#])', optionals, i, actuals, i + requiredCount);
+    JS('', '#[#].as(#[#])', optionals, i, actuals, i + requiredCount);
   }
   if (names != null) {
     for (var name in names) {
-      JS('', '#[#]._check(#[#])', named, name, namedActuals, name);
+      JS('', '#[#].as(#[#])', named, name, namedActuals, name);
     }
   }
   return null;
@@ -397,13 +397,13 @@
 }
 
 @JSExportName('as')
-cast(obj, type, @notNull bool isImplicit) {
+cast(obj, type) {
   if (obj == null) return obj;
   var actual = getReifiedType(obj);
   if (isSubtypeOf(actual, type)) {
     return obj;
   }
-  return castError(obj, type, isImplicit);
+  return castError(obj, type);
 }
 
 bool test(bool obj) {
@@ -419,7 +419,7 @@
 void _throwBooleanConversionError() => throw BooleanConversionAssertionError();
 
 void booleanConversionFailed(obj) {
-  var actual = typeName(getReifiedType(test(obj)));
+  var actual = typeName(getReifiedType(obj));
   throw TypeErrorImpl("type '$actual' is not a 'bool' in boolean expression");
 }
 
@@ -427,7 +427,7 @@
   if (obj == null) return null;
 
   if (JS('!', 'Math.floor(#) != #', obj, obj)) {
-    castError(obj, JS('', '#', int), false);
+    castError(obj, JS('', '#', int));
   }
   return obj;
 }
@@ -448,7 +448,7 @@
 }
 
 /// No-op without null safety enabled.
-nullCast(x, type, [@notNull bool isImplicit = false]) => x;
+nullCast(x, type) => x;
 
 /// The global constant map table.
 final constantMaps = JS('', 'new Map()');
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 a6d17de..b3fad43 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
@@ -46,10 +46,9 @@
 ///
 ///     T.is(o): Implements 'o is T'.
 ///     T.as(o): Implements 'o as T'.
-///     T._check(o): Implements the type assertion of 'T x = o;'
 ///
 /// By convention, we used named JavaScript functions for these methods with the
-/// name 'is_X', 'as_X' and 'check_X' for various X to indicate the type or the
+/// name 'is_X' and 'as_X' for various X to indicate the type or the
 /// implementation strategy for the test (e.g 'is_String', 'is_G' for generic
 /// types, etc.)
 // TODO(jmesserly): we shouldn't implement Type here. It should be moved down
@@ -63,10 +62,7 @@
   bool is_T(object) => instanceOf(object, this);
 
   @JSExportName('as')
-  as_T(object) => cast(object, this, false);
-
-  @JSExportName('_check')
-  check_T(object) => cast(object, this, true);
+  as_T(object) => cast(object, this);
 }
 
 class DynamicType extends DartType {
@@ -77,9 +73,6 @@
 
   @JSExportName('as')
   as_T(object) => object;
-
-  @JSExportName('_check')
-  check_T(object) => object;
 }
 
 @notNull
@@ -178,10 +171,7 @@
   bool is_T(obj) => isRawJSType(obj) || instanceOf(obj, this);
 
   @JSExportName('as')
-  as_T(obj) => obj == null || is_T(obj) ? obj : castError(obj, this, false);
-
-  @JSExportName('_check')
-  check_T(obj) => obj == null || is_T(obj) ? obj : castError(obj, this, true);
+  as_T(obj) => obj == null || is_T(obj) ? obj : castError(obj, this);
 }
 
 /// An anonymous JS type
@@ -196,10 +186,7 @@
   bool is_T(obj) => _isJsObject(obj) || instanceOf(obj, this);
 
   @JSExportName('as')
-  as_T(obj) => obj == null || _isJsObject(obj) ? obj : cast(obj, this, false);
-
-  @JSExportName('_check')
-  check_T(obj) => obj == null || _isJsObject(obj) ? obj : cast(obj, this, true);
+  as_T(obj) => obj == null || _isJsObject(obj) ? obj : cast(obj, this);
 }
 
 void _warn(arg) {
@@ -486,7 +473,7 @@
   }
 
   @JSExportName('as')
-  as_T(obj, [@notNull bool isImplicit = false]) {
+  as_T(obj) {
     if (obj == null) return obj;
     if (JS('!', 'typeof # == "function"', obj)) {
       var actual = JS('', '#[#]', obj, _runtimeType);
@@ -496,11 +483,8 @@
         return obj;
       }
     }
-    return castError(obj, this, isImplicit);
+    return castError(obj, this);
   }
-
-  @JSExportName('_check')
-  check_T(obj) => as_T(obj, true);
 }
 
 /// A type variable, used by [GenericFunctionType] to represent a type formal.
@@ -677,13 +661,7 @@
   @JSExportName('as')
   as_T(obj) {
     if (obj == null || is_T(obj)) return obj;
-    return castError(obj, this, false);
-  }
-
-  @JSExportName('_check')
-  check_T(obj) {
-    if (obj == null || is_T(obj)) return obj;
-    return castError(obj, this, true);
+    return castError(obj, this);
   }
 }
 
diff --git a/sdk/lib/_internal/js_runtime/lib/async_patch.dart b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
index 480a17b..3da215e 100644
--- a/sdk/lib/_internal/js_runtime/lib/async_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
@@ -205,7 +205,8 @@
     }
   }
 
-  void completeError(e, [st]) {
+  void completeError(Object e, [StackTrace st]) {
+    st ??= AsyncError.defaultStackTrace(e);
     if (isSync) {
       _future._completeError(e, st);
     } else {
diff --git a/sdk/lib/_internal/js_runtime/lib/io_patch.dart b/sdk/lib/_internal/js_runtime/lib/io_patch.dart
index 37aa15c..146776c 100644
--- a/sdk/lib/_internal/js_runtime/lib/io_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/io_patch.dart
@@ -406,9 +406,16 @@
   }
 
   @patch
-  factory InternetAddress(String address) {
+  factory InternetAddress(String address, {InternetAddressType type}) {
     throw new UnsupportedError("InternetAddress");
   }
+
+  @patch
+  factory InternetAddress.fromRawAddress(Uint8List rawAddress,
+      {InternetAddressType type}) {
+    throw new UnsupportedError("InternetAddress.fromRawAddress");
+  }
+
   @patch
   static Future<List<InternetAddress>> lookup(String host,
       {InternetAddressType type: InternetAddressType.any}) {
diff --git a/sdk/lib/_internal/js_runtime/lib/rti.dart b/sdk/lib/_internal/js_runtime/lib/rti.dart
index d7764df..22af777 100644
--- a/sdk/lib/_internal/js_runtime/lib/rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/rti.dart
@@ -55,12 +55,6 @@
   @pragma('dart2js:noElision')
   dynamic _as;
 
-  /// JavaScript method for type check.  The method is called from generated
-  /// code, e.g. parameter check for `T param` generates something like
-  /// `rtiForT._check(param)`.
-  @pragma('dart2js:noElision')
-  dynamic _check;
-
   /// JavaScript method for 'is' test.  The method is called from generated
   /// code, e.g. `o is T` generates something like `rtiForT._is(o)`.
   @pragma('dart2js:noElision')
@@ -70,10 +64,6 @@
     rti._as = fn;
   }
 
-  static void _setTypeCheckFunction(Rti rti, fn) {
-    rti._check = fn;
-  }
-
   static void _setIsTestFunction(Rti rti, fn) {
     rti._is = fn;
   }
@@ -837,12 +827,10 @@
   if (isObjectType(testRti)) {
     isFn = RAW_DART_FUNCTION_REF(_isObject);
     Rti._setAsCheckFunction(testRti, RAW_DART_FUNCTION_REF(_asObject));
-    Rti._setTypeCheckFunction(testRti, RAW_DART_FUNCTION_REF(_checkObject));
   } else if (isTopType(testRti)) {
     isFn = RAW_DART_FUNCTION_REF(_isTop);
     var asFn = RAW_DART_FUNCTION_REF(_asTop);
     Rti._setAsCheckFunction(testRti, asFn);
-    Rti._setTypeCheckFunction(testRti, asFn);
   } else if (_Utils.isIdentical(testRti, TYPE_REF<int>())) {
     isFn = RAW_DART_FUNCTION_REF(_isInt);
   } else if (_Utils.isIdentical(testRti, TYPE_REF<double>())) {
@@ -924,23 +912,6 @@
   Rti objectRti = instanceOrFunctionType(object, testRti);
   String message =
       _Error.compose(object, objectRti, _rtiToString(testRti, null));
-  throw _CastError.fromMessage(message);
-}
-
-/// Called from generated code.
-_generalTypeCheckImplementation(object) {
-  // This static method is installed on an Rti object as a JavaScript instance
-  // method. The Rti object is 'this'.
-  Rti testRti = _castToRti(JS('', 'this'));
-  if (object == null) {
-    if (JS_GET_FLAG('LEGACY') || isNullable(testRti)) return object;
-  } else {
-    if (Rti._isCheck(testRti, object)) return object;
-  }
-
-  Rti objectRti = instanceOrFunctionType(object, testRti);
-  String message =
-      _Error.compose(object, objectRti, _rtiToString(testRti, null));
   throw _TypeError.fromMessage(message);
 }
 
@@ -953,7 +924,7 @@
   throw _TypeError.fromMessage(message);
 }
 
-/// Base class to _CastError and _TypeError.
+/// Base class to _TypeError.
 class _Error extends Error {
   final String _message;
   _Error(this._message);
@@ -971,14 +942,6 @@
   String toString() => _message;
 }
 
-class _CastError extends _Error implements CastError, TypeError {
-  _CastError.fromMessage(String message) : super('TypeError: $message');
-
-  factory _CastError.forType(object, String type) {
-    return _CastError.fromMessage(_Error.compose(object, null, type));
-  }
-}
-
 class _TypeError extends _Error implements TypeError, CastError {
   _TypeError.fromMessage(String message) : super('TypeError: $message');
 
@@ -992,7 +955,7 @@
 
 // Specializations.
 //
-// Specializations can be placed on Rti objects as the _as, _check and _is
+// Specializations can be placed on Rti objects as the _as and _is
 // 'methods'. They can also be called directly called from generated code.
 
 /// Specialization for 'is Object'.
@@ -1005,13 +968,6 @@
 /// Called from generated code via Rti `_as` method.
 dynamic _asObject(object) {
   if (JS_GET_FLAG('LEGACY') || object != null) return object;
-  throw _CastError.forType(object, 'Object');
-}
-
-/// Specialization for check on 'Object'.
-/// Called from generated code via Rti `_check` method.
-dynamic _checkObject(object) {
-  if (JS_GET_FLAG('LEGACY') || object != null) return object;
   throw _TypeError.forType(object, 'Object');
 }
 
@@ -1022,7 +978,7 @@
 }
 
 /// Specialization for 'as dynamic' and other top types.
-/// Called from generated code via Rti `_as` and `_check` methods.
+/// Called from generated code via Rti `_as` methods.
 dynamic _asTop(object) {
   return object;
 }
@@ -1038,14 +994,6 @@
 bool /*?*/ _asBoolNullable(object) {
   if (_isBool(object)) return _Utils.asBool(object);
   if (object == null) return object;
-  throw _CastError.forType(object, 'bool');
-}
-
-/// Specialization for check on 'bool?'.
-/// Called from generated code.
-bool /*?*/ _checkBoolNullable(object) {
-  if (_isBool(object)) return _Utils.asBool(object);
-  if (object == null) return object;
   throw _TypeError.forType(object, 'bool');
 }
 
@@ -1054,14 +1002,6 @@
 double /*?*/ _asDoubleNullable(object) {
   if (_isNum(object)) return _Utils.asDouble(object);
   if (object == null) return object;
-  throw _CastError.forType(object, 'double');
-}
-
-/// Specialization for check on 'double?'.
-/// Called from generated code.
-double /*?*/ _checkDoubleNullable(object) {
-  if (_isNum(object)) return _Utils.asDouble(object);
-  if (object == null) return object;
   throw _TypeError.forType(object, 'double');
 }
 
@@ -1077,14 +1017,6 @@
 int /*?*/ _asIntNullable(object) {
   if (_isInt(object)) return _Utils.asInt(object);
   if (object == null) return object;
-  throw _CastError.forType(object, 'int');
-}
-
-/// Specialization for check on 'int?'.
-/// Called from generated code.
-int /*?*/ _checkIntNullable(object) {
-  if (_isInt(object)) return _Utils.asInt(object);
-  if (object == null) return object;
   throw _TypeError.forType(object, 'int');
 }
 
@@ -1099,14 +1031,6 @@
 num /*?*/ _asNumNullable(object) {
   if (_isNum(object)) return _Utils.asNum(object);
   if (object == null) return object;
-  throw _CastError.forType(object, 'num');
-}
-
-/// Specialization for check on 'num?'.
-/// Called from generated code.
-num /*?*/ _checkNumNullable(object) {
-  if (_isNum(object)) return _Utils.asNum(object);
-  if (object == null) return object;
   throw _TypeError.forType(object, 'num');
 }
 
@@ -1121,14 +1045,6 @@
 String /*?*/ _asStringNullable(object) {
   if (_isString(object)) return _Utils.asString(object);
   if (object == null) return object;
-  throw _CastError.forType(object, 'String');
-}
-
-/// Specialization for check on 'String?'.
-/// Called from generated code.
-String /*?*/ _checkStringNullable(object) {
-  if (_isString(object)) return _Utils.asString(object);
-  if (object == null) return object;
   throw _TypeError.forType(object, 'String');
 }
 
@@ -1596,15 +1512,12 @@
   }
 
   static Rti _installTypeTests(Object universe, Rti rti) {
-    // Set up methods to perform type tests. The general as-check / type-check
-    // methods use the is-test method. The is-test method on first use
-    // overwrites itself, and possibly the as-check / type-check methods, with a
-    // specialized version.
-    var checkFn = RAW_DART_FUNCTION_REF(_generalTypeCheckImplementation);
+    // Set up methods to perform type tests. The general as-check methods use
+    // the is-test method. The is-test method on first use overwrites itself,
+    // and possibly the as-check method, with a specialized version.
     var asFn = RAW_DART_FUNCTION_REF(_generalAsCheckImplementation);
     var isFn = RAW_DART_FUNCTION_REF(_installSpecializedIsTest);
     Rti._setAsCheckFunction(rti, asFn);
-    Rti._setTypeCheckFunction(rti, checkFn);
     Rti._setIsTestFunction(rti, isFn);
     return rti;
   }
diff --git a/sdk/lib/_internal/vm/bin/socket_patch.dart b/sdk/lib/_internal/vm/bin/socket_patch.dart
index 8d5bbe3..3fe415d 100644
--- a/sdk/lib/_internal/vm/bin/socket_patch.dart
+++ b/sdk/lib/_internal/vm/bin/socket_patch.dart
@@ -71,8 +71,14 @@
   }
 
   @patch
-  factory InternetAddress(String address) {
-    return new _InternetAddress.parse(address);
+  factory InternetAddress(String address, {InternetAddressType type}) {
+    return _InternetAddress.fromString(address, type: type);
+  }
+
+  @patch
+  factory InternetAddress.fromRawAddress(Uint8List rawAddress,
+      {InternetAddressType type}) {
+    return _InternetAddress.fromRawAddress(rawAddress, type: type);
   }
 
   @patch
@@ -140,10 +146,7 @@
   final String _host;
   final Uint8List _in_addr;
   final int _scope_id;
-
-  InternetAddressType get type => _in_addr.length == _IPv4AddrLength
-      ? InternetAddressType.IPv4
-      : InternetAddressType.IPv6;
+  final InternetAddressType type;
 
   String get host => _host != null ? _host : address;
 
@@ -159,6 +162,9 @@
           if (_in_addr[i] != 0) return false;
         }
         return _in_addr[_IPv6AddrLength - 1] == 1;
+
+      case InternetAddressType.unix:
+        return false;
     }
   }
 
@@ -171,6 +177,9 @@
       case InternetAddressType.IPv6:
         // Checking for fe80::/10.
         return _in_addr[0] == 0xFE && (_in_addr[1] & 0xB0) == 0x80;
+
+      case InternetAddressType.unix:
+        return false;
     }
   }
 
@@ -183,57 +192,103 @@
       case InternetAddressType.IPv6:
         // Checking for ff00::/8.
         return _in_addr[0] == 0xFF;
+
+      case InternetAddressType.unix:
+        return false;
     }
   }
 
-  Future<InternetAddress> reverse() => _NativeSocket.reverseLookup(this);
+  Future<InternetAddress> reverse() {
+    if (type == InternetAddressType.unix) {
+      return Future.value(this);
+    }
+    return _NativeSocket.reverseLookup(this);
+  }
 
-  _InternetAddress(this.address, this._host, this._in_addr,
+  _InternetAddress(this.type, this.address, this._host, this._in_addr,
       [this._scope_id = 0]);
 
-  factory _InternetAddress.parse(String address) {
-    if (address is! String) {
-      throw new ArgumentError("Invalid internet address $address");
+  factory _InternetAddress.fromString(String address,
+      {InternetAddressType type}) {
+    if (type == InternetAddressType.unix) {
+      ArgumentError.checkNotNull(address, 'address');
+      var rawAddress = FileSystemEntity._toUtf8Array(address);
+      return _InternetAddress(
+          InternetAddressType.unix, address, null, rawAddress);
+    } else {
+      if (address is! String) {
+        throw ArgumentError("Invalid internet address $address");
+      }
+      var in_addr = _parse(address);
+      if (in_addr == null) {
+        throw ArgumentError("Invalid internet address $address");
+      }
+      InternetAddressType type = in_addr.length == _IPv4AddrLength
+          ? InternetAddressType.IPv4
+          : InternetAddressType.IPv6;
+      return _InternetAddress(type, address, null, in_addr);
     }
-    var in_addr = _parse(address);
-    if (in_addr == null) {
-      throw new ArgumentError("Invalid internet address $address");
+  }
+
+  factory _InternetAddress.fromRawAddress(Uint8List rawAddress,
+      {InternetAddressType type}) {
+    if (type == InternetAddressType.unix) {
+      ArgumentError.checkNotNull(rawAddress, 'rawAddress');
+      var rawPath = FileSystemEntity._toNullTerminatedUtf8Array(rawAddress);
+      var address = FileSystemEntity._toStringFromUtf8Array(rawAddress);
+      return _InternetAddress(InternetAddressType.unix, address, null, rawPath);
+    } else {
+      int type = -1;
+      if (rawAddress.length == _IPv4AddrLength) {
+        type = 0;
+      } else {
+        if (rawAddress.length != _IPv6AddrLength) {
+          throw ArgumentError("Invalid internet address ${rawAddress}");
+        }
+        type = 1;
+      }
+      var address = _rawAddrToString(rawAddress);
+      return _InternetAddress(
+          InternetAddressType._from(type), address, null, rawAddress);
     }
-    return new _InternetAddress(address, null, in_addr);
   }
 
   factory _InternetAddress.fixed(int id) {
     switch (id) {
       case _addressLoopbackIPv4:
-        var in_addr = new Uint8List(_IPv4AddrLength);
+        var in_addr = Uint8List(_IPv4AddrLength);
         in_addr[0] = 127;
         in_addr[_IPv4AddrLength - 1] = 1;
-        return new _InternetAddress("127.0.0.1", null, in_addr);
+        return _InternetAddress(
+            InternetAddressType.IPv4, "127.0.0.1", null, in_addr);
       case _addressLoopbackIPv6:
-        var in_addr = new Uint8List(_IPv6AddrLength);
+        var in_addr = Uint8List(_IPv6AddrLength);
         in_addr[_IPv6AddrLength - 1] = 1;
-        return new _InternetAddress("::1", null, in_addr);
+        return _InternetAddress(InternetAddressType.IPv6, "::1", null, in_addr);
       case _addressAnyIPv4:
-        var in_addr = new Uint8List(_IPv4AddrLength);
-        return new _InternetAddress("0.0.0.0", "0.0.0.0", in_addr);
+        var in_addr = Uint8List(_IPv4AddrLength);
+        return _InternetAddress(
+            InternetAddressType.IPv4, "0.0.0.0", "0.0.0.0", in_addr);
       case _addressAnyIPv6:
-        var in_addr = new Uint8List(_IPv6AddrLength);
-        return new _InternetAddress("::", "::", in_addr);
+        var in_addr = Uint8List(_IPv6AddrLength);
+        return _InternetAddress(InternetAddressType.IPv6, "::", "::", in_addr);
       default:
         assert(false);
-        throw new ArgumentError();
+        throw ArgumentError();
     }
   }
 
   // Create a clone of this _InternetAddress replacing the host.
   _InternetAddress _cloneWithNewHost(String host) {
-    return new _InternetAddress(
-        address, host, new Uint8List.fromList(_in_addr));
+    return _InternetAddress(type, address, host, Uint8List.fromList(_in_addr));
   }
 
   bool operator ==(other) {
     if (!(other is _InternetAddress)) return false;
     if (other.type != type) return false;
+    if (type == InternetAddressType.unix) {
+      return address == other.address;
+    }
     bool equals = true;
     for (int i = 0; i < _in_addr.length && equals; i++) {
       equals = other._in_addr[i] == _in_addr[i];
@@ -242,6 +297,9 @@
   }
 
   int get hashCode {
+    if (type == InternetAddressType.unix) {
+      return address.hashCode;
+    }
     int result = 1;
     for (int i = 0; i < _in_addr.length; i++) {
       result = (result * 31 + _in_addr[i]) & 0x3FFFFFFF;
@@ -253,6 +311,9 @@
     return "InternetAddress('$address', ${type.name})";
   }
 
+  static String _rawAddrToString(Uint8List address)
+      native "InternetAddress_RawAddrToString";
+
   static Uint8List _parse(String address) native "InternetAddress_Parse";
 }
 
@@ -394,8 +455,8 @@
         throw createError(response, "Failed host lookup: '$host'");
       } else {
         return response.skip(1).map<InternetAddress>((result) {
-          var type = new InternetAddressType._from(result[0]);
-          return new _InternetAddress(result[1], host, result[2], result[3]);
+          var type = InternetAddressType._from(result[0]);
+          return _InternetAddress(type, result[1], host, result[2], result[3]);
         }).toList();
       }
     });
@@ -423,10 +484,10 @@
       } else {
         var map = response.skip(1).fold(new Map<String, NetworkInterface>(),
             (map, result) {
-          var type = new InternetAddressType._from(result[0]);
+          var type = InternetAddressType._from(result[0]);
           var name = result[3];
           var index = result[4];
-          var address = new _InternetAddress(result[1], "", result[2]);
+          var address = _InternetAddress(type, result[1], "", result[2]);
           if (!includeLinkLocal && address.isLinkLocal) return map;
           if (!includeLoopback && address.isLoopback) return map;
           map.putIfAbsent(name, () => new _NetworkInterface(name, index));
@@ -505,12 +566,23 @@
         socket.localAddress = address;
         var result;
         if (sourceAddress == null) {
-          result = socket.nativeCreateConnect(
-              address._in_addr, port, address._scope_id);
+          if (address.type == InternetAddressType.unix) {
+            result = socket.nativeCreateUnixDomainConnect(
+                address.address, _Namespace._namespace);
+          } else {
+            result = socket.nativeCreateConnect(
+                address._in_addr, port, address._scope_id);
+          }
         } else {
           assert(sourceAddress is _InternetAddress);
-          result = socket.nativeCreateBindConnect(address._in_addr, port,
-              sourceAddress._in_addr, address._scope_id);
+          if (address.type == InternetAddressType.unix) {
+            assert(sourceAddress.type == InternetAddressType.unix);
+            result = socket.nativeCreateUnixDomainBindConnect(
+                address.address, sourceAddress.address, _Namespace._namespace);
+          } else {
+            result = socket.nativeCreateBindConnect(address._in_addr, port,
+                sourceAddress._in_addr, address._scope_id);
+          }
         }
         if (result is OSError) {
           // Keep first error, if present.
@@ -642,8 +714,18 @@
 
     var socket = new _NativeSocket.listen();
     socket.localAddress = address;
-    var result = socket.nativeCreateBindListen(
-        address._in_addr, port, backlog, v6Only, shared, address._scope_id);
+    var result;
+    if (address.type == InternetAddressType.unix) {
+      var path = address.address;
+      if (FileSystemEntity.isLinkSync(path)) {
+        path = Link(path).targetSync();
+      }
+      result = socket.nativeCreateUnixDomainBindListen(
+          path, backlog, shared, _Namespace._namespace);
+    } else {
+      result = socket.nativeCreateBindListen(
+          address._in_addr, port, backlog, v6Only, shared, address._scope_id);
+    }
     if (result is OSError) {
       throw new SocketException("Failed to create server socket",
           osError: result, address: address, port: port);
@@ -885,12 +967,14 @@
   }
 
   int get port {
+    if (localAddress.type == InternetAddressType.unix) return 0;
     if (localPort != 0) return localPort;
     if (isClosing || isClosed) throw const SocketException.closed();
     return localPort = nativeGetPort();
   }
 
   int get remotePort {
+    if (localAddress.type == InternetAddressType.unix) return 0;
     if (isClosing || isClosed) throw const SocketException.closed();
     return nativeGetRemotePeer()[1];
   }
@@ -902,7 +986,11 @@
     var result = nativeGetRemotePeer();
     var addr = result[0];
     var type = new InternetAddressType._from(addr[0]);
-    return new _InternetAddress(addr[1], null, addr[2]);
+    if (type == InternetAddressType.unix) {
+      return _InternetAddress.fromString(addr[1],
+          type: InternetAddressType.unix);
+    }
+    return _InternetAddress(type, addr[1], null, addr[2]);
   }
 
   void issueReadEvent() {
@@ -1247,11 +1335,17 @@
       int port) native "Socket_SendTo";
   nativeCreateConnect(Uint8List addr, int port, int scope_id)
       native "Socket_CreateConnect";
+  nativeCreateUnixDomainConnect(String addr, _Namespace namespace)
+      native "Socket_CreateUnixDomainConnect";
   nativeCreateBindConnect(Uint8List addr, int port, Uint8List sourceAddr,
       int scope_id) native "Socket_CreateBindConnect";
+  nativeCreateUnixDomainBindConnect(String addr, String sourceAddr,
+      _Namespace namespace) native "Socket_CreateUnixDomainBindConnect";
   bool isBindError(int errorNumber) native "SocketBase_IsBindError";
   nativeCreateBindListen(Uint8List addr, int port, int backlog, bool v6Only,
       bool shared, int scope_id) native "ServerSocket_CreateBindListen";
+  nativeCreateUnixDomainBindListen(String addr, int backlog, bool shared,
+      _Namespace namespace) native "ServerSocket_CreateUnixDomainBindListen";
   nativeCreateBindDatagram(Uint8List addr, int port, bool reuseAddress,
       bool reusePort, int ttl) native "Socket_CreateBindDatagram";
   bool nativeAccept(_NativeSocket socket) native "ServerSocket_Accept";
@@ -2090,6 +2184,9 @@
 
 @pragma("vm:entry-point", "call")
 Datagram _makeDatagram(
-    Uint8List data, String address, Uint8List in_addr, int port) {
-  return new Datagram(data, new _InternetAddress(address, null, in_addr), port);
+    Uint8List data, String address, Uint8List in_addr, int port, int type) {
+  return new Datagram(
+      data,
+      _InternetAddress(InternetAddressType._from(type), address, null, in_addr),
+      port);
 }
diff --git a/sdk/lib/_internal/vm/bin/sync_socket_patch.dart b/sdk/lib/_internal/vm/bin/sync_socket_patch.dart
index d98649e..bccdd4f 100644
--- a/sdk/lib/_internal/vm/bin/sync_socket_patch.dart
+++ b/sdk/lib/_internal/vm/bin/sync_socket_patch.dart
@@ -144,7 +144,12 @@
       throw result;
     }
     var addr = result[0];
-    return new _InternetAddress(addr[1], null, addr[2]);
+    var type = InternetAddressType._from(addr[0]);
+    if (type == InternetAddressType.unix) {
+      return _InternetAddress.fromString(addr[1],
+          type: InternetAddressType.unix);
+    }
+    return _InternetAddress(type, addr[1], null, addr[2]);
   }
 
   int get remotePort {
@@ -188,7 +193,8 @@
         new List<_InternetAddress>(response.length);
     for (int i = 0; i < response.length; ++i) {
       var result = response[i];
-      addresses[i] = new _InternetAddress(result[1], host, result[2]);
+      var type = InternetAddressType._from(result[0]);
+      addresses[i] = _InternetAddress(type, result[1], host, result[2]);
     }
     return addresses;
   }
diff --git a/sdk/lib/_internal/vm/lib/async_patch.dart b/sdk/lib/_internal/vm/lib/async_patch.dart
index 85de9dc..9d730ab 100644
--- a/sdk/lib/_internal/vm/lib/async_patch.dart
+++ b/sdk/lib/_internal/vm/lib/async_patch.dart
@@ -35,7 +35,8 @@
     }
   }
 
-  void completeError(e, [st]) {
+  void completeError(Object e, [StackTrace st]) {
+    st ??= AsyncError.defaultStackTrace(e);
     if (isSync) {
       _future._completeError(e, st);
     } else {
@@ -79,7 +80,7 @@
 // parameter to the continuation.  See vm/ast_transformer.cc for usage.
 Function _asyncErrorWrapperHelper(continuation) {
   // See comments of `_asyncThenWrapperHelper`.
-  var errorCallback = (e, s) => continuation(null, e, s);
+  void errorCallback(Object e, StackTrace s) => continuation(null, e, s);
   if (Zone.current == Zone.root) return errorCallback;
   return Zone.current.registerBinaryCallback(errorCallback);
 }
diff --git a/sdk/lib/_internal/vm/lib/compact_hash.dart b/sdk/lib/_internal/vm/lib/compact_hash.dart
index 112b9ba..da431134 100644
--- a/sdk/lib/_internal/vm/lib/compact_hash.dart
+++ b/sdk/lib/_internal/vm/lib/compact_hash.dart
@@ -468,6 +468,7 @@
 }
 
 // Set implementation, analogous to _CompactLinkedHashMap.
+@pragma('vm:entry-point')
 class _CompactLinkedHashSet<E> extends _HashFieldBase
     with _HashBase, _OperatorEqualsAndHashCode, SetMixin<E>
     implements LinkedHashSet<E> {
diff --git a/sdk/lib/async/broadcast_stream_controller.dart b/sdk/lib/async/broadcast_stream_controller.dart
index 09ab783..6a62e0b 100644
--- a/sdk/lib/async/broadcast_stream_controller.dart
+++ b/sdk/lib/async/broadcast_stream_controller.dart
@@ -260,6 +260,7 @@
       error = _nonNullError(replacement.error);
       stackTrace = replacement.stackTrace;
     }
+    stackTrace ??= AsyncError.defaultStackTrace(error);
     _sendError(error, stackTrace);
   }
 
@@ -481,6 +482,7 @@
 
   void addError(Object error, [StackTrace stackTrace]) {
     ArgumentError.checkNotNull(error, "error");
+    stackTrace ??= AsyncError.defaultStackTrace(error);
     if (!isClosed && _isFiring) {
       _addPendingEvent(new _DelayedError(error, stackTrace));
       return;
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
index a0e35b5..19bb7c4 100644
--- a/sdk/lib/async/future.dart
+++ b/sdk/lib/async/future.dart
@@ -280,6 +280,7 @@
         stackTrace = replacement.stackTrace;
       }
     }
+    stackTrace ??= AsyncError.defaultStackTrace(error);
     return new _Future<T>.immediateError(error, stackTrace);
   }
 
@@ -363,7 +364,7 @@
     // Handle an error from any of the futures.
     // TODO(jmesserly): use `void` return type once it can be inferred for the
     // `then` call below.
-    handleError(theError, StackTrace theStackTrace) {
+    handleError(Object theError, StackTrace theStackTrace) {
       remaining--;
       if (values != null) {
         if (cleanUp != null) {
@@ -905,13 +906,14 @@
 }
 
 // Helper function completing a _Future with error, but checking the zone
-// for error replacement first.
+// for error replacement first and missing stack trace.
 void _completeWithErrorCallback(_Future result, error, StackTrace stackTrace) {
   AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
   if (replacement != null) {
     error = _nonNullError(replacement.error);
     stackTrace = replacement.stackTrace;
   }
+  stackTrace ??= AsyncError.defaultStackTrace(error);
   result._completeError(error, stackTrace);
 }
 
@@ -923,6 +925,7 @@
     error = _nonNullError(replacement.error);
     stackTrace = replacement.stackTrace;
   }
+  stackTrace ??= AsyncError.defaultStackTrace(error);
   result._asyncCompleteError(error, stackTrace);
 }
 
diff --git a/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart
index e2b548b..c7cefce 100644
--- a/sdk/lib/async/future_impl.dart
+++ b/sdk/lib/async/future_impl.dart
@@ -26,6 +26,7 @@
       error = _nonNullError(replacement.error);
       stackTrace = replacement.stackTrace;
     }
+    stackTrace ??= AsyncError.defaultStackTrace(error);
     _completeError(error, stackTrace);
   }
 
@@ -229,7 +230,7 @@
     _setValue(value);
   }
 
-  _Future.immediateError(var error, [StackTrace stackTrace])
+  _Future.immediateError(var error, StackTrace stackTrace)
       : _zone = Zone.current {
     _asyncCompleteError(error, stackTrace);
   }
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index 203178a..21bc370 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -156,7 +156,7 @@
   factory Stream.error(Object error, [StackTrace stackTrace]) {
     ArgumentError.checkNotNull(error, "error");
     return (_AsyncStreamController<T>(null, null, null, null)
-          .._addError(error, stackTrace)
+          .._addError(error, stackTrace ?? AsyncError.defaultStackTrace(error))
           .._closeUnchecked())
         .stream;
   }
diff --git a/sdk/lib/async/stream_controller.dart b/sdk/lib/async/stream_controller.dart
index b54ddac..3b5694f 100644
--- a/sdk/lib/async/stream_controller.dart
+++ b/sdk/lib/async/stream_controller.dart
@@ -611,6 +611,7 @@
       error = _nonNullError(replacement.error);
       stackTrace = replacement.stackTrace;
     }
+    stackTrace ??= AsyncError.defaultStackTrace(error);
     _addError(error, stackTrace);
   }
 
diff --git a/sdk/lib/async/stream_transformers.dart b/sdk/lib/async/stream_transformers.dart
index 41c963f..243e934 100644
--- a/sdk/lib/async/stream_transformers.dart
+++ b/sdk/lib/async/stream_transformers.dart
@@ -18,7 +18,7 @@
   }
 
   void addError(error, [StackTrace stackTrace]) {
-    _sink._addError(error, stackTrace);
+    _sink._addError(error, stackTrace ?? AsyncError.defaultStackTrace(error));
   }
 
   void close() {
@@ -239,6 +239,7 @@
       throw StateError("Sink is closed");
     }
     if (_handleError != null) {
+      stackTrace ??= AsyncError.defaultStackTrace(error);
       _handleError(error, stackTrace, _sink);
     } else {
       _sink.addError(error, stackTrace);
diff --git a/sdk/lib/async/zone.dart b/sdk/lib/async/zone.dart
index 83c0a80..82626a6 100644
--- a/sdk/lib/async/zone.dart
+++ b/sdk/lib/async/zone.dart
@@ -43,10 +43,24 @@
   final Object error;
   final StackTrace stackTrace;
 
-  AsyncError(this.error, this.stackTrace) {
+  AsyncError(this.error, StackTrace stackTrace)
+      : stackTrace = stackTrace ?? defaultStackTrace(error) {
     ArgumentError.checkNotNull(error, "error");
   }
 
+  /// A default stack trace for an error.
+  ///
+  /// If [error] is an [Error] and it has an [Error.stackTrace],
+  /// that stack trace is returned.
+  /// If not, the [StackTrace.empty] default stack trace is returned.
+  static StackTrace defaultStackTrace(Object error) {
+    if (error is Error) {
+      var stackTrace = error.stackTrace;
+      if (stackTrace != null) return stackTrace;
+    }
+    return StackTrace.empty;
+  }
+
   String toString() => '$error';
 }
 
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index bb12431..e1a2672 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -184,10 +184,16 @@
 
   /**
    * Throws if [argument] is `null`.
+   *
+   * If [name] is supplied, it is used as the parameter name
+   * in the error message.
+   *
+   * Returns the [argument] if it is not null.
    */
   @Since("2.1")
-  static void checkNotNull(Object argument, [String name]) {
+  static T checkNotNull<@Since("2.8") T>(T argument, [String name]) {
     if (argument == null) throw ArgumentError.notNull(name);
+    return argument;
   }
 
   // Helper functions for toString overridden in subclasses.
@@ -279,30 +285,42 @@
       [String name, String message, int length]) = IndexError;
 
   /**
-   * Check that a [value] lies in a specific interval.
+   * Check that an integer [value] lies in a specific interval.
    *
    * Throws if [value] is not in the interval.
    * The interval is from [minValue] to [maxValue], both inclusive.
+   *
+   * If [name] or [message] are provided, they are used as the parameter
+   * name and message text of the thrown error.
+   *
+   * Returns [value] if it is in the interval.
    */
-  static void checkValueInInterval(int value, int minValue, int maxValue,
+  static int checkValueInInterval(int value, int minValue, int maxValue,
       [String name, String message]) {
     if (value < minValue || value > maxValue) {
       throw RangeError.range(value, minValue, maxValue, name, message);
     }
+    return value;
   }
 
   /**
-   * Check that a value is a valid index into an indexable object.
+   * Check that [index] is a valid index into an indexable object.
    *
    * Throws if [index] is not a valid index into [indexable].
    *
    * An indexable object is one that has a `length` and a and index-operator
    * `[]` that accepts an index if `0 <= index < length`.
    *
+   * If [name] or [message] are provided, they are used as the parameter
+   * name and message text of the thrown error. If [name] is omitted, it
+   * defaults to `"index"`.
+   *
    * If [length] is provided, it is used as the length of the indexable object,
    * otherwise the length is found as `indexable.length`.
+   *
+   * Returns [index] if it is a valid index.
    */
-  static void checkValidIndex(int index, dynamic indexable,
+  static int checkValidIndex(int index, dynamic indexable,
       [String name, int length, String message]) {
     length ??= indexable.length;
     // Comparing with `0` as receiver produces better dart2js type inference.
@@ -310,6 +328,7 @@
       name ??= "index";
       throw RangeError.index(index, indexable, name, message, length);
     }
+    return index;
   }
 
   /**
@@ -347,12 +366,19 @@
   }
 
   /**
-   * Check that an integer value isn't negative.
+   * Check that an integer value is non-negative.
    *
    * Throws if the value is negative.
+   *
+   * If [name] or [message] are provided, they are used as the parameter
+   * name and message text of the thrown error. If [name] is omitted, it
+   * defaults to `index`.
+   *
+   * Returns [value] if it is not negative.
    */
-  static void checkNotNegative(int value, [String name, String message]) {
+  static int checkNotNegative(int value, [String name, String message]) {
     if (value < 0) throw RangeError.range(value, 0, null, name, message);
+    return value;
   }
 
   String get _errorName => "RangeError";
diff --git a/sdk/lib/core/stacktrace.dart b/sdk/lib/core/stacktrace.dart
index ed5f85d..3715730 100644
--- a/sdk/lib/core/stacktrace.dart
+++ b/sdk/lib/core/stacktrace.dart
@@ -16,6 +16,13 @@
  * them programmatically.
  */
 abstract class StackTrace {
+  /// A stack trace object with no information.
+  ///
+  /// This stack trace is used as the default in situations where
+  /// a stack trace is required, but the user has not supplied one.
+  @Since("2.8")
+  static const empty = const _StringStackTrace("");
+
   StackTrace(); // In case existing classes extend StackTrace.
 
   /**
@@ -57,6 +64,6 @@
 
 class _StringStackTrace implements StackTrace {
   final String _stackTrace;
-  _StringStackTrace(this._stackTrace);
+  const _StringStackTrace(this._stackTrace);
   String toString() => _stackTrace;
 }
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index e09b761..3f8332f 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -13770,6 +13770,14 @@
          if (!(element.attributes instanceof NamedNodeMap)) {
 	   return true;
 	 }
+         // If something has corrupted the traversal we want to detect
+         // these on not only the children (tested below) but on the node itself
+         // in case it was bypassed.
+         if (element["id"] == 'lastChild' || element["name"] == 'lastChild' ||
+             element["id"] == 'previousSibling' || element["name"] == 'previousSibling' ||
+             element["id"] == 'children' || element["name"] == 'children') {
+           return true;
+         }
 	 var childNodes = element.childNodes;
 	 if (element.lastChild &&
 	     element.lastChild !== childNodes[childNodes.length -1]) {
@@ -13795,6 +13803,7 @@
            // allowing us to check for clobbering that may show up in other accesses.
            if (child["id"] == 'attributes' || child["name"] == 'attributes' ||
                child["id"] == 'lastChild'  || child["name"] == 'lastChild' ||
+               child["id"] == 'previousSibling'  || child["name"] == 'previousSibling' ||
                child["id"] == 'children' || child["name"] == 'children') {
              return true;
            }
@@ -40773,6 +40782,9 @@
  */
 class _ValidatingTreeSanitizer implements NodeTreeSanitizer {
   NodeValidator validator;
+
+  /// Did we modify the tree by removing anything.
+  bool modifiedTree = false;
   _ValidatingTreeSanitizer(this.validator) {}
 
   void sanitizeTree(Node node) {
@@ -40781,11 +40793,15 @@
 
       var child = node.lastChild;
       while (null != child) {
-        var nextChild;
+        Node nextChild;
         try {
-          // Child may be removed during the walk, and we may not
-          // even be able to get its previousNode.
+          // Child may be removed during the walk, and we may not even be able
+          // to get its previousNode. But it's also possible that previousNode
+          // (i.e. previousSibling) is being spoofed, so double-check it.
           nextChild = child.previousNode;
+          if (nextChild != null && nextChild.nextNode != child) {
+            throw StateError("Corrupt HTML");
+          }
         } catch (e) {
           // Child appears bad, remove it. We want to check the rest of the
           // children of node and, but we have no way of getting to the next
@@ -40799,7 +40815,12 @@
       }
     }
 
+    modifiedTree = false;
     walk(node, null);
+    while (modifiedTree) {
+      modifiedTree = false;
+      walk(node, null);
+    }
   }
 
   /// Aggressively try to remove node.
@@ -40807,7 +40828,8 @@
     // If we have the parent, it's presumably already passed more sanitization
     // or is the fragment, so ask it to remove the child. And if that fails
     // try to set the outer html.
-    if (parent == null) {
+    modifiedTree = true;
+    if (parent == null || parent != node.parentNode) {
       node.remove();
     } else {
       parent._removeChild(node);
diff --git a/sdk/lib/io/socket.dart b/sdk/lib/io/socket.dart
index 2b7edeb..283a30a 100644
--- a/sdk/lib/io/socket.dart
+++ b/sdk/lib/io/socket.dart
@@ -8,11 +8,15 @@
 
 /**
  * [InternetAddressType] is the type an [InternetAddress]. Currently,
- * IP version 4 (IPv4) and IP version 6 (IPv6) are supported.
+ * IP version 4 (IPv4), IP version 6 (IPv6) and Unix domain address are
+ * supported. Unix domain sockets are available only on Linux, MacOS and
+ * Android.
  */
 class InternetAddressType {
   static const InternetAddressType IPv4 = const InternetAddressType._(0);
   static const InternetAddressType IPv6 = const InternetAddressType._(1);
+  @Since("2.8")
+  static const InternetAddressType unix = const InternetAddressType._(2);
   static const InternetAddressType any = const InternetAddressType._(-1);
 
   @Deprecated("Use IPv4 instead")
@@ -27,8 +31,9 @@
   const InternetAddressType._(this._value);
 
   factory InternetAddressType._from(int value) {
-    if (value == 0) return IPv4;
-    if (value == 1) return IPv6;
+    if (value == IPv4._value) return IPv4;
+    if (value == IPv6._value) return IPv6;
+    if (value == unix._value) return unix;
     throw new ArgumentError("Invalid type: $value");
   }
 
@@ -43,6 +48,8 @@
         return "IPv4";
       case 1:
         return "IPv6";
+      case 2:
+        return "Unix";
       default:
         throw new ArgumentError("Invalid InternetAddress");
     }
@@ -52,7 +59,7 @@
 }
 
 /**
- * An internet address.
+ * An internet address or a Unix domain address.
  *
  * This object holds an internet address. If this internet address
  * is the result of a DNS lookup, the address also holds the hostname
@@ -95,27 +102,35 @@
   external static InternetAddress get ANY_IP_V6;
 
   /**
-   * The [type] of the [InternetAddress] specified what IP protocol.
+   * The address family of the [InternetAddress].
    */
   InternetAddressType get type;
 
   /**
-   * The numeric address of the host. For IPv4 addresses this is using
-   * the dotted-decimal notation. For IPv6 it is using the
-   * hexadecimal representation.
+   * The numeric address of the host.
+   *
+   * For IPv4 addresses this is using the dotted-decimal notation.
+   * For IPv6 it is using the hexadecimal representation.
+   * For Unix domain addresses, this is a file path.
    */
   String get address;
 
   /**
-   * The host used to lookup the address. If there is no host
-   * associated with the address this returns the numeric address.
+   * The host used to lookup the address.
+   *
+   * If there is no host associated with the address this returns the [address].
    */
   String get host;
 
   /**
-   * Get the raw address of this [InternetAddress]. The result is either a
-   * 4 or 16 byte long list. The returned list is a copy, making it possible
-   * to change the list without modifying the [InternetAddress].
+   * The raw address of this [InternetAddress].
+   *
+   * For an IP address, the result is either a 4 or 16 byte long list.
+   * For a Unix domain address, UTF-8 encoded byte sequences that represents
+   * [address] is returned.
+   *
+   * The returned list is a fresh copy, making it possible to change the list without
+   * modifying the [InternetAddress].
    */
   Uint8List get rawAddress;
 
@@ -135,17 +150,48 @@
   bool get isMulticast;
 
   /**
-   * Creates a new [InternetAddress] from a numeric address.
+   * Creates a new [InternetAddress] from a numeric address or a file path.
    *
-   * If the address in [address] is not a numeric IPv4
-   * (dotted-decimal notation) or IPv6 (hexadecimal representation).
-   * address [ArgumentError] is thrown.
+   * If [type] is [InternetAddressType.IPv4], [address] must be a numeric IPv4
+   * address (dotted-decimal notation).
+   * If [type] is [InternetAddressType.IPv6], [address] must be a numeric IPv6
+   * address (hexadecimal notation).
+   * If [type] is [InternetAddressType.unix], [address] must be a a valid file
+   * path.
+   * If [type] is omitted, [address] must be either a numeric IPv4 or IPv6
+   * address and the type is inferred from the format.
+   *
+   * To create a Unix domain address, [type] should be
+   * [InternetAddressType.unix] and [address] should be a string.
    */
-  external factory InternetAddress(String address);
+  external factory InternetAddress(String address,
+      {@Since("2.8") InternetAddressType type});
 
   /**
-   * Perform a reverse dns lookup on the [address], creating a new
-   * [InternetAddress] where the host field set to the result.
+   * Creates a new [InternetAddress] from the provided raw address bytes.
+   *
+   * If the [type] is [InternetAddressType.IPv4], the [rawAddress] must have
+   * length 4.
+   * If the [type] is [InternetAddressType.IPv6], the [rawAddress] must have
+   * length 16.
+   * If the [type] is [InternetAddressType.IPv4], the [rawAddress] must be a
+   * valid UTF-8 encoded file path.
+   *
+   * If [type] is omitted, the [rawAddress] must have a length of either 4 or
+   * 16, in which case the type defaults to [InternetAddress.IPv4] or
+   * [InternetAddress.IPv6] respectively.
+   */
+  external factory InternetAddress.fromRawAddress(Uint8List rawAddress,
+      {@Since("2.8") InternetAddressType type});
+
+  /**
+   * Perform a reverse DNS lookup on this [address]
+   *
+   * Returns a new [InternetAddress] with the same address, but where the [host]
+   * field set to the result of the lookup.
+   *
+   * If this address is Unix domain addresses, no lookup is performed and this
+   * address is returned directly.
    */
   Future<InternetAddress> reverse();
 
@@ -826,28 +872,30 @@
   void setRawOption(RawSocketOption option);
 
   /**
-   * Returns the port used by this socket.
+   * The port used by this socket.
    *
    * Throws a [SocketException] if the socket is closed.
+   * The port is 0 if the socket is a Unix domain socket.
    */
   int get port;
 
   /**
-   * Returns the remote port connected to by this socket.
+   * The remote port connected to by this socket.
    *
    * Throws a [SocketException] if the socket is closed.
+   * The port is 0 if the socket is a Unix domain socket.
    */
   int get remotePort;
 
   /**
-   * Returns the [InternetAddress] used to connect this socket.
+   * The [InternetAddress] used to connect this socket.
    *
    * Throws a [SocketException] if the socket is closed.
    */
   InternetAddress get address;
 
   /**
-   * Returns the remote [InternetAddress] connected to by this socket.
+   * The remote [InternetAddress] connected to by this socket.
    *
    * Throws a [SocketException] if the socket is closed.
    */
diff --git a/sdk_nnbd/lib/_http/http.dart b/sdk_nnbd/lib/_http/http.dart
index fb662c6..551ab65 100644
--- a/sdk_nnbd/lib/_http/http.dart
+++ b/sdk_nnbd/lib/_http/http.dart
@@ -142,7 +142,8 @@
    *
    * The default value is `null`.
    */
-  String? serverHeader;
+  String? get serverHeader;
+  void set serverHeader(String? newServerHeader);
 
   /**
    * Default set of headers added to all response objects.
@@ -169,7 +170,8 @@
    * The default value is `false` (compression disabled).
    * To enable, set `autoCompress` to `true`.
    */
-  bool autoCompress;
+  bool get autoCompress;
+  void set autoCompress(bool newAutoCompress);
 
   /**
    * Gets or sets the timeout used for idle keep-alive connections. If no
@@ -183,7 +185,8 @@
    *
    * To disable, set [idleTimeout] to `null`.
    */
-  Duration? idleTimeout;
+  Duration? get idleTimeout;
+  void set idleTimeout(Duration? newIdleTimeout);
 
   /**
    * Starts listening for HTTP requests on the specified [address] and
@@ -772,6 +775,11 @@
  * [HeaderValue] can be used to conveniently build and parse header
  * values on this form.
  *
+ * Parameter values can be omitted, in which case the value is parsed as `null`.
+ * Values can be doubled quoted to allow characters outside of the RFC 7230
+ * token characters and backslash sequences can be used to represent the double
+ * quote and backslash characters themselves.
+ *
  * To build an "accepts" header with the value
  *
  *     text/plain; q=0.3, text/html
@@ -798,7 +806,8 @@
   /**
    * Creates a new header value object setting the value and parameters.
    */
-  factory HeaderValue([String value = "", Map<String, String>? parameters]) {
+  factory HeaderValue(
+      [String value = "", Map<String, String?> parameters = const {}]) {
     return new _HeaderValue(value, parameters);
   }
 
@@ -826,7 +835,7 @@
    *
    * This map cannot be modified.
    */
-  Map<String, String> get parameters;
+  Map<String, String?> get parameters;
 
   /**
    * Returns the formatted string representation in the form:
@@ -916,7 +925,7 @@
    * or in `parameters`, will have its value converted to lower-case.
    */
   factory ContentType(String primaryType, String subType,
-      {String? charset, Map<String, String>? parameters}) {
+      {String? charset, Map<String, String?> parameters = const {}}) {
     return new _ContentType(primaryType, subType, charset, parameters);
   }
 
@@ -988,7 +997,8 @@
    * `(`, `)`, `<`, `>`, `@`, `,`, `;`, `:`, `\`, `"`, `/`, `[`, `]`, `?`, `=`,
    * `{`, and `}`.
    */
-  String name;
+  String get name;
+  void set name(String newName);
 
   /**
    * The value of the cookie.
@@ -1001,39 +1011,46 @@
    * Cookie values may be wrapped in a single pair of double quotes
    * (U+0022, `"`).
    */
-  String value;
+  String get value;
+  void set value(String newValue);
 
   /**
    * The time at which the cookie expires.
    */
-  DateTime? expires;
+  DateTime? get expires;
+  void set expires(DateTime? newExpires);
 
   /**
    * The number of seconds until the cookie expires. A zero or negative value
    * means the cookie has expired.
    */
-  int? maxAge;
+  int? get maxAge;
+  void set maxAge(int? newMaxAge);
 
   /**
    * The domain that the cookie applies to.
    */
-  String? domain;
+  String? get domain;
+  void set domain(String? newDomain);
 
   /**
    * The path within the [domain] that the cookie applies to.
    */
-  String? path;
+  String? get path;
+  void set path(String? newPath);
 
   /**
    * Whether to only send this cookie on secure connections.
    */
-  bool secure;
+  bool get secure;
+  void set secure(bool newSecure);
 
   /**
    * Whether the cookie is only sent in the HTTP request and is not made
    * available to client side scripts.
    */
-  bool httpOnly;
+  bool get httpOnly;
+  void set httpOnly(bool newHttpOnly);
 
   /**
    * Creates a new cookie setting the name and value.
@@ -1490,7 +1507,8 @@
   /// connections.
   ///
   /// The default value is 15 seconds.
-  Duration idleTimeout;
+  Duration get idleTimeout;
+  void set idleTimeout(Duration newIdleTimeout);
 
   /// Gets and sets the connection timeout.
   ///
@@ -1500,7 +1518,8 @@
   ///
   /// When this is `null`, the OS default timeout is used. The default is
   /// `null`.
-  Duration? connectionTimeout;
+  Duration? get connectionTimeout;
+  void set connectionTimeout(Duration? newConnectionTimeout);
 
   /**
    * Gets and sets the maximum number of live connections, to a single host.
@@ -1512,7 +1531,8 @@
    *
    * Default is `null`.
    */
-  int? maxConnectionsPerHost;
+  int? get maxConnectionsPerHost;
+  void set maxConnectionsPerHost(int? newMaxConnectionsPerHost);
 
   /**
    * Gets and sets whether the body of a response will be automatically
@@ -1540,7 +1560,8 @@
    *
    * Default is `true`.
    */
-  bool autoUncompress;
+  bool get autoUncompress;
+  void set autoUncompress(bool newAutoUncompress);
 
   /// Gets and sets the default value of the `User-Agent` header for all requests
   /// generated by this [HttpClient].
@@ -1549,7 +1570,8 @@
   ///
   /// If the userAgent is set to `null`, no default `User-Agent` header will be
   /// added to each request.
-  String? userAgent;
+  String? get userAgent;
+  void set userAgent(String? newUserAgent);
 
   factory HttpClient({SecurityContext? context}) {
     HttpOverrides? overrides = HttpOverrides.current;
diff --git a/sdk_nnbd/lib/_http/http_headers.dart b/sdk_nnbd/lib/_http/http_headers.dart
index 3fcdbe7..db3d7aa 100644
--- a/sdk_nnbd/lib/_http/http_headers.dart
+++ b/sdk_nnbd/lib/_http/http_headers.dart
@@ -648,12 +648,14 @@
 
 class _HeaderValue implements HeaderValue {
   String _value;
-  Map<String, String>? _parameters;
-  Map<String, String>? _unmodifiableParameters;
+  Map<String, String?>? _parameters;
+  Map<String, String?>? _unmodifiableParameters;
 
-  _HeaderValue([this._value = "", Map<String, String>? parameters]) {
-    if (parameters != null) {
-      _parameters = new HashMap<String, String>.from(parameters);
+  _HeaderValue([this._value = "", Map<String, String?> parameters = const {}]) {
+    // TODO(40614): Remove once non-nullability is sound.
+    Map<String, String?>? nullableParameters = parameters;
+    if (nullableParameters != null && nullableParameters.isNotEmpty) {
+      _parameters = new HashMap<String, String?>.from(nullableParameters);
     }
   }
 
@@ -669,23 +671,55 @@
 
   String get value => _value;
 
-  Map<String, String> _ensureParameters() =>
-      _parameters ??= HashMap<String, String>();
+  Map<String, String?> _ensureParameters() =>
+      _parameters ??= <String, String?>{};
 
-  Map<String, String> get parameters =>
+  Map<String, String?> get parameters =>
       _unmodifiableParameters ??= UnmodifiableMapView(_ensureParameters());
 
+  static bool _isToken(String token) {
+    if (token.isEmpty) {
+      return false;
+    }
+    final delimiters = "\"(),/:;<=>?@[\]{}";
+    for (int i = 0; i < token.length; i++) {
+      int codeUnit = token.codeUnitAt(i);
+      if (codeUnit <= 32 ||
+          codeUnit >= 127 ||
+          delimiters.indexOf(token[i]) >= 0) {
+        return false;
+      }
+    }
+    return true;
+  }
+
   String toString() {
     StringBuffer sb = new StringBuffer();
     sb.write(_value);
     var parameters = this._parameters;
     if (parameters != null && parameters.length > 0) {
-      parameters.forEach((String name, String value) {
-        sb
-          ..write("; ")
-          ..write(name)
-          ..write("=")
-          ..write(value == "" ? '""' : value);
+      parameters.forEach((String name, String? value) {
+        sb..write("; ")..write(name);
+        if (value != null) {
+          sb.write("=");
+          if (_isToken(value)) {
+            sb.write(value);
+          } else {
+            sb.write('"');
+            int start = 0;
+            for (int i = 0; i < value.length; i++) {
+              // Can use codeUnitAt here instead.
+              int codeUnit = value.codeUnitAt(i);
+              if (codeUnit == 92 /* backslash */ ||
+                  codeUnit == 34 /* double quote */) {
+                sb.write(value.substring(start, i));
+                sb.write(r'\');
+                start = i;
+              }
+            }
+            sb..write(value.substring(start))..write('"');
+          }
+        }
       });
     }
     return sb.toString();
@@ -724,8 +758,12 @@
       index++;
     }
 
-    void maybeExpect(String expected) {
-      if (s[index] == expected) index++;
+    bool maybeExpect(String expected) {
+      if (done() || !s.startsWith(expected, index)) {
+        return false;
+      }
+      index++;
+      return true;
     }
 
     void parseParameters() {
@@ -762,13 +800,13 @@
               index++;
             } else if (char == "\"") {
               index++;
-              break;
+              return sb.toString();
             }
             char = s[index];
             sb.write(char);
             index++;
           }
-          return sb.toString();
+          throw new HttpException("Failed to parse header value");
         } else {
           // Parse non-quoted value.
           return parseValue();
@@ -780,23 +818,18 @@
         if (done()) return;
         String name = parseParameterName();
         skipWS();
-        if (done()) {
-          parameters[name] = "";
-          return;
+        if (maybeExpect("=")) {
+          skipWS();
+          String value = parseParameterValue();
+          if (name == 'charset' && this is _ContentType) {
+            // Charset parameter of ContentTypes are always lower-case.
+            value = value.toLowerCase();
+          }
+          parameters[name] = value;
+          skipWS();
+        } else if (name.isNotEmpty) {
+          parameters[name] = null;
         }
-        maybeExpect("=");
-        skipWS();
-        if (done()) {
-          parameters[name] = "";
-          return;
-        }
-        String value = parseParameterValue();
-        if (name == 'charset' && this is _ContentType) {
-          // Charset parameter of ContentTypes are always lower-case.
-          value = value.toLowerCase();
-        }
-        parameters[name] = value;
-        skipWS();
         if (done()) return;
         // TODO: Implement support for multi-valued parameters.
         if (s[index] == valueSeparator) return;
@@ -805,7 +838,7 @@
     }
 
     skipWS();
-    _value = parseValue(); // TODO(39784): No _validateValue?
+    _value = parseValue();
     skipWS();
     if (done()) return;
     maybeExpect(parameterSeparator);
@@ -818,17 +851,23 @@
   String _subType = "";
 
   _ContentType(String primaryType, String subType, String? charset,
-      Map<String, String>? parameters)
+      Map<String, String?> parameters)
       : _primaryType = primaryType,
         _subType = subType,
         super("") {
+    // TODO(40614): Remove once non-nullability is sound.
+    String emptyIfNull(String? string) => string ?? "";
+    _primaryType = emptyIfNull(_primaryType);
+    _subType = emptyIfNull(_subType);
     _value = "$_primaryType/$_subType";
-    if (parameters != null) {
+    // TODO(40614): Remove once non-nullability is sound.
+    Map<String, String?>? nullableParameters = parameters;
+    if (nullableParameters != null) {
       var parameterMap = _ensureParameters();
-      parameters.forEach((String key, String value) {
+      nullableParameters.forEach((String key, String? value) {
         String lowerCaseKey = key.toLowerCase();
         if (lowerCaseKey == "charset") {
-          value = value.toLowerCase();
+          value = value?.toLowerCase();
         }
         parameterMap[lowerCaseKey] = value;
       });
diff --git a/sdk_nnbd/lib/_http/http_impl.dart b/sdk_nnbd/lib/_http/http_impl.dart
index 5b9782a..aeacfa3 100644
--- a/sdk_nnbd/lib/_http/http_impl.dart
+++ b/sdk_nnbd/lib/_http/http_impl.dart
@@ -666,7 +666,7 @@
     }
   }
 
-  void _completeDoneError(Object error, StackTrace? stackTrace) {
+  void _completeDoneError(Object error, StackTrace stackTrace) {
     if (!_doneCompleter.isCompleted) {
       _hasError = true;
       _doneCompleter.completeError(error, stackTrace);
@@ -693,7 +693,7 @@
           // No new stream, .close was called. Close _target.
           _closeTarget();
         }
-      }, onError: (Object error, StackTrace? stackTrace) {
+      }, onError: (Object error, StackTrace stackTrace) {
         if (_isBound) {
           // A new stream takes over - forward errors to that stream.
           _controllerCompleter!.completeError(error, stackTrace);
@@ -1715,7 +1715,7 @@
       if (incoming.statusCode == 100) {
         incoming.drain().then((_) {
           _subscription!.resume();
-        }).catchError((error, [StackTrace? stackTrace]) {
+        }).catchError((dynamic error, StackTrace stackTrace) {
           _nextResponseCompleter!.completeError(
               new HttpException(error.message, uri: _currentUri), stackTrace);
           _nextResponseCompleter = null;
@@ -1724,7 +1724,7 @@
         _nextResponseCompleter!.complete(incoming);
         _nextResponseCompleter = null;
       }
-    }, onError: (error, [StackTrace? stackTrace]) {
+    }, onError: (dynamic error, StackTrace stackTrace) {
       _nextResponseCompleter?.completeError(
           new HttpException(error.message, uri: _currentUri), stackTrace);
       _nextResponseCompleter = null;
@@ -1758,9 +1758,9 @@
     request.headers
       ..host = host
       ..port = port
-      .._add(HttpHeaders.acceptEncodingHeader, "gzip");
+      ..add(HttpHeaders.acceptEncodingHeader, "gzip");
     if (_httpClient.userAgent != null) {
-      request.headers._add(HttpHeaders.userAgentHeader, _httpClient.userAgent);
+      request.headers.add(HttpHeaders.userAgentHeader, _httpClient.userAgent!);
     }
     if (proxy.isAuthenticated) {
       // If the proxy configuration contains user information use that
@@ -2557,6 +2557,10 @@
           outgoing,
           _httpServer.defaultResponseHeaders,
           _httpServer.serverHeader);
+      // Parser found badRequest and sent out Response.
+      if (incoming.statusCode == HttpStatus.badRequest) {
+        response.statusCode = HttpStatus.badRequest;
+      }
       var request = new _HttpRequest(response, incoming, _httpServer, this);
       _streamFuture = outgoing.done.then((_) {
         response.deadline = null;
diff --git a/sdk_nnbd/lib/_http/http_parser.dart b/sdk_nnbd/lib/_http/http_parser.dart
index c5a480c..36a8a1a 100644
--- a/sdk_nnbd/lib/_http/http_parser.dart
+++ b/sdk_nnbd/lib/_http/http_parser.dart
@@ -246,6 +246,8 @@
   final List<int> _uriOrReasonPhrase = [];
   final List<int> _headerField = [];
   final List<int> _headerValue = [];
+  // The limit for method, uriOrReasonPhrase, header field and value
+  int _headerSizeLimit = 8 * 1024;
 
   int _httpVersion = _HttpVersion.UNDETERMINED;
   int _transferLength = -1;
@@ -255,9 +257,14 @@
 
   bool _noMessageBody = false;
   int _remainingContent = -1;
+  bool _contentLength = false;
+  bool _transferEncoding = false;
 
   _HttpHeaders? _headers;
 
+  // The limit for parsing chunk size
+  int _chunkSizeLimit = 0x7FFFFFFF;
+
   // The current incoming connection.
   _HttpIncoming? _incoming;
   StreamSubscription<Uint8List>? _socketSubscription;
@@ -429,7 +436,7 @@
             if (!_isTokenChar(byte)) {
               throw HttpException("Invalid request method");
             }
-            _method.add(byte);
+            _addWithValidation(_method, byte);
             if (!_requestParser) {
               throw HttpException("Invalid response line");
             }
@@ -455,12 +462,12 @@
           } else {
             // Did not parse HTTP version. Expect method instead.
             for (int i = 0; i < httpVersionIndex; i++) {
-              _method.add(_Const.HTTP[i]);
+              _addWithValidation(_method, _Const.HTTP[i]);
             }
             if (byte == _CharCode.SP) {
               _state = _State.REQUEST_LINE_URI;
             } else {
-              _method.add(byte);
+              _addWithValidation(_method, byte);
               _httpVersion = _HttpVersion.UNDETERMINED;
               if (!_requestParser) {
                 throw HttpException("Invalid response line");
@@ -507,7 +514,7 @@
                 byte == _CharCode.LF) {
               throw HttpException("Invalid request method");
             }
-            _method.add(byte);
+            _addWithValidation(_method, byte);
           }
           break;
 
@@ -522,7 +529,7 @@
             if (byte == _CharCode.CR || byte == _CharCode.LF) {
               throw HttpException("Invalid request, unexpected $byte in URI");
             }
-            _uriOrReasonPhrase.add(byte);
+            _addWithValidation(_uriOrReasonPhrase, byte);
           }
           break;
 
@@ -590,7 +597,7 @@
               throw HttpException(
                   "Invalid response, unexpected $byte in reason phrase");
             }
-            _uriOrReasonPhrase.add(byte);
+            _addWithValidation(_uriOrReasonPhrase, byte);
           }
           break;
 
@@ -613,7 +620,7 @@
             _index = _index - 1; // Make the new state see the LF again.
           } else {
             // Start of new header field.
-            _headerField.add(_toLowerCaseByte(byte));
+            _addWithValidation(_headerField, _toLowerCaseByte(byte));
             _state = _State.HEADER_FIELD;
           }
           break;
@@ -625,7 +632,7 @@
             if (!_isTokenChar(byte)) {
               throw HttpException("Invalid header field name, with $byte");
             }
-            _headerField.add(_toLowerCaseByte(byte));
+            _addWithValidation(_headerField, _toLowerCaseByte(byte));
           }
           break;
 
@@ -636,7 +643,7 @@
             _state = _State.HEADER_VALUE_FOLD_OR_END;
           } else if (byte != _CharCode.SP && byte != _CharCode.HT) {
             // Start of new header value.
-            _headerValue.add(byte);
+            _addWithValidation(_headerValue, byte);
             _state = _State.HEADER_VALUE;
           }
           break;
@@ -647,7 +654,7 @@
           } else if (byte == _CharCode.LF) {
             _state = _State.HEADER_VALUE_FOLD_OR_END;
           } else {
-            _headerValue.add(byte);
+            _addWithValidation(_headerValue, byte);
           }
           break;
 
@@ -662,9 +669,21 @@
           } else {
             String headerField = new String.fromCharCodes(_headerField);
             String headerValue = new String.fromCharCodes(_headerValue);
-            if (headerField == HttpHeaders.transferEncodingHeader &&
-                _caseInsensitiveCompare("chunked".codeUnits, _headerValue)) {
-              _chunked = true;
+            if (headerField == HttpHeaders.contentLengthHeader) {
+              // Content Length header should not have more than one occurance
+              // or coexist with Transfer Encoding header.
+              if (_contentLength || _transferEncoding) {
+                _statusCode = HttpStatus.badRequest;
+              }
+              _contentLength = true;
+            } else if (headerField == HttpHeaders.transferEncodingHeader) {
+              _transferEncoding = true;
+              if (_caseInsensitiveCompare("chunked".codeUnits, _headerValue)) {
+                _chunked = true;
+              }
+              if (_contentLength) {
+                _statusCode = HttpStatus.badRequest;
+              }
             }
             var headers = _headers!;
             if (headerField == HttpHeaders.connectionHeader) {
@@ -680,10 +699,10 @@
                     (isUpgrade && isResponse && isUpgradeCode)) {
                   _connectionUpgrade = true;
                 }
-                headers._add(headerField, tokens[i]);
+                headers.add(headerField, tokens[i]);
               }
             } else {
-              headers._add(headerField, headerValue);
+              headers.add(headerField, headerValue);
             }
             _headerField.clear();
             _headerValue.clear();
@@ -695,8 +714,8 @@
               _index = _index - 1; // Make the new state see the LF again.
             } else {
               // Start of new header field.
-              _headerField.add(_toLowerCaseByte(byte));
               _state = _State.HEADER_FIELD;
+              _addWithValidation(_headerField, _toLowerCaseByte(byte));
             }
           }
           break;
@@ -725,6 +744,10 @@
             _state = _State.CHUNK_SIZE_EXTENSION;
           } else {
             int value = _expectHexDigit(byte);
+            // Checks whether (_remaingingContent * 16 + value) overflows.
+            if (_remainingContent > _chunkSizeLimit >> 4) {
+              throw HttpException('Chunk size overflows the integer');
+            }
             _remainingContent = _remainingContent * 16 + value;
           }
           break;
@@ -924,6 +947,9 @@
     _noMessageBody = false;
     _remainingContent = -1;
 
+    _contentLength = false;
+    _transferEncoding = false;
+
     _headers = null;
   }
 
@@ -996,6 +1022,48 @@
     }
   }
 
+  void _addWithValidation(List<int> list, int byte) {
+    if (list.length < _headerSizeLimit) {
+      list.add(byte);
+    } else {
+      _reportSizeLimitError();
+    }
+  }
+
+  void _reportSizeLimitError() {
+    String method = "";
+    switch (_state) {
+      case _State.START:
+      case _State.METHOD_OR_RESPONSE_HTTP_VERSION:
+      case _State.REQUEST_LINE_METHOD:
+        method = "Method";
+        break;
+
+      case _State.REQUEST_LINE_URI:
+        method = "URI";
+        break;
+
+      case _State.RESPONSE_LINE_REASON_PHRASE:
+        method = "Reason phrase";
+        break;
+
+      case _State.HEADER_START:
+      case _State.HEADER_FIELD:
+        method = "Header field";
+        break;
+
+      case _State.HEADER_VALUE_START:
+      case _State.HEADER_VALUE:
+        method = "Header value";
+        break;
+
+      default:
+        throw UnsupportedError("Unexpected state: $_state");
+        break;
+    }
+    throw HttpException("$method exceeds the $_headerSizeLimit size limit");
+  }
+
   _HttpIncoming _createIncoming(int transferLength) {
     assert(_incoming == null);
     assert(_bodyController == null);
diff --git a/sdk_nnbd/lib/_http/websocket.dart b/sdk_nnbd/lib/_http/websocket.dart
index 5e6ec02..c9c6246 100644
--- a/sdk_nnbd/lib/_http/websocket.dart
+++ b/sdk_nnbd/lib/_http/websocket.dart
@@ -326,11 +326,14 @@
   static const int CLOSED = closed;
 
   /**
-   * Set and get the interval for sending ping signals. If a ping message is not
-   * answered by a pong message from the peer, the `WebSocket` is assumed
-   * disconnected and the connection is closed with a
-   * [WebSocketStatus.goingAway] close code. When a ping signal is sent, the
-   * pong message must be received within [pingInterval].
+   * The interval between ping signals.
+   *
+   * A ping message is sent every [pingInterval], starting at the first
+   * [pingInterval] after a new value has been assigned or a pong message has
+   * been received. If a ping message is not answered by a pong message from the
+   * peer, the `WebSocket` is assumed disconnected and the connection is closed
+   * with a [WebSocketStatus.goingAway] close code. When a ping signal is sent,
+   * the pong message must be received within [pingInterval].
    *
    * There are never two outstanding pings at any given time, and the next ping
    * timer starts when the pong is received.
diff --git a/sdk_nnbd/lib/_http/websocket_impl.dart b/sdk_nnbd/lib/_http/websocket_impl.dart
index 64eb1eb..68d0f29 100644
--- a/sdk_nnbd/lib/_http/websocket_impl.dart
+++ b/sdk_nnbd/lib/_http/websocket_impl.dart
@@ -901,7 +901,7 @@
     socket.addStream(stream).then((_) {
       _done();
       _closeCompleter.complete(webSocket);
-    }, onError: (Object error, StackTrace? stackTrace) {
+    }, onError: (Object error, StackTrace stackTrace) {
       _closed = true;
       _cancel();
       if (error is ArgumentError) {
@@ -1144,7 +1144,7 @@
       } else {
         _controller.add(data);
       }
-    }, onError: (Object error, StackTrace? stackTrace) {
+    }, onError: (Object error, StackTrace stackTrace) {
       _closeTimer?.cancel();
       if (error is FormatException) {
         _close(WebSocketStatus.invalidFramePayloadData);
@@ -1203,8 +1203,12 @@
       if (_writeClosed) return;
       _consumer.add(new _WebSocketPing());
       _pingTimer = new Timer(interval, () {
+        _closeTimer?.cancel();
         // No pong received.
         _close(WebSocketStatus.goingAway);
+        _closeCode = _outCloseCode;
+        _closeReason = _outCloseReason;
+        _controller.close();
       });
     });
   }
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/async_patch.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/async_patch.dart
index dbba91e..64f3983 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/async_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/async_patch.dart
@@ -196,7 +196,7 @@
 }
 
 @patch
-void _rethrow(Object error, StackTrace? stackTrace) {
+void _rethrow(Object error, StackTrace stackTrace) {
   JS('', 'throw #', dart.createErrorWithStack(error, stackTrace));
 }
 
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/core_patch.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/core_patch.dart
index 13c2f4c..d2c62cf 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/core_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/core_patch.dart
@@ -69,12 +69,8 @@
   static bool _is_Object(Object? o) => o != null;
 
   @JSExportName('as')
-  static Object _as_Object(Object? o) =>
-      o == null ? dart.cast(o, dart.unwrapType(Object), false) : o;
-
-  @JSExportName('_check')
-  static Object _check_Object(Object? o) =>
-      o == null ? dart.cast(o, dart.unwrapType(Object), true) : o;
+  static Object? _as_Object(Object? o) =>
+      o == null ? dart.cast(o, dart.unwrapType(Object)) : o;
 }
 
 @patch
@@ -89,14 +85,7 @@
   static Object? _as_Null(Object? o) {
     // Avoid extra function call to core.Null.is() by manually inlining.
     if (o == null) return o;
-    return dart.cast(o, dart.unwrapType(Null), false);
-  }
-
-  @JSExportName('_check')
-  static Object? _check_Null(Object? o) {
-    // Avoid extra function call to core.Null.is() by manually inlining.
-    if (o == null) return o;
-    return dart.cast(o, dart.unwrapType(Null), true);
+    return dart.cast(o, dart.unwrapType(Null));
   }
 }
 
@@ -135,14 +124,7 @@
   static Object? _as_Function(Object? o) {
     // Avoid extra function call to core.Function.is() by manually inlining.
     if (JS<bool>('!', 'typeof $o == "function"')) return o;
-    return dart.cast(o, dart.unwrapType(Function), false);
-  }
-
-  @JSExportName('_check')
-  static Object? _check_Function(Object? o) {
-    // Avoid extra function call to core.Function.is() by manually inlining.
-    if (JS<bool>('!', 'typeof $o == "function"')) return o;
-    return dart.cast(o, dart.unwrapType(Function), true);
+    return dart.cast(o, dart.unwrapType(Function));
   }
 }
 
@@ -218,16 +200,7 @@
     if (JS<bool>('!', '(typeof $o == "number" && Math.floor($o) == $o)')) {
       return o;
     }
-    return dart.cast(o, dart.unwrapType(int), false);
-  }
-
-  @JSExportName('_check')
-  static Object? _check_int(Object? o) {
-    // Avoid extra function call to core.int.is() by manually inlining.
-    if (JS<bool>('!', '(typeof $o == "number" && Math.floor($o) == $o)')) {
-      return o;
-    }
-    return dart.cast(o, dart.unwrapType(int), true);
+    return dart.cast(o, dart.unwrapType(int));
   }
 }
 
@@ -253,14 +226,7 @@
   static Object? _as_double(Object? o) {
     // Avoid extra function call to core.double.is() by manually inlining.
     if (JS<bool>('!', 'typeof $o == "number"')) return o;
-    return dart.cast(o, dart.unwrapType(double), false);
-  }
-
-  @JSExportName('_check')
-  static Object? _check_double(Object? o) {
-    // Avoid extra function call to core.double.is() by manually inlining.
-    if (JS<bool>('!', 'typeof $o == "number"')) return o;
-    return dart.cast(o, dart.unwrapType(double), true);
+    return dart.cast(o, dart.unwrapType(double));
   }
 }
 
@@ -275,14 +241,7 @@
   static Object? _as_num(Object? o) {
     // Avoid extra function call to core.num.is() by manually inlining.
     if (JS<bool>('!', 'typeof $o == "number"')) return o;
-    return dart.cast(o, dart.unwrapType(num), false);
-  }
-
-  @JSExportName('_check')
-  static Object? _check_num(Object? o) {
-    // Avoid extra function call to core.num.is() by manually inlining.
-    if (JS<bool>('!', 'typeof $o == "number"')) return o;
-    return dart.cast(o, dart.unwrapType(num), true);
+    return dart.cast(o, dart.unwrapType(num));
   }
 }
 
@@ -672,14 +631,7 @@
   static Object? _as_String(Object? o) {
     // Avoid extra function call to core.String.is() by manually inlining.
     if (JS<bool>('!', 'typeof $o == "string"')) return o;
-    return dart.cast(o, dart.unwrapType(String), false);
-  }
-
-  @JSExportName('_check')
-  static Object? _check_String(Object? o) {
-    // Avoid extra function call to core.String.is() by manually inlining.
-    if (JS<bool>('!', 'typeof $o == "string"')) return o;
-    return dart.cast(o, dart.unwrapType(String), true);
+    return dart.cast(o, dart.unwrapType(String));
   }
 }
 
@@ -710,14 +662,7 @@
   static Object? _as_bool(Object? o) {
     // Avoid extra function call to core.bool.is() by manually inlining.
     if (JS<bool>("!", '$o === true || $o === false')) return o;
-    return dart.cast(o, dart.unwrapType(bool), false);
-  }
-
-  @JSExportName('_check')
-  static Object? _check_bool(Object? o) {
-    // Avoid extra function call to core.bool.is() by manually inlining.
-    if (JS<bool>("!", '$o === true || $o === false')) return o;
-    return dart.cast(o, dart.unwrapType(bool), true);
+    return dart.cast(o, dart.unwrapType(bool));
   }
 }
 
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/io_patch.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/io_patch.dart
index cd854ce..ceee3d4 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/patch/io_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/patch/io_patch.dart
@@ -404,9 +404,16 @@
   }
 
   @patch
-  factory InternetAddress(String address) {
+  factory InternetAddress(String address, {InternetAddressType? type}) {
     throw UnsupportedError("InternetAddress");
   }
+
+  @patch
+  factory InternetAddress.fromRawAddress(Uint8List rawAddress,
+      {InternetAddressType? type}) {
+    throw new UnsupportedError("InternetAddress.fromRawAddress");
+  }
+
   @patch
   static Future<List<InternetAddress>> lookup(String host,
       {InternetAddressType type = InternetAddressType.any}) {
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
index 48d41f9..bb58063 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
@@ -551,16 +551,7 @@
       '',
       '''#.as = function as_C(obj) {
     if (obj != null && obj[#]) return obj;
-    return #(obj, this, false);
-  }''',
-      ctor,
-      isClass,
-      cast);
-  JS(
-      '',
-      '''#._check = function check_C(obj) {
-    if (obj != null && obj[#]) return obj;
-    return #(obj, this, true);
+    return #(obj, this);
   }''',
       ctor,
       isClass,
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
index 0d62265..5696d69 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
@@ -56,30 +56,30 @@
   throw NoSuchMethodError(null, Symbol('<Unexpected Null Value>'), null, null);
 }
 
-castError(obj, expectedType, [@notNull bool isImplicit = false]) {
+castError(obj, expectedType) {
   var actualType = getReifiedType(obj);
   var message = _castErrorMessage(actualType, expectedType);
-  var error = isImplicit ? TypeErrorImpl(message) : CastErrorImpl(message);
-  throw error;
+  throw TypeErrorImpl(message);
 }
 
 String _castErrorMessage(from, to) {
   // If both types are generic classes, see if we can infer generic type
   // arguments for `from` that would allow the subtype relation to work.
-  var fromClass = getGenericClass(from);
-  if (fromClass != null) {
-    var fromTypeFormals = getGenericTypeFormals(fromClass);
-    var fromType = instantiateClass(fromClass, fromTypeFormals);
-    var inferrer = _TypeInferrer(fromTypeFormals);
-    if (inferrer.trySubtypeMatch(fromType, to)) {
-      var inferredTypes = inferrer.getInferredTypes();
-      if (inferredTypes != null) {
-        var inferred = instantiateClass(fromClass, inferredTypes);
-        return "Type '${typeName(from)}' should be '${typeName(inferred)}' "
-            "to implement expected type '${typeName(to)}'.";
-      }
-    }
-  }
+  // TODO(#40326) Fix suggested type or remove this code if no longer needed.
+  // var fromClass = getGenericClass(from);
+  // if (fromClass != null) {
+  //   var fromTypeFormals = getGenericTypeFormals(fromClass);
+  //   var fromType = instantiateClass(fromClass, fromTypeFormals);
+  //   var inferrer = _TypeInferrer(fromTypeFormals);
+  //   if (inferrer.trySubtypeMatch(fromType, to)) {
+  //     var inferredTypes = inferrer.getInferredTypes();
+  //     if (inferredTypes != null) {
+  //       var inferred = instantiateClass(fromClass, inferredTypes);
+  //       return "Type '${typeName(from)}' should be '${typeName(inferred)}' "
+  //           "to implement expected type '${typeName(to)}'.";
+  //     }
+  //   }
+  // }
   return "Expected a value of type '${typeName(to)}', "
       "but got one of type '${typeName(from)}'";
 }
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
index 12a41a0..20555fb 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart
@@ -130,7 +130,7 @@
   if (f != null) {
     var setterType = getSetterType(getType(obj), f);
     if (setterType != null) {
-      return JS('', '#[#] = #._check(#)', obj, f, setterType, value);
+      return JS('', '#[#] = #.as(#)', obj, f, setterType, value);
     }
     // Always allow for JS interop objects.
     if (isJsInterop(obj)) return JS('', '#[#] = #', obj, f, value);
@@ -194,14 +194,14 @@
   }
   // Now that we know the signature matches, we can perform type checks.
   for (var i = 0; i < requiredCount; ++i) {
-    JS('', '#[#]._check(#[#])', required, i, actuals, i);
+    JS('', '#[#].as(#[#])', required, i, actuals, i);
   }
   for (var i = 0; i < extras; ++i) {
-    JS('', '#[#]._check(#[#])', optionals, i, actuals, i + requiredCount);
+    JS('', '#[#].as(#[#])', optionals, i, actuals, i + requiredCount);
   }
   if (names != null) {
     for (var name in names) {
-      JS('', '(#[#] || #[#])._check(#[#])', named, name, requiredNamed, name,
+      JS('', '(#[#] || #[#]).as(#[#])', named, name, requiredNamed, name,
           namedActuals, name);
     }
   }
@@ -427,7 +427,7 @@
 /// directly on types, but any query that requires checking subtyping relations
 /// is handled here.
 @JSExportName('as')
-cast(obj, type, @notNull bool isImplicit) {
+cast(obj, type) {
   // We hoist the common case where null is checked against another type here
   // for better performance.
   if (obj == null && !_strictSubtypeChecks) {
@@ -439,7 +439,7 @@
     if (isSubtypeOf(actual, type)) return obj;
   }
 
-  return castError(obj, type, isImplicit);
+  return castError(obj, type);
 }
 
 bool test(bool? obj) {
@@ -455,7 +455,7 @@
 void _throwBooleanConversionError() => throw BooleanConversionAssertionError();
 
 void booleanConversionFailed(obj) {
-  var actual = typeName(getReifiedType(test(obj)));
+  var actual = typeName(getReifiedType(obj));
   throw TypeErrorImpl("type '$actual' is not a 'bool' in boolean expression");
 }
 
@@ -466,7 +466,7 @@
       _nullWarnOnType(JS('', '#', int));
       return null;
     } else {
-      castError(obj, JS('', '#', int), false);
+      castError(obj, JS('', '#', int));
     }
   }
   return obj;
@@ -493,12 +493,12 @@
 /// or emits a runtime warning (otherwise).  This is only used by the
 /// compiler when casting from nullable to non-nullable variants of the
 /// same type.
-nullCast(x, type, [@notNull bool isImplicit = false]) {
+nullCast(x, type) {
   if (x == null) {
     if (!_strictSubtypeChecks) {
       _nullWarnOnType(type);
     } else {
-      castError(x, type, isImplicit);
+      castError(x, type);
     }
   }
   return x;
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
index d424a31..d71922a 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
@@ -54,10 +54,9 @@
 ///
 ///     T.is(o): Implements 'o is T'.
 ///     T.as(o): Implements 'o as T'.
-///     T._check(o): Implements the type assertion of 'T x = o;'
 ///
 /// By convention, we used named JavaScript functions for these methods with the
-/// name 'is_X', 'as_X' and 'check_X' for various X to indicate the type or the
+/// name 'is_X' and 'as_X' for various X to indicate the type or the
 /// implementation strategy for the test (e.g 'is_String', 'is_G' for generic
 /// types, etc.)
 // TODO(jmesserly): we shouldn't implement Type here. It should be moved down
@@ -71,10 +70,7 @@
   bool is_T(object) => instanceOf(object, this);
 
   @JSExportName('as')
-  as_T(object) => cast(object, this, false);
-
-  @JSExportName('_check')
-  check_T(object) => cast(object, this, true);
+  as_T(object) => cast(object, this);
 
   DartType() {
     // Every instance of a DartType requires a set of type caches.
@@ -91,9 +87,6 @@
 
   @JSExportName('as')
   Object? as_T(Object? object) => object;
-
-  @JSExportName('_check')
-  Object? check_T(Object? object) => object;
 }
 
 @notNull
@@ -119,10 +112,10 @@
 Expando<Function> _assertInteropExpando = Expando<Function>();
 
 @NoReifyGeneric()
-F tearoffInterop<F extends Function>(F f) {
+F tearoffInterop<F extends Function?>(F f) {
   // Wrap a JS function with a closure that ensures all function arguments are
   // native JS functions.
-  if (!_isJsObject(f)) return f;
+  if (!_isJsObject(f) || f == null) return f;
   var ret = _assertInteropExpando[f];
   if (ret == null) {
     ret = JS(
@@ -194,10 +187,7 @@
   bool is_T(obj) => isRawJSType(obj) || instanceOf(obj, this);
 
   @JSExportName('as')
-  as_T(obj) => obj == null || is_T(obj) ? obj : castError(obj, this, false);
-
-  @JSExportName('_check')
-  check_T(obj) => obj == null || is_T(obj) ? obj : castError(obj, this, true);
+  as_T(obj) => obj == null || is_T(obj) ? obj : castError(obj, this);
 }
 
 /// An anonymous JS type
@@ -212,10 +202,7 @@
   bool is_T(obj) => _isJsObject(obj) || instanceOf(obj, this);
 
   @JSExportName('as')
-  as_T(obj) => obj == null || _isJsObject(obj) ? obj : cast(obj, this, false);
-
-  @JSExportName('_check')
-  check_T(obj) => obj == null || _isJsObject(obj) ? obj : cast(obj, this, true);
+  as_T(obj) => obj == null || _isJsObject(obj) ? obj : cast(obj, this);
 }
 
 void _warn(arg) {
@@ -362,12 +349,7 @@
   @JSExportName('as')
   as_T(obj) => obj == null || JS<bool>('!', '#.is(#)', type, obj)
       ? obj
-      : cast(obj, this, false);
-
-  @JSExportName('_check')
-  check_T(obj) => obj == null || JS<bool>('!', '#.is(#)', type, obj)
-      ? obj
-      : cast(obj, this, true);
+      : cast(obj, this);
 }
 
 /// A wrapper to identify a legacy (star, *) type of the form [type]*.
@@ -395,15 +377,10 @@
   @JSExportName('as')
   as_T(obj) => obj == null || JS<bool>('!', '#.is(#)', type, obj)
       ? obj
-      : cast(obj, this, false);
-
-  @JSExportName('_check')
-  check_T(obj) => obj == null || JS<bool>('!', '#.is(#)', type, obj)
-      ? obj
-      : cast(obj, this, true);
+      : cast(obj, this);
 }
 
-// TODO(nshahan) Add override optimizations for is, as and _check?
+// TODO(nshahan) Add override optimizations for is and as?
 class NeverType extends DartType {
   @override
   toString() => 'Never';
@@ -424,9 +401,6 @@
 
   @JSExportName('as')
   Object? as_T(Object? object) => object;
-
-  @JSExportName('_check')
-  Object? check_T(Object? object) => object;
 }
 
 @JSExportName('void')
@@ -786,7 +760,8 @@
         var typeNameString = typeName(JS('', '#[#[#]]', named, names, i));
         buffer += '$typeNameString ${JS('', '#[#]', names, i)}';
       }
-      if (JS('!', 'Object.keys(#).length > 0', requiredNamed)) buffer += ', ';
+      if (JS('!', 'Object.keys(#).length > 0 && #.length > 0', requiredNamed,
+          names)) buffer += ', ';
       names = getOwnPropertyNames(requiredNamed);
       JS('', '#.sort()', names);
       for (var i = 0; JS<bool>('!', '# < #.length', i, names); i++) {
@@ -817,7 +792,7 @@
   }
 
   @JSExportName('as')
-  as_T(obj, [@notNull bool isImplicit = false]) {
+  as_T(obj) {
     if (JS('!', 'typeof # == "function"', obj)) {
       var actual = JS('', '#[#]', obj, _runtimeType);
       // If there's no actual type, it's a JS function.
@@ -826,11 +801,8 @@
         return obj;
       }
     }
-    return castError(obj, this, isImplicit);
+    return castError(obj, this);
   }
-
-  @JSExportName('_check')
-  check_T(obj) => as_T(obj, true);
 }
 
 /// A type variable, used by [GenericFunctionType] to represent a type formal.
@@ -1047,13 +1019,7 @@
   @JSExportName('as')
   as_T(obj) {
     if (is_T(obj)) return obj;
-    return castError(obj, this, false);
-  }
-
-  @JSExportName('_check')
-  check_T(obj) {
-    if (is_T(obj)) return obj;
-    return castError(obj, this, true);
+    return castError(obj, this);
   }
 }
 
diff --git a/sdk_nnbd/lib/_internal/js_dev_runtime/private/foreign_helper.dart b/sdk_nnbd/lib/_internal/js_dev_runtime/private/foreign_helper.dart
index 357047e..7f11505 100644
--- a/sdk_nnbd/lib/_internal/js_dev_runtime/private/foreign_helper.dart
+++ b/sdk_nnbd/lib/_internal/js_dev_runtime/private/foreign_helper.dart
@@ -106,7 +106,7 @@
  */
 // Add additional optional arguments if needed. The method is treated internally
 // as a variable argument method.
-T JS<T extends Object?>(String typeDescription, String codeTemplate,
+external T JS<T extends Object?>(String typeDescription, String codeTemplate,
     [arg0,
     arg1,
     arg2,
@@ -126,7 +126,7 @@
     arg16,
     arg17,
     arg18,
-    arg19]) {}
+    arg19]);
 
 /// Annotates the compiled Js name for fields and methods.
 /// Similar behaviour to `JS` from `package:js/js.dart` (but usable from runtime
@@ -159,73 +159,73 @@
 /**
  * Returns the prefix used for generated is checks on classes.
  */
-String JS_OPERATOR_IS_PREFIX() {}
+external String JS_OPERATOR_IS_PREFIX();
 
 /**
  * Returns the prefix used for generated type argument substitutions on classes.
  */
-String JS_OPERATOR_AS_PREFIX() {}
+external String JS_OPERATOR_AS_PREFIX();
 
 /// Returns the name of the class `Object` in the generated code.
-String JS_OBJECT_CLASS_NAME() {}
+external String JS_OBJECT_CLASS_NAME();
 
 /// Returns the name of the class `Null` in the generated code.
-String JS_NULL_CLASS_NAME() {}
+external String JS_NULL_CLASS_NAME();
 
 /// Returns the name of the class `Function` in the generated code.
-String JS_FUNCTION_CLASS_NAME() {}
+external String JS_FUNCTION_CLASS_NAME();
 
 /**
  * Returns the field name used for determining if an object or its
  * interceptor has JavaScript indexing behavior.
  */
-String JS_IS_INDEXABLE_FIELD_NAME() {}
+external String JS_IS_INDEXABLE_FIELD_NAME();
 
 /// Returns the name used for generated function types on classes and methods.
-String JS_SIGNATURE_NAME() {}
+external String JS_SIGNATURE_NAME();
 
 /// Returns the name used to tag typedefs.
-String JS_TYPEDEF_TAG() {}
+external String JS_TYPEDEF_TAG();
 
 /// Returns the name used to tag function type representations in JavaScript.
-String JS_FUNCTION_TYPE_TAG() {}
+external String JS_FUNCTION_TYPE_TAG();
 
 /**
  * Returns the name used to tag void return in function type representations
  * in JavaScript.
  */
-String JS_FUNCTION_TYPE_VOID_RETURN_TAG() {}
+external String JS_FUNCTION_TYPE_VOID_RETURN_TAG();
 
 /**
  * Returns the name used to tag return types in function type representations
  * in JavaScript.
  */
-String JS_FUNCTION_TYPE_RETURN_TYPE_TAG() {}
+external String JS_FUNCTION_TYPE_RETURN_TYPE_TAG();
 
 /**
  * Returns the name used to tag required parameters in function type
  * representations in JavaScript.
  */
-String JS_FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG() {}
+external String JS_FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG();
 
 /**
  * Returns the name used to tag optional parameters in function type
  * representations in JavaScript.
  */
-String JS_FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG() {}
+external String JS_FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG();
 
 /**
  * Returns the name used to tag named parameters in function type
  * representations in JavaScript.
  */
-String JS_FUNCTION_TYPE_NAMED_PARAMETERS_TAG() {}
+external String JS_FUNCTION_TYPE_NAMED_PARAMETERS_TAG();
 
 /// Returns the JS name for [name] from the Namer.
-String JS_GET_NAME(String name) {}
+external String JS_GET_NAME(String name);
 
 /// Returns the state of a flag that is determined by the state of the compiler
 /// when the program has been analyzed.
-bool JS_GET_FLAG(String name) {}
+external bool JS_GET_FLAG(String name);
 
 /**
  * Pretend [code] is executed.  Generates no executable code.  This is used to
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/async_patch.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/async_patch.dart
index 15f64ac..dfc4707 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/async_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/async_patch.dart
@@ -203,7 +203,8 @@
     }
   }
 
-  void completeError(e, [st]) {
+  void completeError(Object e, [StackTrace? st]) {
+    st ??= AsyncError.defaultStackTrace(e);
     if (isSync) {
       _future._completeError(e, st);
     } else {
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/constant_map.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/constant_map.dart
index 347b20b..0f673d8 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/constant_map.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/constant_map.dart
@@ -54,7 +54,7 @@
 
   String toString() => MapBase.mapToString(this);
 
-  static void _throwUnmodifiable() {
+  static Never _throwUnmodifiable() {
     throw new UnsupportedError('Cannot modify unmodifiable Map');
   }
 
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/io_patch.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/io_patch.dart
index a6121c9..da7ebc7 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/io_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/io_patch.dart
@@ -404,9 +404,16 @@
   }
 
   @patch
-  factory InternetAddress(String address) {
+  factory InternetAddress(String address, {InternetAddressType? type}) {
     throw new UnsupportedError("InternetAddress");
   }
+
+  @patch
+  factory InternetAddress.fromRawAddress(Uint8List rawAddress,
+      {InternetAddressType? type}) {
+    throw new UnsupportedError("InternetAddress.fromRawAddress");
+  }
+
   @patch
   static Future<List<InternetAddress>> lookup(String host,
       {InternetAddressType type: InternetAddressType.any}) {
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/js_helper.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/js_helper.dart
index 0a8a274..36a0510 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/js_helper.dart
@@ -2696,6 +2696,7 @@
         return JS('String', '#', name);
       }
     }
+    throw new ArgumentError("Field name $fieldName not found.");
   }
 }
 
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/js_patch.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/js_patch.dart
index 99f9016..1ff2e55 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/js_patch.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/js_patch.dart
@@ -14,7 +14,7 @@
 @patch
 JsObject get context => _context;
 
-final JsObject _context = _wrapToDart(JS('', 'self'));
+final JsObject _context = _castToJsObject(_wrapToDart(JS('', 'self')));
 
 _convertDartFunction(Function f, {bool captureThis: false}) {
   return JS(
@@ -54,37 +54,39 @@
   factory JsObject(JsFunction constructor, [List? arguments]) {
     var ctor = _convertToJS(constructor);
     if (arguments == null) {
-      return _wrapToDart(JS('', 'new #()', ctor));
+      return _castToJsObject(_wrapToDart(JS('', 'new #()', ctor)));
     }
 
     if (JS('bool', '# instanceof Array', arguments)) {
       int argumentCount = JS('int', '#.length', arguments);
       switch (argumentCount) {
         case 0:
-          return _wrapToDart(JS('', 'new #()', ctor));
+          return _castToJsObject(_wrapToDart(JS('', 'new #()', ctor)));
 
         case 1:
           var arg0 = _convertToJS(JS('', '#[0]', arguments));
-          return _wrapToDart(JS('', 'new #(#)', ctor, arg0));
+          return _castToJsObject(_wrapToDart(JS('', 'new #(#)', ctor, arg0)));
 
         case 2:
           var arg0 = _convertToJS(JS('', '#[0]', arguments));
           var arg1 = _convertToJS(JS('', '#[1]', arguments));
-          return _wrapToDart(JS('', 'new #(#, #)', ctor, arg0, arg1));
+          return _castToJsObject(
+              _wrapToDart(JS('', 'new #(#, #)', ctor, arg0, arg1)));
 
         case 3:
           var arg0 = _convertToJS(JS('', '#[0]', arguments));
           var arg1 = _convertToJS(JS('', '#[1]', arguments));
           var arg2 = _convertToJS(JS('', '#[2]', arguments));
-          return _wrapToDart(JS('', 'new #(#, #, #)', ctor, arg0, arg1, arg2));
+          return _castToJsObject(
+              _wrapToDart(JS('', 'new #(#, #, #)', ctor, arg0, arg1, arg2)));
 
         case 4:
           var arg0 = _convertToJS(JS('', '#[0]', arguments));
           var arg1 = _convertToJS(JS('', '#[1]', arguments));
           var arg2 = _convertToJS(JS('', '#[2]', arguments));
           var arg3 = _convertToJS(JS('', '#[3]', arguments));
-          return _wrapToDart(
-              JS('', 'new #(#, #, #, #)', ctor, arg0, arg1, arg2, arg3));
+          return _castToJsObject(_wrapToDart(
+              JS('', 'new #(#, #, #, #)', ctor, arg0, arg1, arg2, arg3)));
       }
     }
 
@@ -103,7 +105,7 @@
     // object for which there is an interceptor
     var jsObj = JS('', 'new #()', factoryFunction);
 
-    return _wrapToDart(jsObj);
+    return _castToJsObject(_wrapToDart(jsObj));
 
     // TODO(sra): Investigate:
     //
@@ -118,7 +120,7 @@
     if (object is num || object is String || object is bool || object == null) {
       throw ArgumentError("object cannot be a num, string, bool, or null");
     }
-    return _wrapToDart(_convertToJS(object));
+    return _castToJsObject(_wrapToDart(_convertToJS(object)));
   }
 
   @patch
@@ -126,7 +128,7 @@
     if ((object is! Map) && (object is! Iterable)) {
       throw ArgumentError("object must be a Map or Iterable");
     }
-    return _wrapToDart(_convertDataTree(object));
+    return _castToJsObject(_wrapToDart(_convertDataTree(object)));
   }
 
   static _convertDataTree(Object data) {
@@ -367,6 +369,9 @@
 const _JS_FUNCTION_PROPERTY_NAME = r'$dart_jsFunction';
 const _JS_FUNCTION_PROPERTY_NAME_CAPTURE_THIS = r'_$dart_jsFunctionCaptureThis';
 
+@pragma('dart2js:tryInline')
+JsObject _castToJsObject(o) => JS<JsObject>('', '#', o);
+
 bool _defineProperty(o, String name, value) {
   try {
     if (_isExtensible(o) &&
@@ -445,7 +450,7 @@
 
 // converts a Dart object to a reference to a native JS object
 // which might be a DartObject JS->Dart proxy
-Object _convertToDart(o) {
+Object? _convertToDart(o) {
   if (JS('bool', '# == null', o) ||
       JS('bool', 'typeof # == "string"', o) ||
       JS('bool', 'typeof # == "number"', o) ||
@@ -465,7 +470,7 @@
   }
 }
 
-JsObject _wrapToDart(o) {
+Object _wrapToDart(o) {
   if (JS('bool', 'typeof # == "function"', o)) {
     return _getDartProxy(
         o, DART_CLOSURE_PROPERTY_NAME, (o) => JsFunction._fromJs(o));
@@ -478,8 +483,8 @@
       o, _DART_OBJECT_PROPERTY_NAME, (o) => JsObject._fromJs(o));
 }
 
-JsObject _getDartProxy(o, String propertyName, JsObject createProxy(o)) {
-  var dartProxy = _getOwnProperty(o, propertyName) as JsObject;
+Object _getDartProxy(o, String propertyName, JsObject createProxy(o)) {
+  var dartProxy = _getOwnProperty(o, propertyName);
   // Temporary fix for dartbug.com/15193
   // In some cases it's possible to see a JavaScript object that
   // came from a different context and was previously proxied to
diff --git a/sdk_nnbd/lib/_internal/js_runtime/lib/rti.dart b/sdk_nnbd/lib/_internal/js_runtime/lib/rti.dart
index 690efb3..a3494f2 100644
--- a/sdk_nnbd/lib/_internal/js_runtime/lib/rti.dart
+++ b/sdk_nnbd/lib/_internal/js_runtime/lib/rti.dart
@@ -53,12 +53,6 @@
   @pragma('dart2js:noElision')
   dynamic _as;
 
-  /// JavaScript method for type check.  The method is called from generated
-  /// code, e.g. parameter check for `T param` generates something like
-  /// `rtiForT._check(param)`.
-  @pragma('dart2js:noElision')
-  dynamic _check;
-
   /// JavaScript method for 'is' test.  The method is called from generated
   /// code, e.g. `o is T` generates something like `rtiForT._is(o)`.
   @pragma('dart2js:noElision')
@@ -68,10 +62,6 @@
     rti._as = fn;
   }
 
-  static void _setTypeCheckFunction(Rti rti, fn) {
-    rti._check = fn;
-  }
-
   static void _setIsTestFunction(Rti rti, fn) {
     rti._is = fn;
   }
@@ -835,12 +825,10 @@
   if (isObjectType(testRti)) {
     isFn = RAW_DART_FUNCTION_REF(_isObject);
     Rti._setAsCheckFunction(testRti, RAW_DART_FUNCTION_REF(_asObject));
-    Rti._setTypeCheckFunction(testRti, RAW_DART_FUNCTION_REF(_checkObject));
   } else if (isTopType(testRti)) {
     isFn = RAW_DART_FUNCTION_REF(_isTop);
     var asFn = RAW_DART_FUNCTION_REF(_asTop);
     Rti._setAsCheckFunction(testRti, asFn);
-    Rti._setTypeCheckFunction(testRti, asFn);
   } else if (_Utils.isIdentical(testRti, TYPE_REF<int>())) {
     isFn = RAW_DART_FUNCTION_REF(_isInt);
   } else if (_Utils.isIdentical(testRti, TYPE_REF<double>())) {
@@ -921,23 +909,6 @@
   Rti objectRti = instanceOrFunctionType(object, testRti);
   String message =
       _Error.compose(object, objectRti, _rtiToString(testRti, null));
-  throw _CastError.fromMessage(message);
-}
-
-/// Called from generated code.
-_generalTypeCheckImplementation(object) {
-  // This static method is installed on an Rti object as a JavaScript instance
-  // method. The Rti object is 'this'.
-  Rti testRti = _castToRti(JS('', 'this'));
-  if (object == null) {
-    if (JS_GET_FLAG('LEGACY') || isNullable(testRti)) return object;
-  } else {
-    if (Rti._isCheck(testRti, object)) return object;
-  }
-
-  Rti objectRti = instanceOrFunctionType(object, testRti);
-  String message =
-      _Error.compose(object, objectRti, _rtiToString(testRti, null));
   throw _TypeError.fromMessage(message);
 }
 
@@ -950,7 +921,7 @@
   throw _TypeError.fromMessage(message);
 }
 
-/// Base class to _CastError and _TypeError.
+/// Base class to _TypeError.
 class _Error extends Error {
   final String _message;
   _Error(this._message);
@@ -968,14 +939,6 @@
   String toString() => _message;
 }
 
-class _CastError extends _Error implements CastError, TypeError {
-  _CastError.fromMessage(String message) : super('TypeError: $message');
-
-  factory _CastError.forType(object, String type) {
-    return _CastError.fromMessage(_Error.compose(object, null, type));
-  }
-}
-
 class _TypeError extends _Error implements TypeError, CastError {
   _TypeError.fromMessage(String message) : super('TypeError: $message');
 
@@ -989,7 +952,7 @@
 
 // Specializations.
 //
-// Specializations can be placed on Rti objects as the _as, _check and _is
+// Specializations can be placed on Rti objects as the _as and _is
 // 'methods'. They can also be called directly called from generated code.
 
 /// Specialization for 'is Object'.
@@ -1002,13 +965,6 @@
 /// Called from generated code via Rti `_as` method.
 dynamic _asObject(object) {
   if (JS_GET_FLAG('LEGACY') || object != null) return object;
-  throw _CastError.forType(object, 'Object');
-}
-
-/// Specialization for check on 'Object'.
-/// Called from generated code via Rti `_check` method.
-dynamic _checkObject(object) {
-  if (JS_GET_FLAG('LEGACY') || object != null) return object;
   throw _TypeError.forType(object, 'Object');
 }
 
@@ -1019,7 +975,7 @@
 }
 
 /// Specialization for 'as dynamic' and other top types.
-/// Called from generated code via Rti `_as` and `_check` methods.
+/// Called from generated code via Rti `_as` methods.
 dynamic _asTop(object) {
   return object;
 }
@@ -1035,14 +991,6 @@
 bool? _asBoolNullable(object) {
   if (_isBool(object)) return _Utils.asBool(object);
   if (object == null) return object;
-  throw _CastError.forType(object, 'bool');
-}
-
-/// Specialization for check on 'bool?'.
-/// Called from generated code.
-bool? _checkBoolNullable(object) {
-  if (_isBool(object)) return _Utils.asBool(object);
-  if (object == null) return object;
   throw _TypeError.forType(object, 'bool');
 }
 
@@ -1051,14 +999,6 @@
 double? _asDoubleNullable(object) {
   if (_isNum(object)) return _Utils.asDouble(object);
   if (object == null) return object;
-  throw _CastError.forType(object, 'double');
-}
-
-/// Specialization for check on 'double?'.
-/// Called from generated code.
-double? _checkDoubleNullable(object) {
-  if (_isNum(object)) return _Utils.asDouble(object);
-  if (object == null) return object;
   throw _TypeError.forType(object, 'double');
 }
 
@@ -1074,14 +1014,6 @@
 int? _asIntNullable(object) {
   if (_isInt(object)) return _Utils.asInt(object);
   if (object == null) return object;
-  throw _CastError.forType(object, 'int');
-}
-
-/// Specialization for check on 'int?'.
-/// Called from generated code.
-int? _checkIntNullable(object) {
-  if (_isInt(object)) return _Utils.asInt(object);
-  if (object == null) return object;
   throw _TypeError.forType(object, 'int');
 }
 
@@ -1096,14 +1028,6 @@
 num? _asNumNullable(object) {
   if (_isNum(object)) return _Utils.asNum(object);
   if (object == null) return object;
-  throw _CastError.forType(object, 'num');
-}
-
-/// Specialization for check on 'num?'.
-/// Called from generated code.
-num? _checkNumNullable(object) {
-  if (_isNum(object)) return _Utils.asNum(object);
-  if (object == null) return object;
   throw _TypeError.forType(object, 'num');
 }
 
@@ -1118,14 +1042,6 @@
 String? _asStringNullable(object) {
   if (_isString(object)) return _Utils.asString(object);
   if (object == null) return object;
-  throw _CastError.forType(object, 'String');
-}
-
-/// Specialization for check on 'String?'.
-/// Called from generated code.
-String? _checkStringNullable(object) {
-  if (_isString(object)) return _Utils.asString(object);
-  if (object == null) return object;
   throw _TypeError.forType(object, 'String');
 }
 
@@ -1594,15 +1510,12 @@
   }
 
   static Rti _installTypeTests(Object universe, Rti rti) {
-    // Set up methods to perform type tests. The general as-check / type-check
-    // methods use the is-test method. The is-test method on first use
-    // overwrites itself, and possibly the as-check / type-check methods, with a
-    // specialized version.
-    var checkFn = RAW_DART_FUNCTION_REF(_generalTypeCheckImplementation);
+    // Set up methods to perform type tests. The general as-check methods use
+    // the is-test method. The is-test method on first use overwrites itself,
+    // and possibly the as-check methods, with a specialized version.
     var asFn = RAW_DART_FUNCTION_REF(_generalAsCheckImplementation);
     var isFn = RAW_DART_FUNCTION_REF(_installSpecializedIsTest);
     Rti._setAsCheckFunction(rti, asFn);
-    Rti._setTypeCheckFunction(rti, checkFn);
     Rti._setIsTestFunction(rti, isFn);
     return rti;
   }
diff --git a/sdk_nnbd/lib/_internal/vm/bin/file_patch.dart b/sdk_nnbd/lib/_internal/vm/bin/file_patch.dart
index 8c50129..354f809 100644
--- a/sdk_nnbd/lib/_internal/vm/bin/file_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/bin/file_patch.dart
@@ -193,7 +193,7 @@
   // Called when a watcher is no longer needed.
   void _doneWatcher() {}
   // Called when a new path is being watched.
-  Stream _pathWatched() {}
+  Stream _pathWatched();
   // Called when a path is no longer being watched.
   void _donePathWatched() {}
 
diff --git a/sdk_nnbd/lib/_internal/vm/bin/process_patch.dart b/sdk_nnbd/lib/_internal/vm/bin/process_patch.dart
index 2df7ef9..467bdc6 100644
--- a/sdk_nnbd/lib/_internal/vm/bin/process_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/bin/process_patch.dart
@@ -76,7 +76,7 @@
 
   @patch
   static bool killPid(int pid, [ProcessSignal signal = ProcessSignal.sigterm]) {
-    // TODO: Remove once non-nullability is sound.
+    // TODO(40614): Remove once non-nullability is sound.
     ArgumentError.checkNotNull(signal, "signal");
     return _ProcessUtils._killPid(pid, signal._signalNumber);
   }
@@ -216,7 +216,7 @@
       bool runInShell,
       this._mode)
       : super() {
-    // TODO: Remove once non-nullability is sound.
+    // TODO(40614): Remove once non-nullability is sound.
     ArgumentError.checkNotNull(path, "path");
     ArgumentError.checkNotNull(arguments, "arguments");
     for (int i = 0; i < arguments.length; i++) {
@@ -518,7 +518,7 @@
       _exitCode?.future ?? (throw StateError("Process is detached"));
 
   bool kill([ProcessSignal signal = ProcessSignal.sigterm]) {
-    // TODO: Remove once non-nullability is sound.
+    // TODO(40614): Remove once non-nullability is sound.
     ArgumentError.checkNotNull(kill, "kill");
     assert(_started);
     if (_ended) return false;
diff --git a/sdk_nnbd/lib/_internal/vm/bin/socket_patch.dart b/sdk_nnbd/lib/_internal/vm/bin/socket_patch.dart
index 8b5638d..8a954e8 100644
--- a/sdk_nnbd/lib/_internal/vm/bin/socket_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/bin/socket_patch.dart
@@ -68,8 +68,14 @@
   }
 
   @patch
-  factory InternetAddress(String address) {
-    return new _InternetAddress.parse(address);
+  factory InternetAddress(String address, {InternetAddressType? type}) {
+    return _InternetAddress.fromString(address, type: type);
+  }
+
+  @patch
+  factory InternetAddress.fromRawAddress(Uint8List rawAddress,
+      {InternetAddressType? type}) {
+    return _InternetAddress.fromRawAddress(rawAddress, type: type);
   }
 
   @patch
@@ -107,7 +113,7 @@
 }
 
 void _throwOnBadPort(int port) {
-  // TODO: Remove once non-nullability is sound.
+  // TODO(40614): Remove once non-nullability is sound.
   ArgumentError.checkNotNull(port, "port");
   if ((port < 0) || (port > 0xFFFF)) {
     throw new ArgumentError("Invalid port $port");
@@ -115,7 +121,7 @@
 }
 
 void _throwOnBadTtl(int ttl) {
-  // TODO: Remove once non-nullability is sound.
+  // TODO(40614): Remove once non-nullability is sound.
   ArgumentError.checkNotNull(ttl, "ttl");
   if (ttl < 1 || ttl > 255) {
     throw new ArgumentError('Invalid ttl $ttl');
@@ -141,10 +147,7 @@
   final String? _host;
   final Uint8List _in_addr;
   final int _scope_id;
-
-  InternetAddressType get type => _in_addr.length == _IPv4AddrLength
-      ? InternetAddressType.IPv4
-      : InternetAddressType.IPv6;
+  final InternetAddressType type;
 
   String get host => _host ?? address;
 
@@ -160,7 +163,11 @@
           if (_in_addr[i] != 0) return false;
         }
         return _in_addr[_IPv6AddrLength - 1] == 1;
+
+      case InternetAddressType.unix:
+        return false;
     }
+    throw new UnsupportedError("Unexpected address type $type");
   }
 
   bool get isLinkLocal {
@@ -172,7 +179,11 @@
       case InternetAddressType.IPv6:
         // Checking for fe80::/10.
         return _in_addr[0] == 0xFE && (_in_addr[1] & 0xB0) == 0x80;
+
+      case InternetAddressType.unix:
+        return false;
     }
+    throw new UnsupportedError("Unexpected address type $type");
   }
 
   bool get isMulticast {
@@ -184,56 +195,102 @@
       case InternetAddressType.IPv6:
         // Checking for ff00::/8.
         return _in_addr[0] == 0xFF;
+
+      case InternetAddressType.unix:
+        return false;
+    }
+    throw new UnsupportedError("Unexpected address type $type");
+  }
+
+  Future<InternetAddress> reverse() {
+    if (type == InternetAddressType.unix) {
+      return Future.value(this);
+    }
+    return _NativeSocket.reverseLookup(this);
+  }
+
+  _InternetAddress(this.type, this.address, this._host, this._in_addr,
+      [this._scope_id = 0]);
+
+  factory _InternetAddress.fromString(String address,
+      {InternetAddressType? type}) {
+    // TODO(40614): Remove once non-nullability is sound.
+    ArgumentError.checkNotNull(address, 'address');
+    if (type == InternetAddressType.unix) {
+      var rawAddress = FileSystemEntity._toUtf8Array(address);
+      return _InternetAddress(
+          InternetAddressType.unix, address, null, rawAddress);
+    } else {
+      var in_addr = _parse(address);
+      if (in_addr == null) {
+        throw ArgumentError("Invalid internet address $address");
+      }
+      InternetAddressType type = in_addr.length == _IPv4AddrLength
+          ? InternetAddressType.IPv4
+          : InternetAddressType.IPv6;
+      return _InternetAddress(type, address, null, in_addr);
     }
   }
 
-  Future<InternetAddress> reverse() => _NativeSocket.reverseLookup(this);
-
-  _InternetAddress(this.address, this._host, this._in_addr,
-      [this._scope_id = 0]);
-
-  factory _InternetAddress.parse(String address) {
-    // TODO: Remove once non-nullability is sound.
-    ArgumentError.checkNotNull(address, "address");
-    var in_addr = _parse(address);
-    if (in_addr == null) {
-      throw new ArgumentError("Invalid internet address $address");
+  factory _InternetAddress.fromRawAddress(Uint8List rawAddress,
+      {InternetAddressType? type}) {
+    if (type == InternetAddressType.unix) {
+      ArgumentError.checkNotNull(rawAddress, 'rawAddress');
+      var rawPath = FileSystemEntity._toNullTerminatedUtf8Array(rawAddress);
+      var address = FileSystemEntity._toStringFromUtf8Array(rawAddress);
+      return _InternetAddress(InternetAddressType.unix, address, null, rawPath);
+    } else {
+      int type = -1;
+      if (rawAddress.length == _IPv4AddrLength) {
+        type = 0;
+      } else {
+        if (rawAddress.length != _IPv6AddrLength) {
+          throw ArgumentError("Invalid internet address ${rawAddress}");
+        }
+        type = 1;
+      }
+      var address = _rawAddrToString(rawAddress);
+      return _InternetAddress(
+          InternetAddressType._from(type), address, null, rawAddress);
     }
-    return new _InternetAddress(address, null, in_addr);
   }
 
   factory _InternetAddress.fixed(int id) {
     switch (id) {
       case _addressLoopbackIPv4:
-        var in_addr = new Uint8List(_IPv4AddrLength);
+        var in_addr = Uint8List(_IPv4AddrLength);
         in_addr[0] = 127;
         in_addr[_IPv4AddrLength - 1] = 1;
-        return new _InternetAddress("127.0.0.1", null, in_addr);
+        return _InternetAddress(
+            InternetAddressType.IPv4, "127.0.0.1", null, in_addr);
       case _addressLoopbackIPv6:
-        var in_addr = new Uint8List(_IPv6AddrLength);
+        var in_addr = Uint8List(_IPv6AddrLength);
         in_addr[_IPv6AddrLength - 1] = 1;
-        return new _InternetAddress("::1", null, in_addr);
+        return _InternetAddress(InternetAddressType.IPv6, "::1", null, in_addr);
       case _addressAnyIPv4:
-        var in_addr = new Uint8List(_IPv4AddrLength);
-        return new _InternetAddress("0.0.0.0", "0.0.0.0", in_addr);
+        var in_addr = Uint8List(_IPv4AddrLength);
+        return _InternetAddress(
+            InternetAddressType.IPv4, "0.0.0.0", "0.0.0.0", in_addr);
       case _addressAnyIPv6:
-        var in_addr = new Uint8List(_IPv6AddrLength);
-        return new _InternetAddress("::", "::", in_addr);
+        var in_addr = Uint8List(_IPv6AddrLength);
+        return _InternetAddress(InternetAddressType.IPv6, "::", "::", in_addr);
       default:
         assert(false);
-        throw new ArgumentError();
+        throw ArgumentError();
     }
   }
 
   // Create a clone of this _InternetAddress replacing the host.
   _InternetAddress _cloneWithNewHost(String host) {
-    return new _InternetAddress(
-        address, host, new Uint8List.fromList(_in_addr));
+    return _InternetAddress(type, address, host, Uint8List.fromList(_in_addr));
   }
 
   bool operator ==(other) {
     if (!(other is _InternetAddress)) return false;
     if (other.type != type) return false;
+    if (type == InternetAddressType.unix) {
+      return address == other.address;
+    }
     bool equals = true;
     for (int i = 0; i < _in_addr.length && equals; i++) {
       equals = other._in_addr[i] == _in_addr[i];
@@ -242,6 +299,9 @@
   }
 
   int get hashCode {
+    if (type == InternetAddressType.unix) {
+      return address.hashCode;
+    }
     int result = 1;
     for (int i = 0; i < _in_addr.length; i++) {
       result = (result * 31 + _in_addr[i]) & 0x3FFFFFFF;
@@ -253,6 +313,9 @@
     return "InternetAddress('$address', ${type.name})";
   }
 
+  static String _rawAddrToString(Uint8List address)
+      native "InternetAddress_RawAddrToString";
+
   static Uint8List? _parse(String address) native "InternetAddress_Parse";
 }
 
@@ -394,8 +457,8 @@
         throw createError(response, "Failed host lookup: '$host'");
       } else {
         return response.skip(1).map<InternetAddress>((result) {
-          var type = new InternetAddressType._from(result[0]);
-          return new _InternetAddress(result[1], host, result[2], result[3]);
+          var type = InternetAddressType._from(result[0]);
+          return _InternetAddress(type, result[1], host, result[2], result[3]);
         }).toList();
       }
     });
@@ -423,10 +486,10 @@
       } else {
         var map = response.skip(1).fold(new Map<String, NetworkInterface>(),
             (map, result) {
-          var type = new InternetAddressType._from(result[0]);
+          var type = InternetAddressType._from(result[0]);
           var name = result[3];
           var index = result[4];
-          var address = new _InternetAddress(result[1], "", result[2]);
+          var address = _InternetAddress(type, result[1], "", result[2]);
           if (!includeLinkLocal && address.isLinkLocal) return map;
           if (!includeLoopback && address.isLoopback) return map;
           map.putIfAbsent(name, () => new _NetworkInterface(name, index));
@@ -505,12 +568,23 @@
         socket.localAddress = address;
         var result;
         if (sourceAddress == null) {
-          result = socket.nativeCreateConnect(
-              address._in_addr, port, address._scope_id);
+          if (address.type == InternetAddressType.unix) {
+            result = socket.nativeCreateUnixDomainConnect(
+                address.address, _Namespace._namespace);
+          } else {
+            result = socket.nativeCreateConnect(
+                address._in_addr, port, address._scope_id);
+          }
         } else {
           assert(sourceAddress is _InternetAddress);
-          result = socket.nativeCreateBindConnect(address._in_addr, port,
-              sourceAddress._in_addr, address._scope_id);
+          if (address.type == InternetAddressType.unix) {
+            assert(sourceAddress.type == InternetAddressType.unix);
+            result = socket.nativeCreateUnixDomainBindConnect(
+                address.address, sourceAddress.address, _Namespace._namespace);
+          } else {
+            result = socket.nativeCreateBindConnect(address._in_addr, port,
+                sourceAddress._in_addr, address._scope_id);
+          }
         }
         if (result is OSError) {
           // Keep first error, if present.
@@ -641,8 +715,18 @@
 
     var socket = new _NativeSocket.listen();
     socket.localAddress = address;
-    var result = socket.nativeCreateBindListen(
-        address._in_addr, port, backlog, v6Only, shared, address._scope_id);
+    var result;
+    if (address.type == InternetAddressType.unix) {
+      var path = address.address;
+      if (FileSystemEntity.isLinkSync(path)) {
+        path = Link(path).targetSync();
+      }
+      result = socket.nativeCreateUnixDomainBindListen(
+          path, backlog, shared, _Namespace._namespace);
+    } else {
+      result = socket.nativeCreateBindListen(
+          address._in_addr, port, backlog, v6Only, shared, address._scope_id);
+    }
     if (result is OSError) {
       throw new SocketException("Failed to create server socket",
           osError: result, address: address, port: port);
@@ -799,7 +883,7 @@
   static int _fixOffset(int? offset) => offset ?? 0;
 
   int write(List<int> buffer, int offset, int? bytes) {
-    // TODO: Remove once non-nullability is sound.
+    // TODO(40614): Remove once non-nullability is sound.
     offset = _fixOffset(offset);
     if (bytes == null) {
       if (offset > buffer.length) {
@@ -905,12 +989,14 @@
   }
 
   int get port {
+    if (localAddress.type == InternetAddressType.unix) return 0;
     if (localPort != 0) return localPort;
     if (isClosing || isClosed) throw const SocketException.closed();
     return localPort = nativeGetPort();
   }
 
   int get remotePort {
+    if (localAddress.type == InternetAddressType.unix) return 0;
     if (isClosing || isClosed) throw const SocketException.closed();
     return nativeGetRemotePeer()[1];
   }
@@ -922,7 +1008,11 @@
     var result = nativeGetRemotePeer();
     var addr = result[0];
     var type = new InternetAddressType._from(addr[0]);
-    return new _InternetAddress(addr[1], null, addr[2]);
+    if (type == InternetAddressType.unix) {
+      return _InternetAddress.fromString(addr[1],
+          type: InternetAddressType.unix);
+    }
+    return _InternetAddress(type, addr[1], null, addr[2]);
   }
 
   void issueReadEvent() {
@@ -1195,7 +1285,7 @@
   }
 
   dynamic getOption(SocketOption option) {
-    // TODO: Remove once non-nullability is sound.
+    // TODO(40614): Remove once non-nullability is sound.
     ArgumentError.checkNotNull(option, "option");
     var result = nativeGetOption(option._value, address.type._value);
     if (result is OSError) throw result;
@@ -1203,14 +1293,14 @@
   }
 
   bool setOption(SocketOption option, value) {
-    // TODO: Remove once non-nullability is sound.
+    // TODO(40614): Remove once non-nullability is sound.
     ArgumentError.checkNotNull(option, "option");
     nativeSetOption(option._value, address.type._value, value);
     return true;
   }
 
   Uint8List getRawOption(RawSocketOption option) {
-    // TODO: Remove once non-nullability is sound.
+    // TODO(40614): Remove once non-nullability is sound.
     ArgumentError.checkNotNull(option, "option");
     ArgumentError.checkNotNull(option.value, "option.value");
     nativeGetRawOption(option.level, option.option, option.value);
@@ -1218,7 +1308,7 @@
   }
 
   void setRawOption(RawSocketOption option) {
-    // TODO: Remove once non-nullability is sound.
+    // TODO(40614): Remove once non-nullability is sound.
     ArgumentError.checkNotNull(option, "option");
     ArgumentError.checkNotNull(option.value, "option.value");
     nativeSetRawOption(option.level, option.option, option.value);
@@ -1274,11 +1364,17 @@
       int port) native "Socket_SendTo";
   nativeCreateConnect(Uint8List addr, int port, int scope_id)
       native "Socket_CreateConnect";
+  nativeCreateUnixDomainConnect(String addr, _Namespace namespace)
+      native "Socket_CreateUnixDomainConnect";
   nativeCreateBindConnect(Uint8List addr, int port, Uint8List sourceAddr,
       int scope_id) native "Socket_CreateBindConnect";
+  nativeCreateUnixDomainBindConnect(String addr, String sourceAddr,
+      _Namespace namespace) native "Socket_CreateUnixDomainBindConnect";
   bool isBindError(int errorNumber) native "SocketBase_IsBindError";
   nativeCreateBindListen(Uint8List addr, int port, int backlog, bool v6Only,
       bool shared, int scope_id) native "ServerSocket_CreateBindListen";
+  nativeCreateUnixDomainBindListen(String addr, int backlog, bool shared,
+      _Namespace namespace) native "ServerSocket_CreateUnixDomainBindListen";
   nativeCreateBindDatagram(Uint8List addr, int port, bool reuseAddress,
       bool reusePort, int ttl) native "Socket_CreateBindDatagram";
   bool nativeAccept(_NativeSocket socket) native "ServerSocket_Accept";
@@ -2122,6 +2218,9 @@
 
 @pragma("vm:entry-point", "call")
 Datagram _makeDatagram(
-    Uint8List data, String address, Uint8List in_addr, int port) {
-  return new Datagram(data, new _InternetAddress(address, null, in_addr), port);
+    Uint8List data, String address, Uint8List in_addr, int port, int type) {
+  return new Datagram(
+      data,
+      _InternetAddress(InternetAddressType._from(type), address, null, in_addr),
+      port);
 }
diff --git a/sdk_nnbd/lib/_internal/vm/bin/stdio_patch.dart b/sdk_nnbd/lib/_internal/vm/bin/stdio_patch.dart
index d820733..bc32221 100644
--- a/sdk_nnbd/lib/_internal/vm/bin/stdio_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/bin/stdio_patch.dart
@@ -22,6 +22,7 @@
       case _stdioHandleTypeFile:
         return new Stdin._(new _FileStream.forStdin(), fd);
     }
+    throw new UnsupportedError("Unexpected handle type $type");
   }
 
   @patch
diff --git a/sdk_nnbd/lib/_internal/vm/bin/sync_socket_patch.dart b/sdk_nnbd/lib/_internal/vm/bin/sync_socket_patch.dart
index cf16b88..e2ced70 100644
--- a/sdk_nnbd/lib/_internal/vm/bin/sync_socket_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/bin/sync_socket_patch.dart
@@ -142,7 +142,12 @@
       throw result;
     }
     var addr = result[0];
-    return new _InternetAddress(addr[1], null, addr[2]);
+    var type = InternetAddressType._from(addr[0]);
+    if (type == InternetAddressType.unix) {
+      return _InternetAddress.fromString(addr[1],
+          type: InternetAddressType.unix);
+    }
+    return _InternetAddress(type, addr[1], null, addr[2]);
   }
 
   int get remotePort {
@@ -184,12 +189,13 @@
     }
     return <_InternetAddress>[
       for (int i = 0; i < response.length; ++i)
-        new _InternetAddress(response[i][1], host, response[i][2]),
+        new _InternetAddress(InternetAddressType._from(response[i][0]),
+            response[i][1], host, response[i][2]),
     ];
   }
 
   int readIntoSync(List<int> buffer, int start, int? end) {
-    // TODO: Remove once non-nullability is sound.
+    // TODO(40614): Remove once non-nullability is sound.
     ArgumentError.checkNotNull(buffer, "buffer");
     ArgumentError.checkNotNull(start, "start");
     _checkAvailable();
@@ -279,7 +285,7 @@
   }
 
   void writeFromSync(List<int> buffer, int start, int? end) {
-    // TODO: Remove once non-nullability is sound.
+    // TODO(40614): Remove once non-nullability is sound.
     ArgumentError.checkNotNull(buffer, "buffer");
     ArgumentError.checkNotNull(start, "start");
     _checkAvailable();
diff --git a/sdk_nnbd/lib/_internal/vm/lib/async_patch.dart b/sdk_nnbd/lib/_internal/vm/lib/async_patch.dart
index 9e180a2..1de3219 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/async_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/async_patch.dart
@@ -33,7 +33,8 @@
     }
   }
 
-  void completeError(e, [st]) {
+  void completeError(Object e, [StackTrace? st]) {
+    st ??= AsyncError.defaultStackTrace(e);
     if (isSync) {
       _future._completeError(e, st);
     } else {
@@ -77,7 +78,7 @@
 // parameter to the continuation.  See vm/ast_transformer.cc for usage.
 Function _asyncErrorWrapperHelper(continuation) {
   // See comments of `_asyncThenWrapperHelper`.
-  var errorCallback = (e, s) => continuation(null, e, s);
+  void errorCallback(Object e, StackTrace s) => continuation(null, e, s);
   if (Zone.current == Zone.root) return errorCallback;
   return Zone.current.registerBinaryCallback(errorCallback);
 }
diff --git a/sdk_nnbd/lib/_internal/vm/lib/compact_hash.dart b/sdk_nnbd/lib/_internal/vm/lib/compact_hash.dart
index 7f3984d..64fff0b 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/compact_hash.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/compact_hash.dart
@@ -471,6 +471,7 @@
 }
 
 // Set implementation, analogous to _CompactLinkedHashMap.
+@pragma('vm:entry-point')
 class _CompactLinkedHashSet<E> extends _HashFieldBase
     with _HashBase, _OperatorEqualsAndHashCode, SetMixin<E>
     implements LinkedHashSet<E> {
diff --git a/sdk_nnbd/lib/_internal/vm/lib/identical_patch.dart b/sdk_nnbd/lib/_internal/vm/lib/identical_patch.dart
index 9847491..4b57430 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/identical_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/identical_patch.dart
@@ -10,5 +10,4 @@
 
 @patch
 @pragma("vm:entry-point", "call")
-int identityHashCode(Object? object) =>
-    object == null ? null.hashCode : object._identityHashCode;
+int identityHashCode(Object? object) => object._identityHashCode;
diff --git a/sdk_nnbd/lib/_internal/vm/lib/invocation_mirror_patch.dart b/sdk_nnbd/lib/_internal/vm/lib/invocation_mirror_patch.dart
index e4000a4..075e001 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/invocation_mirror_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/invocation_mirror_patch.dart
@@ -60,7 +60,7 @@
     _namedArguments ??= const {};
   }
 
-  Symbol _setMemberNameAndType() {
+  void _setMemberNameAndType() {
     final funcName = _functionName!;
     if (_type == _UNINITIALIZED) {
       _type = 0;
diff --git a/sdk_nnbd/lib/_internal/vm/lib/mirror_reference.dart b/sdk_nnbd/lib/_internal/vm/lib/mirror_reference.dart
index d203953..0cb1e37 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/mirror_reference.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/mirror_reference.dart
@@ -10,5 +10,5 @@
     throw "Unreachable";
   }
 
-  bool operator ==(other) native "MirrorReference_equals";
+  bool operator ==(Object other) native "MirrorReference_equals";
 }
diff --git a/sdk_nnbd/lib/async/async_error.dart b/sdk_nnbd/lib/async/async_error.dart
index 17abfed..a7172bd 100644
--- a/sdk_nnbd/lib/async/async_error.dart
+++ b/sdk_nnbd/lib/async/async_error.dart
@@ -5,7 +5,7 @@
 part of dart.async;
 
 _invokeErrorHandler(
-    Function errorHandler, Object error, StackTrace? stackTrace) {
+    Function errorHandler, Object error, StackTrace stackTrace) {
   var handler = errorHandler; // Rename to avoid promotion.
   if (handler is ZoneBinaryCallback<dynamic, Never, Never>) {
     // Dynamic invocation because we don't know the actual type of the
diff --git a/sdk_nnbd/lib/async/broadcast_stream_controller.dart b/sdk_nnbd/lib/async/broadcast_stream_controller.dart
index 9a80aab..3684a7c 100644
--- a/sdk_nnbd/lib/async/broadcast_stream_controller.dart
+++ b/sdk_nnbd/lib/async/broadcast_stream_controller.dart
@@ -23,8 +23,11 @@
   _BroadcastSubscription<T>? _next;
   _BroadcastSubscription<T>? _previous;
 
-  _BroadcastSubscription(_StreamControllerLifecycle<T> controller,
-      void onData(T data)?, Function? onError, void onDone()?,
+  _BroadcastSubscription(
+      _StreamControllerLifecycle<T> controller,
+      void onData(T data)?,
+      Function? onError,
+      void onDone()?,
       bool cancelOnError)
       : super(controller, onData, onError, onDone, cancelOnError) {
     _next = _previous = this;
@@ -255,7 +258,10 @@
     if (replacement != null) {
       error = replacement.error;
       stackTrace = replacement.stackTrace;
+    } else {
+      stackTrace ??= AsyncError.defaultStackTrace(error);
     }
+    if (stackTrace == null) throw "unreachable"; // TODO(40088)
     _sendError(error, stackTrace);
   }
 
@@ -287,7 +293,7 @@
     _sendData(data);
   }
 
-  void _addError(Object error, StackTrace? stackTrace) {
+  void _addError(Object error, StackTrace stackTrace) {
     _sendError(error, stackTrace);
   }
 
@@ -386,7 +392,7 @@
     });
   }
 
-  void _sendError(Object error, StackTrace? stackTrace) {
+  void _sendError(Object error, StackTrace stackTrace) {
     if (_isEmpty) return;
     _forEachListener((_BufferingStreamSubscription<T> subscription) {
       subscription._addError(error, stackTrace);
@@ -419,7 +425,7 @@
     }
   }
 
-  void _sendError(Object error, StackTrace? stackTrace) {
+  void _sendError(Object error, StackTrace stackTrace) {
     for (var subscription = _firstSubscription;
         subscription != null;
         subscription = subscription._next) {
@@ -480,6 +486,7 @@
   void addError(Object error, [StackTrace? stackTrace]) {
     // TODO(40614): Remove once non-nullability is sound.
     ArgumentError.checkNotNull(error, "error");
+    stackTrace ??= AsyncError.defaultStackTrace(error);
     if (!isClosed && _isFiring) {
       _addPendingEvent(new _DelayedError(error, stackTrace));
       return;
diff --git a/sdk_nnbd/lib/async/future.dart b/sdk_nnbd/lib/async/future.dart
index 62aef45..d1273aa 100644
--- a/sdk_nnbd/lib/async/future.dart
+++ b/sdk_nnbd/lib/async/future.dart
@@ -282,6 +282,7 @@
         stackTrace = replacement.stackTrace;
       }
     }
+    stackTrace ??= AsyncError.defaultStackTrace(error);
     return new _Future<T>.immediateError(error, stackTrace);
   }
 
@@ -364,13 +365,13 @@
     final _Future<List<T>> result = new _Future<List<T>>();
     List<T?>? values; // Collects the values. Set to null on error.
     int remaining = 0; // How many futures are we waiting for.
-    Object? error; // The first error from a future.
-    StackTrace? stackTrace; // The stackTrace that came with the error.
+    late Object error; // The first error from a future.
+    late StackTrace stackTrace; // The stackTrace that came with the error.
 
     // Handle an error from any of the futures.
     // TODO(jmesserly): use `void` return type once it can be inferred for the
     // `then` call below.
-    handleError(theError, StackTrace? theStackTrace) {
+    handleError(Object theError, StackTrace theStackTrace) {
       remaining--;
       List<T?>? valueList = values;
       if (valueList != null) {
@@ -393,7 +394,7 @@
           stackTrace = theStackTrace;
         }
       } else if (remaining == 0 && !eagerError) {
-        result._completeError(error!, stackTrace);
+        result._completeError(error, stackTrace);
       }
     }
 
@@ -411,7 +412,7 @@
               result._completeWithValue(List<T>.from(valueList));
             }
           } else {
-            // An error has occurred earlier.
+            // Forced read of error to assert that it has occurred earlier.
             assert(error != null);
             if (cleanUp != null && value != null) {
               // Ensure errors from cleanUp are uncaught.
@@ -420,7 +421,7 @@
               });
             }
             if (remaining == 0 && !eagerError) {
-              result._completeError(error!, stackTrace);
+              result._completeError(error, stackTrace);
             }
           }
         }, onError: handleError);
@@ -470,12 +471,14 @@
    */
   static Future<T> any<T>(Iterable<Future<T>> futures) {
     var completer = new Completer<T>.sync();
-    var onValue = (T value) {
+    void onValue(T value) {
       if (!completer.isCompleted) completer.complete(value);
-    };
-    var onError = (Object error, StackTrace? stack) {
+    }
+
+    void onError(Object error, StackTrace stack) {
       if (!completer.isCompleted) completer.completeError(error, stack);
-    };
+    }
+
     for (var future in futures) {
       future.then(onValue, onError: onError);
     }
@@ -649,7 +652,7 @@
    */
   // The `Function` below stands for one of two types:
   // - (dynamic) -> FutureOr<T>
-  // - (dynamic, StackTrace?) -> FutureOr<T>
+  // - (dynamic, StackTrace) -> FutureOr<T>
   // Given that there is a `test` function that is usually used to do an
   // `isCheck` we should also expect functions that take a specific argument.
   Future<T> catchError(Function onError, {bool test(Object error)?});
@@ -919,14 +922,17 @@
 }
 
 // Helper function completing a _Future with error, but checking the zone
-// for error replacement first.
+// for error replacement and missing stack trace first.
 void _completeWithErrorCallback(
     _Future result, Object error, StackTrace? stackTrace) {
   AsyncError? replacement = Zone.current.errorCallback(error, stackTrace);
   if (replacement != null) {
     error = replacement.error;
     stackTrace = replacement.stackTrace;
+  } else {
+    stackTrace ??= AsyncError.defaultStackTrace(error);
   }
+  if (stackTrace == null) throw "unreachable"; // TODO(40088).
   result._completeError(error, stackTrace);
 }
 
@@ -937,6 +943,11 @@
   if (replacement != null) {
     error = replacement.error;
     stackTrace = replacement.stackTrace;
+  } else {
+    stackTrace ??= AsyncError.defaultStackTrace(error);
+  }
+  if (stackTrace == null) {
+    throw "unreachable"; // TODO(lrn): Remove when type promotion works.
   }
   result._asyncCompleteError(error, stackTrace);
 }
diff --git a/sdk_nnbd/lib/async/future_impl.dart b/sdk_nnbd/lib/async/future_impl.dart
index e469175..b23bfdb0 100644
--- a/sdk_nnbd/lib/async/future_impl.dart
+++ b/sdk_nnbd/lib/async/future_impl.dart
@@ -24,11 +24,14 @@
     if (replacement != null) {
       error = replacement.error;
       stackTrace = replacement.stackTrace;
+    } else {
+      stackTrace ??= AsyncError.defaultStackTrace(error);
     }
+    if (stackTrace == null) throw "unreachable"; // TODO(40088)
     _completeError(error, stackTrace);
   }
 
-  void _completeError(Object error, StackTrace? stackTrace);
+  void _completeError(Object error, StackTrace stackTrace);
 
   // The future's _isComplete doesn't take into account pending completions.
   // We therefore use _mayComplete.
@@ -41,7 +44,7 @@
     future._asyncComplete(value as FutureOr<T>);
   }
 
-  void _completeError(Object error, StackTrace? stackTrace) {
+  void _completeError(Object error, StackTrace stackTrace) {
     future._asyncCompleteError(error, stackTrace);
   }
 }
@@ -52,7 +55,7 @@
     future._complete(value as FutureOr<T>);
   }
 
-  void _completeError(Object error, StackTrace? stackTrace) {
+  void _completeError(Object error, StackTrace stackTrace) {
     future._completeError(error, stackTrace);
   }
 }
@@ -150,8 +153,8 @@
     var errorCallback = this.errorCallback; // To enable promotion.
     // If the errorCallback returns something which is not a FutureOr<T>,
     // this return statement throws, and the caller handles the error.
-    if (errorCallback is dynamic Function(Object, StackTrace?)) {
-      return _zone.runBinary<dynamic, Object, StackTrace?>(
+    if (errorCallback is dynamic Function(Object, StackTrace)) {
+      return _zone.runBinary<dynamic, Object, StackTrace>(
           errorCallback, asyncError.error, asyncError.stackTrace);
     } else {
       return _zone.runUnary<dynamic, Object>(
@@ -229,7 +232,7 @@
     _setValue(value);
   }
 
-  _Future.immediateError(var error, [StackTrace? stackTrace])
+  _Future.immediateError(var error, StackTrace stackTrace)
       : _zone = Zone._current {
     _asyncCompleteError(error, stackTrace);
   }
@@ -353,7 +356,7 @@
     _resultOrListeners = error;
   }
 
-  void _setError(Object error, StackTrace? stackTrace) {
+  void _setError(Object error, StackTrace stackTrace) {
     _setErrorObject(new AsyncError(error, stackTrace));
   }
 
@@ -465,12 +468,7 @@
         // so use _complete instead of _completeWithValue.
         target._clearPendingComplete(); // Clear this first, it's set again.
         target._complete(value);
-      },
-          // TODO(floitsch): eventually we would like to make this non-optional
-          // and dependent on the listeners of the target future. If none of
-          // the target future's listeners want to have the stack trace we don't
-          // need a trace.
-          onError: (Object error, [StackTrace? stackTrace]) {
+      }, onError: (Object error, StackTrace stackTrace) {
         assert(target._isPendingComplete);
         target._completeError(error, stackTrace);
       });
@@ -528,7 +526,7 @@
     _propagateToListeners(this, listeners);
   }
 
-  void _completeError(Object error, [StackTrace? stackTrace]) {
+  void _completeError(Object error, StackTrace stackTrace) {
     assert(!_isComplete);
 
     _FutureListener? listeners = _removeListeners();
@@ -577,7 +575,7 @@
     _chainForeignFuture(value, this);
   }
 
-  void _asyncCompleteError(Object error, StackTrace? stackTrace) {
+  void _asyncCompleteError(Object error, StackTrace stackTrace) {
     assert(!_isComplete);
 
     _setPendingComplete();
@@ -767,7 +765,8 @@
     if (onTimeout == null) {
       timer = new Timer(timeLimit, () {
         result._completeError(
-            new TimeoutException("Future not completed", timeLimit));
+            new TimeoutException("Future not completed", timeLimit),
+            StackTrace.empty);
       });
     } else {
       Zone zone = Zone.current;
@@ -787,7 +786,7 @@
         timer.cancel();
         result._completeWithValue(v);
       }
-    }, onError: (Object e, StackTrace? s) {
+    }, onError: (Object e, StackTrace s) {
       if (timer.isActive) {
         timer.cancel();
         result._completeError(e, s);
diff --git a/sdk_nnbd/lib/async/stream.dart b/sdk_nnbd/lib/async/stream.dart
index c35d8a8..d504a42 100644
--- a/sdk_nnbd/lib/async/stream.dart
+++ b/sdk_nnbd/lib/async/stream.dart
@@ -154,7 +154,7 @@
     // TODO(40614): Remove once non-nullability is sound.
     ArgumentError.checkNotNull(error, "error");
     return (_AsyncStreamController<T>(null, null, null, null)
-          .._addError(error, stackTrace)
+          .._addError(error, stackTrace ?? AsyncError.defaultStackTrace(error))
           .._closeUnchecked())
         .stream;
   }
@@ -203,18 +203,20 @@
     // Declare these as variables holding closures instead of as
     // function declarations.
     // This avoids creating a new closure from the functions for each future.
-    var onValue = (T value) {
+    void onValue(T value) {
       if (!controller.isClosed) {
         controller._add(value);
         if (--count == 0) controller._closeUnchecked();
       }
-    };
-    var onError = (Object error, StackTrace? stack) {
+    }
+
+    void onError(Object error, StackTrace stack) {
       if (!controller.isClosed) {
         controller._addError(error, stack);
         if (--count == 0) controller._closeUnchecked();
       }
-    };
+    }
+
     // The futures are already running, so start listening to them immediately
     // (instead of waiting for the stream to be listened on).
     // If we wait, we might not catch errors in the futures in time.
@@ -411,7 +413,7 @@
    * error object and possibly a stack trace.
    *
    * The [onError] callback must be of type `void onError(Object error)` or
-   * `void onError(Object error, StackTrace? stackTrace)`. If [onError] accepts
+   * `void onError(Object error, StackTrace stackTrace)`. If [onError] accepts
    * two arguments it is called with the error object and the stack trace
    * (which could be `null` if this stream itself received an error without
    * stack trace).
@@ -508,6 +510,7 @@
       }
 
       final addError = controller._addError;
+      final resume = subscription.resume;
       subscription.onData((T event) {
         FutureOr<E> newValue;
         try {
@@ -518,9 +521,7 @@
         }
         if (newValue is Future<E>) {
           subscription.pause();
-          newValue
-              .then(add, onError: addError)
-              .whenComplete(subscription.resume);
+          newValue.then(add, onError: addError).whenComplete(resume);
         } else {
           if (newValue is! E) {
             throw "unreachable"; // TODO(lrn): Remove when type promotion works.
@@ -532,7 +533,7 @@
       if (!isBroadcast) {
         controller
           ..onPause = subscription.pause
-          ..onResume = subscription.resume;
+          ..onResume = resume;
       }
     };
     return controller.stream;
@@ -598,7 +599,7 @@
    * by the [onError] function.
    *
    * The [onError] callback must be of type `void onError(Object error)` or
-   * `void onError(Object error, StackTrace? stackTrace)`.
+   * `void onError(Object error, StackTrace stackTrace)`.
    * The function type determines whether [onError] is invoked with a stack
    * trace argument.
    * The stack trace argument may be `null` if this stream received an error
@@ -1471,7 +1472,8 @@
     subscription =
         this.listen(null, onError: result._completeError, onDone: () {
       result._completeError(
-          new RangeError.index(index, this, "index", null, elementIndex));
+          new RangeError.index(index, this, "index", null, elementIndex),
+          StackTrace.empty);
     }, cancelOnError: true);
     subscription.onData((T value) {
       if (index == elementIndex) {
@@ -1555,7 +1557,7 @@
           // issue: https://github.com/dart-lang/sdk/issues/37565
           controller.add(event);
         })
-        ..onError((Object error, StackTrace? stackTrace) {
+        ..onError((Object error, StackTrace stackTrace) {
           timer.cancel();
           timer = zone.createTimer(timeLimit, timeoutCallback);
           controller._addError(
@@ -2048,8 +2050,7 @@
    */
   factory StreamTransformer.fromHandlers(
       {void handleData(S data, EventSink<T> sink)?,
-      void handleError(
-          Object error, StackTrace? stackTrace, EventSink<T> sink)?,
+      void handleError(Object error, StackTrace stackTrace, EventSink<T> sink)?,
       void handleDone(EventSink<T> sink)?}) = _StreamHandlerTransformer<S, T>;
 
   /**
diff --git a/sdk_nnbd/lib/async/stream_controller.dart b/sdk_nnbd/lib/async/stream_controller.dart
index 3f3f461..8b7d786 100644
--- a/sdk_nnbd/lib/async/stream_controller.dart
+++ b/sdk_nnbd/lib/async/stream_controller.dart
@@ -607,7 +607,10 @@
     if (replacement != null) {
       error = replacement.error;
       stackTrace = replacement.stackTrace;
+    } else {
+      stackTrace ??= AsyncError.defaultStackTrace(error);
     }
+    if (stackTrace == null) throw "unreachable"; // TODO(40088)
     _addError(error, stackTrace);
   }
 
@@ -654,7 +657,7 @@
     }
   }
 
-  void _addError(Object error, StackTrace? stackTrace) {
+  void _addError(Object error, StackTrace stackTrace) {
     if (hasListener) {
       _sendError(error, stackTrace);
     } else if (_isInitialState) {
@@ -780,7 +783,7 @@
     _subscription._add(data);
   }
 
-  void _sendError(Object error, StackTrace? stackTrace) {
+  void _sendError(Object error, StackTrace stackTrace) {
     _subscription._addError(error, stackTrace);
   }
 
@@ -795,7 +798,7 @@
     _subscription._addPending(_DelayedData<T>(data));
   }
 
-  void _sendError(Object error, StackTrace? stackTrace) {
+  void _sendError(Object error, StackTrace stackTrace) {
     _subscription._addPending(_DelayedError(error, stackTrace));
   }
 
@@ -903,7 +906,7 @@
             onDone: controller._close,
             cancelOnError: cancelOnError);
 
-  static makeErrorHandler(_EventSink controller) => (Object e, StackTrace? s) {
+  static makeErrorHandler(_EventSink controller) => (Object e, StackTrace s) {
         controller._addError(e, s);
         controller._close();
       };
diff --git a/sdk_nnbd/lib/async/stream_impl.dart b/sdk_nnbd/lib/async/stream_impl.dart
index a817ac9..4404d78 100644
--- a/sdk_nnbd/lib/async/stream_impl.dart
+++ b/sdk_nnbd/lib/async/stream_impl.dart
@@ -7,7 +7,7 @@
 /** Abstract and private interface for a place to put events. */
 abstract class _EventSink<T> {
   void _add(T data);
-  void _addError(Object error, StackTrace? stackTrace);
+  void _addError(Object error, StackTrace stackTrace);
   void _close();
 }
 
@@ -20,7 +20,7 @@
  */
 abstract class _EventDispatch<T> {
   void _sendData(T data);
-  void _sendError(Object error, StackTrace? stackTrace);
+  void _sendError(Object error, StackTrace stackTrace);
   void _sendDone();
 }
 
@@ -153,9 +153,9 @@
   static Function _registerErrorHandler(Zone zone, Function? handleError) {
     // TODO(lrn): Consider whether we need to register the null handler.
     handleError ??= _nullErrorHandler;
-    if (handleError is void Function(Object, StackTrace?)) {
+    if (handleError is void Function(Object, StackTrace)) {
       return zone
-          .registerBinaryCallback<dynamic, Object, StackTrace?>(handleError);
+          .registerBinaryCallback<dynamic, Object, StackTrace>(handleError);
     }
     if (handleError is void Function(Object)) {
       return zone.registerUnaryCallback<dynamic, Object>(handleError);
@@ -220,7 +220,7 @@
       _onDone = () {
         result._complete(resultValue);
       };
-      _onError = (Object error, StackTrace? stackTrace) {
+      _onError = (Object error, StackTrace stackTrace) {
         Future cancelFuture = cancel();
         if (!identical(cancelFuture, Future._nullFuture)) {
           cancelFuture.whenComplete(() {
@@ -283,7 +283,7 @@
     }
   }
 
-  void _addError(Object error, StackTrace? stackTrace) {
+  void _addError(Object error, StackTrace stackTrace) {
     if (_isCanceled) return;
     if (_canFire) {
       _sendError(error, stackTrace); // Reports cancel after sending.
@@ -352,7 +352,7 @@
     _checkState(wasInputPaused);
   }
 
-  void _sendError(Object error, StackTrace? stackTrace) {
+  void _sendError(Object error, StackTrace stackTrace) {
     assert(!_isCanceled);
     assert(!_isPaused);
     assert(!_inCallback);
@@ -365,8 +365,8 @@
       _state |= _STATE_IN_CALLBACK;
       // TODO(floitsch): this dynamic should be 'void'.
       var onError = _onError;
-      if (onError is void Function(Object, StackTrace?)) {
-        _zone.runBinaryGuarded<Object, StackTrace?>(onError, error, stackTrace);
+      if (onError is void Function(Object, StackTrace)) {
+        _zone.runBinaryGuarded<Object, StackTrace>(onError, error, stackTrace);
       } else {
         _zone.runUnaryGuarded<Object>(_onError as void Function(Object), error);
       }
@@ -581,7 +581,7 @@
 void _nullDataHandler(dynamic value) {}
 
 /** Default error handler, reports the error to the current zone's handler. */
-void _nullErrorHandler(Object error, [StackTrace? stackTrace]) {
+void _nullErrorHandler(Object error, StackTrace stackTrace) {
   Zone.current.handleUncaughtError(error, stackTrace);
 }
 
@@ -608,7 +608,7 @@
 /** A delayed error event. */
 class _DelayedError extends _DelayedEvent {
   final Object error;
-  final StackTrace? stackTrace;
+  final StackTrace stackTrace;
 
   _DelayedError(this.error, this.stackTrace);
   void perform(_EventDispatch dispatch) {
@@ -990,8 +990,7 @@
   /// completed.
   bool _isPaused = false;
 
-  _StreamIterator(final Stream<T> stream)
-      : _stateData = stream {
+  _StreamIterator(final Stream<T> stream) : _stateData = stream {
     ArgumentError.checkNotNull(stream, "stream");
   }
 
@@ -1060,7 +1059,7 @@
     if (_isPaused) _subscription?.pause();
   }
 
-  void _onError(Object error, [StackTrace? stackTrace]) {
+  void _onError(Object error, StackTrace stackTrace) {
     assert(_subscription != null && !_isPaused);
     var moveNextFuture = _stateData as _Future<bool>;
     _subscription = null;
diff --git a/sdk_nnbd/lib/async/stream_pipe.dart b/sdk_nnbd/lib/async/stream_pipe.dart
index b307ed6..fd20228 100644
--- a/sdk_nnbd/lib/async/stream_pipe.dart
+++ b/sdk_nnbd/lib/async/stream_pipe.dart
@@ -5,8 +5,8 @@
 part of dart.async;
 
 /** Runs user code and takes actions depending on success or failure. */
-_runUserCode<T>(
-    T userCode(), onSuccess(T value), onError(Object error, StackTrace? stackTrace)) {
+_runUserCode<T>(T userCode(), onSuccess(T value),
+    onError(Object error, StackTrace stackTrace)) {
   try {
     onSuccess(userCode());
   } catch (e, s) {
@@ -24,7 +24,7 @@
 /** Helper function to cancel a subscription and wait for the potential future,
   before completing with an error. */
 void _cancelAndError(StreamSubscription subscription, _Future future,
-    Object error, StackTrace? stackTrace) {
+    Object error, StackTrace stackTrace) {
   var cancelFuture = subscription.cancel();
   if (cancelFuture != null && !identical(cancelFuture, Future._nullFuture)) {
     cancelFuture.whenComplete(() => future._completeError(error, stackTrace));
@@ -34,7 +34,7 @@
 }
 
 void _cancelAndErrorWithReplacement(StreamSubscription subscription,
-    _Future future, Object error, StackTrace? stackTrace) {
+    _Future future, Object error, StackTrace stackTrace) {
   AsyncError? replacement = Zone.current.errorCallback(error, stackTrace);
   if (replacement != null) {
     error = replacement.error;
@@ -43,12 +43,10 @@
   _cancelAndError(subscription, future, error, stackTrace);
 }
 
-typedef void _ErrorCallback(Object error, StackTrace? stackTrace);
-
 /** Helper function to make an onError argument to [_runUserCode]. */
-_ErrorCallback _cancelAndErrorClosure(
+void Function(Object error, StackTrace stackTrace) _cancelAndErrorClosure(
     StreamSubscription subscription, _Future future) {
-  return (Object error, StackTrace? stackTrace) {
+  return (Object error, StackTrace stackTrace) {
     _cancelAndError(subscription, future, error, stackTrace);
   };
 }
@@ -95,7 +93,7 @@
 
   void _handleData(S data, _EventSink<T> sink);
 
-  void _handleError(Object error, StackTrace? stackTrace, _EventSink<T> sink) {
+  void _handleError(Object error, StackTrace stackTrace, _EventSink<T> sink) {
     sink._addError(error, stackTrace);
   }
 
@@ -129,7 +127,7 @@
     super._add(data);
   }
 
-  void _addError(Object error, StackTrace? stackTrace) {
+  void _addError(Object error, StackTrace stackTrace) {
     if (_isClosed) return;
     super._addError(error, stackTrace);
   }
@@ -159,7 +157,7 @@
     _stream._handleData(data, this);
   }
 
-  void _handleError(error, StackTrace? stackTrace) {
+  void _handleError(error, StackTrace stackTrace) {
     _stream._handleError(error, stackTrace, this);
   }
 
@@ -173,7 +171,7 @@
 // -------------------------------------------------------------------
 
 void _addErrorWithReplacement(
-    _EventSink sink, Object error, StackTrace? stackTrace) {
+    _EventSink sink, Object error, StackTrace stackTrace) {
   AsyncError? replacement = Zone.current.errorCallback(error, stackTrace);
   if (replacement != null) {
     error = replacement.error;
@@ -268,7 +266,7 @@
     sink._add(data);
   }
 
-  void _handleError(Object error, StackTrace? stackTrace, _EventSink<T> sink) {
+  void _handleError(Object error, StackTrace stackTrace, _EventSink<T> sink) {
     bool matches = true;
     var test = _test;
     if (test != null) {
diff --git a/sdk_nnbd/lib/async/stream_transformers.dart b/sdk_nnbd/lib/async/stream_transformers.dart
index b445d66..ca7934c 100644
--- a/sdk_nnbd/lib/async/stream_transformers.dart
+++ b/sdk_nnbd/lib/async/stream_transformers.dart
@@ -16,7 +16,7 @@
   }
 
   void addError(Object error, [StackTrace? stackTrace]) {
-    _sink._addError(error, stackTrace);
+    _sink._addError(error, stackTrace ?? AsyncError.defaultStackTrace(error));
   }
 
   void close() {
@@ -76,7 +76,7 @@
    * events when the stream is already closed. Report them as state
    * error.
    */
-  void _addError(Object error, StackTrace? stackTrace) {
+  void _addError(Object error, StackTrace stackTrace) {
     if (_isClosed) {
       throw new StateError("Stream is already closed");
     }
@@ -124,7 +124,7 @@
     }
   }
 
-  void _handleError(Object error, StackTrace? stackTrace) {
+  void _handleError(Object error, StackTrace stackTrace) {
     try {
       _transformerSink.addError(error, stackTrace);
     } catch (e, s) {
@@ -193,7 +193,7 @@
 
 /// Error-handler coming from [StreamTransformer.fromHandlers].
 typedef void _TransformErrorHandler<T>(
-    Object error, StackTrace? stackTrace, EventSink<T> sink);
+    Object error, StackTrace stackTrace, EventSink<T> sink);
 
 /// Done-handler coming from [StreamTransformer.fromHandlers].
 typedef void _TransformDoneHandler<T>(EventSink<T> sink);
@@ -236,6 +236,7 @@
       throw StateError("Sink is closed");
     }
     var handleError = _handleError;
+    stackTrace ??= AsyncError.defaultStackTrace(error);
     if (handleError != null) {
       handleError(error, stackTrace, sink);
     } else {
@@ -264,8 +265,7 @@
 class _StreamHandlerTransformer<S, T> extends _StreamSinkTransformer<S, T> {
   _StreamHandlerTransformer(
       {void handleData(S data, EventSink<T> sink)?,
-      void handleError(
-          Object error, StackTrace? stackTrace, EventSink<T> sink)?,
+      void handleError(Object error, StackTrace stackTrace, EventSink<T> sink)?,
       void handleDone(EventSink<T> sink)?})
       : super((EventSink<T> outputSink) {
           return new _HandlerEventSink<S, T>(
diff --git a/sdk_nnbd/lib/async/zone.dart b/sdk_nnbd/lib/async/zone.dart
index 2fc47b8..53ad166 100644
--- a/sdk_nnbd/lib/async/zone.dart
+++ b/sdk_nnbd/lib/async/zone.dart
@@ -9,7 +9,7 @@
 typedef R ZoneBinaryCallback<R, T1, T2>(T1 arg1, T2 arg2);
 
 typedef HandleUncaughtErrorHandler = void Function(Zone self,
-    ZoneDelegate parent, Zone zone, Object error, StackTrace? stackTrace);
+    ZoneDelegate parent, Zone zone, Object error, StackTrace stackTrace);
 typedef RunHandler = R Function<R>(
     Zone self, ZoneDelegate parent, Zone zone, R Function() f);
 typedef RunUnaryHandler = R Function<R, T>(
@@ -39,13 +39,27 @@
 /** Pair of error and stack trace. Returned by [Zone.errorCallback]. */
 class AsyncError implements Error {
   final Object error;
-  final StackTrace? stackTrace;
+  final StackTrace stackTrace;
 
-  AsyncError(this.error, this.stackTrace) {
+  AsyncError(this.error, StackTrace? stackTrace)
+      : stackTrace = stackTrace ?? defaultStackTrace(error) {
     // TODO(40614): Remove once non-nullability is sound.
     ArgumentError.checkNotNull(error, "error");
   }
 
+  /// A default stack trace for an error.
+  ///
+  /// If [error] is an [Error] and it has an [Error.stackTrace],
+  /// that stack trace is returned.
+  /// If not, the [StackTrace.empty] default stack trace is returned.
+  static StackTrace defaultStackTrace(Object error) {
+    if (error is Error) {
+      var stackTrace = error.stackTrace;
+      if (stackTrace != null) return stackTrace;
+    }
+    return StackTrace.empty;
+  }
+
   String toString() => '$error';
 }
 
@@ -205,7 +219,7 @@
  *   to skip zones that would just delegate to their parents.
  */
 abstract class ZoneDelegate {
-  void handleUncaughtError(Zone zone, Object error, StackTrace? stackTrace);
+  void handleUncaughtError(Zone zone, Object error, StackTrace stackTrace);
   R run<R>(Zone zone, R f());
   R runUnary<R, T>(Zone zone, R f(T arg), T arg);
   R runBinary<R, T1, T2>(Zone zone, R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2);
@@ -312,7 +326,7 @@
    * By default, when handled by the root zone, uncaught asynchronous errors are
    * treated like uncaught synchronous exceptions.
    */
-  void handleUncaughtError(Object error, StackTrace? stackTrace);
+  void handleUncaughtError(Object error, StackTrace stackTrace);
 
   /**
    * The parent zone of the this zone.
@@ -694,7 +708,7 @@
 
   _ZoneDelegate(this._delegationTarget);
 
-  void handleUncaughtError(Zone zone, Object error, StackTrace? stackTrace) {
+  void handleUncaughtError(Zone zone, Object error, StackTrace stackTrace) {
     var implementation = _delegationTarget._handleUncaughtError;
     _Zone implZone = implementation.zone;
     HandleUncaughtErrorHandler handler = implementation.function;
@@ -1019,7 +1033,7 @@
 
   // Methods that can be customized by the zone specification.
 
-  void handleUncaughtError(Object error, StackTrace? stackTrace) {
+  void handleUncaughtError(Object error, StackTrace stackTrace) {
     var implementation = this._handleUncaughtError;
     ZoneDelegate parentDelegate = implementation.zone._parentDelegate;
     HandleUncaughtErrorHandler handler = implementation.function;
@@ -1120,14 +1134,13 @@
 }
 
 void _rootHandleUncaughtError(Zone? self, ZoneDelegate? parent, Zone zone,
-    Object error, StackTrace? stackTrace) {
+    Object error, StackTrace stackTrace) {
   _schedulePriorityAsyncCallback(() {
-    if (stackTrace == null) throw error;
     _rethrow(error, stackTrace);
   });
 }
 
-external void _rethrow(Object error, StackTrace? stackTrace);
+external void _rethrow(Object error, StackTrace stackTrace);
 
 R _rootRun<R>(Zone? self, ZoneDelegate? parent, Zone zone, R f()) {
   if (identical(Zone._current, zone)) return f();
@@ -1383,7 +1396,7 @@
 
   // Methods that can be customized by the zone specification.
 
-  void handleUncaughtError(Object error, StackTrace? stackTrace) {
+  void handleUncaughtError(Object error, StackTrace stackTrace) {
     _rootHandleUncaughtError(null, null, this, error, stackTrace);
   }
 
@@ -1487,8 +1500,8 @@
     return _runZoned<R>(body, zoneValues, zoneSpecification);
   }
   void Function(Object)? unaryOnError;
-  void Function(Object, StackTrace?)? binaryOnError;
-  if (onError is void Function(Object, StackTrace?)) {
+  void Function(Object, StackTrace)? binaryOnError;
+  if (onError is void Function(Object, StackTrace)) {
     binaryOnError = onError;
   } else if (onError is void Function(Object)) {
     unaryOnError = onError;
@@ -1498,7 +1511,7 @@
   }
   _Zone parentZone = Zone._current;
   HandleUncaughtErrorHandler errorHandler = (Zone self, ZoneDelegate parent,
-      Zone zone, Object error, StackTrace? stackTrace) {
+      Zone zone, Object error, StackTrace stackTrace) {
     try {
       if (binaryOnError != null) {
         parentZone.runBinary(binaryOnError, error, stackTrace);
diff --git a/sdk_nnbd/lib/collection/list.dart b/sdk_nnbd/lib/collection/list.dart
index a47ca1b..94124c5 100644
--- a/sdk_nnbd/lib/collection/list.dart
+++ b/sdk_nnbd/lib/collection/list.dart
@@ -358,12 +358,7 @@
     return ListMapView<E>(this);
   }
 
-  List<E> operator +(List<E> other) {
-    var result = <E>[]..length = (this.length + other.length);
-    result.setRange(0, this.length, this);
-    result.setRange(this.length, result.length, other);
-    return result;
-  }
+  List<E> operator +(List<E> other) => [...this, ...other];
 
   List<E> sublist(int start, [int? end]) {
     int listLength = this.length;
diff --git a/sdk_nnbd/lib/collection/splay_tree.dart b/sdk_nnbd/lib/collection/splay_tree.dart
index 6eda337..b81a034 100644
--- a/sdk_nnbd/lib/collection/splay_tree.dart
+++ b/sdk_nnbd/lib/collection/splay_tree.dart
@@ -6,36 +6,38 @@
 
 typedef _Predicate<T> = bool Function(T value);
 
-class _SplayTreeNodeBase<K> {
-  _SplayTreeNode<K>? left;
-  _SplayTreeNode<K>? right;
-}
-
 /// A node in a splay tree. It holds the sorting key and the left
 /// and right children in the tree.
-class _SplayTreeNode<K> extends _SplayTreeNodeBase<K> {
-  final K key;
+class _SplayTreeNode<K> {
+  // The key is nullable to be able to create a dummy node.
+  final K? _key;
 
-  _SplayTreeNode(this.key);
-}
+  _SplayTreeNode<K>? left;
+  _SplayTreeNode<K>? right;
 
-class _DummySplayTreeNode<K> extends _SplayTreeNodeBase<K>
-    implements _SplayTreeNode<K> {
-  K get key => throw UnsupportedError("");
+  _SplayTreeNode(this._key);
+
+  K get key {
+    // TODO(dartbug.com/40892): replace with '_key as K'
+    K? localKey = _key;
+    return (localKey != null) ? localKey : localKey as K;
+  }
 }
 
 /// A node in a splay tree based map.
 ///
 /// A [_SplayTreeNode] that also contains a value
 class _SplayTreeMapNode<K, V> extends _SplayTreeNode<K> {
-  V value;
-  _SplayTreeMapNode(K key, this.value) : super(key);
-}
+  // The value is nullable to be able to create a dummy node.
+  V? _value;
 
-class _DummySplayTreeMapNode<K, V> extends _DummySplayTreeNode<K>
-    implements _SplayTreeMapNode<K, V> {
-  V get value => throw UnsupportedError("");
-  set value(V v) => throw UnsupportedError("");
+  _SplayTreeMapNode(K? key, this._value) : super(key);
+
+  V get value {
+    // TODO(dartbug.com/40892): replace with '_value as V'
+    V? localValue = _value;
+    return (localValue != null) ? localValue : localValue as V;
+  }
 }
 
 /// A splay tree is a self-balancing binary search tree.
@@ -264,7 +266,7 @@
 class SplayTreeMap<K, V> extends _SplayTree<K, _SplayTreeMapNode<K, V>>
     with MapMixin<K, V> {
   _SplayTreeMapNode<K, V>? _root;
-  final _SplayTreeMapNode<K, V> _dummy = _DummySplayTreeMapNode<K, V>();
+  final _SplayTreeMapNode<K, V> _dummy = _SplayTreeMapNode<K, V>(null, null);
 
   Comparator<K> _comparator;
   _Predicate _validKey;
@@ -359,7 +361,7 @@
     // the key to the root of the tree.
     int comp = _splay(key);
     if (comp == 0) {
-      _root!.value = value;
+      _root!._value = value;
       return;
     }
     _addNewRoot(_SplayTreeMapNode(key, value), comp);
@@ -652,7 +654,7 @@
 class SplayTreeSet<E> extends _SplayTree<E, _SplayTreeNode<E>>
     with IterableMixin<E>, SetMixin<E> {
   _SplayTreeNode<E>? _root;
-  final _SplayTreeNode<E> _dummy = _DummySplayTreeNode<E>();
+  final _SplayTreeNode<E> _dummy = _SplayTreeNode<E>(null);
 
   Comparator<E> _comparator;
   _Predicate _validKey;
diff --git a/sdk_nnbd/lib/core/errors.dart b/sdk_nnbd/lib/core/errors.dart
index 8a87c8b..005cb84 100644
--- a/sdk_nnbd/lib/core/errors.dart
+++ b/sdk_nnbd/lib/core/errors.dart
@@ -182,10 +182,16 @@
 
   /**
    * Throws if [argument] is `null`.
+   *
+   * If [name] is supplied, it is used as the parameter name
+   * in the error message.
+   *
+   * Returns the [argument] if it is not null.
    */
   @Since("2.1")
-  static void checkNotNull(Object? argument, [String? name]) {
+  static T checkNotNull<@Since("2.8") T>(T? argument, [String? name]) {
     if (argument == null) throw ArgumentError.notNull(name);
+    return argument;
   }
 
   // Helper functions for toString overridden in subclasses.
@@ -274,30 +280,42 @@
       [String? name, String? message, int? length]) = IndexError;
 
   /**
-   * Check that a [value] lies in a specific interval.
+   * Check that an integer [value] lies in a specific interval.
    *
    * Throws if [value] is not in the interval.
    * The interval is from [minValue] to [maxValue], both inclusive.
+   *
+   * If [name] or [message] are provided, they are used as the parameter
+   * name and message text of the thrown error.
+   *
+   * Returns [value] if it is in the interval.
    */
-  static void checkValueInInterval(int value, int minValue, int maxValue,
+  static int checkValueInInterval(int value, int minValue, int maxValue,
       [String? name, String? message]) {
     if (value < minValue || value > maxValue) {
       throw RangeError.range(value, minValue, maxValue, name, message);
     }
+    return value;
   }
 
   /**
-   * Check that a value is a valid index into an indexable object.
+   * Check that [index] is a valid index into an indexable object.
    *
    * Throws if [index] is not a valid index into [indexable].
    *
    * An indexable object is one that has a `length` and a and index-operator
    * `[]` that accepts an index if `0 <= index < length`.
    *
+   * If [name] or [message] are provided, they are used as the parameter
+   * name and message text of the thrown error. If [name] is omitted, it
+   * defaults to `"index"`.
+   *
    * If [length] is provided, it is used as the length of the indexable object,
    * otherwise the length is found as `indexable.length`.
+   *
+   * Returns [index] if it is a valid index.
    */
-  static void checkValidIndex(int index, dynamic indexable,
+  static int checkValidIndex(int index, dynamic indexable,
       [String? name, int? length, String? message]) {
     length ??= (indexable.length as int);
     // Comparing with `0` as receiver produces better dart2js type inference.
@@ -305,6 +323,7 @@
       name ??= "index";
       throw RangeError.index(index, indexable, name, message, length);
     }
+    return index;
   }
 
   /**
@@ -342,12 +361,19 @@
   }
 
   /**
-   * Check that an integer value isn't negative.
+   * Check that an integer value is non-negative.
    *
    * Throws if the value is negative.
+   *
+   * If [name] or [message] are provided, they are used as the parameter
+   * name and message text of the thrown error. If [name] is omitted, it
+   * defaults to `index`.
+   *
+   * Returns [value] if it is not negative.
    */
-  static void checkNotNegative(int value, [String? name, String? message]) {
+  static int checkNotNegative(int value, [String? name, String? message]) {
     if (value < 0) throw RangeError.range(value, 0, null, name, message);
+    return value;
   }
 
   String get _errorName => "RangeError";
diff --git a/sdk_nnbd/lib/core/stacktrace.dart b/sdk_nnbd/lib/core/stacktrace.dart
index 2eb1493..ef08f71 100644
--- a/sdk_nnbd/lib/core/stacktrace.dart
+++ b/sdk_nnbd/lib/core/stacktrace.dart
@@ -14,6 +14,13 @@
  * them programmatically.
  */
 abstract class StackTrace {
+  /// A stack trace object with no information.
+  ///
+  /// This stack trace is used as the default in situations where
+  /// a stack trace is required, but the user has not supplied one.
+  @Since("2.8")
+  static const empty = const _StringStackTrace("");
+
   StackTrace(); // In case existing classes extend StackTrace.
 
   /**
@@ -55,6 +62,6 @@
 
 class _StringStackTrace implements StackTrace {
   final String _stackTrace;
-  _StringStackTrace(this._stackTrace);
+  const _StringStackTrace(this._stackTrace);
   String toString() => _stackTrace;
 }
diff --git a/sdk_nnbd/lib/html/dart2js/html_dart2js.dart b/sdk_nnbd/lib/html/dart2js/html_dart2js.dart
index c16628a..f8ed144 100644
--- a/sdk_nnbd/lib/html/dart2js/html_dart2js.dart
+++ b/sdk_nnbd/lib/html/dart2js/html_dart2js.dart
@@ -13788,6 +13788,14 @@
          if (!(element.attributes instanceof NamedNodeMap)) {
 	   return true;
 	 }
+         // If something has corrupted the traversal we want to detect
+         // these on not only the children (tested below) but on the node itself
+         // in case it was bypassed.
+         if (element["id"] == 'lastChild' || element["name"] == 'lastChild' ||
+             element["id"] == 'previousSibling' || element["name"] == 'previousSibling' ||
+             element["id"] == 'children' || element["name"] == 'children') {
+           return true;
+         }
 	 var childNodes = element.childNodes;
 	 if (element.lastChild &&
 	     element.lastChild !== childNodes[childNodes.length -1]) {
@@ -13813,6 +13821,7 @@
            // allowing us to check for clobbering that may show up in other accesses.
            if (child["id"] == 'attributes' || child["name"] == 'attributes' ||
                child["id"] == 'lastChild'  || child["name"] == 'lastChild' ||
+               child["id"] == 'previousSibling'  || child["name"] == 'previousSibling' ||
                child["id"] == 'children' || child["name"] == 'children') {
              return true;
            }
@@ -40830,6 +40839,9 @@
  */
 class _ValidatingTreeSanitizer implements NodeTreeSanitizer {
   NodeValidator validator;
+
+  /// Did we modify the tree by removing anything.
+  bool modifiedTree = false;
   _ValidatingTreeSanitizer(this.validator) {}
 
   void sanitizeTree(Node node) {
@@ -40838,11 +40850,15 @@
 
       var child = node.lastChild;
       while (null != child) {
-        var nextChild;
+        Node? nextChild;
         try {
-          // Child may be removed during the walk, and we may not
-          // even be able to get its previousNode.
+          // Child may be removed during the walk, and we may not even be able
+          // to get its previousNode. But it's also possible that previousNode
+          // (i.e. previousSibling) is being spoofed, so double-check it.
           nextChild = child.previousNode;
+          if (nextChild != null && nextChild.nextNode != child) {
+            throw StateError("Corrupt HTML");
+          }
         } catch (e) {
           // Child appears bad, remove it. We want to check the rest of the
           // children of node and, but we have no way of getting to the next
@@ -40856,7 +40872,12 @@
       }
     }
 
+    modifiedTree = false;
     walk(node, null);
+    while (modifiedTree) {
+      modifiedTree = false;
+      walk(node, null);
+    }
   }
 
   /// Aggressively try to remove node.
@@ -40864,7 +40885,8 @@
     // If we have the parent, it's presumably already passed more sanitization
     // or is the fragment, so ask it to remove the child. And if that fails
     // try to set the outer html.
-    if (parent == null) {
+    modifiedTree = true;
+    if (parent == null || parent != node.parentNode) {
       node.remove();
     } else {
       parent._removeChild(node);
diff --git a/sdk_nnbd/lib/internal/async_cast.dart b/sdk_nnbd/lib/internal/async_cast.dart
index 677f303..306ada8 100644
--- a/sdk_nnbd/lib/internal/async_cast.dart
+++ b/sdk_nnbd/lib/internal/async_cast.dart
@@ -50,9 +50,9 @@
     _source.onError(handleError);
     if (handleError == null) {
       _handleError = null;
-    } else if (handleError is void Function(Object, StackTrace?)) {
+    } else if (handleError is void Function(Object, StackTrace)) {
       _handleError = _zone
-          .registerBinaryCallback<dynamic, Object, StackTrace?>(handleError);
+          .registerBinaryCallback<dynamic, Object, StackTrace>(handleError);
     } else if (handleError is void Function(Object)) {
       _handleError = _zone.registerUnaryCallback<dynamic, Object>(handleError);
     } else {
@@ -74,8 +74,8 @@
       var handleError = _handleError;
       if (handleError == null) {
         _zone.handleUncaughtError(error, stack);
-      } else if (handleError is void Function(Object, StackTrace?)) {
-        _zone.runBinaryGuarded<Object, StackTrace?>(handleError, error, stack);
+      } else if (handleError is void Function(Object, StackTrace)) {
+        _zone.runBinaryGuarded<Object, StackTrace>(handleError, error, stack);
       } else {
         _zone.runUnaryGuarded<Object>(
             handleError as void Function(Object), error);
diff --git a/sdk_nnbd/lib/io/common.dart b/sdk_nnbd/lib/io/common.dart
index f8fda15..e6a56bc 100644
--- a/sdk_nnbd/lib/io/common.dart
+++ b/sdk_nnbd/lib/io/common.dart
@@ -105,7 +105,7 @@
   int j = start;
   for (int i = 0; i < length; i++) {
     int value = buffer[j];
-    // TODO: Remove once non-nullability is sound.
+    // TODO(40614): Remove once non-nullability is sound.
     ArgumentError.checkNotNull(value, "buffer[]");
     newBuffer[i] = value;
     j++;
diff --git a/sdk_nnbd/lib/io/data_transformer.dart b/sdk_nnbd/lib/io/data_transformer.dart
index 81fe195..4346a1a 100644
--- a/sdk_nnbd/lib/io/data_transformer.dart
+++ b/sdk_nnbd/lib/io/data_transformer.dart
@@ -598,7 +598,7 @@
   }
 
   void addSlice(List<int> data, int start, int end, bool isLast) {
-    // TODO: Remove once non-nullability is sound.
+    // TODO(40614): Remove once non-nullability is sound.
     ArgumentError.checkNotNull(end, "end");
     if (_closed) return;
     RangeError.checkValidRange(start, end, data.length);
diff --git a/sdk_nnbd/lib/io/directory_impl.dart b/sdk_nnbd/lib/io/directory_impl.dart
index 06777e7..9ca5b6c 100644
--- a/sdk_nnbd/lib/io/directory_impl.dart
+++ b/sdk_nnbd/lib/io/directory_impl.dart
@@ -213,7 +213,7 @@
   }
 
   Directory renameSync(String newPath) {
-    // TODO: Remove once non-nullability is sound.
+    // TODO(40614): Remove once non-nullability is sound.
     ArgumentError.checkNotNull(newPath, "newPath");
     var result = _rename(_Namespace._namespace, _rawPath, newPath);
     if (result is OSError) {
@@ -236,7 +236,7 @@
 
   List<FileSystemEntity> listSync(
       {bool recursive: false, bool followLinks: true}) {
-    // TODO: Remove once non-nullability is sound.
+    // TODO(40614): Remove once non-nullability is sound.
     ArgumentError.checkNotNull(recursive, "recursive");
     ArgumentError.checkNotNull(followLinks, "followLinks");
     var result = <FileSystemEntity>[];
diff --git a/sdk_nnbd/lib/io/file_system_entity.dart b/sdk_nnbd/lib/io/file_system_entity.dart
index 737d673..0741583 100644
--- a/sdk_nnbd/lib/io/file_system_entity.dart
+++ b/sdk_nnbd/lib/io/file_system_entity.dart
@@ -825,7 +825,7 @@
 
   // TODO(bkonyi): find a way to do this with raw paths.
   static String _trimTrailingPathSeparators(String path) {
-    // TODO: Remove once non-nullability is sound.
+    // TODO(40614): Remove once non-nullability is sound.
     ArgumentError.checkNotNull(path, "path");
     if (Platform.isWindows) {
       while (path.length > 1 &&
diff --git a/sdk_nnbd/lib/io/io_sink.dart b/sdk_nnbd/lib/io/io_sink.dart
index 38296b8..d4a3ec8 100644
--- a/sdk_nnbd/lib/io/io_sink.dart
+++ b/sdk_nnbd/lib/io/io_sink.dart
@@ -31,7 +31,8 @@
    * The [Encoding] used when writing strings. Depending on the
    * underlying consumer this property might be mutable.
    */
-  Encoding encoding;
+  Encoding get encoding;
+  void set encoding(Encoding newEncoding);
 
   /**
    * Adds byte [data] to the target consumer, ignoring [encoding].
diff --git a/sdk_nnbd/lib/io/secure_socket.dart b/sdk_nnbd/lib/io/secure_socket.dart
index 857d8b2..fef9d16 100644
--- a/sdk_nnbd/lib/io/secure_socket.dart
+++ b/sdk_nnbd/lib/io/secure_socket.dart
@@ -581,12 +581,12 @@
     if (host is! String && host is! InternetAddress) {
       throw new ArgumentError("host is not a String or an InternetAddress");
     }
-    // TODO: Remove once non-nullability is sound.
+    // TODO(40614): Remove once non-nullability is sound.
     ArgumentError.checkNotNull(requestedPort, "requestedPort");
     if (requestedPort < 0 || requestedPort > 65535) {
       throw ArgumentError("requestedPort is not in the range 0..65535");
     }
-    // TODO: Remove once non-nullability is sound.
+    // TODO(40614): Remove once non-nullability is sound.
     ArgumentError.checkNotNull(
         requestClientCertificate, "requestClientCertificate");
     ArgumentError.checkNotNull(
@@ -698,7 +698,7 @@
       throw new ArgumentError(
           "Invalid bytes parameter in SecureSocket.read (bytes: $bytes)");
     }
-    // TODO: Remove once non-nullability is sound.
+    // TODO(40614): Remove once non-nullability is sound.
     offset = _fixOffset(offset);
     if (offset < 0) {
       throw new ArgumentError(
diff --git a/sdk_nnbd/lib/io/socket.dart b/sdk_nnbd/lib/io/socket.dart
index dc92d8b..bf1e209 100644
--- a/sdk_nnbd/lib/io/socket.dart
+++ b/sdk_nnbd/lib/io/socket.dart
@@ -6,11 +6,15 @@
 
 /**
  * [InternetAddressType] is the type an [InternetAddress]. Currently,
- * IP version 4 (IPv4) and IP version 6 (IPv6) are supported.
+ * IP version 4 (IPv4), IP version 6 (IPv6) and Unix domain address are
+ * supported. Unix domain sockets are available only on Linux, MacOS and
+ * Android.
  */
 class InternetAddressType {
   static const InternetAddressType IPv4 = const InternetAddressType._(0);
   static const InternetAddressType IPv6 = const InternetAddressType._(1);
+  @Since("2.8")
+  static const InternetAddressType unix = const InternetAddressType._(2);
   static const InternetAddressType any = const InternetAddressType._(-1);
 
   @Deprecated("Use IPv4 instead")
@@ -25,8 +29,9 @@
   const InternetAddressType._(this._value);
 
   factory InternetAddressType._from(int value) {
-    if (value == 0) return IPv4;
-    if (value == 1) return IPv6;
+    if (value == IPv4._value) return IPv4;
+    if (value == IPv6._value) return IPv6;
+    if (value == unix._value) return unix;
     throw new ArgumentError("Invalid type: $value");
   }
 
@@ -41,6 +46,8 @@
         return "IPv4";
       case 1:
         return "IPv6";
+      case 2:
+        return "Unix";
       default:
         throw new ArgumentError("Invalid InternetAddress");
     }
@@ -50,7 +57,7 @@
 }
 
 /**
- * An internet address.
+ * An internet address or a Unix domain address.
  *
  * This object holds an internet address. If this internet address
  * is the result of a DNS lookup, the address also holds the hostname
@@ -93,27 +100,35 @@
   external static InternetAddress get ANY_IP_V6;
 
   /**
-   * The [type] of the [InternetAddress] specified what IP protocol.
+   * The address family of the [InternetAddress].
    */
   InternetAddressType get type;
 
   /**
-   * The numeric address of the host. For IPv4 addresses this is using
-   * the dotted-decimal notation. For IPv6 it is using the
-   * hexadecimal representation.
+   * The numeric address of the host.
+   *
+   * For IPv4 addresses this is using the dotted-decimal notation.
+   * For IPv6 it is using the hexadecimal representation.
+   * For Unix domain addresses, this is a file path.
    */
   String get address;
 
   /**
-   * The host used to lookup the address. If there is no host
-   * associated with the address this returns the numeric address.
+   * The host used to lookup the address.
+   *
+   * If there is no host associated with the address this returns the [address].
    */
   String get host;
 
   /**
-   * Get the raw address of this [InternetAddress]. The result is either a
-   * 4 or 16 byte long list. The returned list is a copy, making it possible
-   * to change the list without modifying the [InternetAddress].
+   * The raw address of this [InternetAddress].
+   *
+   * For an IP address, the result is either a 4 or 16 byte long list.
+   * For a Unix domain address, UTF-8 encoded byte sequences that represents
+   * [address] is returned.
+   *
+   * The returned list is a fresh copy, making it possible to change the list without
+   * modifying the [InternetAddress].
    */
   Uint8List get rawAddress;
 
@@ -133,17 +148,48 @@
   bool get isMulticast;
 
   /**
-   * Creates a new [InternetAddress] from a numeric address.
+   * Creates a new [InternetAddress] from a numeric address or a file path.
    *
-   * If the address in [address] is not a numeric IPv4
-   * (dotted-decimal notation) or IPv6 (hexadecimal representation).
-   * address [ArgumentError] is thrown.
+   * If [type] is [InternetAddressType.IPv4], [address] must be a numeric IPv4
+   * address (dotted-decimal notation).
+   * If [type] is [InternetAddressType.IPv6], [address] must be a numeric IPv6
+   * address (hexadecimal notation).
+   * If [type] is [InternetAddressType.unix], [address] must be a a valid file
+   * path.
+   * If [type] is omitted, [address] must be either a numeric IPv4 or IPv6
+   * address and the type is inferred from the format.
+   *
+   * To create a Unix domain address, [type] should be
+   * [InternetAddressType.unix] and [address] should be a string.
    */
-  external factory InternetAddress(String address);
+  external factory InternetAddress(String address,
+      {@Since("2.8") InternetAddressType? type});
 
   /**
-   * Perform a reverse dns lookup on the [address], creating a new
-   * [InternetAddress] where the host field set to the result.
+   * Creates a new [InternetAddress] from the provided raw address bytes.
+   *
+   * If the [type] is [InternetAddressType.IPv4], the [rawAddress] must have
+   * length 4.
+   * If the [type] is [InternetAddressType.IPv6], the [rawAddress] must have
+   * length 16.
+   * If the [type] is [InternetAddressType.IPv4], the [rawAddress] must be a
+   * valid UTF-8 encoded file path.
+   *
+   * If [type] is omitted, the [rawAddress] must have a length of either 4 or
+   * 16, in which case the type defaults to [InternetAddress.IPv4] or
+   * [InternetAddress.IPv6] respectively.
+   */
+  external factory InternetAddress.fromRawAddress(Uint8List rawAddress,
+      {@Since("2.8") InternetAddressType? type});
+
+  /**
+   * Perform a reverse DNS lookup on this [address]
+   *
+   * Returns a new [InternetAddress] with the same address, but where the [host]
+   * field set to the result of the lookup.
+   *
+   * If this address is Unix domain addresses, no lookup is performed and this
+   * address is returned directly.
    */
   Future<InternetAddress> reverse();
 
@@ -817,28 +863,30 @@
   void setRawOption(RawSocketOption option);
 
   /**
-   * Returns the port used by this socket.
+   * The port used by this socket.
    *
    * Throws a [SocketException] if the socket is closed.
+   * The port is 0 if the socket is a Unix domain socket.
    */
   int get port;
 
   /**
-   * Returns the remote port connected to by this socket.
+   * The remote port connected to by this socket.
    *
    * Throws a [SocketException] if the socket is closed.
+   * The port is 0 if the socket is a Unix domain socket.
    */
   int get remotePort;
 
   /**
-   * Returns the [InternetAddress] used to connect this socket.
+   * The [InternetAddress] used to connect this socket.
    *
    * Throws a [SocketException] if the socket is closed.
    */
   InternetAddress get address;
 
   /**
-   * Returns the remote [InternetAddress] connected to by this socket.
+   * The remote [InternetAddress] connected to by this socket.
    *
    * Throws a [SocketException] if the socket is closed.
    */
diff --git a/sdk_nnbd/lib/mirrors/mirrors.dart b/sdk_nnbd/lib/mirrors/mirrors.dart
index baec2f4..95a8aff 100644
--- a/sdk_nnbd/lib/mirrors/mirrors.dart
+++ b/sdk_nnbd/lib/mirrors/mirrors.dart
@@ -226,7 +226,7 @@
    * 2. the isolate being reflected by this mirror is the same isolate being
    *    reflected by [other].
    */
-  bool operator ==(other);
+  bool operator ==(Object other);
 
   /**
    * Loads the library at the given uri into this isolate.
@@ -545,7 +545,7 @@
    *    b. the remote objects reflected by this mirror and by [other] are
    *    identical.
    */
-  bool operator ==(other);
+  bool operator ==(Object other);
 }
 
 /**
@@ -630,7 +630,7 @@
    * 2. The library being reflected by this mirror and the library being
    *    reflected by [other] are the same library in the same isolate.
    */
-  bool operator ==(other);
+  bool operator ==(Object other);
 
   /**
    * Returns a list of the imports and exports in this library;
@@ -888,7 +888,7 @@
    * Note that if the reflected class is an invocation of a generic class, 2.
    * implies that the reflected class and [other] have equal type arguments.
    */
-  bool operator ==(other);
+  bool operator ==(Object other);
 
   /**
    * Returns whether the class denoted by the receiver is a subclass of the
@@ -948,7 +948,7 @@
    * 1. [other] is a mirror of the same kind, and
    * 2. [:simpleName == other.simpleName:] and [:owner == other.owner:].
    */
-  bool operator ==(other);
+  bool operator ==(Object other);
 }
 
 /**
@@ -1081,7 +1081,7 @@
    * 1. [other] is a mirror of the same kind, and
    * 2. [:simpleName == other.simpleName:] and [:owner == other.owner:].
    */
-  bool operator ==(other);
+  bool operator ==(Object other);
 }
 
 /**
@@ -1127,7 +1127,7 @@
    * 1. [other] is a mirror of the same kind, and
    * 2. [:simpleName == other.simpleName:] and [:owner == other.owner:].
    */
-  bool operator ==(other);
+  bool operator ==(Object other);
 }
 
 /**
diff --git a/tests/angular/.blazeproject b/tests/angular/.blazeproject
deleted file mode 100644
index 8ca3309..0000000
--- a/tests/angular/.blazeproject
+++ /dev/null
@@ -1,7 +0,0 @@
-directories:
-  ads/acx2/testing/angular
-
-targets:
-  //ads/acx2/testing/angular/...:all
-additional_languages:
-  dart
\ No newline at end of file
diff --git a/tests/compiler/dart2js/analyses/analysis_helper.dart b/tests/compiler/dart2js/analyses/analysis_helper.dart
index b422f84..d70a4bc 100644
--- a/tests/compiler/dart2js/analyses/analysis_helper.dart
+++ b/tests/compiler/dart2js/analyses/analysis_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.7
+
 import 'dart:convert' as json;
 import 'dart:io';
 
diff --git a/tests/compiler/dart2js/analyses/analyze_test.dart b/tests/compiler/dart2js/analyses/analyze_test.dart
index 27e50dd..b0f6832 100644
--- a/tests/compiler/dart2js/analyses/analyze_test.dart
+++ b/tests/compiler/dart2js/analyses/analyze_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.7
+
 import "package:testing/src/run_tests.dart" as testing show main;
 
 main() {
diff --git a/tests/compiler/dart2js/analyses/api_dynamic_test.dart b/tests/compiler/dart2js/analyses/api_dynamic_test.dart
index e06471d..d9a0bf7 100644
--- a/tests/compiler/dart2js/analyses/api_dynamic_test.dart
+++ b/tests/compiler/dart2js/analyses/api_dynamic_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'analysis_helper.dart';
 
diff --git a/tests/compiler/dart2js/analyses/dart2js_dynamic_test.dart b/tests/compiler/dart2js/analyses/dart2js_dynamic_test.dart
index b65a57f..e435e6d 100644
--- a/tests/compiler/dart2js/analyses/dart2js_dynamic_test.dart
+++ b/tests/compiler/dart2js/analyses/dart2js_dynamic_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'analysis_helper.dart';
 
diff --git a/tests/compiler/dart2js/analyses/static_type_visitor_test.dart b/tests/compiler/dart2js/analyses/static_type_visitor_test.dart
index 6d59f72..9fb7a2b 100644
--- a/tests/compiler/dart2js/analyses/static_type_visitor_test.dart
+++ b/tests/compiler/dart2js/analyses/static_type_visitor_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/ir/static_type.dart';
diff --git a/tests/compiler/dart2js/annotations/annotations_test.dart b/tests/compiler/dart2js/annotations/annotations_test.dart
index 38b6bf5..82c35a0 100644
--- a/tests/compiler/dart2js/annotations/annotations_test.dart
+++ b/tests/compiler/dart2js/annotations/annotations_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.7
+
 import 'dart:io';
 import 'package:_fe_analyzer_shared/src/testing/features.dart';
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/annotations/data/basic.dart b/tests/compiler/dart2js/annotations/data/basic.dart
index c60693b..c7f29c9 100644
--- a/tests/compiler/dart2js/annotations/data/basic.dart
+++ b/tests/compiler/dart2js/annotations/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.7
+
 main() {
   noInline();
   tryInline();
diff --git a/tests/compiler/dart2js/annotations/data/directives.dart b/tests/compiler/dart2js/annotations/data/directives.dart
index dbebee2..fadf7d8 100644
--- a/tests/compiler/dart2js/annotations/data/directives.dart
+++ b/tests/compiler/dart2js/annotations/data/directives.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   typesTrust();
   typesCheck();
diff --git a/tests/compiler/dart2js/annotations/data/errors.dart b/tests/compiler/dart2js/annotations/data/errors.dart
index c170331..ce12b6b 100644
--- a/tests/compiler/dart2js/annotations/data/errors.dart
+++ b/tests/compiler/dart2js/annotations/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
+
 main() {
   unknown();
   noInlineField;
diff --git a/tests/compiler/dart2js/async_await/async_await_js_transform_test.dart b/tests/compiler/dart2js/async_await/async_await_js_transform_test.dart
index 111e57d..2307c08 100644
--- a/tests/compiler/dart2js/async_await/async_await_js_transform_test.dart
+++ b/tests/compiler/dart2js/async_await/async_await_js_transform_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.7
+
 import "package:expect/expect.dart";
 import "package:compiler/src/js/js.dart";
 import "package:compiler/src/js/rewrite_async.dart";
diff --git a/tests/compiler/dart2js/closure/closure_test.dart b/tests/compiler/dart2js/closure/closure_test.dart
index a92c1dc..0701d19 100644
--- a/tests/compiler/dart2js/closure/closure_test.dart
+++ b/tests/compiler/dart2js/closure/closure_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.7
+
 import 'dart:io' hide Link;
 import 'package:_fe_analyzer_shared/src/testing/features.dart';
 import 'package:_fe_analyzer_shared/src/util/link.dart' show Link;
diff --git a/tests/compiler/dart2js/closure/data/captured_variable.dart b/tests/compiler/dart2js/closure/data/captured_variable.dart
index 409184d..edc1add 100644
--- a/tests/compiler/dart2js/closure/data/captured_variable.dart
+++ b/tests/compiler/dart2js/closure/data/captured_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.7
+
 /*member: boxedLoopVariableExample:*/
 boxedLoopVariableExample() {
   var input = [1, 2, 3];
diff --git a/tests/compiler/dart2js/closure/data/generic.dart b/tests/compiler/dart2js/closure/data/generic.dart
index c1a3f5d..a2f552d 100644
--- a/tests/compiler/dart2js/closure/data/generic.dart
+++ b/tests/compiler/dart2js/closure/data/generic.dart
@@ -2,6 +2,8 @@
 // for details. All 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 Class1<T> {
   /*member: Class1.field:hasThis*/
   var field = /*fields=[T],free=[T],hasThis*/ () => T;
diff --git a/tests/compiler/dart2js/closure/data/instantiation.dart b/tests/compiler/dart2js/closure/data/instantiation.dart
index 8f95b60..19949ff 100644
--- a/tests/compiler/dart2js/closure/data/instantiation.dart
+++ b/tests/compiler/dart2js/closure/data/instantiation.dart
@@ -2,6 +2,8 @@
 // for details. All 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 id<T>(T t) => t;
 
 method<S>(S s) {
diff --git a/tests/compiler/dart2js/closure/data/instantiation1.dart b/tests/compiler/dart2js/closure/data/instantiation1.dart
index e8ba217..3f31e41 100644
--- a/tests/compiler/dart2js/closure/data/instantiation1.dart
+++ b/tests/compiler/dart2js/closure/data/instantiation1.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 int f<T>(T a) => null;
 
 typedef int F<R>(R a);
diff --git a/tests/compiler/dart2js/closure/data/instantiation2.dart b/tests/compiler/dart2js/closure/data/instantiation2.dart
index d3a616f..8e75f09 100644
--- a/tests/compiler/dart2js/closure/data/instantiation2.dart
+++ b/tests/compiler/dart2js/closure/data/instantiation2.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 bool f<T>(T a) => a is T;
 
 typedef bool F<R>(R a);
diff --git a/tests/compiler/dart2js/closure/data/instantiation3.dart b/tests/compiler/dart2js/closure/data/instantiation3.dart
index aeeee92..2157d67 100644
--- a/tests/compiler/dart2js/closure/data/instantiation3.dart
+++ b/tests/compiler/dart2js/closure/data/instantiation3.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 int f<T>(T a) => null;
 
 typedef int F<R>(R a);
diff --git a/tests/compiler/dart2js/closure/data/instantiation4.dart b/tests/compiler/dart2js/closure/data/instantiation4.dart
index 957eca0..05b8caf 100644
--- a/tests/compiler/dart2js/closure/data/instantiation4.dart
+++ b/tests/compiler/dart2js/closure/data/instantiation4.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 bool f<T>(T a) => a is T;
 
 typedef bool F<R>(R a);
diff --git a/tests/compiler/dart2js/closure/data/list_literal_class.dart b/tests/compiler/dart2js/closure/data/list_literal_class.dart
index 080bb77..8ce3e2e 100644
--- a/tests/compiler/dart2js/closure/data/list_literal_class.dart
+++ b/tests/compiler/dart2js/closure/data/list_literal_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.7
+
 import 'package:expect/expect.dart';
 
 /*member: A.:hasThis*/
diff --git a/tests/compiler/dart2js/closure/data/list_literal_method.dart b/tests/compiler/dart2js/closure/data/list_literal_method.dart
index 03a05c8..2a93a2d 100644
--- a/tests/compiler/dart2js/closure/data/list_literal_method.dart
+++ b/tests/compiler/dart2js/closure/data/list_literal_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.7
+
 import 'package:expect/expect.dart';
 
 @pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/closure/data/list_literal_untested_class.dart b/tests/compiler/dart2js/closure/data/list_literal_untested_class.dart
index a20f0b8..516b390 100644
--- a/tests/compiler/dart2js/closure/data/list_literal_untested_class.dart
+++ b/tests/compiler/dart2js/closure/data/list_literal_untested_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.7
+
 import 'package:expect/expect.dart';
 
 /*member: A.:hasThis*/
diff --git a/tests/compiler/dart2js/closure/data/list_literal_untested_method.dart b/tests/compiler/dart2js/closure/data/list_literal_untested_method.dart
index 87a5673..42e8cf2 100644
--- a/tests/compiler/dart2js/closure/data/list_literal_untested_method.dart
+++ b/tests/compiler/dart2js/closure/data/list_literal_untested_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.7
+
 import 'package:expect/expect.dart';
 
 @pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/closure/data/map_literal_class.dart b/tests/compiler/dart2js/closure/data/map_literal_class.dart
index f6f1f0c..f41747b 100644
--- a/tests/compiler/dart2js/closure/data/map_literal_class.dart
+++ b/tests/compiler/dart2js/closure/data/map_literal_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.7
+
 import 'package:expect/expect.dart';
 
 /*member: A.:hasThis*/
diff --git a/tests/compiler/dart2js/closure/data/map_literal_method.dart b/tests/compiler/dart2js/closure/data/map_literal_method.dart
index 51f99a9..de83643 100644
--- a/tests/compiler/dart2js/closure/data/map_literal_method.dart
+++ b/tests/compiler/dart2js/closure/data/map_literal_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.7
+
 import 'package:expect/expect.dart';
 
 @pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/closure/data/map_literal_untested_class.dart b/tests/compiler/dart2js/closure/data/map_literal_untested_class.dart
index da671a3..6ee00d3 100644
--- a/tests/compiler/dart2js/closure/data/map_literal_untested_class.dart
+++ b/tests/compiler/dart2js/closure/data/map_literal_untested_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.7
+
 import 'package:expect/expect.dart';
 
 /*member: A.:hasThis*/
diff --git a/tests/compiler/dart2js/closure/data/map_literal_untested_method.dart b/tests/compiler/dart2js/closure/data/map_literal_untested_method.dart
index 27c33a2..d2adfbb 100644
--- a/tests/compiler/dart2js/closure/data/map_literal_untested_method.dart
+++ b/tests/compiler/dart2js/closure/data/map_literal_untested_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.7
+
 import 'package:expect/expect.dart';
 
 @pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/closure/data/mixed.dart b/tests/compiler/dart2js/closure/data/mixed.dart
index 20fdcbe..a9a0635 100644
--- a/tests/compiler/dart2js/closure/data/mixed.dart
+++ b/tests/compiler/dart2js/closure/data/mixed.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Test that free variables aren't mixed between capturing and non-capturing
 // closures.
 
diff --git a/tests/compiler/dart2js/closure/data/mutations.dart b/tests/compiler/dart2js/closure/data/mutations.dart
index 8516ba3..03597b5 100644
--- a/tests/compiler/dart2js/closure/data/mutations.dart
+++ b/tests/compiler/dart2js/closure/data/mutations.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Test that captured variables are boxed regardless of where they are mutated.
 
 /*member: mutateUnused:*/
diff --git a/tests/compiler/dart2js/closure/data/nested_closures.dart b/tests/compiler/dart2js/closure/data/nested_closures.dart
index 2f2cb12..c061cb6 100644
--- a/tests/compiler/dart2js/closure/data/nested_closures.dart
+++ b/tests/compiler/dart2js/closure/data/nested_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.7
+
 /// Test boxing/captures for nested closures.
 
 /*member: useOne:box=(box0 which holds [b1])*/ useOne(/*boxed*/ b1) {
diff --git a/tests/compiler/dart2js/closure/data/parameter_in_try.dart b/tests/compiler/dart2js/closure/data/parameter_in_try.dart
index bf4cb90..65a4e81 100644
--- a/tests/compiler/dart2js/closure/data/parameter_in_try.dart
+++ b/tests/compiler/dart2js/closure/data/parameter_in_try.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 readParameterInFinally(/*inTry*/ parameter) {
   try {
     if (parameter) {
diff --git a/tests/compiler/dart2js/closure/data/test_type_class.dart b/tests/compiler/dart2js/closure/data/test_type_class.dart
index 222ca14..ead1797 100644
--- a/tests/compiler/dart2js/closure/data/test_type_class.dart
+++ b/tests/compiler/dart2js/closure/data/test_type_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.7
+
 ////////////////////////////////////////////////////////////////////////////////
 /// Explicit is-test is always required.
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/tests/compiler/dart2js/closure/data/test_type_method.dart b/tests/compiler/dart2js/closure/data/test_type_method.dart
index bab82c3..faad952 100644
--- a/tests/compiler/dart2js/closure/data/test_type_method.dart
+++ b/tests/compiler/dart2js/closure/data/test_type_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.7
+
 ////////////////////////////////////////////////////////////////////////////////
 /// Explicit is-test is always required.
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/tests/compiler/dart2js/closure/data/two_local_functions.dart b/tests/compiler/dart2js/closure/data/two_local_functions.dart
index a7ecf9c..b90d407 100644
--- a/tests/compiler/dart2js/closure/data/two_local_functions.dart
+++ b/tests/compiler/dart2js/closure/data/two_local_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.7
+
 main() {
   /**/ local1() {}
   /*fields=[local1],free=[local1]*/ local2() => local1();
diff --git a/tests/compiler/dart2js/closure/data/type_annotations_class.dart b/tests/compiler/dart2js/closure/data/type_annotations_class.dart
index 853ffd6..1732242 100644
--- a/tests/compiler/dart2js/closure/data/type_annotations_class.dart
+++ b/tests/compiler/dart2js/closure/data/type_annotations_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.7
+
 ////////////////////////////////////////////////////////////////////////////////
 /// A sound initialization of a local variable doesn't capture the type
 /// variable.
diff --git a/tests/compiler/dart2js/closure/data/type_annotations_method.dart b/tests/compiler/dart2js/closure/data/type_annotations_method.dart
index 878e3bd..4bf4396 100644
--- a/tests/compiler/dart2js/closure/data/type_annotations_method.dart
+++ b/tests/compiler/dart2js/closure/data/type_annotations_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.7
+
 ////////////////////////////////////////////////////////////////////////////////
 /// A sound assignment to a local variable doesn't capture the type variable.
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/tests/compiler/dart2js/closure/data/type_arguments_class.dart b/tests/compiler/dart2js/closure/data/type_arguments_class.dart
index 2340013..4ba386d 100644
--- a/tests/compiler/dart2js/closure/data/type_arguments_class.dart
+++ b/tests/compiler/dart2js/closure/data/type_arguments_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.7
+
 ////////////////////////////////////////////////////////////////////////////////
 /// A constructor invocation to a class that needs type arguments captures the
 /// type variables.
diff --git a/tests/compiler/dart2js/closure/data/type_arguments_method.dart b/tests/compiler/dart2js/closure/data/type_arguments_method.dart
index ad35ada..21bf745 100644
--- a/tests/compiler/dart2js/closure/data/type_arguments_method.dart
+++ b/tests/compiler/dart2js/closure/data/type_arguments_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.7
+
 ////////////////////////////////////////////////////////////////////////////////
 /// A constructor invocation for a class that needs type arguments captures the
 /// type variables.
diff --git a/tests/compiler/dart2js/closure/data/type_variables.dart b/tests/compiler/dart2js/closure/data/type_variables.dart
index 1521b3a..ea99255 100644
--- a/tests/compiler/dart2js/closure/data/type_variables.dart
+++ b/tests/compiler/dart2js/closure/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.7
+
 class Class1<T> {
   /*member: Class1.field:hasThis*/
   var field = /*fields=[T],free=[T],hasThis*/ () => T;
diff --git a/tests/compiler/dart2js/closure/show.dart b/tests/compiler/dart2js/closure/show.dart
index e300f74..535a18b 100644
--- a/tests/compiler/dart2js/closure/show.dart
+++ b/tests/compiler/dart2js/closure/show.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /// Helper program that shows the closure data on a dart program.
 
 import 'package:args/args.dart';
diff --git a/tests/compiler/dart2js/codegen/arithmetic_simplification_test.dart b/tests/compiler/dart2js/codegen/arithmetic_simplification_test.dart
index 35f344f..210f2f1 100644
--- a/tests/compiler/dart2js/codegen/arithmetic_simplification_test.dart
+++ b/tests/compiler/dart2js/codegen/arithmetic_simplification_test.dart
@@ -1,6 +1,8 @@
 // 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.
+
+// @dart = 2.7
 // Test constant folding on numbers.
 
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/array_static_intercept_test.dart b/tests/compiler/dart2js/codegen/array_static_intercept_test.dart
index ee3c87a..4f02ed5 100644
--- a/tests/compiler/dart2js/codegen/array_static_intercept_test.dart
+++ b/tests/compiler/dart2js/codegen/array_static_intercept_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/builtin_equals_test.dart b/tests/compiler/dart2js/codegen/builtin_equals_test.dart
index 29d1577..d5281f8 100644
--- a/tests/compiler/dart2js/codegen/builtin_equals_test.dart
+++ b/tests/compiler/dart2js/codegen/builtin_equals_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/builtin_interceptor_test.dart b/tests/compiler/dart2js/codegen/builtin_interceptor_test.dart
index 36e15f7..b1c6312 100644
--- a/tests/compiler/dart2js/codegen/builtin_interceptor_test.dart
+++ b/tests/compiler/dart2js/codegen/builtin_interceptor_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/class_codegen2_test.dart b/tests/compiler/dart2js/codegen/class_codegen2_test.dart
index 213c5f3..788ba2d 100644
--- a/tests/compiler/dart2js/codegen/class_codegen2_test.dart
+++ b/tests/compiler/dart2js/codegen/class_codegen2_test.dart
@@ -1,6 +1,8 @@
 // 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.
+
+// @dart = 2.7
 // Test that parameters keep their names in the output.
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/codegen/class_codegen_test.dart b/tests/compiler/dart2js/codegen/class_codegen_test.dart
index d46135e..a4f0c3d 100644
--- a/tests/compiler/dart2js/codegen/class_codegen_test.dart
+++ b/tests/compiler/dart2js/codegen/class_codegen_test.dart
@@ -1,6 +1,8 @@
 // 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.
+
+// @dart = 2.7
 // Test that parameters keep their names in the output.
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/codegen/class_order_test.dart b/tests/compiler/dart2js/codegen/class_order_test.dart
index 28fc7f2..b5f8b8d 100644
--- a/tests/compiler/dart2js/codegen/class_order_test.dart
+++ b/tests/compiler/dart2js/codegen/class_order_test.dart
@@ -1,6 +1,8 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All 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
 // Test that parameters keep their names in the output.
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/codegen/closure_call_of_static_reduction_test.dart b/tests/compiler/dart2js/codegen/closure_call_of_static_reduction_test.dart
index 74d86f6..9695510 100644
--- a/tests/compiler/dart2js/codegen/closure_call_of_static_reduction_test.dart
+++ b/tests/compiler/dart2js/codegen/closure_call_of_static_reduction_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.7
+
 import 'dart:async';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/closure_codegen_test.dart b/tests/compiler/dart2js/codegen/closure_codegen_test.dart
index 83119ac..516d526 100644
--- a/tests/compiler/dart2js/codegen/closure_codegen_test.dart
+++ b/tests/compiler/dart2js/codegen/closure_codegen_test.dart
@@ -1,6 +1,8 @@
 // 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.
+
+// @dart = 2.7
 // Test that parameters keep their names in the output.
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/codegen/code_motion_test.dart b/tests/compiler/dart2js/codegen/code_motion_test.dart
index d0f1e59..bd374f0 100644
--- a/tests/compiler/dart2js/codegen/code_motion_test.dart
+++ b/tests/compiler/dart2js/codegen/code_motion_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/constant_folding_codeUnitAt_test.dart b/tests/compiler/dart2js/codegen/constant_folding_codeUnitAt_test.dart
index 465bc32..a821884 100644
--- a/tests/compiler/dart2js/codegen/constant_folding_codeUnitAt_test.dart
+++ b/tests/compiler/dart2js/codegen/constant_folding_codeUnitAt_test.dart
@@ -1,6 +1,8 @@
 // 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.
+
+// @dart = 2.7
 // Test constant folding on numbers.
 
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/constant_folding_test.dart b/tests/compiler/dart2js/codegen/constant_folding_test.dart
index 227d97b..06d09ad 100644
--- a/tests/compiler/dart2js/codegen/constant_folding_test.dart
+++ b/tests/compiler/dart2js/codegen/constant_folding_test.dart
@@ -1,6 +1,8 @@
 // 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.
+
+// @dart = 2.7
 // Test constant folding on numbers.
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/codegen/constant_namer_test.dart b/tests/compiler/dart2js/codegen/constant_namer_test.dart
index 8893422..b24c281 100644
--- a/tests/compiler/dart2js/codegen/constant_namer_test.dart
+++ b/tests/compiler/dart2js/codegen/constant_namer_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/dead_code_test.dart b/tests/compiler/dart2js/codegen/dead_code_test.dart
index c7ffd88..9b7f749 100644
--- a/tests/compiler/dart2js/codegen/dead_code_test.dart
+++ b/tests/compiler/dart2js/codegen/dead_code_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.7
+
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/dead_phi_eliminator_test.dart b/tests/compiler/dart2js/codegen/dead_phi_eliminator_test.dart
index 49de078..dc56466 100644
--- a/tests/compiler/dart2js/codegen/dead_phi_eliminator_test.dart
+++ b/tests/compiler/dart2js/codegen/dead_phi_eliminator_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/declare_once_test.dart b/tests/compiler/dart2js/codegen/declare_once_test.dart
index 849b1bf..9e8be8d 100644
--- a/tests/compiler/dart2js/codegen/declare_once_test.dart
+++ b/tests/compiler/dart2js/codegen/declare_once_test.dart
@@ -1,6 +1,8 @@
 // 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.
+
+// @dart = 2.7
 // Test that parameters keep their names in the output.
 
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/elide_callthrough_stub_test.dart b/tests/compiler/dart2js/codegen/elide_callthrough_stub_test.dart
index 67102fe..a7aaaa9 100644
--- a/tests/compiler/dart2js/codegen/elide_callthrough_stub_test.dart
+++ b/tests/compiler/dart2js/codegen/elide_callthrough_stub_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.7
+
 // Check that calls through fields elide the call-through stub.  This
 // optimization is done by the simplifier, so inlining does not need to be
 // enabled.
diff --git a/tests/compiler/dart2js/codegen/emit_const_fields_test.dart b/tests/compiler/dart2js/codegen/emit_const_fields_test.dart
index fbfa9f4..82c8571 100644
--- a/tests/compiler/dart2js/codegen/emit_const_fields_test.dart
+++ b/tests/compiler/dart2js/codegen/emit_const_fields_test.dart
@@ -1,6 +1,8 @@
 // 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.
+
+// @dart = 2.7
 // Test that unused static consts are not emitted.
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/codegen/equals_test.dart b/tests/compiler/dart2js/codegen/equals_test.dart
index 45bbf50..7aa71ad 100644
--- a/tests/compiler/dart2js/codegen/equals_test.dart
+++ b/tests/compiler/dart2js/codegen/equals_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.7
+
 library equals_test;
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/codegen/expect_annotations2_test.dart b/tests/compiler/dart2js/codegen/expect_annotations2_test.dart
index fad77c6..b4d1338 100644
--- a/tests/compiler/dart2js/codegen/expect_annotations2_test.dart
+++ b/tests/compiler/dart2js/codegen/expect_annotations2_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.7
+
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import 'package:compiler/compiler_new.dart';
diff --git a/tests/compiler/dart2js/codegen/expect_annotations_test.dart b/tests/compiler/dart2js/codegen/expect_annotations_test.dart
index 8775d9c..f25bec8 100644
--- a/tests/compiler/dart2js/codegen/expect_annotations_test.dart
+++ b/tests/compiler/dart2js/codegen/expect_annotations_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js/codegen/field_codegen_test.dart b/tests/compiler/dart2js/codegen/field_codegen_test.dart
index 76eea98..eeb446c7b 100644
--- a/tests/compiler/dart2js/codegen/field_codegen_test.dart
+++ b/tests/compiler/dart2js/codegen/field_codegen_test.dart
@@ -1,6 +1,8 @@
 // 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.
+
+// @dart = 2.7
 // Test that parameters keep their names in the output.
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/codegen/field_update_test.dart b/tests/compiler/dart2js/codegen/field_update_test.dart
index 995ce95..81c5e53 100644
--- a/tests/compiler/dart2js/codegen/field_update_test.dart
+++ b/tests/compiler/dart2js/codegen/field_update_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.7
+
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/for_in_test.dart b/tests/compiler/dart2js/codegen/for_in_test.dart
index 6c5cb0e..340ffc0 100644
--- a/tests/compiler/dart2js/codegen/for_in_test.dart
+++ b/tests/compiler/dart2js/codegen/for_in_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/forloop_box_test.dart b/tests/compiler/dart2js/codegen/forloop_box_test.dart
index aa90153..486e862 100644
--- a/tests/compiler/dart2js/codegen/forloop_box_test.dart
+++ b/tests/compiler/dart2js/codegen/forloop_box_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.7
+
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/generate_at_use_site_test.dart b/tests/compiler/dart2js/codegen/generate_at_use_site_test.dart
index 334ecc4..77acbf8 100644
--- a/tests/compiler/dart2js/codegen/generate_at_use_site_test.dart
+++ b/tests/compiler/dart2js/codegen/generate_at_use_site_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/gvn_dynamic_field_get_test.dart b/tests/compiler/dart2js/codegen/gvn_dynamic_field_get_test.dart
index 6695ad2..48ceec8 100644
--- a/tests/compiler/dart2js/codegen/gvn_dynamic_field_get_test.dart
+++ b/tests/compiler/dart2js/codegen/gvn_dynamic_field_get_test.dart
@@ -1,6 +1,8 @@
 // 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.
+
+// @dart = 2.7
 // Test that dart2js gvns dynamic getters that don't have side
 // effects.
 
diff --git a/tests/compiler/dart2js/codegen/gvn_test.dart b/tests/compiler/dart2js/codegen/gvn_test.dart
index f8ce1a1..d359896 100644
--- a/tests/compiler/dart2js/codegen/gvn_test.dart
+++ b/tests/compiler/dart2js/codegen/gvn_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/identity_test.dart b/tests/compiler/dart2js/codegen/identity_test.dart
index 03ef1ba..26f9dd9 100644
--- a/tests/compiler/dart2js/codegen/identity_test.dart
+++ b/tests/compiler/dart2js/codegen/identity_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/if_do_while_test.dart b/tests/compiler/dart2js/codegen/if_do_while_test.dart
index 06c963c..e8688b6 100644
--- a/tests/compiler/dart2js/codegen/if_do_while_test.dart
+++ b/tests/compiler/dart2js/codegen/if_do_while_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/interceptor_almost_constant_test.dart b/tests/compiler/dart2js/codegen/interceptor_almost_constant_test.dart
index ee6c404..53bc1f5 100644
--- a/tests/compiler/dart2js/codegen/interceptor_almost_constant_test.dart
+++ b/tests/compiler/dart2js/codegen/interceptor_almost_constant_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/interceptor_test.dart b/tests/compiler/dart2js/codegen/interceptor_test.dart
index cba680f..beb8ba3 100644
--- a/tests/compiler/dart2js/codegen/interceptor_test.dart
+++ b/tests/compiler/dart2js/codegen/interceptor_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/interpolation_folding_test.dart b/tests/compiler/dart2js/codegen/interpolation_folding_test.dart
index 4b88d9d..1877ff8 100644
--- a/tests/compiler/dart2js/codegen/interpolation_folding_test.dart
+++ b/tests/compiler/dart2js/codegen/interpolation_folding_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/inverse_operator_test.dart b/tests/compiler/dart2js/codegen/inverse_operator_test.dart
index 5d5e1d2..e9c45c0 100644
--- a/tests/compiler/dart2js/codegen/inverse_operator_test.dart
+++ b/tests/compiler/dart2js/codegen/inverse_operator_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.7
+
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
 
diff --git a/tests/compiler/dart2js/codegen/is_function_test.dart b/tests/compiler/dart2js/codegen/is_function_test.dart
index 73b2d2f..aa03396 100644
--- a/tests/compiler/dart2js/codegen/is_function_test.dart
+++ b/tests/compiler/dart2js/codegen/is_function_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.7
+
 /// Test that checks that we are not added $isFunction properties on closure
 /// classes.
 
diff --git a/tests/compiler/dart2js/codegen/is_inference2_test.dart b/tests/compiler/dart2js/codegen/is_inference2_test.dart
index 4117a99..c524a8a 100644
--- a/tests/compiler/dart2js/codegen/is_inference2_test.dart
+++ b/tests/compiler/dart2js/codegen/is_inference2_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/is_inference_test.dart b/tests/compiler/dart2js/codegen/is_inference_test.dart
index 195e02c..8ea721b 100644
--- a/tests/compiler/dart2js/codegen/is_inference_test.dart
+++ b/tests/compiler/dart2js/codegen/is_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.7
+
 import 'dart:async';
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart b/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart
index f24357b..4b75ecd 100644
--- a/tests/compiler/dart2js/codegen/jsarray_indexof_test.dart
+++ b/tests/compiler/dart2js/codegen/jsarray_indexof_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.7
+
 // Test that `length` access in JSArray.indexOf is encoding using `.length` and
 // not `.get$length()`.
 
diff --git a/tests/compiler/dart2js/codegen/licm_test.dart b/tests/compiler/dart2js/codegen/licm_test.dart
index 32f889c..4ee5013 100644
--- a/tests/compiler/dart2js/codegen/licm_test.dart
+++ b/tests/compiler/dart2js/codegen/licm_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.7
+
 // Check that we hoist instructions in a loop condition, even if that
 // condition involves control flow.
 
diff --git a/tests/compiler/dart2js/codegen/list_tracer_length_test.dart b/tests/compiler/dart2js/codegen/list_tracer_length_test.dart
index 7f97bb9..7b81c20 100644
--- a/tests/compiler/dart2js/codegen/list_tracer_length_test.dart
+++ b/tests/compiler/dart2js/codegen/list_tracer_length_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.7
+
 /// TODO(johnniwinther): Currently this only works with the mock compiler.
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/codegen/list_tracer_node_type_test.dart b/tests/compiler/dart2js/codegen/list_tracer_node_type_test.dart
index 1aa5c2a..b192a95 100644
--- a/tests/compiler/dart2js/codegen/list_tracer_node_type_test.dart
+++ b/tests/compiler/dart2js/codegen/list_tracer_node_type_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.7
+
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/literal_list_test.dart b/tests/compiler/dart2js/codegen/literal_list_test.dart
index ae346c3..e514901 100644
--- a/tests/compiler/dart2js/codegen/literal_list_test.dart
+++ b/tests/compiler/dart2js/codegen/literal_list_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/literal_map_test.dart b/tests/compiler/dart2js/codegen/literal_map_test.dart
index b5db2aa..99c7d0c 100644
--- a/tests/compiler/dart2js/codegen/literal_map_test.dart
+++ b/tests/compiler/dart2js/codegen/literal_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/load_elimination_test.dart b/tests/compiler/dart2js/codegen/load_elimination_test.dart
index 822a582..16305c0 100644
--- a/tests/compiler/dart2js/codegen/load_elimination_test.dart
+++ b/tests/compiler/dart2js/codegen/load_elimination_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.7
+
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/logical_expression_test.dart b/tests/compiler/dart2js/codegen/logical_expression_test.dart
index 2108602..90dba52 100644
--- a/tests/compiler/dart2js/codegen/logical_expression_test.dart
+++ b/tests/compiler/dart2js/codegen/logical_expression_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.7
+
 // Test that logical or-expressions don't introduce unnecessary nots.
 
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/loop_test.dart b/tests/compiler/dart2js/codegen/loop_test.dart
index acd1d88..5fdc5e8 100644
--- a/tests/compiler/dart2js/codegen/loop_test.dart
+++ b/tests/compiler/dart2js/codegen/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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/minify_many_locals_test.dart b/tests/compiler/dart2js/codegen/minify_many_locals_test.dart
index 197f77c..aee5156 100644
--- a/tests/compiler/dart2js/codegen/minify_many_locals_test.dart
+++ b/tests/compiler/dart2js/codegen/minify_many_locals_test.dart
@@ -1,6 +1,8 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All 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
 // Test that parameters keep their names in the output.
 
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/model_data/capture.dart b/tests/compiler/dart2js/codegen/model_data/capture.dart
index 251c751..7e47ed8 100644
--- a/tests/compiler/dart2js/codegen/model_data/capture.dart
+++ b/tests/compiler/dart2js/codegen/model_data/capture.dart
@@ -2,6 +2,8 @@
 // for details. All 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: method1:params=0*/
 @pragma('dart2js:noInline')
 method1([a]) => /*access=[a],params=0*/ () => a;
diff --git a/tests/compiler/dart2js/codegen/model_data/constant_folding.dart b/tests/compiler/dart2js/codegen/model_data/constant_folding.dart
index ce74ab7..4b0d8c2 100644
--- a/tests/compiler/dart2js/codegen/model_data/constant_folding.dart
+++ b/tests/compiler/dart2js/codegen/model_data/constant_folding.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Derived from dart2js_extra/constant_folding_test
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/codegen/model_data/constructors.dart b/tests/compiler/dart2js/codegen/model_data/constructors.dart
index 6d25ce6..d5b81b4 100644
--- a/tests/compiler/dart2js/codegen/model_data/constructors.dart
+++ b/tests/compiler/dart2js/codegen/model_data/constructors.dart
@@ -2,6 +2,8 @@
 // for details. All 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 {
   /*member: Class.constructor1:params=0*/
   @pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/codegen/model_data/dynamic_get.dart b/tests/compiler/dart2js/codegen/model_data/dynamic_get.dart
index 427eb7a..8a32b6e 100644
--- a/tests/compiler/dart2js/codegen/model_data/dynamic_get.dart
+++ b/tests/compiler/dart2js/codegen/model_data/dynamic_get.dart
@@ -2,6 +2,8 @@
 // for details. All 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:calls=*,params=0*/
 main() {
   method1(new Class1a());
diff --git a/tests/compiler/dart2js/codegen/model_data/dynamic_set.dart b/tests/compiler/dart2js/codegen/model_data/dynamic_set.dart
index 546d97c..e5afcba 100644
--- a/tests/compiler/dart2js/codegen/model_data/dynamic_set.dart
+++ b/tests/compiler/dart2js/codegen/model_data/dynamic_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.7
+
 /*member: main:calls=*,params=0*/
 main() {
   method1(new Class1a()..field1);
diff --git a/tests/compiler/dart2js/codegen/model_data/dynamic_set_unread.dart b/tests/compiler/dart2js/codegen/model_data/dynamic_set_unread.dart
index 0c1fa05..053a59c 100644
--- a/tests/compiler/dart2js/codegen/model_data/dynamic_set_unread.dart
+++ b/tests/compiler/dart2js/codegen/model_data/dynamic_set_unread.dart
@@ -2,6 +2,8 @@
 // for details. All 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:calls=*,params=0*/
 main() {
   method1(new Class1a());
diff --git a/tests/compiler/dart2js/codegen/model_data/effectively_constant_fields.dart b/tests/compiler/dart2js/codegen/model_data/effectively_constant_fields.dart
index 39e6f1e..aab00a0 100644
--- a/tests/compiler/dart2js/codegen/model_data/effectively_constant_fields.dart
+++ b/tests/compiler/dart2js/codegen/model_data/effectively_constant_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.7
+
 import 'package:expect/expect.dart';
 
 /*member: _field4:params=0*/
diff --git a/tests/compiler/dart2js/codegen/model_data/effectively_constant_state.dart b/tests/compiler/dart2js/codegen/model_data/effectively_constant_state.dart
index ec053ae..311b717 100644
--- a/tests/compiler/dart2js/codegen/model_data/effectively_constant_state.dart
+++ b/tests/compiler/dart2js/codegen/model_data/effectively_constant_state.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 enum Enum {
   a,
   b,
diff --git a/tests/compiler/dart2js/codegen/model_data/field_set.dart b/tests/compiler/dart2js/codegen/model_data/field_set.dart
index 1bc4366..d5df0bd 100644
--- a/tests/compiler/dart2js/codegen/model_data/field_set.dart
+++ b/tests/compiler/dart2js/codegen/model_data/field_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.7
+
 /*member: main:access=*,calls=*,params=0*/
 main() {
   method1(new Class1a());
diff --git a/tests/compiler/dart2js/codegen/model_data/fields.dart b/tests/compiler/dart2js/codegen/model_data/fields.dart
index 5f08845..187ca78 100644
--- a/tests/compiler/dart2js/codegen/model_data/fields.dart
+++ b/tests/compiler/dart2js/codegen/model_data/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.7
+
 var field1a;
 
 var field1b;
diff --git a/tests/compiler/dart2js/codegen/model_data/instance_method_parameters.dart b/tests/compiler/dart2js/codegen/model_data/instance_method_parameters.dart
index 4834159..d70dadf 100644
--- a/tests/compiler/dart2js/codegen/model_data/instance_method_parameters.dart
+++ b/tests/compiler/dart2js/codegen/model_data/instance_method_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.7
+
 class Class {
   /*member: Class.method1:params=0*/
   @pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/codegen/model_data/native.dart b/tests/compiler/dart2js/codegen/model_data/native.dart
index 02cae6f..366dd16 100644
--- a/tests/compiler/dart2js/codegen/model_data/native.dart
+++ b/tests/compiler/dart2js/codegen/model_data/native.dart
@@ -2,6 +2,8 @@
 // for details. All 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: import_internal_library
 import 'dart:_js_helper';
 
diff --git a/tests/compiler/dart2js/codegen/model_data/native_inlined.dart b/tests/compiler/dart2js/codegen/model_data/native_inlined.dart
index 63d5cd6..5e13fba 100644
--- a/tests/compiler/dart2js/codegen/model_data/native_inlined.dart
+++ b/tests/compiler/dart2js/codegen/model_data/native_inlined.dart
@@ -2,6 +2,8 @@
 // for details. All 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: import_internal_library
 import 'dart:_js_helper';
 
diff --git a/tests/compiler/dart2js/codegen/model_data/native_unused_parameters.dart b/tests/compiler/dart2js/codegen/model_data/native_unused_parameters.dart
index 33e8453..ddc05ff 100644
--- a/tests/compiler/dart2js/codegen/model_data/native_unused_parameters.dart
+++ b/tests/compiler/dart2js/codegen/model_data/native_unused_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.7
+
 // ignore: import_internal_library
 import 'dart:_js_helper';
 
diff --git a/tests/compiler/dart2js/codegen/model_data/regress_36222.dart b/tests/compiler/dart2js/codegen/model_data/regress_36222.dart
index 6b2143d..6a5dbe9 100644
--- a/tests/compiler/dart2js/codegen/model_data/regress_36222.dart
+++ b/tests/compiler/dart2js/codegen/model_data/regress_36222.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 typedef int BinaryFunc(int x, int y);
 
 class A {
diff --git a/tests/compiler/dart2js/codegen/model_data/static_method_parameters.dart b/tests/compiler/dart2js/codegen/model_data/static_method_parameters.dart
index 31b2433..31a25e2 100644
--- a/tests/compiler/dart2js/codegen/model_data/static_method_parameters.dart
+++ b/tests/compiler/dart2js/codegen/model_data/static_method_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.7
+
 /*member: method1:params=0*/
 @pragma('dart2js:noInline')
 method1() {}
diff --git a/tests/compiler/dart2js/codegen/model_data/static_tearoff.dart b/tests/compiler/dart2js/codegen/model_data/static_tearoff.dart
index 5720592..e26d48d 100644
--- a/tests/compiler/dart2js/codegen/model_data/static_tearoff.dart
+++ b/tests/compiler/dart2js/codegen/model_data/static_tearoff.dart
@@ -2,6 +2,8 @@
 // for details. All 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 I1 {}
 
 class I2 {}
diff --git a/tests/compiler/dart2js/codegen/model_test.dart b/tests/compiler/dart2js/codegen/model_test.dart
index 34aaff1..95dedea 100644
--- a/tests/compiler/dart2js/codegen/model_test.dart
+++ b/tests/compiler/dart2js/codegen/model_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.7
+
 import 'dart:io';
 import 'package:_fe_analyzer_shared/src/testing/features.dart';
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/modulo_remainder_test.dart b/tests/compiler/dart2js/codegen/modulo_remainder_test.dart
index 7faffa0..68b5b74 100644
--- a/tests/compiler/dart2js/codegen/modulo_remainder_test.dart
+++ b/tests/compiler/dart2js/codegen/modulo_remainder_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.7
+
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
 
diff --git a/tests/compiler/dart2js/codegen/negation_shift_regression_test.dart b/tests/compiler/dart2js/codegen/negation_shift_regression_test.dart
index f3ac6fd..417887d 100644
--- a/tests/compiler/dart2js/codegen/negation_shift_regression_test.dart
+++ b/tests/compiler/dart2js/codegen/negation_shift_regression_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.7
+
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
 
diff --git a/tests/compiler/dart2js/codegen/new_rti_is_test.dart b/tests/compiler/dart2js/codegen/new_rti_is_test.dart
index 06a3604..b22f311 100644
--- a/tests/compiler/dart2js/codegen/new_rti_is_test.dart
+++ b/tests/compiler/dart2js/codegen/new_rti_is_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.7
+
 library new_rti_is_test;
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/codegen/no_constructor_body_test.dart b/tests/compiler/dart2js/codegen/no_constructor_body_test.dart
index 7edc700..ae1a9f6 100644
--- a/tests/compiler/dart2js/codegen/no_constructor_body_test.dart
+++ b/tests/compiler/dart2js/codegen/no_constructor_body_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.7
+
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/no_duplicate_constructor_body2_test.dart b/tests/compiler/dart2js/codegen/no_duplicate_constructor_body2_test.dart
index cd9f5a7..b92f872 100644
--- a/tests/compiler/dart2js/codegen/no_duplicate_constructor_body2_test.dart
+++ b/tests/compiler/dart2js/codegen/no_duplicate_constructor_body2_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.7
+
 import '../helpers/compiler_helper.dart';
 import "package:async_helper/async_helper.dart";
 
diff --git a/tests/compiler/dart2js/codegen/no_duplicate_constructor_body_test.dart b/tests/compiler/dart2js/codegen/no_duplicate_constructor_body_test.dart
index 8d18091..a69550c 100644
--- a/tests/compiler/dart2js/codegen/no_duplicate_constructor_body_test.dart
+++ b/tests/compiler/dart2js/codegen/no_duplicate_constructor_body_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.7
+
 import "package:async_helper/async_helper.dart";
 import '../helpers/compiler_helper.dart';
 
diff --git a/tests/compiler/dart2js/codegen/no_duplicate_stub_test.dart b/tests/compiler/dart2js/codegen/no_duplicate_stub_test.dart
index 98db5e4..c414ad0 100644
--- a/tests/compiler/dart2js/codegen/no_duplicate_stub_test.dart
+++ b/tests/compiler/dart2js/codegen/no_duplicate_stub_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.7
+
 import "package:async_helper/async_helper.dart";
 import '../helpers/compiler_helper.dart';
 
diff --git a/tests/compiler/dart2js/codegen/null_check_test.dart b/tests/compiler/dart2js/codegen/null_check_test.dart
index 63d226e..e97d18a 100644
--- a/tests/compiler/dart2js/codegen/null_check_test.dart
+++ b/tests/compiler/dart2js/codegen/null_check_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.7
+
 import "package:expect/expect.dart";
 import '../helpers/compiler_helper.dart';
 import "package:async_helper/async_helper.dart";
diff --git a/tests/compiler/dart2js/codegen/null_type_test.dart b/tests/compiler/dart2js/codegen/null_type_test.dart
index 0a23eaf..c3b54ed 100644
--- a/tests/compiler/dart2js/codegen/null_type_test.dart
+++ b/tests/compiler/dart2js/codegen/null_type_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/number_output_test.dart b/tests/compiler/dart2js/codegen/number_output_test.dart
index 317b5ad..fa212c9 100644
--- a/tests/compiler/dart2js/codegen/number_output_test.dart
+++ b/tests/compiler/dart2js/codegen/number_output_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.7
+
 import 'dart:async';
 import 'package:expect/expect.dart';
 import 'package:compiler/compiler_new.dart';
diff --git a/tests/compiler/dart2js/codegen/parameter_phi_elimination_test.dart b/tests/compiler/dart2js/codegen/parameter_phi_elimination_test.dart
index 5c9aa95..c15c58d 100644
--- a/tests/compiler/dart2js/codegen/parameter_phi_elimination_test.dart
+++ b/tests/compiler/dart2js/codegen/parameter_phi_elimination_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.7
+
 // Regression test. Failed due to trying to detach an HLocal twice.
 
 // VMOptions=--enable_asserts
diff --git a/tests/compiler/dart2js/codegen/pragma_annotations_test.dart b/tests/compiler/dart2js/codegen/pragma_annotations_test.dart
index a4487ec..6dc0c9c 100644
--- a/tests/compiler/dart2js/codegen/pragma_annotations_test.dart
+++ b/tests/compiler/dart2js/codegen/pragma_annotations_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js/codegen/pretty_parameter_test.dart b/tests/compiler/dart2js/codegen/pretty_parameter_test.dart
index 882be84..1e2257d 100644
--- a/tests/compiler/dart2js/codegen/pretty_parameter_test.dart
+++ b/tests/compiler/dart2js/codegen/pretty_parameter_test.dart
@@ -1,6 +1,8 @@
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 // for details. All 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
 // Test that parameters keep their names in the output.
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/codegen/redundant_phi_eliminator_test.dart b/tests/compiler/dart2js/codegen/redundant_phi_eliminator_test.dart
index 210c142..a27d420 100644
--- a/tests/compiler/dart2js/codegen/redundant_phi_eliminator_test.dart
+++ b/tests/compiler/dart2js/codegen/redundant_phi_eliminator_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/regress_10231_test.dart b/tests/compiler/dart2js/codegen/regress_10231_test.dart
index 9133791..7c795ff 100644
--- a/tests/compiler/dart2js/codegen/regress_10231_test.dart
+++ b/tests/compiler/dart2js/codegen/regress_10231_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.7
+
 // Regression test for http://dartbug.com/10231.
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/codegen/side_effect_tdiv_regression_test.dart b/tests/compiler/dart2js/codegen/side_effect_tdiv_regression_test.dart
index 2648985..aed03d0 100644
--- a/tests/compiler/dart2js/codegen/side_effect_tdiv_regression_test.dart
+++ b/tests/compiler/dart2js/codegen/side_effect_tdiv_regression_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.7
+
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 
diff --git a/tests/compiler/dart2js/codegen/simple_function_subtype_test.dart b/tests/compiler/dart2js/codegen/simple_function_subtype_test.dart
index eece082..dd2bdaf 100644
--- a/tests/compiler/dart2js/codegen/simple_function_subtype_test.dart
+++ b/tests/compiler/dart2js/codegen/simple_function_subtype_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.7
+
 // Test that simple function subtype checks use predicates.
 
 library simple_function_subtype_test;
diff --git a/tests/compiler/dart2js/codegen/simple_inferrer_relations_test.dart b/tests/compiler/dart2js/codegen/simple_inferrer_relations_test.dart
index 21bb5d0..319c652 100644
--- a/tests/compiler/dart2js/codegen/simple_inferrer_relations_test.dart
+++ b/tests/compiler/dart2js/codegen/simple_inferrer_relations_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.7
+
 /// TODO(johnniwinther): Port this test to use the equivalence framework.
 
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/ssa_phi_codegen_test.dart b/tests/compiler/dart2js/codegen/ssa_phi_codegen_test.dart
index 7799586..6814800 100644
--- a/tests/compiler/dart2js/codegen/ssa_phi_codegen_test.dart
+++ b/tests/compiler/dart2js/codegen/ssa_phi_codegen_test.dart
@@ -1,6 +1,8 @@
 // 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.
+
+// @dart = 2.7
 // Test that parameters keep their names in the output.
 
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/static_closure_test.dart b/tests/compiler/dart2js/codegen/static_closure_test.dart
index 7b3947d..b1697c2 100644
--- a/tests/compiler/dart2js/codegen/static_closure_test.dart
+++ b/tests/compiler/dart2js/codegen/static_closure_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.7
+
 // Test that static functions are closurized as expected.
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/codegen/strength_eq_test.dart b/tests/compiler/dart2js/codegen/strength_eq_test.dart
index 196776b..9db0cc4 100644
--- a/tests/compiler/dart2js/codegen/strength_eq_test.dart
+++ b/tests/compiler/dart2js/codegen/strength_eq_test.dart
@@ -1,6 +1,8 @@
 // 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.
+
+// @dart = 2.7
 // Test constant folding on numbers.
 
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/string_add_test.dart b/tests/compiler/dart2js/codegen/string_add_test.dart
index 2b64f35..656b94d 100644
--- a/tests/compiler/dart2js/codegen/string_add_test.dart
+++ b/tests/compiler/dart2js/codegen/string_add_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.7
+
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/string_escapes_test.dart b/tests/compiler/dart2js/codegen/string_escapes_test.dart
index 9e774d2..d51d3e2 100644
--- a/tests/compiler/dart2js/codegen/string_escapes_test.dart
+++ b/tests/compiler/dart2js/codegen/string_escapes_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.7
+
 import 'dart:async';
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/codegen/string_interpolation_test.dart b/tests/compiler/dart2js/codegen/string_interpolation_test.dart
index c36f45e..712b35c 100644
--- a/tests/compiler/dart2js/codegen/string_interpolation_test.dart
+++ b/tests/compiler/dart2js/codegen/string_interpolation_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.7
+
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/switch_empty_default_test.dart b/tests/compiler/dart2js/codegen/switch_empty_default_test.dart
index 0ba4272..e4c9759 100644
--- a/tests/compiler/dart2js/codegen/switch_empty_default_test.dart
+++ b/tests/compiler/dart2js/codegen/switch_empty_default_test.dart
@@ -1,6 +1,8 @@
 // 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.
+
+// @dart = 2.7
 // Test constant folding on numbers.
 
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/tdiv_test.dart b/tests/compiler/dart2js/codegen/tdiv_test.dart
index 2a212c7..ff52396 100644
--- a/tests/compiler/dart2js/codegen/tdiv_test.dart
+++ b/tests/compiler/dart2js/codegen/tdiv_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.7
+
 library tdiv_test;
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/codegen/top_level_closure_tree_shake_test.dart b/tests/compiler/dart2js/codegen/top_level_closure_tree_shake_test.dart
index 5868d23..0437ea1 100644
--- a/tests/compiler/dart2js/codegen/top_level_closure_tree_shake_test.dart
+++ b/tests/compiler/dart2js/codegen/top_level_closure_tree_shake_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/tree_shaking_test.dart b/tests/compiler/dart2js/codegen/tree_shaking_test.dart
index 518851d..3b17476 100644
--- a/tests/compiler/dart2js/codegen/tree_shaking_test.dart
+++ b/tests/compiler/dart2js/codegen/tree_shaking_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.7
+
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/trust_type_annotations2_test.dart b/tests/compiler/dart2js/codegen/trust_type_annotations2_test.dart
index 6cd1e63..09b1437 100644
--- a/tests/compiler/dart2js/codegen/trust_type_annotations2_test.dart
+++ b/tests/compiler/dart2js/codegen/trust_type_annotations2_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.7
+
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 import '../helpers/memory_compiler.dart';
diff --git a/tests/compiler/dart2js/codegen/trust_type_annotations_test.dart b/tests/compiler/dart2js/codegen/trust_type_annotations_test.dart
index 5937b0d..99ac443 100644
--- a/tests/compiler/dart2js/codegen/trust_type_annotations_test.dart
+++ b/tests/compiler/dart2js/codegen/trust_type_annotations_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.7
+
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 import 'package:compiler/src/commandline_options.dart';
diff --git a/tests/compiler/dart2js/codegen/type_guard_unuser_test.dart b/tests/compiler/dart2js/codegen/type_guard_unuser_test.dart
index 35f1617..28b06c9 100644
--- a/tests/compiler/dart2js/codegen/type_guard_unuser_test.dart
+++ b/tests/compiler/dart2js/codegen/type_guard_unuser_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/type_inference2_test.dart b/tests/compiler/dart2js/codegen/type_inference2_test.dart
index 77366de..549c627 100644
--- a/tests/compiler/dart2js/codegen/type_inference2_test.dart
+++ b/tests/compiler/dart2js/codegen/type_inference2_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.7
+
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
 
diff --git a/tests/compiler/dart2js/codegen/type_inference3_test.dart b/tests/compiler/dart2js/codegen/type_inference3_test.dart
index 0580e9e..b8e7ebf 100644
--- a/tests/compiler/dart2js/codegen/type_inference3_test.dart
+++ b/tests/compiler/dart2js/codegen/type_inference3_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/type_inference4_test.dart b/tests/compiler/dart2js/codegen/type_inference4_test.dart
index 754f094..7b63410 100644
--- a/tests/compiler/dart2js/codegen/type_inference4_test.dart
+++ b/tests/compiler/dart2js/codegen/type_inference4_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/type_inference5_test.dart b/tests/compiler/dart2js/codegen/type_inference5_test.dart
index e478856..7b70e4b 100644
--- a/tests/compiler/dart2js/codegen/type_inference5_test.dart
+++ b/tests/compiler/dart2js/codegen/type_inference5_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/type_inference8_test.dart b/tests/compiler/dart2js/codegen/type_inference8_test.dart
index 9150a65..382ef35 100644
--- a/tests/compiler/dart2js/codegen/type_inference8_test.dart
+++ b/tests/compiler/dart2js/codegen/type_inference8_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.7
+
 /// TODO(johnniwinther): Move this test to the codegen folder.
 
 import "package:async_helper/async_helper.dart";
diff --git a/tests/compiler/dart2js/codegen/types_of_captured_variables_test.dart b/tests/compiler/dart2js/codegen/types_of_captured_variables_test.dart
index d327223..b6d0db1 100644
--- a/tests/compiler/dart2js/codegen/types_of_captured_variables_test.dart
+++ b/tests/compiler/dart2js/codegen/types_of_captured_variables_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.7
+
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 import '../helpers/compiler_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/unused_empty_map_test.dart b/tests/compiler/dart2js/codegen/unused_empty_map_test.dart
index cf3fa88..c705b09 100644
--- a/tests/compiler/dart2js/codegen/unused_empty_map_test.dart
+++ b/tests/compiler/dart2js/codegen/unused_empty_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.7
+
 // Ensure that unused empty HashMap nodes are dropped from the output.
 
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/use_checks_test.dart b/tests/compiler/dart2js/codegen/use_checks_test.dart
index 6f95ee9..69fc215 100644
--- a/tests/compiler/dart2js/codegen/use_checks_test.dart
+++ b/tests/compiler/dart2js/codegen/use_checks_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/codegen/use_strict_test.dart b/tests/compiler/dart2js/codegen/use_strict_test.dart
index 9dfe0f5..4407f33 100644
--- a/tests/compiler/dart2js/codegen/use_strict_test.dart
+++ b/tests/compiler/dart2js/codegen/use_strict_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/compiler_new.dart';
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/codegen/value_range2_test.dart b/tests/compiler/dart2js/codegen/value_range2_test.dart
index d8738ea..2cb17b7 100644
--- a/tests/compiler/dart2js/codegen/value_range2_test.dart
+++ b/tests/compiler/dart2js/codegen/value_range2_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.7
+
 import "package:expect/expect.dart";
 import "package:compiler/src/inferrer/abstract_value_domain.dart";
 import "package:compiler/src/ssa/nodes.dart";
diff --git a/tests/compiler/dart2js/codegen/value_range3_test.dart b/tests/compiler/dart2js/codegen/value_range3_test.dart
index 73491c1..3ccce34 100644
--- a/tests/compiler/dart2js/codegen/value_range3_test.dart
+++ b/tests/compiler/dart2js/codegen/value_range3_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.7
+
 // Test that global analysis in dart2js propagates positive integers.
 
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/codegen/value_range_test.dart b/tests/compiler/dart2js/codegen/value_range_test.dart
index a50b20e..0676cd7 100644
--- a/tests/compiler/dart2js/codegen/value_range_test.dart
+++ b/tests/compiler/dart2js/codegen/value_range_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.7
+
 import 'dart:async';
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/codegen/variance_subtype_cast_test.dart b/tests/compiler/dart2js/codegen/variance_subtype_cast_test.dart
index fcf0d17..f77cd3b 100644
--- a/tests/compiler/dart2js/codegen/variance_subtype_cast_test.dart
+++ b/tests/compiler/dart2js/codegen/variance_subtype_cast_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.7
+
 import 'package:async_helper/async_helper.dart';
 import '../helpers/compiler_helper.dart';
 
diff --git a/tests/compiler/dart2js/deferred/closures_test.dart b/tests/compiler/dart2js/deferred/closures_test.dart
index 3f6d36d..5969125 100644
--- a/tests/compiler/dart2js/deferred/closures_test.dart
+++ b/tests/compiler/dart2js/deferred/closures_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.7
+
 // Ensures that closures are in the output unit of their enclosing element.
 
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/deferred/constant_emission_test_helper.dart b/tests/compiler/dart2js/deferred/constant_emission_test_helper.dart
index 7f8b97e..ce54b1b 100644
--- a/tests/compiler/dart2js/deferred/constant_emission_test_helper.dart
+++ b/tests/compiler/dart2js/deferred/constant_emission_test_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.7
+
 // Test that the additional runtime type support is output to the right
 // Files when using deferred loading.
 
diff --git a/tests/compiler/dart2js/deferred/custom_element_test.dart b/tests/compiler/dart2js/deferred/custom_element_test.dart
index 46acd96..3d363b8 100644
--- a/tests/compiler/dart2js/deferred/custom_element_test.dart
+++ b/tests/compiler/dart2js/deferred/custom_element_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.7
+
 // Test of the graph segmentation algorithm used by deferred loading
 // to determine which elements can be deferred and which libraries
 // much be included in the initial download (loaded eagerly).
diff --git a/tests/compiler/dart2js/deferred/data/deferred_helper.dart b/tests/compiler/dart2js/deferred/data/deferred_helper.dart
index 9df96ab..b2e8813 100644
--- a/tests/compiler/dart2js/deferred/data/deferred_helper.dart
+++ b/tests/compiler/dart2js/deferred/data/deferred_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.7
+
 import 'deferred_lib.dart' deferred as lib;
 
 main() async {
diff --git a/tests/compiler/dart2js/deferred/data/deferred_lib.dart b/tests/compiler/dart2js/deferred/data/deferred_lib.dart
index 7a88c95..cc5015c 100644
--- a/tests/compiler/dart2js/deferred/data/deferred_lib.dart
+++ b/tests/compiler/dart2js/deferred/data/deferred_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 Class {
   method() => 'Class.method';
 }
diff --git a/tests/compiler/dart2js/deferred/deferred_constant3_test.dart b/tests/compiler/dart2js/deferred/deferred_constant3_test.dart
index 7dda970..ab08819 100644
--- a/tests/compiler/dart2js/deferred/deferred_constant3_test.dart
+++ b/tests/compiler/dart2js/deferred/deferred_constant3_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.7
+
 // Test that the additional runtime type support is output to the right
 // Files when using deferred loading.
 
diff --git a/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart b/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart
index 0bac9fa..284a1f5 100644
--- a/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart
+++ b/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_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.7
+
 // Test that the additional runtime type support is output to the right
 // Files when using deferred loading.
 
diff --git a/tests/compiler/dart2js/deferred/dont_inline_deferred_globals_test.dart b/tests/compiler/dart2js/deferred/dont_inline_deferred_globals_test.dart
index 3948747..1c3ac30 100644
--- a/tests/compiler/dart2js/deferred/dont_inline_deferred_globals_test.dart
+++ b/tests/compiler/dart2js/deferred/dont_inline_deferred_globals_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.7
+
 // Test that the additional runtime type support is output to the right
 // Files when using deferred loading.
 
diff --git a/tests/compiler/dart2js/deferred/emit_type_checks_test.dart b/tests/compiler/dart2js/deferred/emit_type_checks_test.dart
index b26555b..38150fc 100644
--- a/tests/compiler/dart2js/deferred/emit_type_checks_test.dart
+++ b/tests/compiler/dart2js/deferred/emit_type_checks_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.7
+
 // Test that the additional runtime type support is output to the right
 // Files when using deferred loading.
 
diff --git a/tests/compiler/dart2js/deferred/follow_constant_dependencies_test.dart b/tests/compiler/dart2js/deferred/follow_constant_dependencies_test.dart
index e4b5593..b277092 100644
--- a/tests/compiler/dart2js/deferred/follow_constant_dependencies_test.dart
+++ b/tests/compiler/dart2js/deferred/follow_constant_dependencies_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.7
+
 // Test that constants depended on by other constants are correctly deferred.
 
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/deferred/follow_implicit_super_regression_test.dart b/tests/compiler/dart2js/deferred/follow_implicit_super_regression_test.dart
index c2ce726..600d455 100644
--- a/tests/compiler/dart2js/deferred/follow_implicit_super_regression_test.dart
+++ b/tests/compiler/dart2js/deferred/follow_implicit_super_regression_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart' as dart2js;
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/deferred/inline_restrictions_test.dart b/tests/compiler/dart2js/deferred/inline_restrictions_test.dart
index 70df323..7432ea3 100644
--- a/tests/compiler/dart2js/deferred/inline_restrictions_test.dart
+++ b/tests/compiler/dart2js/deferred/inline_restrictions_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.7
+
 // Test that we do not accidentally leak code from deferred libraries but do
 // allow inlining of empty functions and from main.
 
diff --git a/tests/compiler/dart2js/deferred/load_graph_segmentation2_test.dart b/tests/compiler/dart2js/deferred/load_graph_segmentation2_test.dart
index 07b6308..e579680 100644
--- a/tests/compiler/dart2js/deferred/load_graph_segmentation2_test.dart
+++ b/tests/compiler/dart2js/deferred/load_graph_segmentation2_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.7
+
 // Test of the graph segmentation algorithm used by deferred loading
 // to determine which elements can be deferred and which libraries
 // much be included in the initial download (loaded eagerly).
diff --git a/tests/compiler/dart2js/deferred/load_graph_segmentation_test.dart b/tests/compiler/dart2js/deferred/load_graph_segmentation_test.dart
index 4d0589c..3dc7942 100644
--- a/tests/compiler/dart2js/deferred/load_graph_segmentation_test.dart
+++ b/tests/compiler/dart2js/deferred/load_graph_segmentation_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.7
+
 // Test of the graph segmentation algorithm used by deferred loading
 // to determine which elements can be deferred and which libraries
 // much be included in the initial download (loaded eagerly).
diff --git a/tests/compiler/dart2js/deferred/load_mapping_test.dart b/tests/compiler/dart2js/deferred/load_mapping_test.dart
index 74c0c43..4e6e9af 100644
--- a/tests/compiler/dart2js/deferred/load_mapping_test.dart
+++ b/tests/compiler/dart2js/deferred/load_mapping_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/compiler_new.dart';
diff --git a/tests/compiler/dart2js/deferred/not_in_main_test.dart b/tests/compiler/dart2js/deferred/not_in_main_test.dart
index 35ac334..d66079a 100644
--- a/tests/compiler/dart2js/deferred/not_in_main_test.dart
+++ b/tests/compiler/dart2js/deferred/not_in_main_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.7
+
 // Test of the graph segmentation algorithm used by deferred loading
 // to determine which elements can be deferred and which libraries
 // much be included in the initial download (loaded eagerly).
diff --git a/tests/compiler/dart2js/deferred/unneeded_part_js_test.dart b/tests/compiler/dart2js/deferred/unneeded_part_js_test.dart
index 7f5ccaa..c097f10 100644
--- a/tests/compiler/dart2js/deferred/unneeded_part_js_test.dart
+++ b/tests/compiler/dart2js/deferred/unneeded_part_js_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.7
+
 // Test that no parts are emitted when deferred loading isn't used.
 
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/deferred_loading/data/basic_deferred/lib.dart b/tests/compiler/dart2js/deferred_loading/data/basic_deferred/lib.dart
index d0d4c5d..3120bea 100644
--- a/tests/compiler/dart2js/deferred_loading/data/basic_deferred/lib.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/basic_deferred/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
+
 /*member: defaultArg:OutputUnit(1, {lib})*/
 defaultArg() => "";
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/basic_deferred/main.dart b/tests/compiler/dart2js/deferred_loading/data/basic_deferred/main.dart
index 2e1b3d3..11d445d 100644
--- a/tests/compiler/dart2js/deferred_loading/data/basic_deferred/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/basic_deferred/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:
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_class/lib.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_class/lib.dart
index 73a68a9..7e98e7b 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_class/lib.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_class/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
+
 // Imported by main.dart.
 
 library deferred_class_library;
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_class/main.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_class/main.dart
index 0656d4a..90fd81f 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_class/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_class/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:OutputUnit(main, {})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/lib1.dart
index 6843b34..8687ed6 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/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.7
+
 library deferred_constants1_lib1;
 
 export 'lib3.dart' show C, C1;
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/lib2.dart
index ed8ffce..7897534 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/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.7
+
 library deferred_constants1_lib2;
 
 export 'lib3.dart' show C2, C3, C4, C5, C6, C7;
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/lib3.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/lib3.dart
index 297fe55..8283665 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/lib3.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/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.7
+
 library deferred_constants1_lib3;
 
 /*class: C:OutputUnit(main, {})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/main.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/main.dart
index 721461b..0f40d1c 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant1/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 'lib1.dart';
 import 'lib2.dart' deferred as lib2;
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant2/lib.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant2/lib.dart
index 1e897c6..db36de5 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_constant2/lib.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant2/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
+
 library deferred_constants2_lib;
 
 /*class: Constant:OutputUnit(1, {lib})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant2/main.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant2/main.dart
index 96002d1..a35addc 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_constant2/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant2/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 'package:expect/expect.dart';
 
 import 'lib.dart' deferred as lib;
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/lib1.dart
index 1b52c4b..061d9d1 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/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.7
+
 import 'shared.dart';
 import 'lib2.dart' deferred as l2;
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/lib2.dart
index 44df89d..71db665 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/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.7
+
 import 'shared.dart';
 
 const c3 = const C(1);
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/main.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/main.dart
index b006d1e..da731a5 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/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 'shared.dart';
 import 'lib1.dart' deferred as l1;
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/shared.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/shared.dart
index 5ce79ac..401e946 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/shared.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_constant3/shared.dart
@@ -2,6 +2,8 @@
 // for details. All 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: C:OutputUnit(main, {})*/
 class C {
   const C(this.x);
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_fail_and_retry/lib.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_fail_and_retry/lib.dart
index e2bccb3..8cab462 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_fail_and_retry/lib.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_fail_and_retry/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
+
 /*member: foo:OutputUnit(1, {lib})*/
 foo() {
   return "loaded";
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_fail_and_retry/main.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_fail_and_retry/main.dart
index 2d2d2bb..67201ca 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_fail_and_retry/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_fail_and_retry/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
+
 // Test that when a deferred import fails to load, it is possible to retry.
 
 import 'lib.dart' deferred as lib;
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_function/lib.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_function/lib.dart
index 5f88684..8406ca6 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_function/lib.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_function/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
+
 // Imported by main.dart and
 
 library deferred_function_library;
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_function/main.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_function/main.dart
index 19a41af..cf774ed 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_function/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_function/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
+
 // Test that loading of a library (with top-level functions only) can
 // be deferred.
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/deferred_overlapping_lib3.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/deferred_overlapping_lib3.dart
index 43a1071..839af93 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/deferred_overlapping_lib3.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/deferred_overlapping_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.7
+
 /*class: C3:OutputUnit(1, {lib1, lib2})*/
 /*member: C3.:OutputUnit(1, {lib1, lib2})*/
 class C3 {}
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/lib1.dart
index 47d7393..6172db7 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/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.7
+
 import "deferred_overlapping_lib3.dart";
 
 /*class: C1:OutputUnit(2, {lib1})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/lib2.dart
index 10073a0..c8cd0e6 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/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.7
+
 import "deferred_overlapping_lib3.dart";
 
 /*class: C2:OutputUnit(3, {lib2})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/main.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/main.dart
index ce926d1..b766437 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_overlapping/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 'lib1.dart' deferred as lib1;
 import 'lib2.dart' deferred as lib2;
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_typed_map/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_typed_map/lib1.dart
index da54242..f5a9c26 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_typed_map/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_typed_map/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.7
+
 /*class: M:OutputUnit(1, {lib})*/
 class M {}
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_typed_map/main.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_typed_map/main.dart
index 109f67e..f31c25c 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_typed_map/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_typed_map/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 'lib1.dart' deferred as lib;
 
 /*member: main:
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_typedef/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_typedef/lib1.dart
index c219ae7..a5bc5f9 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_typedef/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_typedef/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.7
+
 library deferred_typedef_lib1;
 
 /*class: C:OutputUnit(1, {lib1})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/deferred_typedef/main.dart b/tests/compiler/dart2js/deferred_loading/data/deferred_typedef/main.dart
index b6bd66b..a5bccc8 100644
--- a/tests/compiler/dart2js/deferred_loading/data/deferred_typedef/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/deferred_typedef/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 'lib1.dart' deferred as lib1;
 
 /*member: main:OutputUnit(main, {}),constants=[ConstructedConstant(C(a=TypeConstant(void Function()),b=FunctionConstant(topLevelMethod)))=OutputUnit(1, {lib1}),TypeConstant(void Function())=OutputUnit(1, {lib1})]*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/exported_main.dart b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/exported_main.dart
index 6a9d208..35834d4 100644
--- a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/exported_main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/exported_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 'lib1.dart' deferred as lib1;
 import 'lib2.dart' deferred as lib2;
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/lib1.dart
index b0aacb1..8e5690c 100644
--- a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/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.7
+
 import 'exported_main.dart' show C;
 import 'exported_main.dart' as main;
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/lib2.dart
index 050070b..cacae15 100644
--- a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/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.7
+
 import 'exported_main.dart' show C;
 import 'exported_main.dart' as main;
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/main.dart b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/main.dart
index 6afae7d..e55be81 100644
--- a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_constants/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
+
 // TODO(sigmund): remove this indirection and move the main code here. This is
 // needed because of the id-equivalence frameworks overrides the entrypoint URI.
 export 'exported_main.dart';
diff --git a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_global/lib.dart b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_global/lib.dart
index 262c084..18fced0 100644
--- a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_global/lib.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_global/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
+
 /*member: finalVar:OutputUnit(1, {lib})*/
 final finalVar = "string1";
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_global/main.dart b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_global/main.dart
index 964342f..22cbcb4 100644
--- a/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_global/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/dont_inline_deferred_global/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:OutputUnit(main, {})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/future_or/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/future_or/lib1.dart
index 63d79e5..9c001ff 100644
--- a/tests/compiler/dart2js/deferred_loading/data/future_or/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/future_or/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.7
+
 import 'lib2.dart';
 
 const dynamic field = const A();
diff --git a/tests/compiler/dart2js/deferred_loading/data/future_or/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/future_or/lib2.dart
index d8401d3..fde4bbc 100644
--- a/tests/compiler/dart2js/deferred_loading/data/future_or/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/future_or/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.7
+
 /*class: A:OutputUnit(main, {})*/
 class A {
   const A();
diff --git a/tests/compiler/dart2js/deferred_loading/data/future_or/main.dart b/tests/compiler/dart2js/deferred_loading/data/future_or/main.dart
index 9b185a1..deb3dc9 100644
--- a/tests/compiler/dart2js/deferred_loading/data/future_or/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/future_or/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 'dart:async';
 import 'lib1.dart' deferred as lib1;
 import 'lib2.dart' as lib2;
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation0/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation0/lib1.dart
index fee884e..6828e57 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation0/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation0/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.7
+
 /*member: getFoo:OutputUnit(1, {b})*/
 T getFoo<T>(T v) => v;
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation0/main.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation0/main.dart
index aac590a..07c483a 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation0/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation0/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
+
 // Test instantiation used only in a deferred library.
 
 /*class: global#Instantiation:OutputUnit(1, {b})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation1/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation1/lib1.dart
index b9d2704..4ca1497 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation1/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation1/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.7
+
 /*member: getFoo:OutputUnit(1, {b})*/
 T getFoo<T>(T v) => v;
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation1/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation1/lib2.dart
index 3836503..00caeb1 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation1/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation1/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.7
+
 /*member: getFoo:OutputUnit(3, {c})*/
 T getFoo<T, S>(T v, S w) => v;
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation1/main.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation1/main.dart
index 8478533..8f40a89 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation1/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation1/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
+
 // Test instantiations with different type argument count used only in two
 // deferred libraries.
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation2/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation2/lib1.dart
index 449b9d5..89d5d6d 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation2/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation2/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.7
+
 /*member: getFoo:OutputUnit(2, {b})*/
 T getFoo<T>(T v) => v;
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation2/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation2/lib2.dart
index 9263737..d7a9c46 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation2/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation2/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.7
+
 /*member: getFoo:OutputUnit(3, {c})*/
 T getFoo<T>(T v) => v;
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation2/main.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation2/main.dart
index b2b6cfc..9c4fb76 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation2/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation2/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
+
 // Test instantiations with the same type argument count used only in two
 // deferred libraries.
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation3/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation3/lib1.dart
index a49b089..7f641b8 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation3/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation3/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.7
+
 /*member: getFoo:OutputUnit(1, {b})*/
 T getFoo<T>(T v) => v;
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation3/main.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation3/main.dart
index 6d22b9a..dad30c1 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation3/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation3/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
+
 // Test instantiation used only in a deferred library.
 
 /*class: global#Instantiation:OutputUnit(1, {b})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation4/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation4/lib1.dart
index a49b089..7f641b8 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation4/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation4/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.7
+
 /*member: getFoo:OutputUnit(1, {b})*/
 T getFoo<T>(T v) => v;
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation4/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation4/lib2.dart
index 3c506bb..b346bb4 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation4/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation4/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.7
+
 /*member: getFoo:OutputUnit(3, {c})*/
 T getFoo<T, S>(T v, S w) => v;
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation4/main.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation4/main.dart
index 6bcbdc5..302e331 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation4/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation4/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
+
 // Test instantiations with different type argument count used only in two
 // deferred libraries.
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation5/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation5/lib1.dart
index fc0d440..76cebb1 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation5/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation5/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.7
+
 /*member: getFoo:OutputUnit(2, {b})*/
 T getFoo<T>(T v) => v;
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation5/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation5/lib2.dart
index a30cb28..ee8d5ab 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation5/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation5/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.7
+
 /*member: getFoo:OutputUnit(3, {c})*/
 T getFoo<T>(T v) => v;
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation5/main.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation5/main.dart
index b3730ff..ba9004e 100644
--- a/tests/compiler/dart2js/deferred_loading/data/instantiation5/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/instantiation5/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
+
 // Test instantiations with the same type argument count used only in two
 // deferred libraries.
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_a.dart b/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_a.dart
index a2bd8dc..174c5a5 100644
--- a/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_a.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_a.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'shared.dart' deferred as s1;
 
 /*member: doA:
diff --git a/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_b.dart b/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_b.dart
index aa58162..814bff6 100644
--- a/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_b.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_b.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'shared.dart' deferred as s2;
 
 /*member: doB:
diff --git a/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_c.dart b/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_c.dart
index f6b3783..ffc3796 100644
--- a/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_c.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/shared_constant/lib_c.dart
@@ -2,6 +2,8 @@
 // for details. All 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: C:OutputUnit(1, {s1, s2})*/
 class C {
   const C();
diff --git a/tests/compiler/dart2js/deferred_loading/data/shared_constant/main.dart b/tests/compiler/dart2js/deferred_loading/data/shared_constant/main.dart
index 6cdd211..00dffbc 100644
--- a/tests/compiler/dart2js/deferred_loading/data/shared_constant/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/shared_constant/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
+
 /// Regression test for issue https://github.com/dart-lang/sdk/issues/31306.
 ///
 /// When 1 constant was imported in two libraries by using the same exact
diff --git a/tests/compiler/dart2js/deferred_loading/data/shared_constant/shared.dart b/tests/compiler/dart2js/deferred_loading/data/shared_constant/shared.dart
index 1281b4b..be86a09 100644
--- a/tests/compiler/dart2js/deferred_loading/data/shared_constant/shared.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/shared_constant/shared.dart
@@ -2,6 +2,8 @@
 // for details. All 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_c.dart';
 
 const constant = const C();
diff --git a/tests/compiler/dart2js/deferred_loading/data/static_separate/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/static_separate/lib1.dart
index 00ab4d3..c9489f7 100644
--- a/tests/compiler/dart2js/deferred_loading/data/static_separate/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/static_separate/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.7
+
 library lib1;
 
 /*class: ConstClass:OutputUnit(2, {lib1, lib2})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/static_separate/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/static_separate/lib2.dart
index f5f029d..016ba07 100644
--- a/tests/compiler/dart2js/deferred_loading/data/static_separate/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/static_separate/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.7
+
 library lib2;
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/deferred_loading/data/static_separate/main.dart b/tests/compiler/dart2js/deferred_loading/data/static_separate/main.dart
index 0ba29ee..eb82cbf 100644
--- a/tests/compiler/dart2js/deferred_loading/data/static_separate/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/static_separate/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
+
 // The class lib1.C is referenced via lib1
 // The static function lib1.C.foo is referenced via lib2
 // Dart2js will put them in separate hunks.
diff --git a/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/lib1.dart
index d905a5e..4ef7683 100644
--- a/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/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.7
+
 import 'lib2.dart';
 
 /*member: doCast:OutputUnit(main, {})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/lib2.dart
index 452d66e..bfa82bf 100644
--- a/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/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.7
+
 /*class: A:OutputUnit(main, {})*/
 class A {
   /*member: A.:OutputUnit(1, {c})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/main.dart b/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/main.dart
index 1e231be..70024a3 100644
--- a/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/type_argument_dependency/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 'lib1.dart';
 import 'lib2.dart' deferred as c;
 
diff --git a/tests/compiler/dart2js/deferred_loading/data/type_arguments/lib1.dart b/tests/compiler/dart2js/deferred_loading/data/type_arguments/lib1.dart
index a55af13..052d852 100644
--- a/tests/compiler/dart2js/deferred_loading/data/type_arguments/lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/type_arguments/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.7
+
 import 'lib3.dart';
 
 /*class: A:OutputUnit(1, {lib1})*/
diff --git a/tests/compiler/dart2js/deferred_loading/data/type_arguments/lib2.dart b/tests/compiler/dart2js/deferred_loading/data/type_arguments/lib2.dart
index c7672bb..f2d4c91 100644
--- a/tests/compiler/dart2js/deferred_loading/data/type_arguments/lib2.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/type_arguments/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.7
+
 /*class: C:OutputUnit(main, {})*/
 class C<T> {
   const C();
diff --git a/tests/compiler/dart2js/deferred_loading/data/type_arguments/lib3.dart b/tests/compiler/dart2js/deferred_loading/data/type_arguments/lib3.dart
index c7aad0d..d9e5e24 100644
--- a/tests/compiler/dart2js/deferred_loading/data/type_arguments/lib3.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/type_arguments/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.7
+
 /*class: E:OutputUnit(3, {lib3})*/
 class E<T> {
   const E();
diff --git a/tests/compiler/dart2js/deferred_loading/data/type_arguments/main.dart b/tests/compiler/dart2js/deferred_loading/data/type_arguments/main.dart
index 2f6795e..d9b4bac 100644
--- a/tests/compiler/dart2js/deferred_loading/data/type_arguments/main.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/type_arguments/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 'lib1.dart' deferred as lib1;
 import 'lib2.dart' as lib2;
 import 'lib3.dart' deferred as lib3;
diff --git a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
index 2a1c31c..96b7600 100644
--- a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
+++ b/tests/compiler/dart2js/deferred_loading/deferred_loading_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.7
+
 import 'dart:io' hide Link;
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/closure.dart';
diff --git a/tests/compiler/dart2js/end_to_end/all_native_test.dart b/tests/compiler/dart2js/end_to_end/all_native_test.dart
index f85b144..3917078 100644
--- a/tests/compiler/dart2js/end_to_end/all_native_test.dart
+++ b/tests/compiler/dart2js/end_to_end/all_native_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/end_to_end/async_compiler_input_provider_test.dart b/tests/compiler/dart2js/end_to_end/async_compiler_input_provider_test.dart
index c03dfd1..404b675 100644
--- a/tests/compiler/dart2js/end_to_end/async_compiler_input_provider_test.dart
+++ b/tests/compiler/dart2js/end_to_end/async_compiler_input_provider_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.7
+
 import "dart:async";
 import "dart:io";
 
diff --git a/tests/compiler/dart2js/end_to_end/bad_output_io_test.dart b/tests/compiler/dart2js/end_to_end/bad_output_io_test.dart
index ba55341..ccacc18 100644
--- a/tests/compiler/dart2js/end_to_end/bad_output_io_test.dart
+++ b/tests/compiler/dart2js/end_to_end/bad_output_io_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.7
+
 // TODO(johnniwinther): Port this test to use '--use-kernel'.
 
 // Test that the compiler can handle imports when package root has not been set.
diff --git a/tests/compiler/dart2js/end_to_end/command_line_split_test.dart b/tests/compiler/dart2js/end_to_end/command_line_split_test.dart
index f4a2f43..74f41e2 100644
--- a/tests/compiler/dart2js/end_to_end/command_line_split_test.dart
+++ b/tests/compiler/dart2js/end_to_end/command_line_split_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.7
+
 import "package:expect/expect.dart";
 import 'package:compiler/src/util/command_line.dart';
 
diff --git a/tests/compiler/dart2js/end_to_end/command_line_test.dart b/tests/compiler/dart2js/end_to_end/command_line_test.dart
index 076b918..57d4161 100644
--- a/tests/compiler/dart2js/end_to_end/command_line_test.dart
+++ b/tests/compiler/dart2js/end_to_end/command_line_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.7
+
 // Test the command line options of dart2js.
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/end_to_end/dart2js_batch2_test.dart b/tests/compiler/dart2js/end_to_end/dart2js_batch2_test.dart
index 96717ad..0f00751 100644
--- a/tests/compiler/dart2js/end_to_end/dart2js_batch2_test.dart
+++ b/tests/compiler/dart2js/end_to_end/dart2js_batch2_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.7
+
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
diff --git a/tests/compiler/dart2js/end_to_end/dart2js_batch_test.dart b/tests/compiler/dart2js/end_to_end/dart2js_batch_test.dart
index 9447b3a..ade191a 100644
--- a/tests/compiler/dart2js/end_to_end/dart2js_batch_test.dart
+++ b/tests/compiler/dart2js/end_to_end/dart2js_batch_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.7
+
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
diff --git a/tests/compiler/dart2js/end_to_end/data/dart2js_batch2_run.dart b/tests/compiler/dart2js/end_to_end/data/dart2js_batch2_run.dart
index e63be3b..6dee480 100644
--- a/tests/compiler/dart2js/end_to_end/data/dart2js_batch2_run.dart
+++ b/tests/compiler/dart2js/end_to_end/data/dart2js_batch2_run.dart
@@ -2,6 +2,8 @@
 // for details. All 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: UNDEFINED_ANNOTATION
 @notExisting
 var x;
diff --git a/tests/compiler/dart2js/end_to_end/data/hello_world.dart b/tests/compiler/dart2js/end_to_end/data/hello_world.dart
index 3e3c4d4..435410d 100644
--- a/tests/compiler/dart2js/end_to_end/data/hello_world.dart
+++ b/tests/compiler/dart2js/end_to_end/data/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.7
+
 main() {
   print("Hello World!");
 }
diff --git a/tests/compiler/dart2js/end_to_end/diagnostic_reporter_helper.dart b/tests/compiler/dart2js/end_to_end/diagnostic_reporter_helper.dart
index a04734f..15fb27e 100644
--- a/tests/compiler/dart2js/end_to_end/diagnostic_reporter_helper.dart
+++ b/tests/compiler/dart2js/end_to_end/diagnostic_reporter_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.7
+
 library dart2js.diagnostic_reporter.helper;
 
 import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
diff --git a/tests/compiler/dart2js/end_to_end/dill_loader_test.dart b/tests/compiler/dart2js/end_to_end/dill_loader_test.dart
index 92ea4ef..81cbfb7 100644
--- a/tests/compiler/dart2js/end_to_end/dill_loader_test.dart
+++ b/tests/compiler/dart2js/end_to_end/dill_loader_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.7
+
 import '../helpers/memory_compiler.dart';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/apiimpl.dart' show CompilerImpl;
diff --git a/tests/compiler/dart2js/end_to_end/dump_info2_test.dart b/tests/compiler/dart2js/end_to_end/dump_info2_test.dart
index 7d27bf0..d7c74d6 100644
--- a/tests/compiler/dart2js/end_to_end/dump_info2_test.dart
+++ b/tests/compiler/dart2js/end_to_end/dump_info2_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.7
+
 import 'dart:convert';
 
 import 'package:compiler/compiler_new.dart';
diff --git a/tests/compiler/dart2js/end_to_end/dump_info_test.dart b/tests/compiler/dart2js/end_to_end/dump_info_test.dart
index 19a4cfe..642bb2d 100644
--- a/tests/compiler/dart2js/end_to_end/dump_info_test.dart
+++ b/tests/compiler/dart2js/end_to_end/dump_info_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.7
+
 // Test that dump-info has no effect on the compiler output.
 
 import 'dart:io';
diff --git a/tests/compiler/dart2js/end_to_end/exit_code_test.dart b/tests/compiler/dart2js/end_to_end/exit_code_test.dart
index 969a3fe..4a045ee 100644
--- a/tests/compiler/dart2js/end_to_end/exit_code_test.dart
+++ b/tests/compiler/dart2js/end_to_end/exit_code_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.7
+
 // Test the exit code of dart2js in case of exceptions, errors, warnings, etc.
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/end_to_end/generate_code_with_compile_time_errors_test.dart b/tests/compiler/dart2js/end_to_end/generate_code_with_compile_time_errors_test.dart
index 8521dd5..d195707 100644
--- a/tests/compiler/dart2js/end_to_end/generate_code_with_compile_time_errors_test.dart
+++ b/tests/compiler/dart2js/end_to_end/generate_code_with_compile_time_errors_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.7
+
 // Test that the compiler can generates code with compile time error according
 // to the compiler options.
 
diff --git a/tests/compiler/dart2js/end_to_end/launch_helper.dart b/tests/compiler/dart2js/end_to_end/launch_helper.dart
index 4e4df85..7d5a2c5 100644
--- a/tests/compiler/dart2js/end_to_end/launch_helper.dart
+++ b/tests/compiler/dart2js/end_to_end/launch_helper.dart
@@ -1,3 +1,9 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All 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';
 import 'dart:io';
 import 'package:path/path.dart' as path;
diff --git a/tests/compiler/dart2js/end_to_end/library_env_test.dart b/tests/compiler/dart2js/end_to_end/library_env_test.dart
index 45421c4..996bedf 100644
--- a/tests/compiler/dart2js/end_to_end/library_env_test.dart
+++ b/tests/compiler/dart2js/end_to_end/library_env_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.7
+
 /// Check that 'dart:' libraries have their corresponding dart.library.X
 /// environment variable set.
 
diff --git a/tests/compiler/dart2js/end_to_end/modular_loader_test.dart b/tests/compiler/dart2js/end_to_end/modular_loader_test.dart
index 1f79ed0..506d5de 100644
--- a/tests/compiler/dart2js/end_to_end/modular_loader_test.dart
+++ b/tests/compiler/dart2js/end_to_end/modular_loader_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.7
+
 import '../helpers/memory_compiler.dart';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/apiimpl.dart' show CompilerImpl;
diff --git a/tests/compiler/dart2js/end_to_end/no_platform_test.dart b/tests/compiler/dart2js/end_to_end/no_platform_test.dart
index cf6766d..5699366 100644
--- a/tests/compiler/dart2js/end_to_end/no_platform_test.dart
+++ b/tests/compiler/dart2js/end_to_end/no_platform_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 import 'package:compiler/src/kernel/dart2js_target.dart' show Dart2jsTarget;
diff --git a/tests/compiler/dart2js/end_to_end/output_type_test.dart b/tests/compiler/dart2js/end_to_end/output_type_test.dart
index 93726a9..150e8f4 100644
--- a/tests/compiler/dart2js/end_to_end/output_type_test.dart
+++ b/tests/compiler/dart2js/end_to_end/output_type_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.7
+
 /// Test that the expected output targets are generated for various compiler
 /// options.
 
diff --git a/tests/compiler/dart2js/end_to_end/show_package_warnings_test.dart b/tests/compiler/dart2js/end_to_end/show_package_warnings_test.dart
index 3811a01..dd7c73b 100644
--- a/tests/compiler/dart2js/end_to_end/show_package_warnings_test.dart
+++ b/tests/compiler/dart2js/end_to_end/show_package_warnings_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.7
+
 // Test that the '--show-package-warnings' option works as intended.
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/end_to_end/user_crash_test.dart b/tests/compiler/dart2js/end_to_end/user_crash_test.dart
index 1f21642..3154873 100644
--- a/tests/compiler/dart2js/end_to_end/user_crash_test.dart
+++ b/tests/compiler/dart2js/end_to_end/user_crash_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.7
+
 import 'dart:async';
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/equivalence/check_functions.dart b/tests/compiler/dart2js/equivalence/check_functions.dart
index 149894a..0059119 100644
--- a/tests/compiler/dart2js/equivalence/check_functions.dart
+++ b/tests/compiler/dart2js/equivalence/check_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.7
+
 /// Equivalence test functions for data objects.
 
 library dart2js.equivalence.functions;
diff --git a/tests/compiler/dart2js/equivalence/check_helpers.dart b/tests/compiler/dart2js/equivalence/check_helpers.dart
index 08e6379..ea9cf9b 100644
--- a/tests/compiler/dart2js/equivalence/check_helpers.dart
+++ b/tests/compiler/dart2js/equivalence/check_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.7
+
 /// General equivalence test functions.
 
 library dart2js.equivalence.helpers;
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence.dart b/tests/compiler/dart2js/equivalence/id_equivalence.dart
index a78c587..31ece9d 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:_fe_analyzer_shared/src/testing/id.dart';
 import 'package:compiler/src/common.dart';
 import 'package:compiler/src/ir/util.dart';
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
index 341dd6e..20e6173 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence_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.7
+
 import 'dart:async';
 import 'dart:io';
 
diff --git a/tests/compiler/dart2js/equivalence/id_testing_test.dart b/tests/compiler/dart2js/equivalence/id_testing_test.dart
index e8c4022..bf8b007 100644
--- a/tests/compiler/dart2js/equivalence/id_testing_test.dart
+++ b/tests/compiler/dart2js/equivalence/id_testing_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.7
+
 import 'dart:io';
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/equivalence/show_helper.dart b/tests/compiler/dart2js/equivalence/show_helper.dart
index eb9a4f3..754f2e2 100644
--- a/tests/compiler/dart2js/equivalence/show_helper.dart
+++ b/tests/compiler/dart2js/equivalence/show_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.7
+
 /// Helper program that shows the equivalence-based data on a dart program.
 
 import 'dart:io';
diff --git a/tests/compiler/dart2js/field_analysis/jdata/constant_fields.dart b/tests/compiler/dart2js/field_analysis/jdata/constant_fields.dart
index c25d59e..4c7031d 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/constant_fields.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/constant_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.7
+
 main() {
   print(const Class1().field1);
   print(const Class2(field2: true).field2);
diff --git a/tests/compiler/dart2js/field_analysis/jdata/dynamic_set.dart b/tests/compiler/dart2js/field_analysis/jdata/dynamic_set.dart
index fad3d3b..6548d67 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/dynamic_set.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/dynamic_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.7
+
 main() {
   method1(new Class1a());
   method2(new Class2a<int>());
diff --git a/tests/compiler/dart2js/field_analysis/jdata/effectively_constant_state.dart b/tests/compiler/dart2js/field_analysis/jdata/effectively_constant_state.dart
index 22c3126..1bb9851 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/effectively_constant_state.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/effectively_constant_state.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 enum Enum {
   a,
 
diff --git a/tests/compiler/dart2js/field_analysis/jdata/multi_initializers.dart b/tests/compiler/dart2js/field_analysis/jdata/multi_initializers.dart
index f56c73f..fd6efb2 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/multi_initializers.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/multi_initializers.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   var c = new Class1.a();
   c.field3a = null;
diff --git a/tests/compiler/dart2js/field_analysis/jdata/optional_parameters.dart b/tests/compiler/dart2js/field_analysis/jdata/optional_parameters.dart
index 3e0cbf5..1cc064b 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/optional_parameters.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/optional_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.7
+
 main() {
   var c1a = new Class1a(0);
   new Class1a(0, 1);
diff --git a/tests/compiler/dart2js/field_analysis/jdata/regress_36222.dart b/tests/compiler/dart2js/field_analysis/jdata/regress_36222.dart
index a719c2e..2fcbc02 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/regress_36222.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/regress_36222.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 typedef int BinaryFunc(int x, int y);
 
 class A {
diff --git a/tests/compiler/dart2js/field_analysis/jdata/simple_initializers.dart b/tests/compiler/dart2js/field_analysis/jdata/simple_initializers.dart
index 0a7fe28..63c45ec 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/simple_initializers.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/simple_initializers.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   use1(new Class1());
   use2(new Class2());
diff --git a/tests/compiler/dart2js/field_analysis/jdata/static_initializers.dart b/tests/compiler/dart2js/field_analysis/jdata/static_initializers.dart
index 831dd9c..1b4fdf6 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/static_initializers.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/static_initializers.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   print(field1a);
   print(field1b);
diff --git a/tests/compiler/dart2js/field_analysis/jdata/unused_constructors.dart b/tests/compiler/dart2js/field_analysis/jdata/unused_constructors.dart
index cc189f1..848d3c1 100644
--- a/tests/compiler/dart2js/field_analysis/jdata/unused_constructors.dart
+++ b/tests/compiler/dart2js/field_analysis/jdata/unused_constructors.dart
@@ -2,6 +2,8 @@
 // for details. All 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 Class1 {
   /*member: Class1.field:constant=IntConstant(87)*/
   final int field;
diff --git a/tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart b/tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart
index 55f3014..e301643 100644
--- a/tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart
+++ b/tests/compiler/dart2js/field_analysis/jfield_analysis_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.7
+
 import 'dart:io';
 import 'package:_fe_analyzer_shared/src/testing/features.dart';
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/field_analysis/kdata/constant_fields.dart b/tests/compiler/dart2js/field_analysis/kdata/constant_fields.dart
index a8fd083..6adc061 100644
--- a/tests/compiler/dart2js/field_analysis/kdata/constant_fields.dart
+++ b/tests/compiler/dart2js/field_analysis/kdata/constant_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.7
+
 main() {
   print(const Class1().field1);
   print(const Class2(field2: true).field2);
diff --git a/tests/compiler/dart2js/field_analysis/kdata/multi_initializers.dart b/tests/compiler/dart2js/field_analysis/kdata/multi_initializers.dart
index e00b39c..0c09f02 100644
--- a/tests/compiler/dart2js/field_analysis/kdata/multi_initializers.dart
+++ b/tests/compiler/dart2js/field_analysis/kdata/multi_initializers.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   new Class1.a();
   new Class1.b();
diff --git a/tests/compiler/dart2js/field_analysis/kdata/optional_parameters.dart b/tests/compiler/dart2js/field_analysis/kdata/optional_parameters.dart
index 8a9d632..b31c78a 100644
--- a/tests/compiler/dart2js/field_analysis/kdata/optional_parameters.dart
+++ b/tests/compiler/dart2js/field_analysis/kdata/optional_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.7
+
 main() {
   new Class1(0);
   new Class1(0, 1);
diff --git a/tests/compiler/dart2js/field_analysis/kdata/regress_36222.dart b/tests/compiler/dart2js/field_analysis/kdata/regress_36222.dart
index 2641396..4341b32 100644
--- a/tests/compiler/dart2js/field_analysis/kdata/regress_36222.dart
+++ b/tests/compiler/dart2js/field_analysis/kdata/regress_36222.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 typedef int BinaryFunc(int x, int y);
 
 class A {
diff --git a/tests/compiler/dart2js/field_analysis/kdata/side_effects.dart b/tests/compiler/dart2js/field_analysis/kdata/side_effects.dart
index e65028c..129a600 100644
--- a/tests/compiler/dart2js/field_analysis/kdata/side_effects.dart
+++ b/tests/compiler/dart2js/field_analysis/kdata/side_effects.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   new Class1();
 }
diff --git a/tests/compiler/dart2js/field_analysis/kdata/simple_initializers.dart b/tests/compiler/dart2js/field_analysis/kdata/simple_initializers.dart
index 24d5f93..929cb4c 100644
--- a/tests/compiler/dart2js/field_analysis/kdata/simple_initializers.dart
+++ b/tests/compiler/dart2js/field_analysis/kdata/simple_initializers.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   new Class1();
   new Class2();
diff --git a/tests/compiler/dart2js/field_analysis/kdata/static_initializers.dart b/tests/compiler/dart2js/field_analysis/kdata/static_initializers.dart
index 9da6e56..c8f2471 100644
--- a/tests/compiler/dart2js/field_analysis/kdata/static_initializers.dart
+++ b/tests/compiler/dart2js/field_analysis/kdata/static_initializers.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   print(field1a);
   print(field1b);
diff --git a/tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart b/tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
index 7e3d8de..3a8f113 100644
--- a/tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
+++ b/tests/compiler/dart2js/field_analysis/kfield_analysis_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.7
+
 import 'dart:io';
 import 'package:_fe_analyzer_shared/src/testing/features.dart';
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart b/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
index a8cfd0e..b82a36d1 100644
--- a/tests/compiler/dart2js/generic_methods/function_type_variable_test.dart
+++ b/tests/compiler/dart2js/generic_methods/function_type_variable_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/types.dart';
diff --git a/tests/compiler/dart2js/generic_methods/generic_method_test.dart b/tests/compiler/dart2js/generic_methods/generic_method_test.dart
index 76ef8a7..e9cd93a 100644
--- a/tests/compiler/dart2js/generic_methods/generic_method_test.dart
+++ b/tests/compiler/dart2js/generic_methods/generic_method_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/common_elements.dart';
diff --git a/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart b/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart
index 410f5fc..ef4dfc5 100644
--- a/tests/compiler/dart2js/generic_methods/generic_method_type_test.dart
+++ b/tests/compiler/dart2js/generic_methods/generic_method_type_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/types.dart';
diff --git a/tests/compiler/dart2js/generic_methods/instantiation_stub_test.dart b/tests/compiler/dart2js/generic_methods/instantiation_stub_test.dart
index f8c3281..8c9f5fe 100644
--- a/tests/compiler/dart2js/generic_methods/instantiation_stub_test.dart
+++ b/tests/compiler/dart2js/generic_methods/instantiation_stub_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js/generic_methods/world_test.dart b/tests/compiler/dart2js/generic_methods/world_test.dart
index d0edbe1..05cf5da 100644
--- a/tests/compiler/dart2js/generic_methods/world_test.dart
+++ b/tests/compiler/dart2js/generic_methods/world_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/universe/call_structure.dart';
diff --git a/tests/compiler/dart2js/helpers/args_helper.dart b/tests/compiler/dart2js/helpers/args_helper.dart
index 0a63876..b4b4883 100644
--- a/tests/compiler/dart2js/helpers/args_helper.dart
+++ b/tests/compiler/dart2js/helpers/args_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.7
+
 import 'package:_fe_analyzer_shared/src/util/filenames.dart';
 import 'package:args/args.dart';
 import 'package:compiler/src/commandline_options.dart';
diff --git a/tests/compiler/dart2js/helpers/compiler_helper.dart b/tests/compiler/dart2js/helpers/compiler_helper.dart
index c19cda5..9c40a59 100644
--- a/tests/compiler/dart2js/helpers/compiler_helper.dart
+++ b/tests/compiler/dart2js/helpers/compiler_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.7
+
 library compiler_helper;
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/helpers/d8_helper.dart b/tests/compiler/dart2js/helpers/d8_helper.dart
index f358775..50edff3 100644
--- a/tests/compiler/dart2js/helpers/d8_helper.dart
+++ b/tests/compiler/dart2js/helpers/d8_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.7
+
 // Partial test that the closed world computed from [WorldImpact]s derived from
 // kernel is equivalent to the original computed from resolution.
 library dart2js.kernel.compiler_helper;
diff --git a/tests/compiler/dart2js/helpers/diagnostic_helper.dart b/tests/compiler/dart2js/helpers/diagnostic_helper.dart
index d45306a..68a34ff 100644
--- a/tests/compiler/dart2js/helpers/diagnostic_helper.dart
+++ b/tests/compiler/dart2js/helpers/diagnostic_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.7
+
 library dart2js.test.diagnostic_helper;
 
 import 'dart:collection';
diff --git a/tests/compiler/dart2js/helpers/element_lookup.dart b/tests/compiler/dart2js/helpers/element_lookup.dart
index a0c97ba..e72f0f6 100644
--- a/tests/compiler/dart2js/helpers/element_lookup.dart
+++ b/tests/compiler/dart2js/helpers/element_lookup.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:compiler/src/common_elements.dart' show JElementEnvironment;
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/types.dart';
diff --git a/tests/compiler/dart2js/helpers/ir_types.dart b/tests/compiler/dart2js/helpers/ir_types.dart
index 64f44a4..a777fab 100644
--- a/tests/compiler/dart2js/helpers/ir_types.dart
+++ b/tests/compiler/dart2js/helpers/ir_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.7
+
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/class_hierarchy.dart' as ir;
 import 'package:kernel/core_types.dart' as ir;
diff --git a/tests/compiler/dart2js/helpers/link_helper.dart b/tests/compiler/dart2js/helpers/link_helper.dart
index 53d20d4..2290e63 100644
--- a/tests/compiler/dart2js/helpers/link_helper.dart
+++ b/tests/compiler/dart2js/helpers/link_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.7
+
 library link_helper;
 
 import 'package:_fe_analyzer_shared/src/util/link.dart';
diff --git a/tests/compiler/dart2js/helpers/memory_compiler.dart b/tests/compiler/dart2js/helpers/memory_compiler.dart
index 4f7b01f..fb7a7da 100644
--- a/tests/compiler/dart2js/helpers/memory_compiler.dart
+++ b/tests/compiler/dart2js/helpers/memory_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.7
+
 library dart2js.test.memory_compiler;
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/helpers/memory_source_file_helper.dart b/tests/compiler/dart2js/helpers/memory_source_file_helper.dart
index 7fada85..865d20e 100644
--- a/tests/compiler/dart2js/helpers/memory_source_file_helper.dart
+++ b/tests/compiler/dart2js/helpers/memory_source_file_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.7
+
 library dart2js.test.memory_source_file_helper;
 
 import 'dart:async' show Future;
diff --git a/tests/compiler/dart2js/helpers/output_collector.dart b/tests/compiler/dart2js/helpers/output_collector.dart
index 30b62be..3b47963 100644
--- a/tests/compiler/dart2js/helpers/output_collector.dart
+++ b/tests/compiler/dart2js/helpers/output_collector.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Output provider that collects the output in string buffers.
 
 library output_collector;
diff --git a/tests/compiler/dart2js/helpers/program_lookup.dart b/tests/compiler/dart2js/helpers/program_lookup.dart
index 54124aa..0ded799 100644
--- a/tests/compiler/dart2js/helpers/program_lookup.dart
+++ b/tests/compiler/dart2js/helpers/program_lookup.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/deferred_load.dart';
diff --git a/tests/compiler/dart2js/helpers/shared_helper.dart b/tests/compiler/dart2js/helpers/shared_helper.dart
index 7f69eda..65ca216 100644
--- a/tests/compiler/dart2js/helpers/shared_helper.dart
+++ b/tests/compiler/dart2js/helpers/shared_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.7
+
 import 'package:compiler/src/constants/values.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/types.dart';
diff --git a/tests/compiler/dart2js/helpers/stats_test.dart b/tests/compiler/dart2js/helpers/stats_test.dart
index 9254ee9..af0e96a 100644
--- a/tests/compiler/dart2js/helpers/stats_test.dart
+++ b/tests/compiler/dart2js/helpers/stats_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.7
+
 import 'package:expect/expect.dart';
 import 'package:compiler/src/helpers/helpers.dart';
 
diff --git a/tests/compiler/dart2js/helpers/text_helpers.dart b/tests/compiler/dart2js/helpers/text_helpers.dart
index e9723d2..cab50ac 100644
--- a/tests/compiler/dart2js/helpers/text_helpers.dart
+++ b/tests/compiler/dart2js/helpers/text_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.7
+
 /// Compares [text1] and [text2] line-by-line. If a mismatch is found, a diff
 /// of the [windowSize] lines before and after are printed and the mismatch line
 /// number is returned. If identical, nothing is printed and `null` is returned.
diff --git a/tests/compiler/dart2js/helpers/type_test_helper.dart b/tests/compiler/dart2js/helpers/type_test_helper.dart
index 35b4dbe..92ce751 100644
--- a/tests/compiler/dart2js/helpers/type_test_helper.dart
+++ b/tests/compiler/dart2js/helpers/type_test_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.7
+
 library type_test_helper;
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/impact/data/as.dart b/tests/compiler/dart2js/impact/data/as.dart
index 80bbc69f..059a86a 100644
--- a/tests/compiler/dart2js/impact/data/as.dart
+++ b/tests/compiler/dart2js/impact/data/as.dart
@@ -2,6 +2,8 @@
 // for details. All 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:static=[explicitAs(1),implicitAs(1),promoted(1)],type=[inst:JSNull]*/
 main() {
   explicitAs(null);
@@ -9,14 +11,14 @@
   promoted(null);
 }
 
-/*member: explicitAs:dynamic=[String.length],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:String]*/
+/*member: explicitAs:dynamic=[String.length],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:String]*/
 explicitAs(String i) {
   i.length;
   // ignore: unnecessary_cast
   return i as String;
 }
 
-/*member: implicitAs:dynamic=[String.length],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:String]*/
+/*member: implicitAs:dynamic=[String.length],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:String]*/
 String implicitAs(String i) {
   dynamic j = i;
   i.length;
@@ -24,7 +26,7 @@
   return j;
 }
 
-/*member: promoted:dynamic=[String.length],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:String]*/
+/*member: promoted:dynamic=[String.length],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:String]*/
 String promoted(dynamic i) {
   if (i is! String) return null;
   i.length;
diff --git a/tests/compiler/dart2js/impact/data/async.dart b/tests/compiler/dart2js/impact/data/async.dart
index 41172c1..2cc6b7d 100644
--- a/tests/compiler/dart2js/impact/data/async.dart
+++ b/tests/compiler/dart2js/impact/data/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.7
+
 /*member: main:
  static=[
   testAnonymousAsync(0),
@@ -217,13 +219,13 @@
   return () async* {};
 }
 
-/*member: testAsyncForIn:dynamic=[_StreamIterator.cancel(0),_StreamIterator.current,_StreamIterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),StreamIterator.(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_asyncAwait(2),_asyncRethrow(2),_asyncReturn(2),_asyncStartSync(2),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),_makeAsyncAwaitCompleter<dynamic>(0),_wrapJsFunctionForAsync(1),findType(1),instanceType(1)],type=[impl:Stream<dynamic>,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
+/*member: testAsyncForIn:dynamic=[_StreamIterator.cancel(0),_StreamIterator.current,_StreamIterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),StreamIterator.(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_asyncAwait(2),_asyncRethrow(2),_asyncReturn(2),_asyncStartSync(2),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),_makeAsyncAwaitCompleter<dynamic>(0),_wrapJsFunctionForAsync(1),findType(1),instanceType(1)],type=[impl:Stream<dynamic>,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
 testAsyncForIn(o) async {
   // ignore: UNUSED_LOCAL_VARIABLE
   await for (var e in o) {}
 }
 
-/*member: testAsyncForInTyped:dynamic=[_StreamIterator.cancel(0),_StreamIterator.current,_StreamIterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),StreamIterator.(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_asyncAwait(2),_asyncRethrow(2),_asyncReturn(2),_asyncStartSync(2),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),_makeAsyncAwaitCompleter<dynamic>(0),_wrapJsFunctionForAsync(1),findType(1),instanceType(1)],type=[impl:Stream<dynamic>,impl:int,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
+/*member: testAsyncForInTyped:dynamic=[_StreamIterator.cancel(0),_StreamIterator.current,_StreamIterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),StreamIterator.(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_asyncAwait(2),_asyncRethrow(2),_asyncReturn(2),_asyncStartSync(2),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),_makeAsyncAwaitCompleter<dynamic>(0),_wrapJsFunctionForAsync(1),findType(1),instanceType(1)],type=[impl:Stream<dynamic>,impl:int,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
 testAsyncForInTyped(o) async {
   // ignore: UNUSED_LOCAL_VARIABLE
   await for (int e in o) {}
diff --git a/tests/compiler/dart2js/impact/data/classes.dart b/tests/compiler/dart2js/impact/data/classes.dart
index 925f979..09be0cd 100644
--- a/tests/compiler/dart2js/impact/data/classes.dart
+++ b/tests/compiler/dart2js/impact/data/classes.dart
@@ -2,6 +2,8 @@
 // for details. All 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:
  static=[
   testAbstractClassWithField(0),
@@ -137,7 +139,7 @@
 testForwardingConstructor() => new ForwardingConstructorClass(null);
 
 class ForwardingConstructorTypedSuperClass {
-  /*member: ForwardingConstructorTypedSuperClass.:static=[Object.(0),Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:int]*/
+  /*member: ForwardingConstructorTypedSuperClass.:static=[Object.(0),Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:int]*/
   ForwardingConstructorTypedSuperClass(int arg);
 }
 
@@ -151,7 +153,7 @@
 testForwardingConstructorTyped() => new ForwardingConstructorTypedClass(null);
 
 class ForwardingConstructorGenericSuperClass<T> {
-  /*member: ForwardingConstructorGenericSuperClass.:static=[Object.(0),Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:ForwardingConstructorGenericSuperClass.T]*/
+  /*member: ForwardingConstructorGenericSuperClass.:static=[Object.(0),Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:ForwardingConstructorGenericSuperClass.T]*/
   ForwardingConstructorGenericSuperClass(T arg);
 }
 
@@ -181,7 +183,7 @@
 */
 testEnum() => Enum.A;
 
-/*member: staticGenericMethod:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,inst:List<staticGenericMethod.T>,param:Object,param:staticGenericMethod.T]*/
+/*member: staticGenericMethod:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,inst:List<staticGenericMethod.T>,param:Object,param:staticGenericMethod.T]*/
 List<T> staticGenericMethod<T>(T arg) => [arg];
 
 /*member: testStaticGenericMethod:
@@ -228,7 +230,7 @@
 class GenericClass<X, Y> {
   const GenericClass.generative();
 
-  /*member: GenericClass.genericMethod:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,inst:Map<GenericClass.X,genericMethod.T>,param:Object,param:genericMethod.T]*/
+  /*member: GenericClass.genericMethod:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,inst:Map<GenericClass.X,genericMethod.T>,param:Object,param:genericMethod.T]*/
   Map<X, T> genericMethod<T>(T arg) => {null: arg};
 }
 
diff --git a/tests/compiler/dart2js/impact/data/constants/lib.dart b/tests/compiler/dart2js/impact/data/constants/lib.dart
index 5e0bb96..1eeb5d1 100644
--- a/tests/compiler/dart2js/impact/data/constants/lib.dart
+++ b/tests/compiler/dart2js/impact/data/constants/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
+
 const dynamic nullLiteralField = null;
 
 const dynamic boolLiteralField = true;
@@ -42,7 +44,7 @@
 
 const typeLiteralField = String;
 
-/*member: id:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:Object,param:id.T]*/
+/*member: id:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:Object,param:id.T]*/
 T id<T>(T t) => t;
 
 const int Function(int) _instantiation = id;
diff --git a/tests/compiler/dart2js/impact/data/constants/main.dart b/tests/compiler/dart2js/impact/data/constants/main.dart
index 81913aa..1b959de 100644
--- a/tests/compiler/dart2js/impact/data/constants/main.dart
+++ b/tests/compiler/dart2js/impact/data/constants/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';
 import 'lib.dart' deferred as defer;
 
diff --git a/tests/compiler/dart2js/impact/data/constructors.dart b/tests/compiler/dart2js/impact/data/constructors.dart
index a56a258..c3262ba 100644
--- a/tests/compiler/dart2js/impact/data/constructors.dart
+++ b/tests/compiler/dart2js/impact/data/constructors.dart
@@ -2,6 +2,8 @@
 // for details. All 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:
  static=[
   testConstRedirectingFactoryInvoke(0),
@@ -152,7 +154,7 @@
   /*member: GenericClass.generative:static=[Object.(0)]*/
   const GenericClass.generative();
 
-  /*member: GenericClass.fact:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Object]*/
+  /*member: GenericClass.fact:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Object]*/
   factory GenericClass.fact() => null;
 
   const factory GenericClass.redirect() = GenericClass<X, Y>.generative;
diff --git a/tests/compiler/dart2js/impact/data/effectively_final.dart b/tests/compiler/dart2js/impact/data/effectively_final.dart
index 281b098..9384140 100644
--- a/tests/compiler/dart2js/impact/data/effectively_final.dart
+++ b/tests/compiler/dart2js/impact/data/effectively_final.dart
@@ -2,6 +2,8 @@
 // for details. All 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:
  static=[
   effectivelyFinalList(0),
@@ -67,7 +69,7 @@
 /*member: _method1:type=[inst:JSNull]*/
 num _method1() => null;
 
-/*member: effectivelyFinalPromoted:dynamic=[int.+,num.+],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),_method1(0),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSDouble,inst:JSInt,inst:JSNumber,inst:JSPositiveInt,inst:JSUInt31,inst:JSUInt32,is:int]*/
+/*member: effectivelyFinalPromoted:dynamic=[int.+,num.+],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),_method1(0),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSDouble,inst:JSInt,inst:JSNumber,inst:JSPositiveInt,inst:JSUInt31,inst:JSUInt32,is:int]*/
 effectivelyFinalPromoted() {
   dynamic c = _method1();
   c + 0;
@@ -79,7 +81,7 @@
 /*member: _method2:type=[inst:JSNull]*/
 String _method2() => null;
 
-/*member: effectivelyFinalPromotedInvalid:dynamic=[String.+,int.+],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),_method2(0),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSDouble,inst:JSInt,inst:JSNumber,inst:JSPositiveInt,inst:JSString,inst:JSUInt31,inst:JSUInt32,is:int]*/
+/*member: effectivelyFinalPromotedInvalid:dynamic=[String.+,int.+],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),_method2(0),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSDouble,inst:JSInt,inst:JSNumber,inst:JSPositiveInt,inst:JSString,inst:JSUInt31,inst:JSUInt32,is:int]*/
 effectivelyFinalPromotedInvalid() {
   dynamic c = _method2();
   c + '';
diff --git a/tests/compiler/dart2js/impact/data/exact.dart b/tests/compiler/dart2js/impact/data/exact.dart
index 1c6a6aa..19e18c6 100644
--- a/tests/compiler/dart2js/impact/data/exact.dart
+++ b/tests/compiler/dart2js/impact/data/exact.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A.:static=[Object.(0)]*/
 class A {
   method1() {}
diff --git a/tests/compiler/dart2js/impact/data/expressions.dart b/tests/compiler/dart2js/impact/data/expressions.dart
index 3976aee..c15c49c 100644
--- a/tests/compiler/dart2js/impact/data/expressions.dart
+++ b/tests/compiler/dart2js/impact/data/expressions.dart
@@ -2,6 +2,8 @@
 // for details. All 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:static=[
   testAs(1),
   testAsGeneric(1),
@@ -105,58 +107,58 @@
 */
 testPreDec(o) => --o;
 
-/*member: testIs:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:Class]*/
+/*member: testIs:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:Class]*/
 testIs() => null is Class;
 
-/*member: testIsGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:GenericClass<int,String>]*/
+/*member: testIsGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:GenericClass<int,String>]*/
 testIsGeneric() => null is GenericClass<int, String>;
 
-/*member: testIsGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
+/*member: testIsGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
 testIsGenericRaw() => null is GenericClass;
 
-/*member: testIsGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
+/*member: testIsGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
 testIsGenericDynamic() => null is GenericClass<dynamic, dynamic>;
 
-/*member: testIsNot:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:Class]*/
+/*member: testIsNot:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:Class]*/
 testIsNot() => null is! Class;
 
-/*member: testIsNotGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:GenericClass<int,String>]*/
+/*member: testIsNotGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:GenericClass<int,String>]*/
 testIsNotGeneric() => null is! GenericClass<int, String>;
 
-/*member: testIsNotGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
+/*member: testIsNotGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
 testIsNotGenericRaw() => null is! GenericClass;
 
-/*member: testIsNotGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
+/*member: testIsNotGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,is:GenericClass<dynamic,dynamic>]*/
 testIsNotGenericDynamic() => null is! GenericClass<dynamic, dynamic>;
 
-/*member: testIsTypedef:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:dynamic Function()]*/
+/*member: testIsTypedef:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:dynamic Function()]*/
 testIsTypedef() => null is Typedef;
 
-/*member: testIsTypedefGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:int Function(String)]*/
+/*member: testIsTypedefGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:int Function(String)]*/
 testIsTypedefGeneric() => null is GenericTypedef<int, String>;
 
-/*member: testIsTypedefGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:dynamic Function(dynamic)]*/
+/*member: testIsTypedefGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:dynamic Function(dynamic)]*/
 testIsTypedefGenericRaw() => null is GenericTypedef;
 
-/*member: testIsTypedefGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:dynamic Function(dynamic)]*/
+/*member: testIsTypedefGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:dynamic Function(dynamic)]*/
 testIsTypedefGenericDynamic() => null is GenericTypedef<dynamic, dynamic>;
 
-/*member: testIsTypedefDeep:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:List<int Function(dynamic Function(dynamic))>]*/
+/*member: testIsTypedefDeep:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,is:List<int Function(dynamic Function(dynamic))>]*/
 testIsTypedefDeep() => null is List<GenericTypedef<int, GenericTypedef>>;
 
-/*member: testAs:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1),throwRuntimeError(1)],type=[as:Class,inst:Closure,inst:JSBool]*/
+/*member: testAs:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1),throwRuntimeError(1)],type=[as:Class,inst:Closure,inst:JSBool]*/
 // ignore: UNNECESSARY_CAST
 testAs(dynamic o) => o as Class;
 
-/*member: testAsGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2),throwRuntimeError(1)],type=[as:GenericClass<int,String>,inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>]*/
+/*member: testAsGeneric:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2),throwRuntimeError(1)],type=[as:GenericClass<int,String>,inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>]*/
 // ignore: UNNECESSARY_CAST
 testAsGeneric(dynamic o) => o as GenericClass<int, String>;
 
-/*member: testAsGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1),throwRuntimeError(1)],type=[as:GenericClass<dynamic,dynamic>,inst:Closure,inst:JSBool]*/
+/*member: testAsGenericRaw:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1),throwRuntimeError(1)],type=[as:GenericClass<dynamic,dynamic>,inst:Closure,inst:JSBool]*/
 // ignore: UNNECESSARY_CAST
 testAsGenericRaw(dynamic o) => o as GenericClass;
 
-/*member: testAsGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1),throwRuntimeError(1)],type=[as:GenericClass<dynamic,dynamic>,inst:Closure,inst:JSBool]*/
+/*member: testAsGenericDynamic:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1),throwRuntimeError(1)],type=[as:GenericClass<dynamic,dynamic>,inst:Closure,inst:JSBool]*/
 // ignore: UNNECESSARY_CAST
 testAsGenericDynamic(dynamic o) => o as GenericClass<dynamic, dynamic>;
 
@@ -168,7 +170,7 @@
 /*member: testIfNotNull:dynamic=[Object.==,foo],type=[inst:JSNull]*/
 testIfNotNull(o) => o?.foo;
 
-/*member: testTypedIfNotNull:dynamic=[Class.==,Class.field],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class]*/
+/*member: testTypedIfNotNull:dynamic=[Class.==,Class.field],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class]*/
 testTypedIfNotNull(Class o) => o?.field;
 
 /*member: testIfNotNullSet:dynamic=[Object.==,foo=],type=[inst:JSBool,inst:JSNull]*/
diff --git a/tests/compiler/dart2js/impact/data/extract_type_arguments.dart b/tests/compiler/dart2js/impact/data/extract_type_arguments.dart
index d498017..3c9b8f3 100644
--- a/tests/compiler/dart2js/impact/data/extract_type_arguments.dart
+++ b/tests/compiler/dart2js/impact/data/extract_type_arguments.dart
@@ -2,6 +2,8 @@
 // for details. All 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: IMPORT_INTERNAL_LIBRARY
 import 'dart:_internal';
 
@@ -12,10 +14,10 @@
 /*member: C.:static=[Object.(0)]*/
 class C implements A<int>, B<String, bool> {}
 
-/*member: testA:dynamic=[call<A.T>(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),extractTypeArguments<A<dynamic>>(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[impl:A<dynamic>,impl:Function,inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,is:A<A.T>]*/
+/*member: testA:dynamic=[call<A.T>(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),extractTypeArguments<A<dynamic>>(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[impl:A<dynamic>,impl:Function,inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,is:A<A.T>]*/
 testA(c, f) => extractTypeArguments<A>(c, f);
 
-/*member: testB:dynamic=[call<B.S,B.U>(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),extractTypeArguments<B<dynamic,dynamic>>(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[impl:B<dynamic,dynamic>,impl:Function,inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,is:B<B.S,B.U>]*/
+/*member: testB:dynamic=[call<B.S,B.U>(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),extractTypeArguments<B<dynamic,dynamic>>(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[impl:B<dynamic,dynamic>,impl:Function,inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,is:B<B.S,B.U>]*/
 testB(c, f) => extractTypeArguments<B>(c, f);
 
 /*member: main:static=[C.(0),testA(2),testB(2)],type=[inst:JSNull]*/
diff --git a/tests/compiler/dart2js/impact/data/future_or.dart b/tests/compiler/dart2js/impact/data/future_or.dart
index acf5373..336fdef 100644
--- a/tests/compiler/dart2js/impact/data/future_or.dart
+++ b/tests/compiler/dart2js/impact/data/future_or.dart
@@ -2,6 +2,8 @@
 // for details. All 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";
 
 /*member: main:dynamic=[runtimeType],runtimeType=[unknown:FutureOr<int>],static=[Future.value(1),checkTypeBound(4),print(1),throwTypeError(1)],type=[inst:JSDouble,inst:JSInt,inst:JSNumber,inst:JSPositiveInt,inst:JSUInt31,inst:JSUInt32]*/
diff --git a/tests/compiler/dart2js/impact/data/initializers.dart b/tests/compiler/dart2js/impact/data/initializers.dart
index 778c065..631eb49 100644
--- a/tests/compiler/dart2js/impact/data/initializers.dart
+++ b/tests/compiler/dart2js/impact/data/initializers.dart
@@ -2,6 +2,8 @@
 // for details. All 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:
  static=[
   testDefaultValuesNamed(0),
@@ -28,10 +30,10 @@
   testGenericClass();
 }
 
-/*member: testDefaultValuesPositional:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:bool]*/
+/*member: testDefaultValuesPositional:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:bool]*/
 testDefaultValuesPositional([bool value = false]) {}
 
-/*member: testDefaultValuesNamed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:bool]*/
+/*member: testDefaultValuesNamed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:bool]*/
 testDefaultValuesNamed({bool value: false}) {}
 
 class ClassFieldInitializer1 {
@@ -84,7 +86,7 @@
 
 /*member: ClassInstanceFieldWithInitializer.:static=[Object.(0)]*/
 class ClassInstanceFieldWithInitializer {
-  /*member: ClassInstanceFieldWithInitializer.field:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:bool]*/
+  /*member: ClassInstanceFieldWithInitializer.field:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:bool]*/
   var field = false;
 }
 
@@ -93,7 +95,7 @@
 
 /*member: ClassInstanceFieldTyped.:static=[Object.(0)]*/
 class ClassInstanceFieldTyped {
-  /*member: ClassInstanceFieldTyped.field:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:int]*/
+  /*member: ClassInstanceFieldTyped.field:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:int]*/
   int field;
 }
 
@@ -120,7 +122,7 @@
 testSuperInitializer() => new ClassSuperInitializer();
 
 class ClassGeneric<T> {
-  /*member: ClassGeneric.:static=[Object.(0),Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:ClassGeneric.T]*/
+  /*member: ClassGeneric.:static=[Object.(0),Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),checkSubtypeOfRuntimeType(2),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:ClassGeneric.T]*/
   ClassGeneric(T arg);
 }
 
diff --git a/tests/compiler/dart2js/impact/data/injected_cast.dart b/tests/compiler/dart2js/impact/data/injected_cast.dart
index 7ff1527..a1ced47 100644
--- a/tests/compiler/dart2js/impact/data/injected_cast.dart
+++ b/tests/compiler/dart2js/impact/data/injected_cast.dart
@@ -2,6 +2,8 @@
 // for details. All 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 A {}
 
 class B {}
@@ -14,11 +16,11 @@
 
 /*member: Class1.:static=[Object.(0)]*/
 class Class1 {
-  /*member: Class1.field1:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:A]*/
+  /*member: Class1.field1:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:A]*/
   A field1;
 }
 
-/*member: method1:dynamic=[Class1.field1=],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,inst:Closure,inst:JSBool,is:Class1]*/
+/*member: method1:dynamic=[Class1.field1=],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,inst:Closure,inst:JSBool,is:Class1]*/
 method1(dynamic o, dynamic value) {
   if (o is! Class1) return;
   o.field1 = value;
@@ -48,11 +50,11 @@
 
 /*member: Class3.:static=[Object.(0)]*/
 class Class3 {
-  /*member: Class3.method3:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:A,param:B,param:C]*/
+  /*member: Class3.method3:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:A,param:B,param:C]*/
   method3(A a, [B b, C c]) {}
 }
 
-/*member: method3:dynamic=[Class3.method3(3)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,impl:C,inst:Closure,inst:JSBool,is:Class3,param:B]*/
+/*member: method3:dynamic=[Class3.method3(3)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,impl:C,inst:Closure,inst:JSBool,is:Class3,param:B]*/
 method3(dynamic o, dynamic a, B b, dynamic c) {
   if (o is! Class3) return;
   o.method3(a, b, c);
@@ -60,11 +62,11 @@
 
 /*member: Class4.:static=[Object.(0)]*/
 class Class4 {
-  /*member: Class4.method4:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:A,param:B,param:C]*/
+  /*member: Class4.method4:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:A,param:B,param:C]*/
   method4(A a, {B b, C c}) {}
 }
 
-/*member: method4:dynamic=[Class4.method4(1,b,c)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,impl:C,inst:Closure,inst:JSBool,is:Class4,param:B]*/
+/*member: method4:dynamic=[Class4.method4(1,b,c)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,impl:C,inst:Closure,inst:JSBool,is:Class4,param:B]*/
 method4(dynamic o, dynamic a, B b, dynamic c) {
   if (o is! Class4) return;
   o.method4(a, c: c, b: b);
@@ -142,7 +144,7 @@
   A Function(A) get f => null;
 }
 
-/*member: method7:dynamic=[Class7.f(1),call(1)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,inst:Closure,inst:JSBool,is:Class7]*/
+/*member: method7:dynamic=[Class7.f(1),call(1)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:A,inst:Closure,inst:JSBool,is:Class7]*/
 method7(dynamic o, dynamic a) {
   if (o is! Class7) return;
   o.f(a);
@@ -170,7 +172,7 @@
   return g.method(iterable);
 }
 
-/*member: method9:dynamic=[G.field=],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:int,inst:Closure,inst:JSBool,inst:JSNull,is:G,param:num]*/
+/*member: method9:dynamic=[G.field=],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[impl:int,inst:Closure,inst:JSBool,inst:JSNull,is:G,param:num]*/
 method9(dynamic g, num value) {
   if (g is! G) return null;
   return g.field = value;
diff --git a/tests/compiler/dart2js/impact/data/invokes.dart b/tests/compiler/dart2js/impact/data/invokes.dart
index ec1ce07..2e93818 100644
--- a/tests/compiler/dart2js/impact/data/invokes.dart
+++ b/tests/compiler/dart2js/impact/data/invokes.dart
@@ -2,6 +2,8 @@
 // for details. All 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:
  static=[
   testClosure(0),
@@ -115,13 +117,13 @@
   topLevelFunction3(15, c: 16, b: 17);
 }
 
-/*member: topLevelFunction1Typed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:int]*/
+/*member: topLevelFunction1Typed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:int]*/
 void topLevelFunction1Typed(int a) {}
 
-/*member: topLevelFunction2Typed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:String,param:double,param:num]*/
+/*member: topLevelFunction2Typed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:String,param:double,param:num]*/
 int topLevelFunction2Typed(String a, [num b, double c]) => null;
 
-/*member: topLevelFunction3Typed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:List<int>,param:Map<String,bool>,param:bool]*/
+/*member: topLevelFunction3Typed:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:List<int>,param:Map<String,bool>,param:bool]*/
 double topLevelFunction3Typed(bool a, {List<int> b, Map<String, bool> c}) {
   return null;
 }
@@ -162,16 +164,16 @@
   topLevelFunction3Typed(false, c: {'16': false}, b: [17]);
 }
 
-/*member: topLevelFunctionTyped1:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num)]*/
+/*member: topLevelFunctionTyped1:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num)]*/
 topLevelFunctionTyped1(void a(num b)) {}
 
-/*member: topLevelFunctionTyped2:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num,[String])]*/
+/*member: topLevelFunctionTyped2:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num,[String])]*/
 topLevelFunctionTyped2(void a(num b, [String c])) {}
 
-/*member: topLevelFunctionTyped3:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num,{String c,int d})]*/
+/*member: topLevelFunctionTyped3:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num,{String c,int d})]*/
 topLevelFunctionTyped3(void a(num b, {String c, int d})) {}
 
-/*member: topLevelFunctionTyped4:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num,{int c,String d})]*/
+/*member: topLevelFunctionTyped4:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:void Function(num,{int c,String d})]*/
 topLevelFunctionTyped4(void a(num b, {String d, int c})) {}
 
 /*member: testTopLevelFunctionTyped:
@@ -210,7 +212,7 @@
 /*member: testTopLevelSetterSet:static=[set:topLevelSetter],type=[inst:JSNull]*/
 testTopLevelSetterSet() => topLevelSetter = null;
 
-/*member: topLevelSetterTyped=:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:int]*/
+/*member: topLevelSetterTyped=:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:int]*/
 void set topLevelSetterTyped(int value) {}
 
 /*member: testTopLevelSetterSetTyped:static=[set:topLevelSetterTyped],type=[inst:JSNull]*/
@@ -239,25 +241,25 @@
 /*member: testTopLevelFieldFinal:static=[topLevelFieldFinal]*/
 testTopLevelFieldFinal() => topLevelFieldFinal;
 
-/*member: topLevelFieldTyped:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:int]*/
+/*member: topLevelFieldTyped:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:int]*/
 int topLevelFieldTyped;
 
 /*member: testTopLevelFieldTyped:static=[topLevelFieldTyped]*/
 testTopLevelFieldTyped() => topLevelFieldTyped;
 
-/*member: topLevelFieldGeneric1:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:GenericClass<dynamic,dynamic>]*/
+/*member: topLevelFieldGeneric1:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:GenericClass<dynamic,dynamic>]*/
 GenericClass topLevelFieldGeneric1;
 
 /*member: testTopLevelFieldGeneric1:static=[topLevelFieldGeneric1]*/
 testTopLevelFieldGeneric1() => topLevelFieldGeneric1;
 
-/*member: topLevelFieldGeneric2:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:GenericClass<dynamic,dynamic>]*/
+/*member: topLevelFieldGeneric2:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:GenericClass<dynamic,dynamic>]*/
 GenericClass<dynamic, dynamic> topLevelFieldGeneric2;
 
 /*member: testTopLevelFieldGeneric2:static=[topLevelFieldGeneric2]*/
 testTopLevelFieldGeneric2() => topLevelFieldGeneric2;
 
-/*member: topLevelFieldGeneric3:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:GenericClass<int,String>]*/
+/*member: topLevelFieldGeneric3:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:GenericClass<int,String>]*/
 GenericClass<int, String> topLevelFieldGeneric3;
 
 /*member: testTopLevelFieldGeneric3:static=[topLevelFieldGeneric3]*/
@@ -382,7 +384,7 @@
   localFunction() {}
 }
 
-/*member: testLocalFunctionTyped:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),computeSignature(3),def:localFunction,findType(1),getRuntimeTypeArguments(3),getRuntimeTypeInfo(1),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:Function,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:String]*/
+/*member: testLocalFunctionTyped:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),computeSignature(3),def:localFunction,findType(1),getRuntimeTypeArguments(3),getRuntimeTypeInfo(1),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:Function,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:String]*/
 testLocalFunctionTyped() {
   // ignore: UNUSED_ELEMENT
   int localFunction(String a) => null;
diff --git a/tests/compiler/dart2js/impact/data/jsinterop.dart b/tests/compiler/dart2js/impact/data/jsinterop.dart
index 6dce2cd..efddfaa 100644
--- a/tests/compiler/dart2js/impact/data/jsinterop.dart
+++ b/tests/compiler/dart2js/impact/data/jsinterop.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 @JS()
 library jsinterop;
 
@@ -59,7 +61,7 @@
 /*member: GenericClass.:static=[JavaScriptObject.(0)]*/
 @JS()
 class GenericClass<T> {
-  /*member: GenericClass.method:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:void Function(GenericClass.T)]*/
+  /*member: GenericClass.method:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:void Function(GenericClass.T)]*/
   external GenericClass method([Callback<T> callback]);
 }
 
diff --git a/tests/compiler/dart2js/impact/data/jsinterop_setter1.dart b/tests/compiler/dart2js/impact/data/jsinterop_setter1.dart
index 379e8e9..d60cd83 100644
--- a/tests/compiler/dart2js/impact/data/jsinterop_setter1.dart
+++ b/tests/compiler/dart2js/impact/data/jsinterop_setter1.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 @JS()
 library main;
 
@@ -9,11 +11,11 @@
 
 import 'package:js/js.dart';
 
-/*member: foo=:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,native:ApplicationCacheErrorEvent,native:DomError,native:DomException,native:ErrorEvent,native:MediaError,native:NavigatorUserMediaError,native:OverconstrainedError,native:PositionError,native:SensorErrorEvent,native:SpeechRecognitionError,native:SqlError,param:Function]*/
+/*member: foo=:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,native:ApplicationCacheErrorEvent,native:DomError,native:DomException,native:ErrorEvent,native:MediaError,native:NavigatorUserMediaError,native:OverconstrainedError,native:PositionError,native:SensorErrorEvent,native:SpeechRecognitionError,native:SqlError,param:Function]*/
 @JS()
 external set foo(Function f);
 
-/*member: _doStuff:dynamic=[File.==,File.name],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),defineProperty(3),findType(1),instanceType(1),print(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,inst:JSString,param:File,param:String]*/
+/*member: _doStuff:dynamic=[File.==,File.name],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),defineProperty(3),findType(1),instanceType(1),print(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,inst:JSString,param:File,param:String]*/
 void _doStuff(String name, File file) {
   if (file == null) {
     print('OK');
diff --git a/tests/compiler/dart2js/impact/data/jsinterop_setter2.dart b/tests/compiler/dart2js/impact/data/jsinterop_setter2.dart
index 4fdac09..2d7eb7f 100644
--- a/tests/compiler/dart2js/impact/data/jsinterop_setter2.dart
+++ b/tests/compiler/dart2js/impact/data/jsinterop_setter2.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 @JS()
 library main;
 
@@ -9,11 +11,11 @@
 
 import 'package:js/js.dart';
 
-/*member: foo=:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,native:ApplicationCacheErrorEvent,native:DomError,native:DomException,native:ErrorEvent,native:File,native:MediaError,native:NavigatorUserMediaError,native:OverconstrainedError,native:PositionError,native:SensorErrorEvent,native:SpeechRecognitionError,native:SqlError,param:void Function(String,File)]*/
+/*member: foo=:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,native:ApplicationCacheErrorEvent,native:DomError,native:DomException,native:ErrorEvent,native:File,native:MediaError,native:NavigatorUserMediaError,native:OverconstrainedError,native:PositionError,native:SensorErrorEvent,native:SpeechRecognitionError,native:SqlError,param:void Function(String,File)]*/
 @JS()
 external set foo(void Function(String, File) f);
 
-/*member: _doStuff:dynamic=[File.==,File.name],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),defineProperty(3),findType(1),instanceType(1),print(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,inst:JSString,param:File,param:String]*/
+/*member: _doStuff:dynamic=[File.==,File.name],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),defineProperty(3),findType(1),instanceType(1),print(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,inst:JSString,param:File,param:String]*/
 void _doStuff(String name, File file) {
   if (file == null) {
     print('OK');
diff --git a/tests/compiler/dart2js/impact/data/literals.dart b/tests/compiler/dart2js/impact/data/literals.dart
index 987e646..4edd315 100644
--- a/tests/compiler/dart2js/impact/data/literals.dart
+++ b/tests/compiler/dart2js/impact/data/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.7
+
 /*member: main:static=[
  testBoolFromEnvironment(0),
  testComplexConstSymbol(0),
diff --git a/tests/compiler/dart2js/impact/data/native.dart b/tests/compiler/dart2js/impact/data/native.dart
index a759f7f..ecbaf89 100644
--- a/tests/compiler/dart2js/impact/data/native.dart
+++ b/tests/compiler/dart2js/impact/data/native.dart
@@ -2,6 +2,8 @@
 // for details. All 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: IMPORT_INTERNAL_LIBRARY
 import 'dart:_foreign_helper' as foreign show JS;
 // ignore: IMPORT_INTERNAL_LIBRARY
@@ -56,7 +58,7 @@
 
 @Native("NativeClass")
 class NativeClass {
-  /*member: NativeClass.field:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,native:JSExtendableArray<JSExtendableArray.E>,native:Object,native:String,native:bool,native:double,native:int,param:Object]*/
+  /*member: NativeClass.field:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,native:JSExtendableArray<JSExtendableArray.E>,native:Object,native:String,native:bool,native:double,native:int,param:Object]*/
   @annotation_Creates_SerializedScriptValue
   final Object field;
 
@@ -65,5 +67,5 @@
   }
 }
 
-/*member: testNativeField:dynamic=[NativeClass.field],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),defineProperty(3),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:NativeClass]*/
+/*member: testNativeField:dynamic=[NativeClass.field],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),defineProperty(3),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:NativeClass]*/
 testNativeField(NativeClass c) => c.field;
diff --git a/tests/compiler/dart2js/impact/data/promotion.dart b/tests/compiler/dart2js/impact/data/promotion.dart
index e0513e7..69a6b93 100644
--- a/tests/compiler/dart2js/impact/data/promotion.dart
+++ b/tests/compiler/dart2js/impact/data/promotion.dart
@@ -2,6 +2,8 @@
 // for details. All 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 {}
 
 class SubClass extends Class {
@@ -37,17 +39,17 @@
   dynamicToNoSuchMethodTearOff(null);
 }
 
-/*member: positiveTyped:dynamic=[SubClass.method(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,is:SubClass,param:Class]*/
+/*member: positiveTyped:dynamic=[SubClass.method(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,is:SubClass,param:Class]*/
 positiveTyped(Class cls) {
   if (cls is SubClass) cls.method();
 }
 
-/*member: positiveDynamic:dynamic=[SubClass.method(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,is:SubClass]*/
+/*member: positiveDynamic:dynamic=[SubClass.method(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,is:SubClass]*/
 positiveDynamic(dynamic cls) {
   if (cls is SubClass) cls.method();
 }
 
-/*member: negativeDynamic:dynamic=[SubClass.method(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,is:SubClass]*/
+/*member: negativeDynamic:dynamic=[SubClass.method(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,is:SubClass]*/
 negativeDynamic(dynamic cls) {
   if (cls is! SubClass) return;
   cls.method();
diff --git a/tests/compiler/dart2js/impact/data/runtime_type.dart b/tests/compiler/dart2js/impact/data/runtime_type.dart
index 7b1ca18..204aadf 100644
--- a/tests/compiler/dart2js/impact/data/runtime_type.dart
+++ b/tests/compiler/dart2js/impact/data/runtime_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.7
+
 /*member: Class1a.:static=[Object.(0)]*/
 class Class1a<T> {
   /*member: Class1a.==:
@@ -60,88 +62,88 @@
 /*member: Class4.:static=[Object.(0)]*/
 class Class4 {}
 
-/*member: toString1:dynamic=[Class2.runtimeType,toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),S(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSString,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
+/*member: toString1:dynamic=[Class2.runtimeType,toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),S(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSString,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
 toString1(Class2<int> c) => '${c.runtimeType}';
 
-/*member: toString2:dynamic=[Class2.==,Class2.runtimeType,toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),S(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSString,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
+/*member: toString2:dynamic=[Class2.==,Class2.runtimeType,toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),S(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSString,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
 toString2(Class2<int> c) => '${c?.runtimeType}';
 
-/*member: toString3:dynamic=[Class2.runtimeType,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
+/*member: toString3:dynamic=[Class2.runtimeType,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
 toString3(Class2<int> c) => c.runtimeType.toString();
 
-/*member: toString4:dynamic=[Class2.runtimeType,Type.==,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
+/*member: toString4:dynamic=[Class2.runtimeType,Type.==,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
 toString4(Class2<int> c) => c.runtimeType?.toString();
 
-/*member: toString5:dynamic=[Class2.==,Class2.runtimeType,Type.==,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
+/*member: toString5:dynamic=[Class2.==,Class2.runtimeType,Type.==,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
 toString5(Class2<int> c) => c?.runtimeType?.toString();
 
-/*member: toString6:dynamic=[Class2.==,Class2.runtimeType,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
+/*member: toString6:dynamic=[Class2.==,Class2.runtimeType,Type.toString(0)],runtimeType=[string:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
 toString6(Class2<int> c) => c?.runtimeType.toString();
 
-/*member: unknown:dynamic=[Class2.runtimeType],runtimeType=[unknown:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
+/*member: unknown:dynamic=[Class2.runtimeType],runtimeType=[unknown:Class2<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSUnmodifiableArray<dynamic>,param:Class2<int>]*/
 unknown(Class2<int> c) => c.runtimeType;
 
-/*member: equals1:dynamic=[Class1a.==,Class1a.runtimeType,Class1d.==,Class1d.runtimeType,Type.==],runtimeType=[equals:Class1a<int>/Class1d<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class1a<int>,param:Class1d<int>]*/
+/*member: equals1:dynamic=[Class1a.==,Class1a.runtimeType,Class1d.==,Class1d.runtimeType,Type.==],runtimeType=[equals:Class1a<int>/Class1d<int>],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkSubtype(4),findType(1),getRuntimeTypeArgument(3),getRuntimeTypeArgumentIntercepted(4),getRuntimeTypeInfo(1),getTypeArgumentByIndex(2),instanceType(1),setRuntimeTypeInfo(2)],type=[inst:Closure,inst:JSArray<dynamic>,inst:JSBool,inst:JSExtendableArray<dynamic>,inst:JSFixedArray<dynamic>,inst:JSMutableArray<dynamic>,inst:JSNull,inst:JSUnmodifiableArray<dynamic>,param:Class1a<int>,param:Class1d<int>]*/
 equals1(Class1a<int> a, Class1d<int> b) => a?.runtimeType == b?.runtimeType;
 
-/*member: almostEquals1:dynamic=[Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals1:dynamic=[Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostEquals1(Class3 a) => a.runtimeType == null;
 
-/*member: almostEquals2:dynamic=[Class3.==,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals2:dynamic=[Class3.==,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostEquals2(Class3 a) => a?.runtimeType == null;
 
-/*member: almostEquals3:dynamic=[Class3.runtimeType,Null.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals3:dynamic=[Class3.runtimeType,Null.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostEquals3(Class3 a) => null == a.runtimeType;
 
-/*member: almostEquals4:dynamic=[Class3.==,Class3.runtimeType,Null.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals4:dynamic=[Class3.==,Class3.runtimeType,Null.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostEquals4(Class3 a) => null == a?.runtimeType;
 
-/*member: almostEquals5:dynamic=[Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3]*/
+/*member: almostEquals5:dynamic=[Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3]*/
 almostEquals5(Class3 a) => a.runtimeType == a.field;
 
-/*member: almostEquals6:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals6:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostEquals6(Class3 a) => a?.runtimeType == a.field;
 
-/*member: almostEquals7:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals7:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostEquals7(Class3 a) => a.runtimeType == a?.field;
 
-/*member: almostEquals8:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals8:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostEquals8(Class3 a) => a?.runtimeType == a?.field;
 
-/*member: almostEquals9:dynamic=[Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3]*/
+/*member: almostEquals9:dynamic=[Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3]*/
 almostEquals9(Class3 a) => a.field == a.runtimeType;
 
-/*member: almostEquals10:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals10:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostEquals10(Class3 a) => a?.field == a.runtimeType;
 
-/*member: almostEquals11:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals11:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostEquals11(Class3 a) => a.field == a?.runtimeType;
 
-/*member: almostEquals12:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostEquals12:dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostEquals12(Class3 a) => a?.field == a?.runtimeType;
 
-/*member: almostToString1:dynamic=[Class3.runtimeType,Type.toString],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3]*/
+/*member: almostToString1:dynamic=[Class3.runtimeType,Type.toString],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3]*/
 almostToString1(Class3 a) => a.runtimeType.toString;
 
-/*member: almostToString2:dynamic=[Class3.==,Class3.runtimeType,Type.==,Type.toString],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostToString2:dynamic=[Class3.==,Class3.runtimeType,Type.==,Type.toString],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostToString2(Class3 a) => a?.runtimeType?.toString;
 
-/*member: almostToString3:dynamic=[Class3.runtimeType,Type.noSuchMethod(1)],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostToString3:dynamic=[Class3.runtimeType,Type.noSuchMethod(1)],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostToString3(Class3 a) => a.runtimeType.noSuchMethod(null);
 
-/*member: almostToString4:dynamic=[Class3.==,Class3.runtimeType,Type.noSuchMethod(1)],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
+/*member: almostToString4:dynamic=[Class3.==,Class3.runtimeType,Type.noSuchMethod(1)],runtimeType=[unknown:Class3],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3]*/
 almostToString4(Class3 a) => a?.runtimeType.noSuchMethod(null);
 
-/*member: notEquals1:dynamic=[Class3.runtimeType,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3,param:Class4]*/
+/*member: notEquals1:dynamic=[Class3.runtimeType,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,param:Class3,param:Class4]*/
 notEquals1(Class3 a, Class4 b) => a.runtimeType != b.runtimeType;
 
-/*member: notEquals2:dynamic=[Class3.==,Class3.runtimeType,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3,param:Class4]*/
+/*member: notEquals2:dynamic=[Class3.==,Class3.runtimeType,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3,param:Class4]*/
 notEquals2(Class3 a, Class4 b) => a?.runtimeType != b.runtimeType;
 
-/*member: notEquals3:dynamic=[Class3.runtimeType,Class4.==,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3,param:Class4]*/
+/*member: notEquals3:dynamic=[Class3.runtimeType,Class4.==,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3,param:Class4]*/
 notEquals3(Class3 a, Class4 b) => a.runtimeType != b?.runtimeType;
 
-/*member: notEquals4:dynamic=[Class3.==,Class3.runtimeType,Class4.==,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3,param:Class4]*/
+/*member: notEquals4:dynamic=[Class3.==,Class3.runtimeType,Class4.==,Class4.runtimeType,Type.==],runtimeType=[equals:Class3/Class4],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1)],type=[inst:Closure,inst:JSBool,inst:JSNull,param:Class3,param:Class4]*/
 notEquals4(Class3 a, Class4 b) => a?.runtimeType != b?.runtimeType;
 
 /*member: main:dynamic=[exact:Class1a.==],static=[Class1a.(0),Class1b.(0),Class1c.(0),Class1d.(0),Class2.(0),Class3.(0),Class4.(0),almostEquals1(1),almostEquals10(1),almostEquals11(1),almostEquals12(1),almostEquals2(1),almostEquals3(1),almostEquals4(1),almostEquals5(1),almostEquals6(1),almostEquals7(1),almostEquals8(1),almostEquals9(1),almostToString1(1),almostToString2(1),almostToString3(1),almostToString4(1),checkTypeBound(4),equals1(2),notEquals1(2),notEquals2(2),notEquals3(2),notEquals4(2),print(1),throwTypeError(1),toString1(1),toString2(1),toString3(1),toString4(1),toString5(1),toString6(1),unknown(1)]*/
diff --git a/tests/compiler/dart2js/impact/data/statements.dart b/tests/compiler/dart2js/impact/data/statements.dart
index 15a28cf..f5b41a2 100644
--- a/tests/compiler/dart2js/impact/data/statements.dart
+++ b/tests/compiler/dart2js/impact/data/statements.dart
@@ -2,6 +2,8 @@
 // for details. All 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:
  static=[
   testAssert(0),
@@ -65,13 +67,13 @@
     return 1;
 }
 
-/*member: testForIn:dynamic=[Iterator.current,Iterator.iterator,Iterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkConcurrentModificationError(2),findType(1),instanceType(1)],type=[impl:Iterable<dynamic>,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
+/*member: testForIn:dynamic=[Iterator.current,Iterator.iterator,Iterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkConcurrentModificationError(2),findType(1),instanceType(1)],type=[impl:Iterable<dynamic>,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
 testForIn(o) {
   // ignore: UNUSED_LOCAL_VARIABLE
   for (var e in o) {}
 }
 
-/*member: testForInTyped:dynamic=[Iterator.current,Iterator.iterator,Iterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkConcurrentModificationError(2),findType(1),instanceType(1)],type=[impl:Iterable<dynamic>,impl:int,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
+/*member: testForInTyped:dynamic=[Iterator.current,Iterator.iterator,Iterator.moveNext(0)],static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),checkConcurrentModificationError(2),findType(1),instanceType(1)],type=[impl:Iterable<dynamic>,impl:int,inst:Closure,inst:JSBool,inst:JSNull,inst:Null]*/
 testForInTyped(o) {
   // ignore: UNUSED_LOCAL_VARIABLE
   for (int e in o) {}
@@ -87,7 +89,7 @@
   try {} catch (e) {}
 }
 
-/*member: testTryCatchOn:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_checkBoolNullable(1),_checkDoubleNullable(1),_checkIntNullable(1),_checkNumNullable(1),_checkObject(1),_checkStringNullable(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_generalTypeCheckImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1),unwrapException(1)],type=[catch:String,inst:Closure,inst:JSBool,inst:PlainJavaScriptObject,inst:UnknownJavaScriptObject]*/
+/*member: testTryCatchOn:static=[Rti._bind(1),Rti._eval(1),_arrayInstanceType(1),_asBoolNullable(1),_asDoubleNullable(1),_asIntNullable(1),_asNumNullable(1),_asObject(1),_asStringNullable(1),_asTop(1),_generalAsCheckImplementation(1),_generalIsTestImplementation(1),_instanceType(1),_isBool(1),_isInt(1),_isNum(1),_isObject(1),_isString(1),_isTop(1),findType(1),instanceType(1),unwrapException(1)],type=[catch:String,inst:Closure,inst:JSBool,inst:PlainJavaScriptObject,inst:UnknownJavaScriptObject]*/
 testTryCatchOn() {
   // ignore: UNUSED_CATCH_CLAUSE
   try {} on String catch (e) {}
diff --git a/tests/compiler/dart2js/impact/data/this.dart b/tests/compiler/dart2js/impact/data/this.dart
index f06504e..d526987 100644
--- a/tests/compiler/dart2js/impact/data/this.dart
+++ b/tests/compiler/dart2js/impact/data/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.7
+
 /*member: Class.:static=[Object.(0)]*/
 class Class {
   /*member: Class.field1:type=[inst:JSNull]*/
diff --git a/tests/compiler/dart2js/impact/impact_test.dart b/tests/compiler/dart2js/impact/impact_test.dart
index 09a1566..1ae3981 100644
--- a/tests/compiler/dart2js/impact/impact_test.dart
+++ b/tests/compiler/dart2js/impact/impact_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.7
+
 import 'dart:io';
 import 'package:_fe_analyzer_shared/src/testing/features.dart';
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/inference/callers/field_access.dart b/tests/compiler/dart2js/inference/callers/field_access.dart
index 4cad4a1..403a14f 100644
--- a/tests/compiler/dart2js/inference/callers/field_access.dart
+++ b/tests/compiler/dart2js/inference/callers/field_access.dart
@@ -2,6 +2,8 @@
 // for details. All 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: B.:[main]*/
 class A {
   /*member: A.field:[main]*/
diff --git a/tests/compiler/dart2js/inference/callers_test.dart b/tests/compiler/dart2js/inference/callers_test.dart
index 5a6a719..421ff24 100644
--- a/tests/compiler/dart2js/inference/callers_test.dart
+++ b/tests/compiler/dart2js/inference/callers_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.7
+
 import 'dart:io';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/closure.dart';
diff --git a/tests/compiler/dart2js/inference/data/abstract_method.dart b/tests/compiler/dart2js/inference/data/abstract_method.dart
index b6076c4..81dd471 100644
--- a/tests/compiler/dart2js/inference/data/abstract_method.dart
+++ b/tests/compiler/dart2js/inference/data/abstract_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.7
+
 /*member: main:[null]*/
 main() {
   abstractEquals();
diff --git a/tests/compiler/dart2js/inference/data/and_or.dart b/tests/compiler/dart2js/inference/data/and_or.dart
index 1f51c64..a312110 100644
--- a/tests/compiler/dart2js/inference/data/and_or.dart
+++ b/tests/compiler/dart2js/inference/data/and_or.dart
@@ -2,6 +2,8 @@
 // for details. All 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: X.:[exact=X]*/
 class X {}
 
diff --git a/tests/compiler/dart2js/inference/data/as.dart b/tests/compiler/dart2js/inference/data/as.dart
index 3a66972..319f83f 100644
--- a/tests/compiler/dart2js/inference/data/as.dart
+++ b/tests/compiler/dart2js/inference/data/as.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   asIntWithString();
diff --git a/tests/compiler/dart2js/inference/data/assert.dart b/tests/compiler/dart2js/inference/data/assert.dart
index 8f470ae..ff409e0 100644
--- a/tests/compiler/dart2js/inference/data/assert.dart
+++ b/tests/compiler/dart2js/inference/data/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.7
+
 /// This file contains tests of assertions when assertions are _disabled_. The
 /// file 'assert_ea.dart' contains similar tests for when assertions are
 /// _enabled_.
diff --git a/tests/compiler/dart2js/inference/data/assert_ea.dart b/tests/compiler/dart2js/inference/data/assert_ea.dart
index 5faff4e..99f4550 100644
--- a/tests/compiler/dart2js/inference/data/assert_ea.dart
+++ b/tests/compiler/dart2js/inference/data/assert_ea.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /// This file contains tests of assertions when assertions are _enabled_. The
 /// file 'assert.dart' contains similar tests for when assertions are
 /// _disabled_.
diff --git a/tests/compiler/dart2js/inference/data/assert_message_throw.dart b/tests/compiler/dart2js/inference/data/assert_message_throw.dart
index 1115952..095a1a3 100644
--- a/tests/compiler/dart2js/inference/data/assert_message_throw.dart
+++ b/tests/compiler/dart2js/inference/data/assert_message_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.7
+
 /// This file contains tests of assertions when assertions are _disabled_. The
 /// file 'assert_message_throw_ea.dart' contains similar tests for when
 /// assertions are _enabled_.
diff --git a/tests/compiler/dart2js/inference/data/assert_message_throw_ea.dart b/tests/compiler/dart2js/inference/data/assert_message_throw_ea.dart
index 72e4618..ed29bb3 100644
--- a/tests/compiler/dart2js/inference/data/assert_message_throw_ea.dart
+++ b/tests/compiler/dart2js/inference/data/assert_message_throw_ea.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /// This file contains tests of assertions when assertions are _enabled_. The
 /// file 'assert_message_throw.dart' contains similar tests for when assertions
 /// are _disabled_.
diff --git a/tests/compiler/dart2js/inference/data/assign_op.dart b/tests/compiler/dart2js/inference/data/assign_op.dart
index 94d63dc..d658ac3 100644
--- a/tests/compiler/dart2js/inference/data/assign_op.dart
+++ b/tests/compiler/dart2js/inference/data/assign_op.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   assignPlus();
diff --git a/tests/compiler/dart2js/inference/data/async_marker.dart b/tests/compiler/dart2js/inference/data/async_marker.dart
index 97a9464..001fed5 100644
--- a/tests/compiler/dart2js/inference/data/async_marker.dart
+++ b/tests/compiler/dart2js/inference/data/async_marker.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   asyncMethod();
diff --git a/tests/compiler/dart2js/inference/data/await.dart b/tests/compiler/dart2js/inference/data/await.dart
index 1f7bfea..5fb5d91 100644
--- a/tests/compiler/dart2js/inference/data/await.dart
+++ b/tests/compiler/dart2js/inference/data/await.dart
@@ -2,6 +2,8 @@
 // for details. All 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';
 
 /*member: main:[null]*/
diff --git a/tests/compiler/dart2js/inference/data/break_continue.dart b/tests/compiler/dart2js/inference/data/break_continue.dart
index 989c474..9fbb86e 100644
--- a/tests/compiler/dart2js/inference/data/break_continue.dart
+++ b/tests/compiler/dart2js/inference/data/break_continue.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   breakInWhile();
diff --git a/tests/compiler/dart2js/inference/data/call_in_loop.dart b/tests/compiler/dart2js/inference/data/call_in_loop.dart
index b948889..5827401 100644
--- a/tests/compiler/dart2js/inference/data/call_in_loop.dart
+++ b/tests/compiler/dart2js/inference/data/call_in_loop.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /// Regression test for [ClosureCallSiteTypeInformation] in loops.
 
 /*member: Class.:[exact=Class]*/
diff --git a/tests/compiler/dart2js/inference/data/call_method_function_typed_value.dart b/tests/compiler/dart2js/inference/data/call_method_function_typed_value.dart
index 52d6d13..23487e5 100644
--- a/tests/compiler/dart2js/inference/data/call_method_function_typed_value.dart
+++ b/tests/compiler/dart2js/inference/data/call_method_function_typed_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.7
+
 // Test based on language_2/call_method_function_typed_value_test/04
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/inference/data/call_site.dart b/tests/compiler/dart2js/inference/data/call_site.dart
index c945208..ac2b579 100644
--- a/tests/compiler/dart2js/inference/data/call_site.dart
+++ b/tests/compiler/dart2js/inference/data/call_site.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   test1();
diff --git a/tests/compiler/dart2js/inference/data/catch.dart b/tests/compiler/dart2js/inference/data/catch.dart
index d87f53a..243100d 100644
--- a/tests/compiler/dart2js/inference/data/catch.dart
+++ b/tests/compiler/dart2js/inference/data/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.7
+
 /*member: main:[null]*/
 main() {
   catchUntyped();
diff --git a/tests/compiler/dart2js/inference/data/closure.dart b/tests/compiler/dart2js/inference/data/closure.dart
index e4f2243..2e14eff 100644
--- a/tests/compiler/dart2js/inference/data/closure.dart
+++ b/tests/compiler/dart2js/inference/data/closure.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   returnInClosure();
diff --git a/tests/compiler/dart2js/inference/data/closure2.dart b/tests/compiler/dart2js/inference/data/closure2.dart
index 5d03f44..0e6335d 100644
--- a/tests/compiler/dart2js/inference/data/closure2.dart
+++ b/tests/compiler/dart2js/inference/data/closure2.dart
@@ -2,6 +2,8 @@
 // for details. All 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: returnInt1:[exact=JSUInt31]*/
 returnInt1() {
   var a = 42;
diff --git a/tests/compiler/dart2js/inference/data/closure_tracer.dart b/tests/compiler/dart2js/inference/data/closure_tracer.dart
index 7aa62d9..08105f7 100644
--- a/tests/compiler/dart2js/inference/data/closure_tracer.dart
+++ b/tests/compiler/dart2js/inference/data/closure_tracer.dart
@@ -2,6 +2,8 @@
 // for details. All 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: testFunctionStatement:[null|exact=JSUInt31]*/
 testFunctionStatement() {
   var res;
@@ -45,7 +47,7 @@
   var res;
   /*[exact=JSUInt31]*/ closure(/*[exact=JSUInt31]*/ a) => res = a;
   var a = new A(closure);
-  a. /*invoke: [exact=A]*/ field(42);
+  a.field /*invoke: [exact=A]*/ (42);
   return res;
 }
 
diff --git a/tests/compiler/dart2js/inference/data/closure_tracer_28919.dart b/tests/compiler/dart2js/inference/data/closure_tracer_28919.dart
index 011b9ed..b93f472 100644
--- a/tests/compiler/dart2js/inference/data/closure_tracer_28919.dart
+++ b/tests/compiler/dart2js/inference/data/closure_tracer_28919.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Regression test for issue 28919.
 
 /*member: foo1:[null]*/
diff --git a/tests/compiler/dart2js/inference/data/closurization_instance.dart b/tests/compiler/dart2js/inference/data/closurization_instance.dart
index 810e71f..5ffcc5d 100644
--- a/tests/compiler/dart2js/inference/data/closurization_instance.dart
+++ b/tests/compiler/dart2js/inference/data/closurization_instance.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   closurizedCallToString();
diff --git a/tests/compiler/dart2js/inference/data/closurization_instance_call.dart b/tests/compiler/dart2js/inference/data/closurization_instance_call.dart
index d5eabac..f716040 100644
--- a/tests/compiler/dart2js/inference/data/closurization_instance_call.dart
+++ b/tests/compiler/dart2js/inference/data/closurization_instance_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.7
+
 /*member: main:[null]*/
 main() {
   closurizedCallToString();
diff --git a/tests/compiler/dart2js/inference/data/closurization_local_call.dart b/tests/compiler/dart2js/inference/data/closurization_local_call.dart
index 19c5758..2b5c6fc 100644
--- a/tests/compiler/dart2js/inference/data/closurization_local_call.dart
+++ b/tests/compiler/dart2js/inference/data/closurization_local_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.7
+
 /*member: main:[null]*/
 main() {
   closurizedCallToString();
diff --git a/tests/compiler/dart2js/inference/data/closurization_static.dart b/tests/compiler/dart2js/inference/data/closurization_static.dart
index deea1db..f053673 100644
--- a/tests/compiler/dart2js/inference/data/closurization_static.dart
+++ b/tests/compiler/dart2js/inference/data/closurization_static.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   closurizedCallToString();
diff --git a/tests/compiler/dart2js/inference/data/closurization_static_call.dart b/tests/compiler/dart2js/inference/data/closurization_static_call.dart
index 575f68d..1da1648 100644
--- a/tests/compiler/dart2js/inference/data/closurization_static_call.dart
+++ b/tests/compiler/dart2js/inference/data/closurization_static_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.7
+
 /*member: main:[null]*/
 main() {
   closurizedCallToString();
diff --git a/tests/compiler/dart2js/inference/data/conditional.dart b/tests/compiler/dart2js/inference/data/conditional.dart
index e8af4fe..3e16c64 100644
--- a/tests/compiler/dart2js/inference/data/conditional.dart
+++ b/tests/compiler/dart2js/inference/data/conditional.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   simpleConditional();
diff --git a/tests/compiler/dart2js/inference/data/const_closure.dart b/tests/compiler/dart2js/inference/data/const_closure.dart
index ca22d2e..24ef0af 100644
--- a/tests/compiler/dart2js/inference/data/const_closure.dart
+++ b/tests/compiler/dart2js/inference/data/const_closure.dart
@@ -2,6 +2,8 @@
 // for details. All 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: method1:[exact=JSUInt31]*/
 method1() {
   return 42;
diff --git a/tests/compiler/dart2js/inference/data/const_closure2.dart b/tests/compiler/dart2js/inference/data/const_closure2.dart
index 64f75e3..d647115 100644
--- a/tests/compiler/dart2js/inference/data/const_closure2.dart
+++ b/tests/compiler/dart2js/inference/data/const_closure2.dart
@@ -2,6 +2,8 @@
 // for details. All 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: method:Union([exact=JSDouble], [exact=JSUInt31])*/
 // Called via [foo] with integer then double.
 method(/*Union([exact=JSDouble], [exact=JSUInt31])*/ a) {
diff --git a/tests/compiler/dart2js/inference/data/const_closure3.dart b/tests/compiler/dart2js/inference/data/const_closure3.dart
index 31bcc35..f0ce02b 100644
--- a/tests/compiler/dart2js/inference/data/const_closure3.dart
+++ b/tests/compiler/dart2js/inference/data/const_closure3.dart
@@ -2,6 +2,8 @@
 // for details. All 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: method:[exact=JSUInt31]*/
 // Called only via [foo2] with a small integer.
 method(/*[exact=JSUInt31]*/ a) {
diff --git a/tests/compiler/dart2js/inference/data/const_closure4.dart b/tests/compiler/dart2js/inference/data/const_closure4.dart
index 64f75e3..d647115 100644
--- a/tests/compiler/dart2js/inference/data/const_closure4.dart
+++ b/tests/compiler/dart2js/inference/data/const_closure4.dart
@@ -2,6 +2,8 @@
 // for details. All 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: method:Union([exact=JSDouble], [exact=JSUInt31])*/
 // Called via [foo] with integer then double.
 method(/*Union([exact=JSDouble], [exact=JSUInt31])*/ a) {
diff --git a/tests/compiler/dart2js/inference/data/const_closure5.dart b/tests/compiler/dart2js/inference/data/const_closure5.dart
index 36b822d..76887e5 100644
--- a/tests/compiler/dart2js/inference/data/const_closure5.dart
+++ b/tests/compiler/dart2js/inference/data/const_closure5.dart
@@ -2,6 +2,8 @@
 // for details. All 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: method:Union([exact=JSDouble], [exact=JSUInt31])*/
 // Called only via [foo2] with a small integer.
 method(/*Union([exact=JSDouble], [exact=JSUInt31])*/ a) {
diff --git a/tests/compiler/dart2js/inference/data/const_closure_default.dart b/tests/compiler/dart2js/inference/data/const_closure_default.dart
index 135ed2a..5b60f7b 100644
--- a/tests/compiler/dart2js/inference/data/const_closure_default.dart
+++ b/tests/compiler/dart2js/inference/data/const_closure_default.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // [defaultFn_i] is called only via [foo_i]'s default value with a small integer.
 
 /*member: defaultFn1:[exact=JSUInt31]*/
diff --git a/tests/compiler/dart2js/inference/data/container_mask_equal.dart b/tests/compiler/dart2js/inference/data/container_mask_equal.dart
index c4830df..e1bde05 100644
--- a/tests/compiler/dart2js/inference/data/container_mask_equal.dart
+++ b/tests/compiler/dart2js/inference/data/container_mask_equal.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Regression test for dart2js that used to have a bogus
 // implementation of var.== and var.hashCode.
 
diff --git a/tests/compiler/dart2js/inference/data/default_value.dart b/tests/compiler/dart2js/inference/data/default_value.dart
index b08d14f..ac5aea5 100644
--- a/tests/compiler/dart2js/inference/data/default_value.dart
+++ b/tests/compiler/dart2js/inference/data/default_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.7
+
 /*member: main:[null]*/
 main() {
   positionalWithoutDefaultOnLocal();
diff --git a/tests/compiler/dart2js/inference/data/deferred_load.dart b/tests/compiler/dart2js/inference/data/deferred_load.dart
index 41ee085..9d7caf1 100644
--- a/tests/compiler/dart2js/inference/data/deferred_load.dart
+++ b/tests/compiler/dart2js/inference/data/deferred_load.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart' deferred as expect;
 
 /*member: main:[null]*/
diff --git a/tests/compiler/dart2js/inference/data/deferred_load_get.dart b/tests/compiler/dart2js/inference/data/deferred_load_get.dart
index d77937c..1e46768 100644
--- a/tests/compiler/dart2js/inference/data/deferred_load_get.dart
+++ b/tests/compiler/dart2js/inference/data/deferred_load_get.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart' deferred as expect;
 
 // Synthetic getter added by kernel.
diff --git a/tests/compiler/dart2js/inference/data/dictionary_types.dart b/tests/compiler/dart2js/inference/data/dictionary_types.dart
index c514566..b2c5aa1 100644
--- a/tests/compiler/dart2js/inference/data/dictionary_types.dart
+++ b/tests/compiler/dart2js/inference/data/dictionary_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.7
+
 /*member: main:[null]*/
 main() {
   test1();
diff --git a/tests/compiler/dart2js/inference/data/do.dart b/tests/compiler/dart2js/inference/data/do.dart
index 5a7ffac..47c116f 100644
--- a/tests/compiler/dart2js/inference/data/do.dart
+++ b/tests/compiler/dart2js/inference/data/do.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   simpleDo();
diff --git a/tests/compiler/dart2js/inference/data/enum.dart b/tests/compiler/dart2js/inference/data/enum.dart
index 6e288fa..5f650f3 100644
--- a/tests/compiler/dart2js/inference/data/enum.dart
+++ b/tests/compiler/dart2js/inference/data/enum.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   enumValue();
diff --git a/tests/compiler/dart2js/inference/data/expose_this.dart b/tests/compiler/dart2js/inference/data/expose_this.dart
index 26a5d7a..1c7ec3f 100644
--- a/tests/compiler/dart2js/inference/data/expose_this.dart
+++ b/tests/compiler/dart2js/inference/data/expose_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.7
+
 /*member: main:[null]*/
 main() {
   exposeThis1();
diff --git a/tests/compiler/dart2js/inference/data/expose_this_closure.dart b/tests/compiler/dart2js/inference/data/expose_this_closure.dart
index da43183..f042cbb 100644
--- a/tests/compiler/dart2js/inference/data/expose_this_closure.dart
+++ b/tests/compiler/dart2js/inference/data/expose_this_closure.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   exposeThis1();
diff --git a/tests/compiler/dart2js/inference/data/expose_this_field.dart b/tests/compiler/dart2js/inference/data/expose_this_field.dart
index aa3b384..de31884 100644
--- a/tests/compiler/dart2js/inference/data/expose_this_field.dart
+++ b/tests/compiler/dart2js/inference/data/expose_this_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.7
+
 /*member: main:[null]*/
 main() {
   exposeThis1();
diff --git a/tests/compiler/dart2js/inference/data/expose_this_mask.dart b/tests/compiler/dart2js/inference/data/expose_this_mask.dart
index 7dd84bb..693de3c 100644
--- a/tests/compiler/dart2js/inference/data/expose_this_mask.dart
+++ b/tests/compiler/dart2js/inference/data/expose_this_mask.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /// Check that exposure of this is correctly restricted through the receiver
 /// mask.
 
@@ -243,7 +245,7 @@
 
   /*member: Class7.:[exact=Class7]*/
   Class7() : field7a = 42 {
-    /*invoke: [subclass=Class7]*/ field7b(/*[subclass=Class7]*/ field7a);
+    field7b /*invoke: [subclass=Class7]*/ (/*[subclass=Class7]*/ field7a);
   }
 }
 
diff --git a/tests/compiler/dart2js/inference/data/expose_this_super.dart b/tests/compiler/dart2js/inference/data/expose_this_super.dart
index cb7b1cc..73116b8 100644
--- a/tests/compiler/dart2js/inference/data/expose_this_super.dart
+++ b/tests/compiler/dart2js/inference/data/expose_this_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.7
+
 /*member: main:[null]*/
 main() {
   exposeThis1();
diff --git a/tests/compiler/dart2js/inference/data/factory.dart b/tests/compiler/dart2js/inference/data/factory.dart
index 60a789c..c7ef2d0 100644
--- a/tests/compiler/dart2js/inference/data/factory.dart
+++ b/tests/compiler/dart2js/inference/data/factory.dart
@@ -2,6 +2,8 @@
 // for details. All 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 A {
   /*member: A.generative:[exact=A]*/
   A.generative();
diff --git a/tests/compiler/dart2js/inference/data/field_type.dart b/tests/compiler/dart2js/inference/data/field_type.dart
index 48ec69b..e74c6e5 100644
--- a/tests/compiler/dart2js/inference/data/field_type.dart
+++ b/tests/compiler/dart2js/inference/data/field_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.7
+
 /*member: main:[null]*/
 main() {
   test1();
diff --git a/tests/compiler/dart2js/inference/data/fields.dart b/tests/compiler/dart2js/inference/data/fields.dart
index 3fbf03a..14eff79 100644
--- a/tests/compiler/dart2js/inference/data/fields.dart
+++ b/tests/compiler/dart2js/inference/data/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.7
+
 /*member: main:[null]*/
 main() {
   fieldGetUnset();
diff --git a/tests/compiler/dart2js/inference/data/final_field.dart b/tests/compiler/dart2js/inference/data/final_field.dart
index c0558d0..ef65501 100644
--- a/tests/compiler/dart2js/inference/data/final_field.dart
+++ b/tests/compiler/dart2js/inference/data/final_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.7
+
 class A {
   /*member: A.intField:[exact=JSUInt31]*/
   final intField;
diff --git a/tests/compiler/dart2js/inference/data/final_field2.dart b/tests/compiler/dart2js/inference/data/final_field2.dart
index d4ee03f..6e1e01d 100644
--- a/tests/compiler/dart2js/inference/data/final_field2.dart
+++ b/tests/compiler/dart2js/inference/data/final_field2.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Test that a non-used generative constructor does not prevent
 // inferring types for fields.
 
diff --git a/tests/compiler/dart2js/inference/data/final_field3.dart b/tests/compiler/dart2js/inference/data/final_field3.dart
index 87925cb..a87aa96 100644
--- a/tests/compiler/dart2js/inference/data/final_field3.dart
+++ b/tests/compiler/dart2js/inference/data/final_field3.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Test that we are analyzing field parameters correctly.
 
 class A {
diff --git a/tests/compiler/dart2js/inference/data/finalized_type_variable.dart b/tests/compiler/dart2js/inference/data/finalized_type_variable.dart
index a3eb54c..1d81014 100644
--- a/tests/compiler/dart2js/inference/data/finalized_type_variable.dart
+++ b/tests/compiler/dart2js/inference/data/finalized_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.7
+
 /*member: AppView.:[subclass=AppView]*/
 abstract class AppView<T> {
   /*member: AppView.ctx:Union(null, [exact=CardComponent2], [exact=CardComponent])*/
diff --git a/tests/compiler/dart2js/inference/data/for.dart b/tests/compiler/dart2js/inference/data/for.dart
index 5af242e..e36b2ca 100644
--- a/tests/compiler/dart2js/inference/data/for.dart
+++ b/tests/compiler/dart2js/inference/data/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.7
+
 /*member: main:[null]*/
 main() {
   simpleFor();
diff --git a/tests/compiler/dart2js/inference/data/for_in.dart b/tests/compiler/dart2js/inference/data/for_in.dart
index 301bcf7..b57661a 100644
--- a/tests/compiler/dart2js/inference/data/for_in.dart
+++ b/tests/compiler/dart2js/inference/data/for_in.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   forInDirect();
diff --git a/tests/compiler/dart2js/inference/data/foreign.dart b/tests/compiler/dart2js/inference/data/foreign.dart
index 8c07276..2f304f7 100644
--- a/tests/compiler/dart2js/inference/data/foreign.dart
+++ b/tests/compiler/dart2js/inference/data/foreign.dart
@@ -2,6 +2,8 @@
 // for details. All 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: IMPORT_INTERNAL_LIBRARY
 import 'dart:_foreign_helper';
 
diff --git a/tests/compiler/dart2js/inference/data/general.dart b/tests/compiler/dart2js/inference/data/general.dart
index f858024..209f884 100644
--- a/tests/compiler/dart2js/inference/data/general.dart
+++ b/tests/compiler/dart2js/inference/data/general.dart
@@ -2,6 +2,8 @@
 // for details. All 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: returnNum1:Union([exact=JSDouble], [exact=JSUInt31])*/
 returnNum1(/*Value([exact=JSBool], value: true)*/ a) {
   if (a)
@@ -654,7 +656,7 @@
 }
 
 /*member: testReturnInvokeDynamicGetter:[null|subclass=Object]*/
-testReturnInvokeDynamicGetter() => new A(). /*invoke: [exact=A]*/ myFactory();
+testReturnInvokeDynamicGetter() => new A().myFactory /*invoke: [exact=A]*/ ();
 
 /*member: topLevelConstList:Container([exact=JSUnmodifiableArray], element: [exact=JSUInt31], length: 1)*/
 var topLevelConstList = const [42];
diff --git a/tests/compiler/dart2js/inference/data/general6.dart b/tests/compiler/dart2js/inference/data/general6.dart
index fab306e..b6c045c 100644
--- a/tests/compiler/dart2js/inference/data/general6.dart
+++ b/tests/compiler/dart2js/inference/data/general6.dart
@@ -2,6 +2,8 @@
 // for details. All 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: foo:[exact=JSUInt31]*/
 foo() {
   var a = [1, 2, 3];
diff --git a/tests/compiler/dart2js/inference/data/general7.dart b/tests/compiler/dart2js/inference/data/general7.dart
index bd8da3f3..80bfbf8 100644
--- a/tests/compiler/dart2js/inference/data/general7.dart
+++ b/tests/compiler/dart2js/inference/data/general7.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /// This file contains tests of assertions when assertions are _disabled_. The
 /// file 'general7_ea.dart' contains similar tests for when assertions are
 /// _enabled_.
diff --git a/tests/compiler/dart2js/inference/data/general7_ea.dart b/tests/compiler/dart2js/inference/data/general7_ea.dart
index 733c016..fe01ac9 100644
--- a/tests/compiler/dart2js/inference/data/general7_ea.dart
+++ b/tests/compiler/dart2js/inference/data/general7_ea.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /// This file contains tests of assertions when assertions are _enabled_. The
 /// file 'general7.dart' contains similar tests for when assertions are
 /// _disabled_.
diff --git a/tests/compiler/dart2js/inference/data/general8a.dart b/tests/compiler/dart2js/inference/data/general8a.dart
index 8f3815a..c21a00d 100644
--- a/tests/compiler/dart2js/inference/data/general8a.dart
+++ b/tests/compiler/dart2js/inference/data/general8a.dart
@@ -2,6 +2,8 @@
 // for details. All 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: foo:Value([exact=JSBool], value: false)*/
 foo(/*Value([exact=JSBool], value: false)*/ x) {
   return x;
diff --git a/tests/compiler/dart2js/inference/data/general8b.dart b/tests/compiler/dart2js/inference/data/general8b.dart
index baed070..2fd6381 100644
--- a/tests/compiler/dart2js/inference/data/general8b.dart
+++ b/tests/compiler/dart2js/inference/data/general8b.dart
@@ -2,6 +2,8 @@
 // for details. All 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: foo:[exact=JSBool]*/
 foo(/*[exact=JSUInt31]*/ x) {
   if (x /*invoke: [exact=JSUInt31]*/ > 3) return true;
diff --git a/tests/compiler/dart2js/inference/data/global_field_closure.dart b/tests/compiler/dart2js/inference/data/global_field_closure.dart
index 616c6f1..cdd3751 100644
--- a/tests/compiler/dart2js/inference/data/global_field_closure.dart
+++ b/tests/compiler/dart2js/inference/data/global_field_closure.dart
@@ -2,6 +2,8 @@
 // for details. All 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: method1:[exact=JSUInt31]*/
 method1() {
   return 42;
diff --git a/tests/compiler/dart2js/inference/data/global_field_closure2.dart b/tests/compiler/dart2js/inference/data/global_field_closure2.dart
index 42991dc..15a70d3 100644
--- a/tests/compiler/dart2js/inference/data/global_field_closure2.dart
+++ b/tests/compiler/dart2js/inference/data/global_field_closure2.dart
@@ -2,6 +2,8 @@
 // for details. All 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: method:[exact=JSUInt31]*/
 // Called only via [foo] with a small integer.
 method(/*[exact=JSUInt31]*/ a) {
diff --git a/tests/compiler/dart2js/inference/data/if.dart b/tests/compiler/dart2js/inference/data/if.dart
index ecb1a6f..b9ffbb7 100644
--- a/tests/compiler/dart2js/inference/data/if.dart
+++ b/tests/compiler/dart2js/inference/data/if.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   simpleIfThen();
diff --git a/tests/compiler/dart2js/inference/data/if_null.dart b/tests/compiler/dart2js/inference/data/if_null.dart
index 988f649..a079f65 100644
--- a/tests/compiler/dart2js/inference/data/if_null.dart
+++ b/tests/compiler/dart2js/inference/data/if_null.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   ifNull();
diff --git a/tests/compiler/dart2js/inference/data/index.dart b/tests/compiler/dart2js/inference/data/index.dart
index 255a5be..4a00271 100644
--- a/tests/compiler/dart2js/inference/data/index.dart
+++ b/tests/compiler/dart2js/inference/data/index.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 ////////////////////////////////////////////////////////////////////////////////
 // Lookup into a singleton list.
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/tests/compiler/dart2js/inference/data/index_call.dart b/tests/compiler/dart2js/inference/data/index_call.dart
index a2c6006..4454632 100644
--- a/tests/compiler/dart2js/inference/data/index_call.dart
+++ b/tests/compiler/dart2js/inference/data/index_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.7
+
 /*member: main:[null]*/
 main() {
   listIndexCall();
diff --git a/tests/compiler/dart2js/inference/data/index_postfix.dart b/tests/compiler/dart2js/inference/data/index_postfix.dart
index a861cfb..157177a 100644
--- a/tests/compiler/dart2js/inference/data/index_postfix.dart
+++ b/tests/compiler/dart2js/inference/data/index_postfix.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   listIndexPostfixIncrement();
diff --git a/tests/compiler/dart2js/inference/data/index_set.dart b/tests/compiler/dart2js/inference/data/index_set.dart
index b31b947..883962c 100644
--- a/tests/compiler/dart2js/inference/data/index_set.dart
+++ b/tests/compiler/dart2js/inference/data/index_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.7
+
 ////////////////////////////////////////////////////////////////////////////////
 // Update to a singleton list.
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/tests/compiler/dart2js/inference/data/init_get.dart b/tests/compiler/dart2js/inference/data/init_get.dart
index e940e1e..949a313 100644
--- a/tests/compiler/dart2js/inference/data/init_get.dart
+++ b/tests/compiler/dart2js/inference/data/init_get.dart
@@ -2,6 +2,8 @@
 // for details. All 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: getter:[exact=JSUInt31]*/
 get getter => 42;
 
diff --git a/tests/compiler/dart2js/inference/data/initializer.dart b/tests/compiler/dart2js/inference/data/initializer.dart
index b059fef..df596c8 100644
--- a/tests/compiler/dart2js/inference/data/initializer.dart
+++ b/tests/compiler/dart2js/inference/data/initializer.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   initializingFormal();
diff --git a/tests/compiler/dart2js/inference/data/instance.dart b/tests/compiler/dart2js/inference/data/instance.dart
index 9559f1ba..d883fea 100644
--- a/tests/compiler/dart2js/inference/data/instance.dart
+++ b/tests/compiler/dart2js/inference/data/instance.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   thisExact();
diff --git a/tests/compiler/dart2js/inference/data/issue13354.dart b/tests/compiler/dart2js/inference/data/issue13354.dart
index a0c669e..ab10e3a 100644
--- a/tests/compiler/dart2js/inference/data/issue13354.dart
+++ b/tests/compiler/dart2js/inference/data/issue13354.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Regression test for issue 13354.
 
 /*member: bar:[exact=JSUInt31]*/
diff --git a/tests/compiler/dart2js/inference/data/js_interop.dart b/tests/compiler/dart2js/inference/data/js_interop.dart
index 2a0f3f9..bc4f653 100644
--- a/tests/compiler/dart2js/inference/data/js_interop.dart
+++ b/tests/compiler/dart2js/inference/data/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.7
+
 @JS()
 library js_interop;
 
diff --git a/tests/compiler/dart2js/inference/data/list.dart b/tests/compiler/dart2js/inference/data/list.dart
index eb14295..aa419a3 100644
--- a/tests/compiler/dart2js/inference/data/list.dart
+++ b/tests/compiler/dart2js/inference/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.7
+
 import 'dart:typed_data';
 
 /*member: main:[null]*/
diff --git a/tests/compiler/dart2js/inference/data/list_huge.dart b/tests/compiler/dart2js/inference/data/list_huge.dart
index d2a23ce..967b704 100644
--- a/tests/compiler/dart2js/inference/data/list_huge.dart
+++ b/tests/compiler/dart2js/inference/data/list_huge.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Test for Container type for Lists with huge or negative sizes.
 
 /*member: main:[null]*/
diff --git a/tests/compiler/dart2js/inference/data/list_tracer2.dart b/tests/compiler/dart2js/inference/data/list_tracer2.dart
index 37e2e2c..001ebc6 100644
--- a/tests/compiler/dart2js/inference/data/list_tracer2.dart
+++ b/tests/compiler/dart2js/inference/data/list_tracer2.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // We used to always nullify the element type of a list we are tracing in
 // the presence of a fixed length list constructor call.
 
diff --git a/tests/compiler/dart2js/inference/data/list_tracer3.dart b/tests/compiler/dart2js/inference/data/list_tracer3.dart
index 2c56101..a8212aa 100644
--- a/tests/compiler/dart2js/inference/data/list_tracer3.dart
+++ b/tests/compiler/dart2js/inference/data/list_tracer3.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // We used to always nullify the element type of a list we are tracing in
 // the presence of a fixed length list constructor call.
 
diff --git a/tests/compiler/dart2js/inference/data/list_tracer_typed_data_length.dart b/tests/compiler/dart2js/inference/data/list_tracer_typed_data_length.dart
index 460ca33..9624438 100644
--- a/tests/compiler/dart2js/inference/data/list_tracer_typed_data_length.dart
+++ b/tests/compiler/dart2js/inference/data/list_tracer_typed_data_length.dart
@@ -2,6 +2,8 @@
 // for details. All 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:typed_data';
 
 // TODO(johnniwinther): Fix inference for strong mode. List elements should not
diff --git a/tests/compiler/dart2js/inference/data/local_functions.dart b/tests/compiler/dart2js/inference/data/local_functions.dart
index 6d08b0a..b5f06cb 100644
--- a/tests/compiler/dart2js/inference/data/local_functions.dart
+++ b/tests/compiler/dart2js/inference/data/local_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.7
+
 /*member: main:[null]*/
 main() {
   namedLocalFunctionInvoke();
diff --git a/tests/compiler/dart2js/inference/data/local_functions_call.dart b/tests/compiler/dart2js/inference/data/local_functions_call.dart
index 42cc5b1..cd55038 100644
--- a/tests/compiler/dart2js/inference/data/local_functions_call.dart
+++ b/tests/compiler/dart2js/inference/data/local_functions_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.7
+
 // This is the same test as `closureCallToString` in 'local_functions.dart' but
 // with a different expectancy because the closed world contains less '.call'
 // methods.
diff --git a/tests/compiler/dart2js/inference/data/locals.dart b/tests/compiler/dart2js/inference/data/locals.dart
index bf0f271..92d1021 100644
--- a/tests/compiler/dart2js/inference/data/locals.dart
+++ b/tests/compiler/dart2js/inference/data/locals.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   uninitializedLocal();
diff --git a/tests/compiler/dart2js/inference/data/locals_trust.dart b/tests/compiler/dart2js/inference/data/locals_trust.dart
index 0580621..a391bd5 100644
--- a/tests/compiler/dart2js/inference/data/locals_trust.dart
+++ b/tests/compiler/dart2js/inference/data/locals_trust.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   trustLocals();
diff --git a/tests/compiler/dart2js/inference/data/logical.dart b/tests/compiler/dart2js/inference/data/logical.dart
index ed24935..6503fd9f0 100644
--- a/tests/compiler/dart2js/inference/data/logical.dart
+++ b/tests/compiler/dart2js/inference/data/logical.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   returnTrue();
diff --git a/tests/compiler/dart2js/inference/data/logical_if.dart b/tests/compiler/dart2js/inference/data/logical_if.dart
index ba19f3a..613dde8 100644
--- a/tests/compiler/dart2js/inference/data/logical_if.dart
+++ b/tests/compiler/dart2js/inference/data/logical_if.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   promotedIfThen();
diff --git a/tests/compiler/dart2js/inference/data/map.dart b/tests/compiler/dart2js/inference/data/map.dart
index bef703b..d39c7eb 100644
--- a/tests/compiler/dart2js/inference/data/map.dart
+++ b/tests/compiler/dart2js/inference/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.7
+
 /*member: main:[null]*/
 main() {
   emptyMap();
diff --git a/tests/compiler/dart2js/inference/data/map_tracer_const.dart b/tests/compiler/dart2js/inference/data/map_tracer_const.dart
index f238ad0..3ff4fbb 100644
--- a/tests/compiler/dart2js/inference/data/map_tracer_const.dart
+++ b/tests/compiler/dart2js/inference/data/map_tracer_const.dart
@@ -2,6 +2,8 @@
 // for details. All 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: closure:[exact=JSUInt31]*/
 int closure(
     int
diff --git a/tests/compiler/dart2js/inference/data/map_tracer_keys.dart b/tests/compiler/dart2js/inference/data/map_tracer_keys.dart
index 0b817a2..20e469e 100644
--- a/tests/compiler/dart2js/inference/data/map_tracer_keys.dart
+++ b/tests/compiler/dart2js/inference/data/map_tracer_keys.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   test1();
diff --git a/tests/compiler/dart2js/inference/data/mixin_constructor_default_parameter_values/lib.dart b/tests/compiler/dart2js/inference/data/mixin_constructor_default_parameter_values/lib.dart
index f734696..b759f52 100644
--- a/tests/compiler/dart2js/inference/data/mixin_constructor_default_parameter_values/lib.dart
+++ b/tests/compiler/dart2js/inference/data/mixin_constructor_default_parameter_values/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 _SECRET {
   /*member: _SECRET.:[exact=_SECRET]*/
   const _SECRET();
diff --git a/tests/compiler/dart2js/inference/data/mixin_constructor_default_parameter_values/main.dart b/tests/compiler/dart2js/inference/data/mixin_constructor_default_parameter_values/main.dart
index eb3692a..5138cbb 100644
--- a/tests/compiler/dart2js/inference/data/mixin_constructor_default_parameter_values/main.dart
+++ b/tests/compiler/dart2js/inference/data/mixin_constructor_default_parameter_values/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
+
 // Ensure that the inferrer looks at default values for parameters in
 // synthetic constructors using the correct context. If the constructor call
 // to D without optional parameters is inferred using D's context, the default
diff --git a/tests/compiler/dart2js/inference/data/narrowing.dart b/tests/compiler/dart2js/inference/data/narrowing.dart
index 27c041d..04545e9 100644
--- a/tests/compiler/dart2js/inference/data/narrowing.dart
+++ b/tests/compiler/dart2js/inference/data/narrowing.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /// Regression test for Issue #33761: is-checks and null-checks were assumed to
 /// be true even in nested non-condition contexts.
 
diff --git a/tests/compiler/dart2js/inference/data/native.dart b/tests/compiler/dart2js/inference/data/native.dart
index a1bfd75..4cca54b 100644
--- a/tests/compiler/dart2js/inference/data/native.dart
+++ b/tests/compiler/dart2js/inference/data/native.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   nativeMethod();
diff --git a/tests/compiler/dart2js/inference/data/native2.dart b/tests/compiler/dart2js/inference/data/native2.dart
index e9b712c..88ae547 100644
--- a/tests/compiler/dart2js/inference/data/native2.dart
+++ b/tests/compiler/dart2js/inference/data/native2.dart
@@ -2,6 +2,8 @@
 // for details. All 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: IMPORT_INTERNAL_LIBRARY
 import 'dart:_foreign_helper' as foreign show JS;
 import 'dart:html';
diff --git a/tests/compiler/dart2js/inference/data/native3.dart b/tests/compiler/dart2js/inference/data/native3.dart
index f2e7167..9ce9612 100644
--- a/tests/compiler/dart2js/inference/data/native3.dart
+++ b/tests/compiler/dart2js/inference/data/native3.dart
@@ -2,6 +2,8 @@
 // for details. All 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:html';
 
 /*member: main:[null]*/
diff --git a/tests/compiler/dart2js/inference/data/new.dart b/tests/compiler/dart2js/inference/data/new.dart
index fb9e9ff..aea17cd 100644
--- a/tests/compiler/dart2js/inference/data/new.dart
+++ b/tests/compiler/dart2js/inference/data/new.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   generativeConstructorCall();
diff --git a/tests/compiler/dart2js/inference/data/no_such_method.dart b/tests/compiler/dart2js/inference/data/no_such_method.dart
index af9d00a..daa1bdd 100644
--- a/tests/compiler/dart2js/inference/data/no_such_method.dart
+++ b/tests/compiler/dart2js/inference/data/no_such_method.dart
@@ -1,6 +1,8 @@
 /*member: main:[null]*/
 main() {
   missingGetter();
+
+// @dart = 2.7
   missingMethod();
   closureThroughMissingMethod();
   closureThroughMissingSetter();
diff --git a/tests/compiler/dart2js/inference/data/no_such_method1.dart b/tests/compiler/dart2js/inference/data/no_such_method1.dart
index 0c38fde..f2bac32 100644
--- a/tests/compiler/dart2js/inference/data/no_such_method1.dart
+++ b/tests/compiler/dart2js/inference/data/no_such_method1.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A.:[exact=A]*/
 class A {
   /*member: A.noSuchMethod:[exact=JSUInt31]*/
diff --git a/tests/compiler/dart2js/inference/data/no_such_method2.dart b/tests/compiler/dart2js/inference/data/no_such_method2.dart
index 6b1c548..8f56a10 100644
--- a/tests/compiler/dart2js/inference/data/no_such_method2.dart
+++ b/tests/compiler/dart2js/inference/data/no_such_method2.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A.:[subclass=B]*/
 abstract class A {
   /*member: A.noSuchMethod:[exact=JSUInt31]*/
diff --git a/tests/compiler/dart2js/inference/data/no_such_method3.dart b/tests/compiler/dart2js/inference/data/no_such_method3.dart
index 0ba1d1e..06a8679 100644
--- a/tests/compiler/dart2js/inference/data/no_such_method3.dart
+++ b/tests/compiler/dart2js/inference/data/no_such_method3.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A.:[exact=A]*/
 class A {
   // We may ignore this for type inference because syntactically it always
diff --git a/tests/compiler/dart2js/inference/data/no_such_method4.dart b/tests/compiler/dart2js/inference/data/no_such_method4.dart
index 7e489ec..0538869 100644
--- a/tests/compiler/dart2js/inference/data/no_such_method4.dart
+++ b/tests/compiler/dart2js/inference/data/no_such_method4.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A.:[exact=A]*/
 class A {
   // We may ignore this for type inference because it forwards to a default
diff --git a/tests/compiler/dart2js/inference/data/non_null.dart b/tests/compiler/dart2js/inference/data/non_null.dart
index 96be59d..d93cd29 100644
--- a/tests/compiler/dart2js/inference/data/non_null.dart
+++ b/tests/compiler/dart2js/inference/data/non_null.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   nonNullStaticField();
diff --git a/tests/compiler/dart2js/inference/data/null.dart b/tests/compiler/dart2js/inference/data/null.dart
index 05fd76b..985c372 100644
--- a/tests/compiler/dart2js/inference/data/null.dart
+++ b/tests/compiler/dart2js/inference/data/null.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   ifThenNullCheck(0);
diff --git a/tests/compiler/dart2js/inference/data/optimizer_hints.dart b/tests/compiler/dart2js/inference/data/optimizer_hints.dart
index c51ce4f..673b6a4 100644
--- a/tests/compiler/dart2js/inference/data/optimizer_hints.dart
+++ b/tests/compiler/dart2js/inference/data/optimizer_hints.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   assumeDynamic();
diff --git a/tests/compiler/dart2js/inference/data/parameters_trust.dart b/tests/compiler/dart2js/inference/data/parameters_trust.dart
index 63fbb49..3cdb9d4 100644
--- a/tests/compiler/dart2js/inference/data/parameters_trust.dart
+++ b/tests/compiler/dart2js/inference/data/parameters_trust.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*member: main:[null]*/
diff --git a/tests/compiler/dart2js/inference/data/postfix.dart b/tests/compiler/dart2js/inference/data/postfix.dart
index 8cba579..8059eac 100644
--- a/tests/compiler/dart2js/inference/data/postfix.dart
+++ b/tests/compiler/dart2js/inference/data/postfix.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   localPostfixInc();
diff --git a/tests/compiler/dart2js/inference/data/postfix_prefix.dart b/tests/compiler/dart2js/inference/data/postfix_prefix.dart
index 9342997..881b489 100644
--- a/tests/compiler/dart2js/inference/data/postfix_prefix.dart
+++ b/tests/compiler/dart2js/inference/data/postfix_prefix.dart
@@ -2,6 +2,8 @@
 // for details. All 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: index:[empty]*/
 dynamic get index => throw '';
 
diff --git a/tests/compiler/dart2js/inference/data/prefix.dart b/tests/compiler/dart2js/inference/data/prefix.dart
index 544ae70..bb1cfb1 100644
--- a/tests/compiler/dart2js/inference/data/prefix.dart
+++ b/tests/compiler/dart2js/inference/data/prefix.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   localPrefixInc();
diff --git a/tests/compiler/dart2js/inference/data/refine_captured_locals.dart b/tests/compiler/dart2js/inference/data/refine_captured_locals.dart
index 5a13864..fcaecf2 100644
--- a/tests/compiler/dart2js/inference/data/refine_captured_locals.dart
+++ b/tests/compiler/dart2js/inference/data/refine_captured_locals.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   refineBeforeCapture();
diff --git a/tests/compiler/dart2js/inference/data/refine_locals.dart b/tests/compiler/dart2js/inference/data/refine_locals.dart
index 1da00f4..6dd425a 100644
--- a/tests/compiler/dart2js/inference/data/refine_locals.dart
+++ b/tests/compiler/dart2js/inference/data/refine_locals.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   refineToClass();
diff --git a/tests/compiler/dart2js/inference/data/refine_order.dart b/tests/compiler/dart2js/inference/data/refine_order.dart
index 1a0b93e..cef03af 100644
--- a/tests/compiler/dart2js/inference/data/refine_order.dart
+++ b/tests/compiler/dart2js/inference/data/refine_order.dart
@@ -2,6 +2,8 @@
 // for details. All 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: Class.:[exact=Class]*/
 class Class {
   /*member: Class.field:[exact=JSUInt31]*/
diff --git a/tests/compiler/dart2js/inference/data/return.dart b/tests/compiler/dart2js/inference/data/return.dart
index 01a574f..72bef6f 100644
--- a/tests/compiler/dart2js/inference/data/return.dart
+++ b/tests/compiler/dart2js/inference/data/return.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   return null;
diff --git a/tests/compiler/dart2js/inference/data/simple.dart b/tests/compiler/dart2js/inference/data/simple.dart
index ada01a1..0fc4b6f 100644
--- a/tests/compiler/dart2js/inference/data/simple.dart
+++ b/tests/compiler/dart2js/inference/data/simple.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   zero();
diff --git a/tests/compiler/dart2js/inference/data/static.dart b/tests/compiler/dart2js/inference/data/static.dart
index e3edc37..f641d1a 100644
--- a/tests/compiler/dart2js/inference/data/static.dart
+++ b/tests/compiler/dart2js/inference/data/static.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   simpleStaticCall();
diff --git a/tests/compiler/dart2js/inference/data/static_get.dart b/tests/compiler/dart2js/inference/data/static_get.dart
index 0a3bf8a..4228594 100644
--- a/tests/compiler/dart2js/inference/data/static_get.dart
+++ b/tests/compiler/dart2js/inference/data/static_get.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   getTopLevelFieldUninitialized();
diff --git a/tests/compiler/dart2js/inference/data/static_set.dart b/tests/compiler/dart2js/inference/data/static_set.dart
index 80c95eb..f585a7a 100644
--- a/tests/compiler/dart2js/inference/data/static_set.dart
+++ b/tests/compiler/dart2js/inference/data/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.7
+
 /*member: main:[null]*/
 main() {
   setTopLevelFieldUninitialized();
diff --git a/tests/compiler/dart2js/inference/data/static_type.dart b/tests/compiler/dart2js/inference/data/static_type.dart
index d9b0e0b..3e698f1 100644
--- a/tests/compiler/dart2js/inference/data/static_type.dart
+++ b/tests/compiler/dart2js/inference/data/static_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.7
+
 class C<T> {
   /*member: C.field:Union([exact=JSString], [exact=JSUInt31])*/
   final T field;
@@ -237,19 +239,19 @@
 /*member: fixedFieldInvoke:[null|subclass=JSInt]*/
 fixedFieldInvoke() {
   C<int> c = new C<int>(0);
-  return c. /*invoke: [exact=C]*/ fixedFunctionField();
+  return c.fixedFunctionField /*invoke: [exact=C]*/ ();
 }
 
 /*member: fieldInvoke1:[null|subclass=JSInt]*/
 fieldInvoke1() {
   C<int> c = new C<int>(0);
-  return c. /*invoke: [exact=C]*/ functionField();
+  return c.functionField /*invoke: [exact=C]*/ ();
 }
 
 /*member: fieldInvoke2:[null|exact=JSString]*/
 fieldInvoke2() {
   C<String> c = new C<String>('');
-  return c. /*invoke: [exact=C]*/ functionField();
+  return c.functionField /*invoke: [exact=C]*/ ();
 }
 
 /*member: methodInvoke1:[exact=JSUInt31]*/
@@ -279,7 +281,7 @@
 /*member: fixedGetterInvoke:[null|subclass=JSInt]*/
 fixedGetterInvoke() {
   C<int> c = new C<int>(0);
-  return c. /*invoke: [exact=C]*/ fixedFunctionGetter();
+  return c.fixedFunctionGetter /*invoke: [exact=C]*/ ();
 }
 
 /*member: getterAccess1:[exact=JSUInt31]*/
@@ -297,25 +299,25 @@
 /*member: getterInvoke1:[null|subclass=JSInt]*/
 getterInvoke1() {
   C<int> c = new C<int>(0);
-  return c. /*invoke: [exact=C]*/ functionGetter();
+  return c.functionGetter /*invoke: [exact=C]*/ ();
 }
 
 /*member: getterInvoke2:[null|exact=JSString]*/
 getterInvoke2() {
   C<String> c = new C<String>('');
-  return c. /*invoke: [exact=C]*/ functionGetter();
+  return c.functionGetter /*invoke: [exact=C]*/ ();
 }
 
 /*member: genericFieldInvoke1:[null|exact=JSString]*/
 genericFieldInvoke1() {
   C<int> c = new C<int>(0);
-  return c. /*invoke: [exact=C]*/ genericFunctionField('');
+  return c.genericFunctionField /*invoke: [exact=C]*/ ('');
 }
 
 /*member: genericFieldInvoke2:[null|subclass=JSInt]*/
 genericFieldInvoke2() {
   C<String> c = new C<String>('');
-  return c. /*invoke: [exact=C]*/ genericFunctionField(0);
+  return c.genericFunctionField /*invoke: [exact=C]*/ (0);
 }
 
 /*member: genericMethodInvoke1:[exact=JSString]*/
@@ -333,11 +335,11 @@
 /*member: genericGetterInvoke1:[null|exact=JSString]*/
 genericGetterInvoke1() {
   C<int> c = new C<int>(0);
-  return c. /*invoke: [exact=C]*/ genericFunctionGetter('');
+  return c.genericFunctionGetter /*invoke: [exact=C]*/ ('');
 }
 
 /*member: genericGetterInvoke2:[null|subclass=JSInt]*/
 genericGetterInvoke2() {
   C<String> c = new C<String>('');
-  return c. /*invoke: [exact=C]*/ genericFunctionGetter(0);
+  return c.genericFunctionGetter /*invoke: [exact=C]*/ (0);
 }
diff --git a/tests/compiler/dart2js/inference/data/super_get.dart b/tests/compiler/dart2js/inference/data/super_get.dart
index 680d080..ed04287 100644
--- a/tests/compiler/dart2js/inference/data/super_get.dart
+++ b/tests/compiler/dart2js/inference/data/super_get.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   superFieldAccess();
diff --git a/tests/compiler/dart2js/inference/data/super_invoke.dart b/tests/compiler/dart2js/inference/data/super_invoke.dart
index 8392f1d..9521e0b 100644
--- a/tests/compiler/dart2js/inference/data/super_invoke.dart
+++ b/tests/compiler/dart2js/inference/data/super_invoke.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   superMethodInvoke();
diff --git a/tests/compiler/dart2js/inference/data/super_set.dart b/tests/compiler/dart2js/inference/data/super_set.dart
index 1365c01..ffa6c73 100644
--- a/tests/compiler/dart2js/inference/data/super_set.dart
+++ b/tests/compiler/dart2js/inference/data/super_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.7
+
 /*member: main:[null]*/
 main() {
   superFieldUpdate();
diff --git a/tests/compiler/dart2js/inference/data/switch.dart b/tests/compiler/dart2js/inference/data/switch.dart
index 83468c6..df79306 100644
--- a/tests/compiler/dart2js/inference/data/switch.dart
+++ b/tests/compiler/dart2js/inference/data/switch.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   switchWithoutDefault();
diff --git a/tests/compiler/dart2js/inference/data/switch1.dart b/tests/compiler/dart2js/inference/data/switch1.dart
index a9f9e32..3d5f76d 100644
--- a/tests/compiler/dart2js/inference/data/switch1.dart
+++ b/tests/compiler/dart2js/inference/data/switch1.dart
@@ -2,6 +2,8 @@
 // for details. All 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: foo:[exact=JSString]*/
 foo(int /*[subclass=JSInt]*/ x) {
   var a = "one";
diff --git a/tests/compiler/dart2js/inference/data/switch2.dart b/tests/compiler/dart2js/inference/data/switch2.dart
index c2aaa71..7783107 100644
--- a/tests/compiler/dart2js/inference/data/switch2.dart
+++ b/tests/compiler/dart2js/inference/data/switch2.dart
@@ -2,6 +2,8 @@
 // for details. All 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: foo:Value([null|exact=JSString], value: "two")*/
 foo(int /*[subclass=JSInt]*/ x) {
   var a;
diff --git a/tests/compiler/dart2js/inference/data/switch5.dart b/tests/compiler/dart2js/inference/data/switch5.dart
index 3263b55..666a285 100644
--- a/tests/compiler/dart2js/inference/data/switch5.dart
+++ b/tests/compiler/dart2js/inference/data/switch5.dart
@@ -2,6 +2,8 @@
 // for details. All 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: foo:[null|exact=JSUInt31]*/
 foo(int /*[subclass=JSInt]*/ x) {
   var a;
diff --git a/tests/compiler/dart2js/inference/data/switch6.dart b/tests/compiler/dart2js/inference/data/switch6.dart
index 2155d6f..cb2f0ae 100644
--- a/tests/compiler/dart2js/inference/data/switch6.dart
+++ b/tests/compiler/dart2js/inference/data/switch6.dart
@@ -2,6 +2,8 @@
 // for details. All 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: foo:[null|exact=JSUInt31]*/
 foo(int /*[subclass=JSInt]*/ x) {
   var a;
diff --git a/tests/compiler/dart2js/inference/data/throw.dart b/tests/compiler/dart2js/inference/data/throw.dart
index e844463..b40e3d8 100644
--- a/tests/compiler/dart2js/inference/data/throw.dart
+++ b/tests/compiler/dart2js/inference/data/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.7
+
 /*member: main:[null]*/
 main() {
   unconditionalThrow();
diff --git a/tests/compiler/dart2js/inference/data/try.dart b/tests/compiler/dart2js/inference/data/try.dart
index 2668f73..5f43edf 100644
--- a/tests/compiler/dart2js/inference/data/try.dart
+++ b/tests/compiler/dart2js/inference/data/try.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   emptyTryCatch();
diff --git a/tests/compiler/dart2js/inference/data/try_catch.dart b/tests/compiler/dart2js/inference/data/try_catch.dart
index 9dfe310..0a41400 100644
--- a/tests/compiler/dart2js/inference/data/try_catch.dart
+++ b/tests/compiler/dart2js/inference/data/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.7
+
 /*member: returnInt1:[exact=JSUInt31]*/
 returnInt1() {
   var a = 42;
diff --git a/tests/compiler/dart2js/inference/data/type_literal.dart b/tests/compiler/dart2js/inference/data/type_literal.dart
index 48f1ce8..ab67c1c 100644
--- a/tests/compiler/dart2js/inference/data/type_literal.dart
+++ b/tests/compiler/dart2js/inference/data/type_literal.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   typeLiteral();
diff --git a/tests/compiler/dart2js/inference/data/unregister_call.dart b/tests/compiler/dart2js/inference/data/unregister_call.dart
index b07989b..00bbbed 100644
--- a/tests/compiler/dart2js/inference/data/unregister_call.dart
+++ b/tests/compiler/dart2js/inference/data/unregister_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.7
+
 /*member: a:Value([exact=JSString], value: "")*/
 var a = '';
 
diff --git a/tests/compiler/dart2js/inference/data/use_static_types.dart b/tests/compiler/dart2js/inference/data/use_static_types.dart
index f701b6d..2011369 100644
--- a/tests/compiler/dart2js/inference/data/use_static_types.dart
+++ b/tests/compiler/dart2js/inference/data/use_static_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.7
+
 /*member: A.:[exact=A]*/
 class A {}
 
@@ -224,29 +226,29 @@
 /*member: invokeFunctionTypedInstanceGetter1:[null|subclass=A]*/
 invokeFunctionTypedInstanceGetter1(
         GenericClass<A> /*[exact=GenericClass]*/ c) =>
-    c. /*invoke: [exact=GenericClass]*/ functionTypedGetter();
+    c.functionTypedGetter /*invoke: [exact=GenericClass]*/ ();
 
 /*member: invokeFunctionTypedInstanceGetter2:[null|exact=B]*/
 invokeFunctionTypedInstanceGetter2(
         GenericClass<B> /*[exact=GenericClass]*/ c) =>
-    c. /*invoke: [exact=GenericClass]*/ functionTypedGetter();
+    c.functionTypedGetter /*invoke: [exact=GenericClass]*/ ();
 
 /*member: invokeFunctionTypedInstanceGetter3:[null|exact=C]*/
 invokeFunctionTypedInstanceGetter3(
         GenericClass<C> /*[exact=GenericClass]*/ c) =>
-    c. /*invoke: [exact=GenericClass]*/ functionTypedGetter();
+    c.functionTypedGetter /*invoke: [exact=GenericClass]*/ ();
 
 /*member: invokeFunctionTypedInstanceField1:[null|subclass=A]*/
 invokeFunctionTypedInstanceField1(GenericClass<A> /*[exact=GenericClass]*/ c) =>
-    c. /*invoke: [exact=GenericClass]*/ functionTypedField();
+    c.functionTypedField /*invoke: [exact=GenericClass]*/ ();
 
 /*member: invokeFunctionTypedInstanceField2:[null|exact=B]*/
 invokeFunctionTypedInstanceField2(GenericClass<B> /*[exact=GenericClass]*/ c) =>
-    c. /*invoke: [exact=GenericClass]*/ functionTypedField();
+    c.functionTypedField /*invoke: [exact=GenericClass]*/ ();
 
 /*member: invokeFunctionTypedInstanceField3:[null|exact=C]*/
 invokeFunctionTypedInstanceField3(GenericClass<C> /*[exact=GenericClass]*/ c) =>
-    c. /*invoke: [exact=GenericClass]*/ functionTypedField();
+    c.functionTypedField /*invoke: [exact=GenericClass]*/ ();
 
 /*member: invokeFunctionTypedSuperMethod1:[null|subclass=Object]*/
 invokeFunctionTypedSuperMethod1(
diff --git a/tests/compiler/dart2js/inference/data/while.dart b/tests/compiler/dart2js/inference/data/while.dart
index 73b214e..9fe86ef 100644
--- a/tests/compiler/dart2js/inference/data/while.dart
+++ b/tests/compiler/dart2js/inference/data/while.dart
@@ -2,6 +2,8 @@
 // for details. All 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() {
   simpleWhile();
diff --git a/tests/compiler/dart2js/inference/data/yield.dart b/tests/compiler/dart2js/inference/data/yield.dart
index 3f89f21..0575c7a 100644
--- a/tests/compiler/dart2js/inference/data/yield.dart
+++ b/tests/compiler/dart2js/inference/data/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.7
+
 /*member: main:[null]*/
 main() {
   yieldZero();
diff --git a/tests/compiler/dart2js/inference/inference0_test.dart b/tests/compiler/dart2js/inference/inference0_test.dart
index 3f3ae82..7871c11 100644
--- a/tests/compiler/dart2js/inference/inference0_test.dart
+++ b/tests/compiler/dart2js/inference/inference0_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.7
+
 import 'inference_test_helper.dart';
 
 main(List<String> args) {
diff --git a/tests/compiler/dart2js/inference/inference1_test.dart b/tests/compiler/dart2js/inference/inference1_test.dart
index ba475ac..7da4878 100644
--- a/tests/compiler/dart2js/inference/inference1_test.dart
+++ b/tests/compiler/dart2js/inference/inference1_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.7
+
 import 'inference_test_helper.dart';
 
 main(List<String> args) {
diff --git a/tests/compiler/dart2js/inference/inference2_test.dart b/tests/compiler/dart2js/inference/inference2_test.dart
index 68b3c20..2f38c10 100644
--- a/tests/compiler/dart2js/inference/inference2_test.dart
+++ b/tests/compiler/dart2js/inference/inference2_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.7
+
 import 'inference_test_helper.dart';
 
 main(List<String> args) {
diff --git a/tests/compiler/dart2js/inference/inference3_test.dart b/tests/compiler/dart2js/inference/inference3_test.dart
index 6161412..596df54 100644
--- a/tests/compiler/dart2js/inference/inference3_test.dart
+++ b/tests/compiler/dart2js/inference/inference3_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.7
+
 import 'inference_test_helper.dart';
 
 main(List<String> args) {
diff --git a/tests/compiler/dart2js/inference/inference_data/called_in_loop.dart b/tests/compiler/dart2js/inference/inference_data/called_in_loop.dart
index 884773e..7c98ca6 100644
--- a/tests/compiler/dart2js/inference/inference_data/called_in_loop.dart
+++ b/tests/compiler/dart2js/inference/inference_data/called_in_loop.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   staticCalledInForLoop();
   staticCalledInForInLoop();
diff --git a/tests/compiler/dart2js/inference/inference_data/cannot_throw.dart b/tests/compiler/dart2js/inference/inference_data/cannot_throw.dart
index 9c516ba..51862bd 100644
--- a/tests/compiler/dart2js/inference/inference_data/cannot_throw.dart
+++ b/tests/compiler/dart2js/inference/inference_data/cannot_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.7
+
 main() {
   noThrows();
   noInline();
diff --git a/tests/compiler/dart2js/inference/inference_data/function_apply.dart b/tests/compiler/dart2js/inference/inference_data/function_apply.dart
index a74ae06..a253f10 100644
--- a/tests/compiler/dart2js/inference/inference_data/function_apply.dart
+++ b/tests/compiler/dart2js/inference/inference_data/function_apply.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   directCall();
   indirectCall();
diff --git a/tests/compiler/dart2js/inference/inference_data_test.dart b/tests/compiler/dart2js/inference/inference_data_test.dart
index e89e33e..48392cd 100644
--- a/tests/compiler/dart2js/inference/inference_data_test.dart
+++ b/tests/compiler/dart2js/inference/inference_data_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.7
+
 import 'dart:io';
 import 'package:_fe_analyzer_shared/src/testing/features.dart';
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/inference/inference_test_helper.dart b/tests/compiler/dart2js/inference/inference_test_helper.dart
index d0b6caa..5e70947 100644
--- a/tests/compiler/dart2js/inference/inference_test_helper.dart
+++ b/tests/compiler/dart2js/inference/inference_test_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.7
+
 import 'dart:io';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/closure.dart';
diff --git a/tests/compiler/dart2js/inference/list_tracer_test.dart b/tests/compiler/dart2js/inference/list_tracer_test.dart
index 9377f4b..f63d8c1 100644
--- a/tests/compiler/dart2js/inference/list_tracer_test.dart
+++ b/tests/compiler/dart2js/inference/list_tracer_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/inferrer/typemasks/masks.dart';
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/inference/load_deferred_library_test.dart b/tests/compiler/dart2js/inference/load_deferred_library_test.dart
index 716d334..aad3724 100644
--- a/tests/compiler/dart2js/inference/load_deferred_library_test.dart
+++ b/tests/compiler/dart2js/inference/load_deferred_library_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/common_elements.dart';
diff --git a/tests/compiler/dart2js/inference/map_tracer_test.dart b/tests/compiler/dart2js/inference/map_tracer_test.dart
index 7e2b849..77f899e 100644
--- a/tests/compiler/dart2js/inference/map_tracer_test.dart
+++ b/tests/compiler/dart2js/inference/map_tracer_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
diff --git a/tests/compiler/dart2js/inference/show.dart b/tests/compiler/dart2js/inference/show.dart
index 725f6dc..d0ab85f 100644
--- a/tests/compiler/dart2js/inference/show.dart
+++ b/tests/compiler/dart2js/inference/show.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /// Helper program that shows the inferrer data on a dart program.
 
 import 'package:args/args.dart';
diff --git a/tests/compiler/dart2js/inference/side_effects/annotations.dart b/tests/compiler/dart2js/inference/side_effects/annotations.dart
index a7d5f65..293ccdc 100644
--- a/tests/compiler/dart2js/inference/side_effects/annotations.dart
+++ b/tests/compiler/dart2js/inference/side_effects/annotations.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /// Static field used in tests below.
 var field;
 
diff --git a/tests/compiler/dart2js/inference/side_effects/foreign.dart b/tests/compiler/dart2js/inference/side_effects/foreign.dart
index ab10b35..d73e3a4 100644
--- a/tests/compiler/dart2js/inference/side_effects/foreign.dart
+++ b/tests/compiler/dart2js/inference/side_effects/foreign.dart
@@ -2,6 +2,8 @@
 // for details. All 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: IMPORT_INTERNAL_LIBRARY
 import 'dart:_foreign_helper';
 
diff --git a/tests/compiler/dart2js/inference/side_effects/local_functions.dart b/tests/compiler/dart2js/inference/side_effects/local_functions.dart
index b6a53a0..01ff04a 100644
--- a/tests/compiler/dart2js/inference/side_effects/local_functions.dart
+++ b/tests/compiler/dart2js/inference/side_effects/local_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.7
+
 var field;
 
 /*member: anonymousClosureUnused:SideEffects(reads nothing; writes nothing)*/
diff --git a/tests/compiler/dart2js/inference/side_effects/methods.dart b/tests/compiler/dart2js/inference/side_effects/methods.dart
index 99a0278..c1e33a7 100644
--- a/tests/compiler/dart2js/inference/side_effects/methods.dart
+++ b/tests/compiler/dart2js/inference/side_effects/methods.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /// Static field used in tests below.
 var field;
 
diff --git a/tests/compiler/dart2js/inference/side_effects/out_of_order.dart b/tests/compiler/dart2js/inference/side_effects/out_of_order.dart
index c8501e3..58f4f3d 100644
--- a/tests/compiler/dart2js/inference/side_effects/out_of_order.dart
+++ b/tests/compiler/dart2js/inference/side_effects/out_of_order.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Test the capability of the side effects computation based on
 // [SideEffectsBuilder].
 //
diff --git a/tests/compiler/dart2js/inference/side_effects/string_interpolation.dart b/tests/compiler/dart2js/inference/side_effects/string_interpolation.dart
index e85be1f..444f3f1 100644
--- a/tests/compiler/dart2js/inference/side_effects/string_interpolation.dart
+++ b/tests/compiler/dart2js/inference/side_effects/string_interpolation.dart
@@ -2,6 +2,8 @@
 // for details. All 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: stringInterpolation:SideEffects(reads nothing; writes anything)*/
 stringInterpolation() => '${null}';
 
diff --git a/tests/compiler/dart2js/inference/side_effects_test.dart b/tests/compiler/dart2js/inference/side_effects_test.dart
index 09f0bb4..f6b92f1 100644
--- a/tests/compiler/dart2js/inference/side_effects_test.dart
+++ b/tests/compiler/dart2js/inference/side_effects_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.7
+
 import 'dart:io';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/closure.dart';
diff --git a/tests/compiler/dart2js/inference/trivial_abstract_value_domain_test.dart b/tests/compiler/dart2js/inference/trivial_abstract_value_domain_test.dart
index 6a8f389..6929dfd 100644
--- a/tests/compiler/dart2js/inference/trivial_abstract_value_domain_test.dart
+++ b/tests/compiler/dart2js/inference/trivial_abstract_value_domain_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.7
+
 import 'package:args/args.dart';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/commandline_options.dart';
diff --git a/tests/compiler/dart2js/inference/type_combination_test.dart b/tests/compiler/dart2js/inference/type_combination_test.dart
index cc65647..e7f96a5 100644
--- a/tests/compiler/dart2js/inference/type_combination_test.dart
+++ b/tests/compiler/dart2js/inference/type_combination_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 import 'package:compiler/src/common_elements.dart';
diff --git a/tests/compiler/dart2js/inference/type_mask2_test.dart b/tests/compiler/dart2js/inference/type_mask2_test.dart
index ac8afe8..c4d5bef 100644
--- a/tests/compiler/dart2js/inference/type_mask2_test.dart
+++ b/tests/compiler/dart2js/inference/type_mask2_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.7
+
 library type_mask2_test;
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/inference/type_mask_disjoint_test.dart b/tests/compiler/dart2js/inference/type_mask_disjoint_test.dart
index ab1ab7a..13732c5 100644
--- a/tests/compiler/dart2js/inference/type_mask_disjoint_test.dart
+++ b/tests/compiler/dart2js/inference/type_mask_disjoint_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 import 'package:compiler/src/common_elements.dart';
diff --git a/tests/compiler/dart2js/inference/type_mask_test.dart b/tests/compiler/dart2js/inference/type_mask_test.dart
index 53e6077..d11d26d 100644
--- a/tests/compiler/dart2js/inference/type_mask_test.dart
+++ b/tests/compiler/dart2js/inference/type_mask_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/common.dart';
 import 'package:compiler/src/common_elements.dart';
diff --git a/tests/compiler/dart2js/inference/type_mask_test_helper.dart b/tests/compiler/dart2js/inference/type_mask_test_helper.dart
index 6da6a0d..3225032 100644
--- a/tests/compiler/dart2js/inference/type_mask_test_helper.dart
+++ b/tests/compiler/dart2js/inference/type_mask_test_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.7
+
 library type_mask_test_helper;
 
 import 'package:compiler/src/inferrer/typemasks/masks.dart';
diff --git a/tests/compiler/dart2js/inference/union_type_test.dart b/tests/compiler/dart2js/inference/union_type_test.dart
index e938293..83e86fd 100644
--- a/tests/compiler/dart2js/inference/union_type_test.dart
+++ b/tests/compiler/dart2js/inference/union_type_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.7
+
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
 import 'package:compiler/src/inferrer/typemasks/masks.dart';
diff --git a/tests/compiler/dart2js/inlining/data/conditional.dart b/tests/compiler/dart2js/inlining/data/conditional.dart
index c19404f..1e08d9c 100644
--- a/tests/compiler/dart2js/inlining/data/conditional.dart
+++ b/tests/compiler/dart2js/inlining/data/conditional.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Tests for the heuristics on conditional expression whose condition is a
 // parameter for which the max, instead of the sum, of the branch sizes is used.
 
diff --git a/tests/compiler/dart2js/inlining/data/constructor.dart b/tests/compiler/dart2js/inlining/data/constructor.dart
index d60a569..f9e0070 100644
--- a/tests/compiler/dart2js/inlining/data/constructor.dart
+++ b/tests/compiler/dart2js/inlining/data/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.7
+
 /*member: main:[]*/
 main() {
   forceInlineConstructor();
diff --git a/tests/compiler/dart2js/inlining/data/dynamic.dart b/tests/compiler/dart2js/inlining/data/dynamic.dart
index 0810edd..c3b0eff 100644
--- a/tests/compiler/dart2js/inlining/data/dynamic.dart
+++ b/tests/compiler/dart2js/inlining/data/dynamic.dart
@@ -2,6 +2,8 @@
 // for details. All 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:[]*/
 main() {
   forceInlineDynamic();
diff --git a/tests/compiler/dart2js/inlining/data/external.dart b/tests/compiler/dart2js/inlining/data/external.dart
index e943165..b144d42 100644
--- a/tests/compiler/dart2js/inlining/data/external.dart
+++ b/tests/compiler/dart2js/inlining/data/external.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 @JS()
 library lib;
 
diff --git a/tests/compiler/dart2js/inlining/data/force_inline.dart b/tests/compiler/dart2js/inlining/data/force_inline.dart
index 4bc1627..3e83f54 100644
--- a/tests/compiler/dart2js/inlining/data/force_inline.dart
+++ b/tests/compiler/dart2js/inlining/data/force_inline.dart
@@ -2,6 +2,8 @@
 // for details. All 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:[]*/
 main() {
   forceInlineOnce();
diff --git a/tests/compiler/dart2js/inlining/data/force_inline_loops.dart b/tests/compiler/dart2js/inlining/data/force_inline_loops.dart
index c9c09a7..9c21b25 100644
--- a/tests/compiler/dart2js/inlining/data/force_inline_loops.dart
+++ b/tests/compiler/dart2js/inlining/data/force_inline_loops.dart
@@ -2,6 +2,8 @@
 // for details. All 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:[]*/
 main() {
   forceInlineLoops();
diff --git a/tests/compiler/dart2js/inlining/data/heuristics.dart b/tests/compiler/dart2js/inlining/data/heuristics.dart
index d9f0c2c..c4a30d8 100644
--- a/tests/compiler/dart2js/inlining/data/heuristics.dart
+++ b/tests/compiler/dart2js/inlining/data/heuristics.dart
@@ -2,6 +2,8 @@
 // for details. All 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:[]*/
 main() {
   outsideLoopNoArgsCalledOnce();
diff --git a/tests/compiler/dart2js/inlining/data/map.dart b/tests/compiler/dart2js/inlining/data/map.dart
index 9063caa..4187816 100644
--- a/tests/compiler/dart2js/inlining/data/map.dart
+++ b/tests/compiler/dart2js/inlining/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.7
+
 /*member: main:[]*/
 main() {
   passMapToNull();
diff --git a/tests/compiler/dart2js/inlining/data/meta.dart b/tests/compiler/dart2js/inlining/data/meta.dart
index fe47d1d..ee65e0d 100644
--- a/tests/compiler/dart2js/inlining/data/meta.dart
+++ b/tests/compiler/dart2js/inlining/data/meta.dart
@@ -2,6 +2,8 @@
 // for details. All 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:[]*/
 main() {
   tryInlineOnce();
diff --git a/tests/compiler/dart2js/inlining/data/native.dart b/tests/compiler/dart2js/inlining/data/native.dart
index 8b4c1cff..761e40d 100644
--- a/tests/compiler/dart2js/inlining/data/native.dart
+++ b/tests/compiler/dart2js/inlining/data/native.dart
@@ -2,6 +2,8 @@
 // for details. All 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:html';
 
 /*member: main:[]*/
diff --git a/tests/compiler/dart2js/inlining/data/nested.dart b/tests/compiler/dart2js/inlining/data/nested.dart
index 0c98ef2..e735510 100644
--- a/tests/compiler/dart2js/inlining/data/nested.dart
+++ b/tests/compiler/dart2js/inlining/data/nested.dart
@@ -2,6 +2,8 @@
 // for details. All 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:[]*/
 main() {
   nestedGenericInlining();
diff --git a/tests/compiler/dart2js/inlining/data/setter.dart b/tests/compiler/dart2js/inlining/data/setter.dart
index 2c255fba..fa56868 100644
--- a/tests/compiler/dart2js/inlining/data/setter.dart
+++ b/tests/compiler/dart2js/inlining/data/setter.dart
@@ -2,6 +2,8 @@
 // for details. All 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:[]*/
 main() {
   inlineSetter();
diff --git a/tests/compiler/dart2js/inlining/data/static_initializer.dart b/tests/compiler/dart2js/inlining/data/static_initializer.dart
index 9c812c3..91880ca 100644
--- a/tests/compiler/dart2js/inlining/data/static_initializer.dart
+++ b/tests/compiler/dart2js/inlining/data/static_initializer.dart
@@ -2,6 +2,8 @@
 // for details. All 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:[]*/
 main() {
   _var1;
diff --git a/tests/compiler/dart2js/inlining/data/switch.dart b/tests/compiler/dart2js/inlining/data/switch.dart
index 37a0c3d..ab91910 100644
--- a/tests/compiler/dart2js/inlining/data/switch.dart
+++ b/tests/compiler/dart2js/inlining/data/switch.dart
@@ -2,6 +2,8 @@
 // for details. All 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:[]*/
 main() {
   switchThrowing();
diff --git a/tests/compiler/dart2js/inlining/data/too_difficult.dart b/tests/compiler/dart2js/inlining/data/too_difficult.dart
index b545095..013d844 100644
--- a/tests/compiler/dart2js/inlining/data/too_difficult.dart
+++ b/tests/compiler/dart2js/inlining/data/too_difficult.dart
@@ -2,6 +2,8 @@
 // for details. All 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:[]*/
 main() {
   asyncMethod();
diff --git a/tests/compiler/dart2js/inlining/data/type_variables.dart b/tests/compiler/dart2js/inlining/data/type_variables.dart
index 93c0c21..14a1ce3 100644
--- a/tests/compiler/dart2js/inlining/data/type_variables.dart
+++ b/tests/compiler/dart2js/inlining/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.7
+
 /*member: main:[]*/
 main() {
   inlineTypeTests();
diff --git a/tests/compiler/dart2js/inlining/inlining_test.dart b/tests/compiler/dart2js/inlining/inlining_test.dart
index bb4dcd2..717045f 100644
--- a/tests/compiler/dart2js/inlining/inlining_test.dart
+++ b/tests/compiler/dart2js/inlining/inlining_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.7
+
 import 'dart:io';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/closure.dart';
diff --git a/tests/compiler/dart2js/inlining/inlining_viewer.dart b/tests/compiler/dart2js/inlining/inlining_viewer.dart
index 902deaf..8fdcb62 100644
--- a/tests/compiler/dart2js/inlining/inlining_viewer.dart
+++ b/tests/compiler/dart2js/inlining/inlining_viewer.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /// Helper program that shows the inlining data on a dart program.
 
 import '../equivalence/show_helper.dart';
diff --git a/tests/compiler/dart2js/inlining/meta_annotations2_test.dart b/tests/compiler/dart2js/inlining/meta_annotations2_test.dart
index d809601..8c3d0da 100644
--- a/tests/compiler/dart2js/inlining/meta_annotations2_test.dart
+++ b/tests/compiler/dart2js/inlining/meta_annotations2_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.7
+
 // Functional test of 'noInline' annotation from package:meta/dart2js.dart.
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/inlining/meta_annotations3_test.dart b/tests/compiler/dart2js/inlining/meta_annotations3_test.dart
index ca5024a..ad71d47 100644
--- a/tests/compiler/dart2js/inlining/meta_annotations3_test.dart
+++ b/tests/compiler/dart2js/inlining/meta_annotations3_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.7
+
 // Functional test of 'tryInline' annotation from package:meta/dart2js.dart.
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/inlining/meta_annotations_test.dart b/tests/compiler/dart2js/inlining/meta_annotations_test.dart
index 074e384..4d59a1d 100644
--- a/tests/compiler/dart2js/inlining/meta_annotations_test.dart
+++ b/tests/compiler/dart2js/inlining/meta_annotations_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/common_elements.dart';
diff --git a/tests/compiler/dart2js/js/js_constant_test.dart b/tests/compiler/dart2js/js/js_constant_test.dart
index 6d0613e..872c58b 100644
--- a/tests/compiler/dart2js/js/js_constant_test.dart
+++ b/tests/compiler/dart2js/js/js_constant_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/js/js_parser_statements_test.dart b/tests/compiler/dart2js/js/js_parser_statements_test.dart
index cc8c378..195b38b 100644
--- a/tests/compiler/dart2js/js/js_parser_statements_test.dart
+++ b/tests/compiler/dart2js/js/js_parser_statements_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.7
+
 import 'package:expect/expect.dart';
 import 'package:compiler/src/js/js.dart' as jsAst;
 import 'package:compiler/src/js/js.dart' show js;
diff --git a/tests/compiler/dart2js/js/js_parser_test.dart b/tests/compiler/dart2js/js/js_parser_test.dart
index 8c82b34..7e7ac3f 100644
--- a/tests/compiler/dart2js/js/js_parser_test.dart
+++ b/tests/compiler/dart2js/js/js_parser_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.7
+
 import 'package:expect/expect.dart';
 import 'package:compiler/src/js/js.dart' as jsAst;
 import 'package:compiler/src/js/js.dart' show js;
diff --git a/tests/compiler/dart2js/js/js_safety_test.dart b/tests/compiler/dart2js/js/js_safety_test.dart
index 9a2df54..8620bec 100644
--- a/tests/compiler/dart2js/js/js_safety_test.dart
+++ b/tests/compiler/dart2js/js/js_safety_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.7
+
 import 'package:expect/expect.dart';
 import 'package:compiler/src/js/js.dart' as js;
 import 'package:compiler/src/js/placeholder_safety.dart';
diff --git a/tests/compiler/dart2js/js/js_spec_optimization_test.dart b/tests/compiler/dart2js/js/js_spec_optimization_test.dart
index 004030c..c7c928d 100644
--- a/tests/compiler/dart2js/js/js_spec_optimization_test.dart
+++ b/tests/compiler/dart2js/js/js_spec_optimization_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/js/js_spec_string_test.dart b/tests/compiler/dart2js/js/js_spec_string_test.dart
index a3245e4..8332491 100644
--- a/tests/compiler/dart2js/js/js_spec_string_test.dart
+++ b/tests/compiler/dart2js/js/js_spec_string_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.7
+
 // Unit test of the [NativeBehavior.processSpecString] method.
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/js/js_throw_behavior_test.dart b/tests/compiler/dart2js/js/js_throw_behavior_test.dart
index 0c3ecea..21872e1 100644
--- a/tests/compiler/dart2js/js/js_throw_behavior_test.dart
+++ b/tests/compiler/dart2js/js/js_throw_behavior_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.7
+
 import 'package:expect/expect.dart';
 import 'package:compiler/src/native/behavior.dart';
 import 'package:compiler/src/native/js.dart';
diff --git a/tests/compiler/dart2js/jsinterop/declaration_test.dart b/tests/compiler/dart2js/jsinterop/declaration_test.dart
index 6c94aab..72c7d23 100644
--- a/tests/compiler/dart2js/jsinterop/declaration_test.dart
+++ b/tests/compiler/dart2js/jsinterop/declaration_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.7
+
 library jsinterop.abstract_test;
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/jsinterop/interop_anonymous_unreachable_test.dart b/tests/compiler/dart2js/jsinterop/interop_anonymous_unreachable_test.dart
index 62512f6..ded9c90 100644
--- a/tests/compiler/dart2js/jsinterop/interop_anonymous_unreachable_test.dart
+++ b/tests/compiler/dart2js/jsinterop/interop_anonymous_unreachable_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.7
+
 library tests.dart2js.interop_anonymous_unreachable_test;
 
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/jsinterop/world_test.dart b/tests/compiler/dart2js/jsinterop/world_test.dart
index d1626de..bc495ac 100644
--- a/tests/compiler/dart2js/jsinterop/world_test.dart
+++ b/tests/compiler/dart2js/jsinterop/world_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.7
+
 library jsinterop.world_test;
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/jumps/data/complex_loops.dart b/tests/compiler/dart2js/jumps/data/complex_loops.dart
index d5f73e2..7c43054 100644
--- a/tests/compiler/dart2js/jumps/data/complex_loops.dart
+++ b/tests/compiler/dart2js/jumps/data/complex_loops.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 simpleForInLoopWithContinue(list) {
   /*0@continue*/ for (int i in list) {
     if (i % 2 == 0) /*target=0*/ continue;
diff --git a/tests/compiler/dart2js/jumps/data/labeled_statements.dart b/tests/compiler/dart2js/jumps/data/labeled_statements.dart
index 0d430c7..465060d 100644
--- a/tests/compiler/dart2js/jumps/data/labeled_statements.dart
+++ b/tests/compiler/dart2js/jumps/data/labeled_statements.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   breakFromIf(true);
   breakFromBlock(true);
diff --git a/tests/compiler/dart2js/jumps/data/nested_loops.dart b/tests/compiler/dart2js/jumps/data/nested_loops.dart
index 2b1783d..146de48 100644
--- a/tests/compiler/dart2js/jumps/data/nested_loops.dart
+++ b/tests/compiler/dart2js/jumps/data/nested_loops.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 nestedForLoopWithBreakAndContinue(count) {
   /*0@continue*/ for (int i = 0; i < count; i = i + 1) {
     /*1@break*/ for (int j = 0; j < count; j = j + 1) {
diff --git a/tests/compiler/dart2js/jumps/data/simple_loops.dart b/tests/compiler/dart2js/jumps/data/simple_loops.dart
index 3e683ba..e77341b 100644
--- a/tests/compiler/dart2js/jumps/data/simple_loops.dart
+++ b/tests/compiler/dart2js/jumps/data/simple_loops.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 simpleForLoop(count) {
   for (int i = 0; i < count; i++) {
     print(i);
diff --git a/tests/compiler/dart2js/jumps/data/switch.dart b/tests/compiler/dart2js/jumps/data/switch.dart
index ec716cd..7ea9ccb 100644
--- a/tests/compiler/dart2js/jumps/data/switch.dart
+++ b/tests/compiler/dart2js/jumps/data/switch.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 void simpleSwitch(e) {
   /*0@break*/ switch (e) {
     case 0:
diff --git a/tests/compiler/dart2js/jumps/jump_test.dart b/tests/compiler/dart2js/jumps/jump_test.dart
index 5d3320a..35b67d1 100644
--- a/tests/compiler/dart2js/jumps/jump_test.dart
+++ b/tests/compiler/dart2js/jumps/jump_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.7
+
 import 'dart:io';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/common.dart';
diff --git a/tests/compiler/dart2js/member_usage/data/constant_folding.dart b/tests/compiler/dart2js/member_usage/data/constant_folding.dart
index 4c601de..89dd97f 100644
--- a/tests/compiler/dart2js/member_usage/data/constant_folding.dart
+++ b/tests/compiler/dart2js/member_usage/data/constant_folding.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Derived from dart2js_extra/constant_folding_test
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/member_usage/data/constructors.dart b/tests/compiler/dart2js/member_usage/data/constructors.dart
index 39d4566..e568cb2 100644
--- a/tests/compiler/dart2js/member_usage/data/constructors.dart
+++ b/tests/compiler/dart2js/member_usage/data/constructors.dart
@@ -2,6 +2,8 @@
 // for details. All 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 {
   /*member: Class.constructor1:invoke*/
   Class.constructor1() {}
diff --git a/tests/compiler/dart2js/member_usage/data/fields.dart b/tests/compiler/dart2js/member_usage/data/fields.dart
index 9bdacad..7ec7120 100644
--- a/tests/compiler/dart2js/member_usage/data/fields.dart
+++ b/tests/compiler/dart2js/member_usage/data/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.7
+
 /*member: field1a:init,read*/
 var field1a;
 
diff --git a/tests/compiler/dart2js/member_usage/data/general.dart b/tests/compiler/dart2js/member_usage/data/general.dart
index 8e86d99..a8b6f61 100644
--- a/tests/compiler/dart2js/member_usage/data/general.dart
+++ b/tests/compiler/dart2js/member_usage/data/general.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A.:invoke*/
 class A {
   /*member: A.method1:invoke*/
diff --git a/tests/compiler/dart2js/member_usage/data/generic.dart b/tests/compiler/dart2js/member_usage/data/generic.dart
index 7ae48a3..ebe650f 100644
--- a/tests/compiler/dart2js/member_usage/data/generic.dart
+++ b/tests/compiler/dart2js/member_usage/data/generic.dart
@@ -2,6 +2,8 @@
 // for details. All 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: Class.:invoke*/
 class Class {
   // The type parameter is never provided but needed nonetheless.
diff --git a/tests/compiler/dart2js/member_usage/data/instance_method_parameters.dart b/tests/compiler/dart2js/member_usage/data/instance_method_parameters.dart
index 0e9ad65..1f658fa 100644
--- a/tests/compiler/dart2js/member_usage/data/instance_method_parameters.dart
+++ b/tests/compiler/dart2js/member_usage/data/instance_method_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.7
+
 /*member: Class.:invoke*/
 class Class {
   /*member: Class.method1:invoke*/
diff --git a/tests/compiler/dart2js/member_usage/data/native.dart b/tests/compiler/dart2js/member_usage/data/native.dart
index 691562b..b4a4875c 100644
--- a/tests/compiler/dart2js/member_usage/data/native.dart
+++ b/tests/compiler/dart2js/member_usage/data/native.dart
@@ -2,6 +2,8 @@
 // for details. All 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: import_internal_library
 import 'dart:_js_helper';
 
diff --git a/tests/compiler/dart2js/member_usage/data/static_method_parameters.dart b/tests/compiler/dart2js/member_usage/data/static_method_parameters.dart
index 5548810..c5ab899 100644
--- a/tests/compiler/dart2js/member_usage/data/static_method_parameters.dart
+++ b/tests/compiler/dart2js/member_usage/data/static_method_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.7
+
 /*member: method1:invoke*/
 method1() {}
 
diff --git a/tests/compiler/dart2js/member_usage/data/super.dart b/tests/compiler/dart2js/member_usage/data/super.dart
index 50e3547..4ff349c 100644
--- a/tests/compiler/dart2js/member_usage/data/super.dart
+++ b/tests/compiler/dart2js/member_usage/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.7
+
 class Super {
   /*member: Super.field1:init,read=super*/
   var field1;
diff --git a/tests/compiler/dart2js/member_usage/member_usage_test.dart b/tests/compiler/dart2js/member_usage/member_usage_test.dart
index 2e09a07..834cd14 100644
--- a/tests/compiler/dart2js/member_usage/member_usage_test.dart
+++ b/tests/compiler/dart2js/member_usage/member_usage_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.7
+
 import 'dart:io';
 import 'package:_fe_analyzer_shared/src/testing/features.dart';
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/model/call_structure_namer_test.dart b/tests/compiler/dart2js/model/call_structure_namer_test.dart
index 4c1826a..4bc9a7b 100644
--- a/tests/compiler/dart2js/model/call_structure_namer_test.dart
+++ b/tests/compiler/dart2js/model/call_structure_namer_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/js_backend/namer.dart';
 import 'package:compiler/src/universe/call_structure.dart';
diff --git a/tests/compiler/dart2js/model/cfe_annotations_test.dart b/tests/compiler/dart2js/model/cfe_annotations_test.dart
index c82f0c5..2dde603 100644
--- a/tests/compiler/dart2js/model/cfe_annotations_test.dart
+++ b/tests/compiler/dart2js/model/cfe_annotations_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.7
+
 import 'package:args/args.dart';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js/model/cfe_constant_evaluation_test.dart b/tests/compiler/dart2js/model/cfe_constant_evaluation_test.dart
index eddb490..a3c182f 100644
--- a/tests/compiler/dart2js/model/cfe_constant_evaluation_test.dart
+++ b/tests/compiler/dart2js/model/cfe_constant_evaluation_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.7
+
 library dart2js.constants.expressions.evaluate_test;
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/model/cfe_constant_swarm_test.dart b/tests/compiler/dart2js/model/cfe_constant_swarm_test.dart
index 5a8997b..474766e 100644
--- a/tests/compiler/dart2js/model/cfe_constant_swarm_test.dart
+++ b/tests/compiler/dart2js/model/cfe_constant_swarm_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.7
+
 import 'package:args/args.dart';
 import 'package:async_helper/async_helper.dart';
 
diff --git a/tests/compiler/dart2js/model/cfe_constant_test.dart b/tests/compiler/dart2js/model/cfe_constant_test.dart
index 3430988..ab872b3 100644
--- a/tests/compiler/dart2js/model/cfe_constant_test.dart
+++ b/tests/compiler/dart2js/model/cfe_constant_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.7
+
 import 'dart:io';
 import 'package:_fe_analyzer_shared/src/testing/id_testing.dart';
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/model/class_set_test.dart b/tests/compiler/dart2js/model/class_set_test.dart
index ea78222..d884344 100644
--- a/tests/compiler/dart2js/model/class_set_test.dart
+++ b/tests/compiler/dart2js/model/class_set_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.7
+
 // Test for iterators on for [SubclassNode].
 
 library class_set_test;
diff --git a/tests/compiler/dart2js/model/constant_value_test.dart b/tests/compiler/dart2js/model/constant_value_test.dart
index aebfbb3..9822945 100644
--- a/tests/compiler/dart2js/model/constant_value_test.dart
+++ b/tests/compiler/dart2js/model/constant_value_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.7
+
 library dart2js.constants.values.test;
 
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/model/enqueuer_test.dart b/tests/compiler/dart2js/model/enqueuer_test.dart
index 99f5f4d..797896c 100644
--- a/tests/compiler/dart2js/model/enqueuer_test.dart
+++ b/tests/compiler/dart2js/model/enqueuer_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.7
+
 // Test that the enqueuers are not dependent upon in which order impacts are
 // applied.
 
diff --git a/tests/compiler/dart2js/model/enumset_test.dart b/tests/compiler/dart2js/model/enumset_test.dart
index 92ab39c..1664113 100644
--- a/tests/compiler/dart2js/model/enumset_test.dart
+++ b/tests/compiler/dart2js/model/enumset_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.7
+
 library enumset.test;
 
 import 'package:compiler/src/util/enumset.dart';
diff --git a/tests/compiler/dart2js/model/forwarding_stub_test.dart b/tests/compiler/dart2js/model/forwarding_stub_test.dart
index 1784cf3..0035c58 100644
--- a/tests/compiler/dart2js/model/forwarding_stub_test.dart
+++ b/tests/compiler/dart2js/model/forwarding_stub_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js/model/future_or_test.dart b/tests/compiler/dart2js/model/future_or_test.dart
index 9dc81d5..87d52be 100644
--- a/tests/compiler/dart2js/model/future_or_test.dart
+++ b/tests/compiler/dart2js/model/future_or_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/types.dart';
diff --git a/tests/compiler/dart2js/model/in_user_code_test.dart b/tests/compiler/dart2js/model/in_user_code_test.dart
index 1e65ecb..81bee9c 100644
--- a/tests/compiler/dart2js/model/in_user_code_test.dart
+++ b/tests/compiler/dart2js/model/in_user_code_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.7
+
 // Test that the helper [Compiler.inUserCode] works as intended.
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/model/indentation_test.dart b/tests/compiler/dart2js/model/indentation_test.dart
index 1730fd1..98a4f41 100644
--- a/tests/compiler/dart2js/model/indentation_test.dart
+++ b/tests/compiler/dart2js/model/indentation_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.7
+
 import "package:expect/expect.dart";
 import 'package:compiler/src/util/util.dart' show Indentation;
 
diff --git a/tests/compiler/dart2js/model/instantiated_classes_test.dart b/tests/compiler/dart2js/model/instantiated_classes_test.dart
index 60cb1cc..610d9b1 100644
--- a/tests/compiler/dart2js/model/instantiated_classes_test.dart
+++ b/tests/compiler/dart2js/model/instantiated_classes_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.7
+
 library instantiated_classes_test;
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/model/link_test.dart b/tests/compiler/dart2js/model/link_test.dart
index 9b2b00e..1854db3 100644
--- a/tests/compiler/dart2js/model/link_test.dart
+++ b/tests/compiler/dart2js/model/link_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.7
+
 import 'package:_fe_analyzer_shared/src/util/link.dart' show Link;
 import "package:expect/expect.dart";
 import '../helpers/link_helper.dart';
diff --git a/tests/compiler/dart2js/model/maplet_test.dart b/tests/compiler/dart2js/model/maplet_test.dart
index 687622e..1a6e66e 100644
--- a/tests/compiler/dart2js/model/maplet_test.dart
+++ b/tests/compiler/dart2js/model/maplet_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.7
+
 import "package:expect/expect.dart";
 import "package:compiler/src/util/maplet.dart";
 
diff --git a/tests/compiler/dart2js/model/mixin_typevariable_test.dart b/tests/compiler/dart2js/model/mixin_typevariable_test.dart
index 01c7a90..c2d4e4d 100644
--- a/tests/compiler/dart2js/model/mixin_typevariable_test.dart
+++ b/tests/compiler/dart2js/model/mixin_typevariable_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.7
+
 library mixin_typevariable_test;
 
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/model/native_test.dart b/tests/compiler/dart2js/model/native_test.dart
index b0b227a..fda3805 100644
--- a/tests/compiler/dart2js/model/native_test.dart
+++ b/tests/compiler/dart2js/model/native_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.7
+
 import 'dart:io';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/common_elements.dart';
diff --git a/tests/compiler/dart2js/model/needs_no_such_method_test.dart b/tests/compiler/dart2js/model/needs_no_such_method_test.dart
index 219d946..a9311a2 100644
--- a/tests/compiler/dart2js/model/needs_no_such_method_test.dart
+++ b/tests/compiler/dart2js/model/needs_no_such_method_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.7
+
 import 'dart:async';
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/model/no_such_method_enabled_test.dart b/tests/compiler/dart2js/model/no_such_method_enabled_test.dart
index 7e45417..df08980 100644
--- a/tests/compiler/dart2js/model/no_such_method_enabled_test.dart
+++ b/tests/compiler/dart2js/model/no_such_method_enabled_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js/model/no_such_method_forwarders_test.dart b/tests/compiler/dart2js/model/no_such_method_forwarders_test.dart
index 27bece5..7535b2d 100644
--- a/tests/compiler/dart2js/model/no_such_method_forwarders_test.dart
+++ b/tests/compiler/dart2js/model/no_such_method_forwarders_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
diff --git a/tests/compiler/dart2js/model/open_world_test.dart b/tests/compiler/dart2js/model/open_world_test.dart
index 35e992d..49c37fb 100644
--- a/tests/compiler/dart2js/model/open_world_test.dart
+++ b/tests/compiler/dart2js/model/open_world_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js/model/receiver_type_test.dart b/tests/compiler/dart2js/model/receiver_type_test.dart
index 3ad5042..d7567dc 100644
--- a/tests/compiler/dart2js/model/receiver_type_test.dart
+++ b/tests/compiler/dart2js/model/receiver_type_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.7
+
 import 'dart:async';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/elements/entities.dart';
diff --git a/tests/compiler/dart2js/model/setlet_test.dart b/tests/compiler/dart2js/model/setlet_test.dart
index f27cbcb..a58f6ce 100644
--- a/tests/compiler/dart2js/model/setlet_test.dart
+++ b/tests/compiler/dart2js/model/setlet_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.7
+
 import "package:expect/expect.dart";
 import 'dart:collection';
 import 'package:compiler/src/util/setlet.dart';
diff --git a/tests/compiler/dart2js/model/strong_mode_closed_world_test.dart b/tests/compiler/dart2js/model/strong_mode_closed_world_test.dart
index a94eaad..6ee0535 100644
--- a/tests/compiler/dart2js/model/strong_mode_closed_world_test.dart
+++ b/tests/compiler/dart2js/model/strong_mode_closed_world_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js/model/strong_mode_impact_test.dart b/tests/compiler/dart2js/model/strong_mode_impact_test.dart
index 79fc030..bb7c914 100644
--- a/tests/compiler/dart2js/model/strong_mode_impact_test.dart
+++ b/tests/compiler/dart2js/model/strong_mode_impact_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.7
+
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/common.dart';
diff --git a/tests/compiler/dart2js/model/subtype_test.dart b/tests/compiler/dart2js/model/subtype_test.dart
index 914d75a..f166770 100644
--- a/tests/compiler/dart2js/model/subtype_test.dart
+++ b/tests/compiler/dart2js/model/subtype_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.7
+
 library subtype_test;
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/model/subtypeset_test.dart b/tests/compiler/dart2js/model/subtypeset_test.dart
index dda257b..f16f4c9 100644
--- a/tests/compiler/dart2js/model/subtypeset_test.dart
+++ b/tests/compiler/dart2js/model/subtypeset_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.7
+
 // Test for iterators on for [SubclassNode].
 
 library subtypeset_test;
diff --git a/tests/compiler/dart2js/model/supermixin_test.dart b/tests/compiler/dart2js/model/supermixin_test.dart
index fab668d..f1fed6e 100644
--- a/tests/compiler/dart2js/model/supermixin_test.dart
+++ b/tests/compiler/dart2js/model/supermixin_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/common_elements.dart';
diff --git a/tests/compiler/dart2js/model/token_naming_test.dart b/tests/compiler/dart2js/model/token_naming_test.dart
index 03702d0..beb5f66 100644
--- a/tests/compiler/dart2js/model/token_naming_test.dart
+++ b/tests/compiler/dart2js/model/token_naming_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.7
+
 import "package:compiler/src/js_backend/js_backend.dart" show TokenScope;
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/model/type_substitution_test.dart b/tests/compiler/dart2js/model/type_substitution_test.dart
index 9c25617..d5db6b3 100644
--- a/tests/compiler/dart2js/model/type_substitution_test.dart
+++ b/tests/compiler/dart2js/model/type_substitution_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.7
+
 library type_substitution_test;
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/model/world_test.dart b/tests/compiler/dart2js/model/world_test.dart
index b2106a8..bf49a4f 100644
--- a/tests/compiler/dart2js/model/world_test.dart
+++ b/tests/compiler/dart2js/model/world_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.7
+
 library world_test;
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/optimization/data/arithmetic.dart b/tests/compiler/dart2js/optimization/data/arithmetic.dart
index cd984e6..bc1843b 100644
--- a/tests/compiler/dart2js/optimization/data/arithmetic.dart
+++ b/tests/compiler/dart2js/optimization/data/arithmetic.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   negate(1);
   negateNum(1);
diff --git a/tests/compiler/dart2js/optimization/data/arithmetic_simplification.dart b/tests/compiler/dart2js/optimization/data/arithmetic_simplification.dart
index dad0dcc..71b6f09 100644
--- a/tests/compiler/dart2js/optimization/data/arithmetic_simplification.dart
+++ b/tests/compiler/dart2js/optimization/data/arithmetic_simplification.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Test constant folding on numbers.
 
 @pragma('dart2js:assumeDynamic')
diff --git a/tests/compiler/dart2js/optimization/data/bit.dart b/tests/compiler/dart2js/optimization/data/bit.dart
index 49364cf..fb42214 100644
--- a/tests/compiler/dart2js/optimization/data/bit.dart
+++ b/tests/compiler/dart2js/optimization/data/bit.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   bitNot(1);
   bitNotNum(1);
diff --git a/tests/compiler/dart2js/optimization/data/effectively_constant_fields.dart b/tests/compiler/dart2js/optimization/data/effectively_constant_fields.dart
index 6e14bb9..55f7152 100644
--- a/tests/compiler/dart2js/optimization/data/effectively_constant_fields.dart
+++ b/tests/compiler/dart2js/optimization/data/effectively_constant_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.7
+
 import 'package:expect/expect.dart';
 
 class Class1 {
diff --git a/tests/compiler/dart2js/optimization/data/field_get.dart b/tests/compiler/dart2js/optimization/data/field_get.dart
index 301efeb..eb78b81 100644
--- a/tests/compiler/dart2js/optimization/data/field_get.dart
+++ b/tests/compiler/dart2js/optimization/data/field_get.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   method1(new Class1a());
   method2(new Class2a());
diff --git a/tests/compiler/dart2js/optimization/data/field_set.dart b/tests/compiler/dart2js/optimization/data/field_set.dart
index a7e1cbb..d21b818 100644
--- a/tests/compiler/dart2js/optimization/data/field_set.dart
+++ b/tests/compiler/dart2js/optimization/data/field_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.7
+
 main() {
   method1(new Class1a());
   method2(new Class2a());
diff --git a/tests/compiler/dart2js/optimization/data/finalized_type_variable.dart b/tests/compiler/dart2js/optimization/data/finalized_type_variable.dart
index 9b64132..865a2d0 100644
--- a/tests/compiler/dart2js/optimization/data/finalized_type_variable.dart
+++ b/tests/compiler/dart2js/optimization/data/finalized_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.7
+
 abstract class AppView<T> {
   T ctx;
 }
diff --git a/tests/compiler/dart2js/optimization/data/index.dart b/tests/compiler/dart2js/optimization/data/index.dart
index a38b22c..7b95043 100644
--- a/tests/compiler/dart2js/optimization/data/index.dart
+++ b/tests/compiler/dart2js/optimization/data/index.dart
@@ -2,6 +2,8 @@
 // for details. All 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:collection';
 
 /*member: dynamicIndex:Specializer=[!Index]*/
diff --git a/tests/compiler/dart2js/optimization/data/index_assign.dart b/tests/compiler/dart2js/optimization/data/index_assign.dart
index d2ac26d..45a88e4 100644
--- a/tests/compiler/dart2js/optimization/data/index_assign.dart
+++ b/tests/compiler/dart2js/optimization/data/index_assign.dart
@@ -2,6 +2,8 @@
 // for details. All 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: dynamicIndexAssign:Specializer=[!IndexAssign]*/
 @pragma('dart2js:noInline')
 dynamicIndexAssign(var list) {
diff --git a/tests/compiler/dart2js/optimization/data/modulo_remainder.dart b/tests/compiler/dart2js/optimization/data/modulo_remainder.dart
index d2d909cc..57da5b3 100644
--- a/tests/compiler/dart2js/optimization/data/modulo_remainder.dart
+++ b/tests/compiler/dart2js/optimization/data/modulo_remainder.dart
@@ -2,6 +2,8 @@
 // for details. All 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: mod1:Specializer=[Modulo]*/
 @pragma('dart2js:noInline')
 mod1(param) {
diff --git a/tests/compiler/dart2js/optimization/optimization_test.dart b/tests/compiler/dart2js/optimization/optimization_test.dart
index ed894c7..e2687f6 100644
--- a/tests/compiler/dart2js/optimization/optimization_test.dart
+++ b/tests/compiler/dart2js/optimization/optimization_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.7
+
 import 'dart:io';
 import 'package:_fe_analyzer_shared/src/testing/features.dart';
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/rti/backend_type_helper_test.dart b/tests/compiler/dart2js/rti/backend_type_helper_test.dart
index 95dc812..53ec0ad 100644
--- a/tests/compiler/dart2js/rti/backend_type_helper_test.dart
+++ b/tests/compiler/dart2js/rti/backend_type_helper_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.7
+
 import 'dart:io';
 
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/rti/bound_check_test.dart b/tests/compiler/dart2js/rti/bound_check_test.dart
index b0729aa..ce5f817 100644
--- a/tests/compiler/dart2js/rti/bound_check_test.dart
+++ b/tests/compiler/dart2js/rti/bound_check_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.7
+
 import 'package:async_helper/async_helper.dart';
 import '../helpers/d8_helper.dart';
 
diff --git a/tests/compiler/dart2js/rti/data/as.dart b/tests/compiler/dart2js/rti/data/as.dart
index b84f239..1b2e5b5 100644
--- a/tests/compiler/dart2js/rti/data/as.dart
+++ b/tests/compiler/dart2js/rti/data/as.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Derived from dart2js_extra/generic_type_error_message_test.
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/rti/data/async_foreach.dart b/tests/compiler/dart2js/rti/data/async_foreach.dart
index b847743..22efbe0 100644
--- a/tests/compiler/dart2js/rti/data/async_foreach.dart
+++ b/tests/compiler/dart2js/rti/data/async_foreach.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: Class:direct,explicit=[Class.T],implicit=[Class.T],needsArgs*/
 /*omit.class: Class:needsArgs*/
 class Class<T> {
diff --git a/tests/compiler/dart2js/rti/data/async_foreach_nonasync.dart b/tests/compiler/dart2js/rti/data/async_foreach_nonasync.dart
index 4afe488..7c27624 100644
--- a/tests/compiler/dart2js/rti/data/async_foreach_nonasync.dart
+++ b/tests/compiler/dart2js/rti/data/async_foreach_nonasync.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: Class:direct,explicit=[Class.T],implicit=[Class.T],needsArgs*/
 /*omit.class: Class:*/
 class Class<T> {
diff --git a/tests/compiler/dart2js/rti/data/async_local.dart b/tests/compiler/dart2js/rti/data/async_local.dart
index 10f865a..14bd0d2 100644
--- a/tests/compiler/dart2js/rti/data/async_local.dart
+++ b/tests/compiler/dart2js/rti/data/async_local.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() async {
   // With the `is dynamic Function(Object,StackTrace)` test in the async
   // implementation the closure, with type `dynamic Function(dynamic, dynamic)`,
diff --git a/tests/compiler/dart2js/rti/data/async_local_nonasync.dart b/tests/compiler/dart2js/rti/data/async_local_nonasync.dart
index b18d28a..e07c33e7 100644
--- a/tests/compiler/dart2js/rti/data/async_local_nonasync.dart
+++ b/tests/compiler/dart2js/rti/data/async_local_nonasync.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   // If any method was `async`, this would have triggered the need for the
   // signature on this closure. See the 'async_local.dart' test.
diff --git a/tests/compiler/dart2js/rti/data/async_local_typed.dart b/tests/compiler/dart2js/rti/data/async_local_typed.dart
index 5d4c863..5154e91 100644
--- a/tests/compiler/dart2js/rti/data/async_local_typed.dart
+++ b/tests/compiler/dart2js/rti/data/async_local_typed.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: Class:explicit=[Class<int>],needsArgs*/
 /*omit.class: Class:*/
 class Class<T> {}
diff --git a/tests/compiler/dart2js/rti/data/call_typed.dart b/tests/compiler/dart2js/rti/data/call_typed.dart
index 7de1bdc..720048e 100644
--- a/tests/compiler/dart2js/rti/data/call_typed.dart
+++ b/tests/compiler/dart2js/rti/data/call_typed.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 class A {
diff --git a/tests/compiler/dart2js/rti/data/call_typed_generic.dart b/tests/compiler/dart2js/rti/data/call_typed_generic.dart
index 6e7e075..3cf8ad8 100644
--- a/tests/compiler/dart2js/rti/data/call_typed_generic.dart
+++ b/tests/compiler/dart2js/rti/data/call_typed_generic.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*strong.class: A:direct,explicit=[A.T],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/closure.dart b/tests/compiler/dart2js/rti/data/closure.dart
index aeb2742..4804c14 100644
--- a/tests/compiler/dart2js/rti/data/closure.dart
+++ b/tests/compiler/dart2js/rti/data/closure.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*omit.class: A:needsArgs*/
 /*strong.class: A:direct,explicit=[A.T],needsArgs*/
 class A<T> {
diff --git a/tests/compiler/dart2js/rti/data/closure_generic_unneeded.dart b/tests/compiler/dart2js/rti/data/closure_generic_unneeded.dart
index ec6a531..6fd577d 100644
--- a/tests/compiler/dart2js/rti/data/closure_generic_unneeded.dart
+++ b/tests/compiler/dart2js/rti/data/closure_generic_unneeded.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*omit.class: A:*/
 /*strong.class: A:direct,explicit=[A.T],needsArgs*/
 class A<T> {
diff --git a/tests/compiler/dart2js/rti/data/closure_unneeded.dart b/tests/compiler/dart2js/rti/data/closure_unneeded.dart
index ec6a531..6fd577d 100644
--- a/tests/compiler/dart2js/rti/data/closure_unneeded.dart
+++ b/tests/compiler/dart2js/rti/data/closure_unneeded.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*omit.class: A:*/
 /*strong.class: A:direct,explicit=[A.T],needsArgs*/
 class A<T> {
diff --git a/tests/compiler/dart2js/rti/data/dependency.dart b/tests/compiler/dart2js/rti/data/dependency.dart
index 8dac33c..4c2ff6f 100644
--- a/tests/compiler/dart2js/rti/data/dependency.dart
+++ b/tests/compiler/dart2js/rti/data/dependency.dart
@@ -2,6 +2,8 @@
 // for details. All 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 A<T> {
   m() => new B<T>();
 }
diff --git a/tests/compiler/dart2js/rti/data/direct.dart b/tests/compiler/dart2js/rti/data/direct.dart
index f2069f6..e7a05cf 100644
--- a/tests/compiler/dart2js/rti/data/direct.dart
+++ b/tests/compiler/dart2js/rti/data/direct.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:explicit=[A<int>],needsArgs*/
 class A<T> {}
 
diff --git a/tests/compiler/dart2js/rti/data/dynamic_is.dart b/tests/compiler/dart2js/rti/data/dynamic_is.dart
index 3918c53..9edf610 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_is.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_is.dart
@@ -2,6 +2,8 @@
 // for details. All 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 A {
   /*member: A.instanceMethod:direct,explicit=[instanceMethod.T],needsArgs,selectors=[Selector(call, instanceMethod, arity=1, types=1)]*/
   instanceMethod<T>(t) => t is T;
diff --git a/tests/compiler/dart2js/rti/data/dynamic_is2.dart b/tests/compiler/dart2js/rti/data/dynamic_is2.dart
index b9c6996..09f291b 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_is2.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_is2.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*omit.class: A:*/
 /*strong.class: A:explicit=[A]*/
 class A {
diff --git a/tests/compiler/dart2js/rti/data/dynamic_is_closure.dart b/tests/compiler/dart2js/rti/data/dynamic_is_closure.dart
index 100e0b6..e224bf8 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_is_closure.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_is_closure.dart
@@ -2,6 +2,8 @@
 // for details. All 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 A {
   /*member: A.instanceMethod:direct,explicit=[instanceMethod.T],needsArgs,selectors=[Selector(call, instanceMethod, arity=1, types=1)]*/
   instanceMethod<T>(t) => t is T;
diff --git a/tests/compiler/dart2js/rti/data/dynamic_is_closure2.dart b/tests/compiler/dart2js/rti/data/dynamic_is_closure2.dart
index 95b4516..26842e1 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_is_closure2.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_is_closure2.dart
@@ -2,6 +2,8 @@
 // for details. All 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 A {
   /*member: A.instanceMethod:deps=[local],direct,explicit=[instanceMethod.T],needsArgs,selectors=[Selector(call, instanceMethod, arity=1, types=1)]*/
   instanceMethod<T>(t) => t is T;
diff --git a/tests/compiler/dart2js/rti/data/dynamic_not.dart b/tests/compiler/dart2js/rti/data/dynamic_not.dart
index 15e708a..b4db411 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_not.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_not.dart
@@ -2,6 +2,8 @@
 // for details. All 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 A {
   /*member: A.instanceMethod:*/
   instanceMethod<T>(t) => t;
diff --git a/tests/compiler/dart2js/rti/data/dynamic_not2.dart b/tests/compiler/dart2js/rti/data/dynamic_not2.dart
index aa043a6..c8f9f6e 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_not2.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_not2.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: A:explicit=[A]*/
 class A {
   /*member: A.instanceMethod:deps=[B.instanceMethod]*/
diff --git a/tests/compiler/dart2js/rti/data/dynamic_not_closure.dart b/tests/compiler/dart2js/rti/data/dynamic_not_closure.dart
index 9049c26..add82db 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_not_closure.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_not_closure.dart
@@ -2,6 +2,8 @@
 // for details. All 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 A {
   /*member: A.instanceMethod:*/
   instanceMethod<T>(t) => t;
diff --git a/tests/compiler/dart2js/rti/data/dynamic_not_closure2.dart b/tests/compiler/dart2js/rti/data/dynamic_not_closure2.dart
index d06c360..e37987e 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_not_closure2.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_not_closure2.dart
@@ -2,6 +2,8 @@
 // for details. All 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 A {
   /*member: A.instanceMethod:deps=[local]*/
   instanceMethod<T>(t) => t;
diff --git a/tests/compiler/dart2js/rti/data/dynamic_tear_off.dart b/tests/compiler/dart2js/rti/data/dynamic_tear_off.dart
index 191ab7a..d69f33e 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_tear_off.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_tear_off.dart
@@ -2,6 +2,8 @@
 // for details. All 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: staticMethod:direct,explicit=[staticMethod.T],needsArgs,selectors=[Selector(call, call, arity=1, types=1)]*/
 staticMethod<T>(t) => t is T;
 
diff --git a/tests/compiler/dart2js/rti/data/dynamic_tear_off2.dart b/tests/compiler/dart2js/rti/data/dynamic_tear_off2.dart
index b018072..af93d70 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_tear_off2.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_tear_off2.dart
@@ -2,6 +2,8 @@
 // for details. All 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: staticMethod:deps=[B.instanceMethod],direct,explicit=[staticMethod.T],needsArgs,selectors=[Selector(call, call, arity=1, types=1)]*/
 staticMethod<T>(t) => t is T;
 
diff --git a/tests/compiler/dart2js/rti/data/dynamic_tear_off3.dart b/tests/compiler/dart2js/rti/data/dynamic_tear_off3.dart
index 807f356..74625dd 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_tear_off3.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_tear_off3.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*omit.class: A:*/
 /*strong.class: A:explicit=[A]*/
 class A {
diff --git a/tests/compiler/dart2js/rti/data/dynamic_tear_off4.dart b/tests/compiler/dart2js/rti/data/dynamic_tear_off4.dart
index 2f04620..a7a7b5e 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_tear_off4.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_tear_off4.dart
@@ -2,6 +2,8 @@
 // for details. All 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: staticMethod1:deps=[staticMethod2],direct,explicit=[staticMethod1.T],needsArgs,selectors=[Selector(call, call, arity=1, types=1)]*/
 staticMethod1<T>(t) => t is T;
 
diff --git a/tests/compiler/dart2js/rti/data/dynamic_type_literal.dart b/tests/compiler/dart2js/rti/data/dynamic_type_literal.dart
index b13dccd..df04a74 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_type_literal.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_type_literal.dart
@@ -2,6 +2,8 @@
 // for details. All 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 A {
   /*member: A.instanceMethod:exp,needsArgs,selectors=[Selector(call, instanceMethod, arity=0, types=1)]*/
   instanceMethod<T>() => T;
diff --git a/tests/compiler/dart2js/rti/data/dynamic_type_literal2.dart b/tests/compiler/dart2js/rti/data/dynamic_type_literal2.dart
index 2f0ab7a..7bf6ce1 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_type_literal2.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_type_literal2.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: A:explicit=[A]*/
 class A {
   /*member: A.instanceMethod:deps=[B.instanceMethod],exp,needsArgs,selectors=[Selector(call, instanceMethod, arity=0, types=1)]*/
diff --git a/tests/compiler/dart2js/rti/data/explicit_as.dart b/tests/compiler/dart2js/rti/data/explicit_as.dart
index a90140a..8bb7f30 100644
--- a/tests/compiler/dart2js/rti/data/explicit_as.dart
+++ b/tests/compiler/dart2js/rti/data/explicit_as.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: C:direct,explicit=[C.T,C<String>],needsArgs*/
 /*omit.class: C:*/
 class C<T> {
diff --git a/tests/compiler/dart2js/rti/data/function_subtype_local5.dart b/tests/compiler/dart2js/rti/data/function_subtype_local5.dart
index 3d1b80c..8d429b8 100644
--- a/tests/compiler/dart2js/rti/data/function_subtype_local5.dart
+++ b/tests/compiler/dart2js/rti/data/function_subtype_local5.dart
@@ -1,6 +1,8 @@
 // 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.
+
+// @dart = 2.7
 // Dart test program for constructors and initializers.
 
 // Check function subtyping for local functions on generic type against generic
diff --git a/tests/compiler/dart2js/rti/data/future_or.dart b/tests/compiler/dart2js/rti/data/future_or.dart
index f39c148..bffc174 100644
--- a/tests/compiler/dart2js/rti/data/future_or.dart
+++ b/tests/compiler/dart2js/rti/data/future_or.dart
@@ -2,6 +2,8 @@
 // for details. All 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';
 
 /*class: global#Future:implicit=[Future<A>],indirect,needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/future_or_future_or.dart b/tests/compiler/dart2js/rti/data/future_or_future_or.dart
index 4f825b0..095ea3d 100644
--- a/tests/compiler/dart2js/rti/data/future_or_future_or.dart
+++ b/tests/compiler/dart2js/rti/data/future_or_future_or.dart
@@ -2,6 +2,8 @@
 // for details. All 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';
 
 /*class: global#Future:implicit=[Future<A>,Future<FutureOr<A>>],indirect,needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/future_or_future_or_generic.dart b/tests/compiler/dart2js/rti/data/future_or_future_or_generic.dart
index 32b28d9..3cc54d6e 100644
--- a/tests/compiler/dart2js/rti/data/future_or_future_or_generic.dart
+++ b/tests/compiler/dart2js/rti/data/future_or_future_or_generic.dart
@@ -2,6 +2,8 @@
 // for details. All 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';
 
 /*class: global#Future:deps=[A],implicit=[Future<B<A.T>>,Future<C>],indirect,needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/future_or_generic.dart b/tests/compiler/dart2js/rti/data/future_or_generic.dart
index 84291b90..901b5bf 100644
--- a/tests/compiler/dart2js/rti/data/future_or_generic.dart
+++ b/tests/compiler/dart2js/rti/data/future_or_generic.dart
@@ -2,6 +2,8 @@
 // for details. All 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';
 
 /*class: global#Future:deps=[A],implicit=[Future<A.T>],indirect,needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/future_or_generic2.dart b/tests/compiler/dart2js/rti/data/future_or_generic2.dart
index 8e588cf..e80d9a0 100644
--- a/tests/compiler/dart2js/rti/data/future_or_generic2.dart
+++ b/tests/compiler/dart2js/rti/data/future_or_generic2.dart
@@ -2,6 +2,8 @@
 // for details. All 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';
 
 /*class: global#Future:deps=[A],implicit=[Future<B<A.T>>],indirect,needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/generic_bounds.dart b/tests/compiler/dart2js/rti/data/generic_bounds.dart
index 4bbc2de..dcfdfbc 100644
--- a/tests/compiler/dart2js/rti/data/generic_bounds.dart
+++ b/tests/compiler/dart2js/rti/data/generic_bounds.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*strong.class: Class1a:explicit=[Class1a]*/
diff --git a/tests/compiler/dart2js/rti/data/generic_class_instantiate.dart b/tests/compiler/dart2js/rti/data/generic_class_instantiate.dart
index 65a7e4d..937ee3e 100644
--- a/tests/compiler/dart2js/rti/data/generic_class_instantiate.dart
+++ b/tests/compiler/dart2js/rti/data/generic_class_instantiate.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:explicit=[B<A>]*/
 class A {}
 
diff --git a/tests/compiler/dart2js/rti/data/generic_class_is.dart b/tests/compiler/dart2js/rti/data/generic_class_is.dart
index fce7f39..46f569d 100644
--- a/tests/compiler/dart2js/rti/data/generic_class_is.dart
+++ b/tests/compiler/dart2js/rti/data/generic_class_is.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:implicit=[A]*/
 class A {}
 
diff --git a/tests/compiler/dart2js/rti/data/generic_class_is2.dart b/tests/compiler/dart2js/rti/data/generic_class_is2.dart
index 7c15011..1f60af6 100644
--- a/tests/compiler/dart2js/rti/data/generic_class_is2.dart
+++ b/tests/compiler/dart2js/rti/data/generic_class_is2.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*class: A:implicit=[List<A<C2>>,List<A<C>>]*/
diff --git a/tests/compiler/dart2js/rti/data/generic_closure_instantiate.dart b/tests/compiler/dart2js/rti/data/generic_closure_instantiate.dart
index cf9db9c..907fc44 100644
--- a/tests/compiler/dart2js/rti/data/generic_closure_instantiate.dart
+++ b/tests/compiler/dart2js/rti/data/generic_closure_instantiate.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:explicit=[B<A>]*/
 class A {}
 
diff --git a/tests/compiler/dart2js/rti/data/generic_creation.dart b/tests/compiler/dart2js/rti/data/generic_creation.dart
index b46fc2f..d0a90fa 100644
--- a/tests/compiler/dart2js/rti/data/generic_creation.dart
+++ b/tests/compiler/dart2js/rti/data/generic_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.7
+
 import "package:expect/expect.dart";
 
 /*class: A:needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/generic_instanceof4.dart b/tests/compiler/dart2js/rti/data/generic_instanceof4.dart
index 84470da..afc5297 100644
--- a/tests/compiler/dart2js/rti/data/generic_instanceof4.dart
+++ b/tests/compiler/dart2js/rti/data/generic_instanceof4.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:deps=[B],direct,explicit=[A.T],needsArgs*/
 class A<T> {
   @pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/rti/data/generic_instanceof4_unused.dart b/tests/compiler/dart2js/rti/data/generic_instanceof4_unused.dart
index 7efc3c1..54d013f 100644
--- a/tests/compiler/dart2js/rti/data/generic_instanceof4_unused.dart
+++ b/tests/compiler/dart2js/rti/data/generic_instanceof4_unused.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:deps=[B],direct,explicit=[A.T],needsArgs*/
 class A<T> {
   @pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/rti/data/generic_method1.dart b/tests/compiler/dart2js/rti/data/generic_method1.dart
index bad6514..6af8aa1 100644
--- a/tests/compiler/dart2js/rti/data/generic_method1.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method1.dart
@@ -2,6 +2,8 @@
 // for details. All 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 "package:expect/expect.dart";
 
 /*class: A:deps=[method2],direct,explicit=[A.T],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/generic_method2.dart b/tests/compiler/dart2js/rti/data/generic_method2.dart
index bfa88fd..7d4afea 100644
--- a/tests/compiler/dart2js/rti/data/generic_method2.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method2.dart
@@ -2,6 +2,8 @@
 // for details. All 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 "package:expect/expect.dart";
 
 /*class: A:deps=[B],direct,explicit=[A.T],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/generic_method3.dart b/tests/compiler/dart2js/rti/data/generic_method3.dart
index 8fceecc..9aa3794 100644
--- a/tests/compiler/dart2js/rti/data/generic_method3.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method3.dart
@@ -2,6 +2,8 @@
 // for details. All 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 "package:expect/expect.dart";
 
 /*class: A:deps=[method2],direct,explicit=[A.T],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/generic_method4.dart b/tests/compiler/dart2js/rti/data/generic_method4.dart
index 7c7fa24..2f6f471 100644
--- a/tests/compiler/dart2js/rti/data/generic_method4.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method4.dart
@@ -2,6 +2,8 @@
 // for details. All 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 "package:expect/expect.dart";
 
 /*class: A:deps=[C.method2],direct,explicit=[A.T],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/generic_method_instantiate.dart b/tests/compiler/dart2js/rti/data/generic_method_instantiate.dart
index 8404071..3599e85 100644
--- a/tests/compiler/dart2js/rti/data/generic_method_instantiate.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method_instantiate.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:explicit=[B<A>]*/
 class A {}
 
diff --git a/tests/compiler/dart2js/rti/data/generic_method_is.dart b/tests/compiler/dart2js/rti/data/generic_method_is.dart
index 2012cdf..8f24a5d 100644
--- a/tests/compiler/dart2js/rti/data/generic_method_is.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method_is.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.member: method:direct,explicit=[method.T],needsArgs*/
 /*omit.member: method:direct,explicit=[method.T],needsArgs*/
 method<T>(T t) => t is T;
diff --git a/tests/compiler/dart2js/rti/data/generic_method_is2.dart b/tests/compiler/dart2js/rti/data/generic_method_is2.dart
index a415e06..de364f3 100644
--- a/tests/compiler/dart2js/rti/data/generic_method_is2.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method_is2.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A1:implicit=[A1]*/
 class A1 {}
 
diff --git a/tests/compiler/dart2js/rti/data/generic_method_tearoff.dart b/tests/compiler/dart2js/rti/data/generic_method_tearoff.dart
index 421d6bd..5fff48f 100644
--- a/tests/compiler/dart2js/rti/data/generic_method_tearoff.dart
+++ b/tests/compiler/dart2js/rti/data/generic_method_tearoff.dart
@@ -2,6 +2,8 @@
 // for details. All 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 method1a<T>() => null;
 T method1b<T>() => null;
 
diff --git a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05.dart b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05.dart
index 4a666a0..13c5edd 100644
--- a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05.dart
+++ b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Test derived from language_2/generic_methods_dynamic_test/05
 
 /*omit.class: global#JSArray:deps=[List],explicit=[JSArray],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a.dart b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a.dart
index ea8041b..e0575e5 100644
--- a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a.dart
+++ b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Reduced version of generic_methods_dynamic_05a_strong.
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/rti/data/implicit_as.dart b/tests/compiler/dart2js/rti/data/implicit_as.dart
index 59db5dc..6c76287 100644
--- a/tests/compiler/dart2js/rti/data/implicit_as.dart
+++ b/tests/compiler/dart2js/rti/data/implicit_as.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: C:direct,explicit=[C.T,C<String>],needsArgs*/
 /*omit.class: C:*/
 class C<T> {
diff --git a/tests/compiler/dart2js/rti/data/indirect_through_static.dart b/tests/compiler/dart2js/rti/data/indirect_through_static.dart
index 95fb0c3..f1cc990 100644
--- a/tests/compiler/dart2js/rti/data/indirect_through_static.dart
+++ b/tests/compiler/dart2js/rti/data/indirect_through_static.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: A:implicit=[A]*/
 /*omit.class: A:implicit=[A]*/
 abstract class A {}
diff --git a/tests/compiler/dart2js/rti/data/indirect_type_literal.dart b/tests/compiler/dart2js/rti/data/indirect_type_literal.dart
index bd9a39f..087d10f 100644
--- a/tests/compiler/dart2js/rti/data/indirect_type_literal.dart
+++ b/tests/compiler/dart2js/rti/data/indirect_type_literal.dart
@@ -2,6 +2,8 @@
 // for details. All 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 "package:expect/expect.dart";
 
 class A<T> {}
diff --git a/tests/compiler/dart2js/rti/data/instantiation1.dart b/tests/compiler/dart2js/rti/data/instantiation1.dart
index 930c1ff..bd638dc 100644
--- a/tests/compiler/dart2js/rti/data/instantiation1.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation1.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.member: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
 /*omit.member: f:deps=[B]*/
 int f<T>(T a) => null;
diff --git a/tests/compiler/dart2js/rti/data/instantiation2.dart b/tests/compiler/dart2js/rti/data/instantiation2.dart
index 777fcc0..8c040bc 100644
--- a/tests/compiler/dart2js/rti/data/instantiation2.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation2.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.member: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
 /*omit.member: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
 bool f<T>(T a) => a is T;
diff --git a/tests/compiler/dart2js/rti/data/instantiation3.dart b/tests/compiler/dart2js/rti/data/instantiation3.dart
index f426821..19899d9 100644
--- a/tests/compiler/dart2js/rti/data/instantiation3.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation3.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.member: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
 /*omit.member: f:deps=[B]*/
 int f<T>(T a) => null;
diff --git a/tests/compiler/dart2js/rti/data/instantiation4.dart b/tests/compiler/dart2js/rti/data/instantiation4.dart
index 34948b9..c40ca9c 100644
--- a/tests/compiler/dart2js/rti/data/instantiation4.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation4.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.member: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
 /*omit.member: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
 bool f<T>(T a) => a is T;
diff --git a/tests/compiler/dart2js/rti/data/instantiation5.dart b/tests/compiler/dart2js/rti/data/instantiation5.dart
index 5cde8c6..8f3fb60 100644
--- a/tests/compiler/dart2js/rti/data/instantiation5.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation5.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.member: f:deps=[method],direct,explicit=[f.T],needsArgs,needsInst=[<method.S>]*/
 /*omit.member: f:deps=[method]*/
 int f<T>(T a) => null;
diff --git a/tests/compiler/dart2js/rti/data/instantiation6.dart b/tests/compiler/dart2js/rti/data/instantiation6.dart
index 3ce71b5..212557f 100644
--- a/tests/compiler/dart2js/rti/data/instantiation6.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation6.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.member: f:deps=[method],direct,explicit=[f.T],needsArgs,needsInst=[<method.S>]*/
 /*omit.member: f:deps=[method],direct,explicit=[f.T],needsArgs,needsInst=[<method.S>]*/
 bool f<T>(T a) => a is T;
diff --git a/tests/compiler/dart2js/rti/data/instantiation7.dart b/tests/compiler/dart2js/rti/data/instantiation7.dart
index 87aabd6..2786071 100644
--- a/tests/compiler/dart2js/rti/data/instantiation7.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation7.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.member: f1:deps=[method],direct,explicit=[f1.T],needsArgs,needsInst=[<method.X>]*/
 /*omit.member: f1:deps=[method]*/
 int f1<T>(T a, T b, T c) => null;
diff --git a/tests/compiler/dart2js/rti/data/is_type_variable.dart b/tests/compiler/dart2js/rti/data/is_type_variable.dart
index 7002e52..7d38ee1 100644
--- a/tests/compiler/dart2js/rti/data/is_type_variable.dart
+++ b/tests/compiler/dart2js/rti/data/is_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.7
+
 /*class: A:direct,explicit=[A.T],needsArgs*/
 class A<T> {
   m(T t) => t is T;
diff --git a/tests/compiler/dart2js/rti/data/is_type_variable_super.dart b/tests/compiler/dart2js/rti/data/is_type_variable_super.dart
index 912c9df..6f168e3 100644
--- a/tests/compiler/dart2js/rti/data/is_type_variable_super.dart
+++ b/tests/compiler/dart2js/rti/data/is_type_variable_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.7
+
 class A<T> {}
 
 /*class: B:direct,explicit=[B.T],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/is_type_variable_super_complex.dart b/tests/compiler/dart2js/rti/data/is_type_variable_super_complex.dart
index 6c526d7..fd30e1b 100644
--- a/tests/compiler/dart2js/rti/data/is_type_variable_super_complex.dart
+++ b/tests/compiler/dart2js/rti/data/is_type_variable_super_complex.dart
@@ -2,6 +2,8 @@
 // for details. All 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 A<T> {}
 
 /*class: B:direct,explicit=[B.T],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/list_literal.dart b/tests/compiler/dart2js/rti/data/list_literal.dart
index 1b2d499..b5caf11 100644
--- a/tests/compiler/dart2js/rti/data/list_literal.dart
+++ b/tests/compiler/dart2js/rti/data/list_literal.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: global#List:deps=[Class.m],explicit=[List,List<String>],indirect,needsArgs*/
 /*omit.class: global#List:deps=[Class.m],explicit=[List],indirect,needsArgs*/
 
diff --git a/tests/compiler/dart2js/rti/data/list_to_set.dart b/tests/compiler/dart2js/rti/data/list_to_set.dart
index c448ab9..d5457ee 100644
--- a/tests/compiler/dart2js/rti/data/list_to_set.dart
+++ b/tests/compiler/dart2js/rti/data/list_to_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.7
+
 /*strong.class: global#List:deps=[Class],explicit=[List,List<String>],indirect,needsArgs*/
 /*omit.class: global#List:deps=[Class],explicit=[List],indirect,needsArgs*/
 
diff --git a/tests/compiler/dart2js/rti/data/local_function_generic.dart b/tests/compiler/dart2js/rti/data/local_function_generic.dart
index 10e9a2f..99ea166 100644
--- a/tests/compiler/dart2js/rti/data/local_function_generic.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_generic.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 method1() {
diff --git a/tests/compiler/dart2js/rti/data/local_function_list_literal.dart b/tests/compiler/dart2js/rti/data/local_function_list_literal.dart
index 190c4c5..585ab8b 100644
--- a/tests/compiler/dart2js/rti/data/local_function_list_literal.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_list_literal.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*strong.member: method:implicit=[method.T],indirect,needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/local_function_map_literal.dart b/tests/compiler/dart2js/rti/data/local_function_map_literal.dart
index 6edee72..2aea2bb 100644
--- a/tests/compiler/dart2js/rti/data/local_function_map_literal.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_map_literal.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*strong.class: global#LinkedHashMap:deps=[Map],direct,explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/local_function_signature2.dart b/tests/compiler/dart2js/rti/data/local_function_signature2.dart
index dd0c838..9d38877 100644
--- a/tests/compiler/dart2js/rti/data/local_function_signature2.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_signature2.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 class Class1 {
diff --git a/tests/compiler/dart2js/rti/data/local_function_signatures.dart b/tests/compiler/dart2js/rti/data/local_function_signatures.dart
index 705a077..f963ae0 100644
--- a/tests/compiler/dart2js/rti/data/local_function_signatures.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_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.7
+
 import 'package:expect/expect.dart';
 
 class Class1 {
diff --git a/tests/compiler/dart2js/rti/data/local_function_signatures_generic.dart b/tests/compiler/dart2js/rti/data/local_function_signatures_generic.dart
index 80eed74..0f38f17 100644
--- a/tests/compiler/dart2js/rti/data/local_function_signatures_generic.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_signatures_generic.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 class Class1 {
diff --git a/tests/compiler/dart2js/rti/data/map_literal.dart b/tests/compiler/dart2js/rti/data/map_literal.dart
index 2c7349d..3472e19 100644
--- a/tests/compiler/dart2js/rti/data/map_literal.dart
+++ b/tests/compiler/dart2js/rti/data/map_literal.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*omit.class: global#Map:*/
 /*strong.class: global#Map:explicit=[Map],indirect,needsArgs*/
 
diff --git a/tests/compiler/dart2js/rti/data/map_to_set.dart b/tests/compiler/dart2js/rti/data/map_to_set.dart
index 28e5bf2..127552a 100644
--- a/tests/compiler/dart2js/rti/data/map_to_set.dart
+++ b/tests/compiler/dart2js/rti/data/map_to_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.7
+
 /*omit.class: global#Map:deps=[Class],needsArgs*/
 /*strong.class: global#Map:deps=[Class],explicit=[Map],indirect,needsArgs*/
 
diff --git a/tests/compiler/dart2js/rti/data/method_signatures.dart b/tests/compiler/dart2js/rti/data/method_signatures.dart
index e393181..b8332d1 100644
--- a/tests/compiler/dart2js/rti/data/method_signatures.dart
+++ b/tests/compiler/dart2js/rti/data/method_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.7
+
 import 'package:expect/expect.dart';
 
 class Class1 {
diff --git a/tests/compiler/dart2js/rti/data/method_signatures_generic.dart b/tests/compiler/dart2js/rti/data/method_signatures_generic.dart
index e356581..eb0efc1 100644
--- a/tests/compiler/dart2js/rti/data/method_signatures_generic.dart
+++ b/tests/compiler/dart2js/rti/data/method_signatures_generic.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 class Class1 {
diff --git a/tests/compiler/dart2js/rti/data/no_such_method1.dart b/tests/compiler/dart2js/rti/data/no_such_method1.dart
index da65384..93be16b 100644
--- a/tests/compiler/dart2js/rti/data/no_such_method1.dart
+++ b/tests/compiler/dart2js/rti/data/no_such_method1.dart
@@ -2,6 +2,8 @@
 // for details. All 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 C {
   /*member: C.noSuchMethod:needsArgs,selectors=[Selector(call, call, arity=0, types=2),Selector(call, foo, arity=0, types=2)]*/
   noSuchMethod(i) => i.typeArguments;
diff --git a/tests/compiler/dart2js/rti/data/no_such_method2.dart b/tests/compiler/dart2js/rti/data/no_such_method2.dart
index 8b27c38..0d22825 100644
--- a/tests/compiler/dart2js/rti/data/no_such_method2.dart
+++ b/tests/compiler/dart2js/rti/data/no_such_method2.dart
@@ -2,6 +2,8 @@
 // for details. All 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 C {
   /*member: C.noSuchMethod:needsArgs,selectors=[Selector(call, call, arity=0, types=2),Selector(call, foo, arity=0, types=2)]*/
   noSuchMethod(i) => i.typeArguments;
diff --git a/tests/compiler/dart2js/rti/data/no_such_method3.dart b/tests/compiler/dart2js/rti/data/no_such_method3.dart
index a6ba3c7..f25295b 100644
--- a/tests/compiler/dart2js/rti/data/no_such_method3.dart
+++ b/tests/compiler/dart2js/rti/data/no_such_method3.dart
@@ -2,6 +2,8 @@
 // for details. All 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 C {
   /*member: C.noSuchMethod:*/
   noSuchMethod(i) => null;
diff --git a/tests/compiler/dart2js/rti/data/pragma_directives_instance.dart b/tests/compiler/dart2js/rti/data/pragma_directives_instance.dart
index 1d245c1..51c3d8b 100644
--- a/tests/compiler/dart2js/rti/data/pragma_directives_instance.dart
+++ b/tests/compiler/dart2js/rti/data/pragma_directives_instance.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   var c = new Class();
   c.method1a(null);
diff --git a/tests/compiler/dart2js/rti/data/pragma_directives_static.dart b/tests/compiler/dart2js/rti/data/pragma_directives_static.dart
index b923edb..4a44a16 100644
--- a/tests/compiler/dart2js/rti/data/pragma_directives_static.dart
+++ b/tests/compiler/dart2js/rti/data/pragma_directives_static.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   method1a(null);
   method1b(null);
diff --git a/tests/compiler/dart2js/rti/data/private_dynamic.dart b/tests/compiler/dart2js/rti/data/private_dynamic.dart
index fb5ca94..135d54c 100644
--- a/tests/compiler/dart2js/rti/data/private_dynamic.dart
+++ b/tests/compiler/dart2js/rti/data/private_dynamic.dart
@@ -2,6 +2,8 @@
 // for details. All 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 C {
   /*member: C._private:direct,explicit=[_private.T],needsArgs,selectors=[Selector(call, _private, arity=1, types=1)]*/
   _private<T>(t) => t is T;
diff --git a/tests/compiler/dart2js/rti/data/private_dynamic2.dart b/tests/compiler/dart2js/rti/data/private_dynamic2.dart
index 5612fbf..d682df3 100644
--- a/tests/compiler/dart2js/rti/data/private_dynamic2.dart
+++ b/tests/compiler/dart2js/rti/data/private_dynamic2.dart
@@ -2,6 +2,8 @@
 // for details. All 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 C {
   /*member: C._private:deps=[D._private2],direct,explicit=[_private.T],needsArgs,selectors=[Selector(call, _private, arity=1, types=1)]*/
   _private<T>(t) => t is T;
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals1.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals1.dart
index 08cc7bf..a42deee 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals1.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals1.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*strong.class: Class:*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals2.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals2.dart
index c7cc1f4..c44c1f7 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals2.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals2.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*strong.class: Class:*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals3.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals3.dart
index e586484..230f46f 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals3.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals3.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 String method() => null;
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals4.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals4.dart
index d219396..43358cb 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals4.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals4.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*strong.class: Class1:*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals5.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals5.dart
index 62858b0..e2cd3bd 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals5.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals5.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*omit.class: Class1:needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals6.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals6.dart
index f469a25..77593d4 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals6.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals6.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*strong.member: method1a:*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart
index db76621..198424c 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*member: method1a:*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart
index a7b639a..5656b34 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*strong.class: Class1:*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string1.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string1.dart
index a1acdd3..cc64617 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string1.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string1.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: Class:*/
 /*omit.class: Class:*/
 class Class<T> {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string2.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string2.dart
index 041b311..e79d08a 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string2.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string2.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: Class:*/
 /*omit.class: Class:*/
 class Class<T> {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string3.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string3.dart
index 9d80812..d1d3744 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string3.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string3.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: Class1:needsArgs*/
 /*omit.class: Class1:*/
 class Class1<T> {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart
index f4511ea..cb5ab6e 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart
@@ -2,6 +2,8 @@
 // for details. All 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: Class1:*/
 class Class1 {
   /*member: Class1.:*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string5.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string5.dart
index 20026ba..ef8ea71 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string5.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string5.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: Class:*/
 /*omit.class: Class:*/
 class Class<T> {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart
index fa6db4d..1e1bce8 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart
@@ -2,6 +2,8 @@
 // for details. All 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:*/
 class Class<T> {
   /*member: Class.:*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart
index bf0d3e2..cc6dfc5 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*class: Class1a:needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart
index 77b9099..77abea4 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*class: Class1a:needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart
index c290ac6..5b030ba 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*class: Class1a:needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart
index 5e77f79..9892440 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*class: Class1a:needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals5.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals5.dart
index c1db9ed..b7b1d2c 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals5.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals5.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*strong.class: Class1a:explicit=[Class1a]*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals6.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals6.dart
index f0cca27..8482f3d 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals6.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals6.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*strong.class: Class1a:explicit=[Class1a],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals7.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals7.dart
index 8639733..980f832 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals7.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals7.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*strong.class: Class1a:explicit=[Class1a]*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string1.dart b/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string1.dart
index 282d501..36de144 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string1.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string1.dart
@@ -2,6 +2,8 @@
 // for details. All 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: global#instantiate1:needsArgs*/
 
 main() {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string2.dart b/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string2.dart
index 22ddfb3..2b1fc09 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string2.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string2.dart
@@ -2,6 +2,8 @@
 // for details. All 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: global#instantiate1:needsArgs*/
 
 /*strong.member: id:direct,explicit=[id.T],needsArgs,needsInst=[<int>]*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string3.dart b/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string3.dart
index 222eb2b..0060b4c 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string3.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string3.dart
@@ -2,6 +2,8 @@
 // for details. All 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: global#instantiate1:needsArgs*/
 
 class Class {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string1.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string1.dart
index 70f0f95..33499d6 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string1.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string1.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: Class1:*/
 /*omit.class: Class1:*/
 class Class1 {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string2.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string2.dart
index d8efa16..b2f2adb 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string2.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string2.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: Class1:needsArgs*/
 /*omit.class: Class1:*/
 class Class1<T> {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string3.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string3.dart
index baf98d4..2fa2623 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string3.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string3.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: Class1:needsArgs*/
 /*omit.class: Class1:*/
 class Class1<T> {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string4.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string4.dart
index 77babb9..75ce88e 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string4.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string4.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: Class1:needsArgs*/
 /*omit.class: Class1:*/
 class Class1<T> {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string5.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string5.dart
index 235b8be..520fbb6 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string5.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string5.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: Class1:needsArgs*/
 /*omit.class: Class1:*/
 class Class1<T> {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart
index b312960..8272616 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: Class1:needsArgs*/
 /*omit.class: Class1:*/
 class Class1<T> {
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string7.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string7.dart
index 70f0f95..33499d6 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string7.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string7.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: Class1:*/
 /*omit.class: Class1:*/
 class Class1 {
diff --git a/tests/compiler/dart2js/rti/data/subclass.dart b/tests/compiler/dart2js/rti/data/subclass.dart
index 2631e8e..d6b8a6e 100644
--- a/tests/compiler/dart2js/rti/data/subclass.dart
+++ b/tests/compiler/dart2js/rti/data/subclass.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:explicit=[A<int>],needsArgs*/
 class A<T> {}
 
diff --git a/tests/compiler/dart2js/rti/data/subclass_fixed.dart b/tests/compiler/dart2js/rti/data/subclass_fixed.dart
index 3dcf303..df179af 100644
--- a/tests/compiler/dart2js/rti/data/subclass_fixed.dart
+++ b/tests/compiler/dart2js/rti/data/subclass_fixed.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:explicit=[A<int>],needsArgs*/
 class A<T> {}
 
diff --git a/tests/compiler/dart2js/rti/data/subtype_named_args.dart b/tests/compiler/dart2js/rti/data/subtype_named_args.dart
index 5e6bbe2..905ab05 100644
--- a/tests/compiler/dart2js/rti/data/subtype_named_args.dart
+++ b/tests/compiler/dart2js/rti/data/subtype_named_args.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // From co19/Language/Types/Function_Types/subtype_named_args_t02.
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/rti/data/subtype_named_args1.dart b/tests/compiler/dart2js/rti/data/subtype_named_args1.dart
index 5af335e..dc140e4 100644
--- a/tests/compiler/dart2js/rti/data/subtype_named_args1.dart
+++ b/tests/compiler/dart2js/rti/data/subtype_named_args1.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // From co19/Language/Types/Function_Types/subtype_named_args_t01.
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/rti/data/superclass.dart b/tests/compiler/dart2js/rti/data/superclass.dart
index bc3c6ff..9dfda6e 100644
--- a/tests/compiler/dart2js/rti/data/superclass.dart
+++ b/tests/compiler/dart2js/rti/data/superclass.dart
@@ -2,6 +2,8 @@
 // for details. All 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 A<T> {}
 
 /*class: B:explicit=[B<int>],needsArgs*/
diff --git a/tests/compiler/dart2js/rti/data/tear_off.dart b/tests/compiler/dart2js/rti/data/tear_off.dart
index f2c56b1..b2ae3a3 100644
--- a/tests/compiler/dart2js/rti/data/tear_off.dart
+++ b/tests/compiler/dart2js/rti/data/tear_off.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:*/
 class A<T> {
   /*member: A.m:*/
diff --git a/tests/compiler/dart2js/rti/data/tear_off_generic.dart b/tests/compiler/dart2js/rti/data/tear_off_generic.dart
index b3689bb..fea635a 100644
--- a/tests/compiler/dart2js/rti/data/tear_off_generic.dart
+++ b/tests/compiler/dart2js/rti/data/tear_off_generic.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: A:direct,explicit=[A.T],needsArgs*/
 /*omit.class: A:*/
 class A<T> {
diff --git a/tests/compiler/dart2js/rti/data/type_argument_substitution.dart b/tests/compiler/dart2js/rti/data/type_argument_substitution.dart
index 635ad13..869bbdf 100644
--- a/tests/compiler/dart2js/rti/data/type_argument_substitution.dart
+++ b/tests/compiler/dart2js/rti/data/type_argument_substitution.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Test that substitutions are emitted for classes that are only used as
 // type arguments.
 
diff --git a/tests/compiler/dart2js/rti/data/type_literal.dart b/tests/compiler/dart2js/rti/data/type_literal.dart
index 972268e..fcce34e 100644
--- a/tests/compiler/dart2js/rti/data/type_literal.dart
+++ b/tests/compiler/dart2js/rti/data/type_literal.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:exp,needsArgs*/
 class A<T> {
   instanceMethod() => T;
diff --git a/tests/compiler/dart2js/rti/data/type_literal2.dart b/tests/compiler/dart2js/rti/data/type_literal2.dart
index a1e3e6b..687bca2 100644
--- a/tests/compiler/dart2js/rti/data/type_literal2.dart
+++ b/tests/compiler/dart2js/rti/data/type_literal2.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:deps=[B],exp,needsArgs*/
 class A<T> {
   method1() => T;
diff --git a/tests/compiler/dart2js/rti/data/type_literal_generic.dart b/tests/compiler/dart2js/rti/data/type_literal_generic.dart
index dde4860..66d98f0 100644
--- a/tests/compiler/dart2js/rti/data/type_literal_generic.dart
+++ b/tests/compiler/dart2js/rti/data/type_literal_generic.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:exp,needsArgs*/
 class A<T> {
   instanceMethod() => T;
diff --git a/tests/compiler/dart2js/rti/data/type_variable_function_type.dart b/tests/compiler/dart2js/rti/data/type_variable_function_type.dart
index b4a7f70..e40a848 100644
--- a/tests/compiler/dart2js/rti/data/type_variable_function_type.dart
+++ b/tests/compiler/dart2js/rti/data/type_variable_function_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.7
+
 // Based on tests\language_2\type_variable_function_type_test.dart
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/rti/disable_rti_test.dart b/tests/compiler/dart2js/rti/disable_rti_test.dart
index e02891c..6bbeb2f 100644
--- a/tests/compiler/dart2js/rti/disable_rti_test.dart
+++ b/tests/compiler/dart2js/rti/disable_rti_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/common_elements.dart';
diff --git a/tests/compiler/dart2js/rti/emission/arguments.dart b/tests/compiler/dart2js/rti/emission/arguments.dart
index 04e10ed..215e20c 100644
--- a/tests/compiler/dart2js/rti/emission/arguments.dart
+++ b/tests/compiler/dart2js/rti/emission/arguments.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:checkedTypeArgument,checks=[],typeArgument*/
 class A {}
 
diff --git a/tests/compiler/dart2js/rti/emission/call.dart b/tests/compiler/dart2js/rti/emission/call.dart
index 44f562a..921de31 100644
--- a/tests/compiler/dart2js/rti/emission/call.dart
+++ b/tests/compiler/dart2js/rti/emission/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.7
+
 import 'package:expect/expect.dart';
 
 /*class: A:checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/call_typed.dart b/tests/compiler/dart2js/rti/emission/call_typed.dart
index 9688991..ab3dbfe 100644
--- a/tests/compiler/dart2js/rti/emission/call_typed.dart
+++ b/tests/compiler/dart2js/rti/emission/call_typed.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*class: A:checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/call_typed_generic.dart b/tests/compiler/dart2js/rti/emission/call_typed_generic.dart
index 1d3bfea..c80f395 100644
--- a/tests/compiler/dart2js/rti/emission/call_typed_generic.dart
+++ b/tests/compiler/dart2js/rti/emission/call_typed_generic.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*class: A:checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/closure_function.dart b/tests/compiler/dart2js/rti/emission/closure_function.dart
index 86101d9..d478691 100644
--- a/tests/compiler/dart2js/rti/emission/closure_function.dart
+++ b/tests/compiler/dart2js/rti/emission/closure_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.7
+
 @pragma('dart2js:noInline')
 test(o) => o is Function;
 
diff --git a/tests/compiler/dart2js/rti/emission/closure_function_type.dart b/tests/compiler/dart2js/rti/emission/closure_function_type.dart
index 374d99e..6436a12 100644
--- a/tests/compiler/dart2js/rti/emission/closure_function_type.dart
+++ b/tests/compiler/dart2js/rti/emission/closure_function_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.7
+
 @pragma('dart2js:noInline')
 test(o) => o is Function();
 
diff --git a/tests/compiler/dart2js/rti/emission/closure_signature.dart b/tests/compiler/dart2js/rti/emission/closure_signature.dart
index 8a4589a..ca68239 100644
--- a/tests/compiler/dart2js/rti/emission/closure_signature.dart
+++ b/tests/compiler/dart2js/rti/emission/closure_signature.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:checks=[],instance*/
 class A<T> {
   @pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart b/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart
index c292b18..28e2660 100644
--- a/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart
+++ b/tests/compiler/dart2js/rti/emission/closure_signature_unneeded.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:checks=[],instance*/
 class A<T> {
   @pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/rti/emission/constructor_argument_static.dart b/tests/compiler/dart2js/rti/emission/constructor_argument_static.dart
index 97c2abe..097a0ce9 100644
--- a/tests/compiler/dart2js/rti/emission/constructor_argument_static.dart
+++ b/tests/compiler/dart2js/rti/emission/constructor_argument_static.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: A1:checkedInstance,checks=[],instance*/
 /*omit.class: A1:checks=[],instance*/
 class A1 {}
diff --git a/tests/compiler/dart2js/rti/emission/dynamic_instance.dart b/tests/compiler/dart2js/rti/emission/dynamic_instance.dart
index 3f455c0..0f3a503 100644
--- a/tests/compiler/dart2js/rti/emission/dynamic_instance.dart
+++ b/tests/compiler/dart2js/rti/emission/dynamic_instance.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*class: B:checkedInstance,checks=[],typeArgument*/
diff --git a/tests/compiler/dart2js/rti/emission/dynamic_type_argument.dart b/tests/compiler/dart2js/rti/emission/dynamic_type_argument.dart
index c3270bb..6837723 100644
--- a/tests/compiler/dart2js/rti/emission/dynamic_type_argument.dart
+++ b/tests/compiler/dart2js/rti/emission/dynamic_type_argument.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*class: A:checkedInstance,checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/dynamic_type_literal.dart b/tests/compiler/dart2js/rti/emission/dynamic_type_literal.dart
index 66d91cf..0d26a10 100644
--- a/tests/compiler/dart2js/rti/emission/dynamic_type_literal.dart
+++ b/tests/compiler/dart2js/rti/emission/dynamic_type_literal.dart
@@ -2,6 +2,8 @@
 // for details. All 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: global#Type:checks=[],instance,typeLiteral*/
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/rti/emission/event_callback.dart b/tests/compiler/dart2js/rti/emission/event_callback.dart
index 4273b86..288d1da 100644
--- a/tests/compiler/dart2js/rti/emission/event_callback.dart
+++ b/tests/compiler/dart2js/rti/emission/event_callback.dart
@@ -2,6 +2,8 @@
 // for details. All 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:html';
 
 /*strong.class: global#Event:checkedInstance,checkedTypeArgument,checks=[$isEvent],instance,typeArgument*/
diff --git a/tests/compiler/dart2js/rti/emission/fixed_type_argument.dart b/tests/compiler/dart2js/rti/emission/fixed_type_argument.dart
index 0d862eb..e636027 100644
--- a/tests/compiler/dart2js/rti/emission/fixed_type_argument.dart
+++ b/tests/compiler/dart2js/rti/emission/fixed_type_argument.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: A:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
 /*omit.class: A:checkedTypeArgument,checks=[],typeArgument*/
 class A {}
diff --git a/tests/compiler/dart2js/rti/emission/fixed_type_argument_implements.dart b/tests/compiler/dart2js/rti/emission/fixed_type_argument_implements.dart
index a7f3624..b5bdbee 100644
--- a/tests/compiler/dart2js/rti/emission/fixed_type_argument_implements.dart
+++ b/tests/compiler/dart2js/rti/emission/fixed_type_argument_implements.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Test that we emit the relation between B and A even when B is only live
 // as a type argument through the supertype of D.
 
diff --git a/tests/compiler/dart2js/rti/emission/function_type_argument.dart b/tests/compiler/dart2js/rti/emission/function_type_argument.dart
index 3b1ae5d..f674415 100644
--- a/tests/compiler/dart2js/rti/emission/function_type_argument.dart
+++ b/tests/compiler/dart2js/rti/emission/function_type_argument.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*strong.class: C:checkedInstance,checks=[],instance,typeArgument*/
diff --git a/tests/compiler/dart2js/rti/emission/function_typed_arguments.dart b/tests/compiler/dart2js/rti/emission/function_typed_arguments.dart
index 60796eb..58d5f14 100644
--- a/tests/compiler/dart2js/rti/emission/function_typed_arguments.dart
+++ b/tests/compiler/dart2js/rti/emission/function_typed_arguments.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*class: A:checkedInstance,checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/future_or.dart b/tests/compiler/dart2js/rti/emission/future_or.dart
index 4e5bf95..61a2b8d 100644
--- a/tests/compiler/dart2js/rti/emission/future_or.dart
+++ b/tests/compiler/dart2js/rti/emission/future_or.dart
@@ -2,6 +2,8 @@
 // for details. All 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';
 import 'package:expect/expect.dart';
 
diff --git a/tests/compiler/dart2js/rti/emission/future_or_as_type_argument.dart b/tests/compiler/dart2js/rti/emission/future_or_as_type_argument.dart
index 837f824..2b718e3 100644
--- a/tests/compiler/dart2js/rti/emission/future_or_as_type_argument.dart
+++ b/tests/compiler/dart2js/rti/emission/future_or_as_type_argument.dart
@@ -2,6 +2,8 @@
 // for details. All 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';
 
 /*class: global#Future:checks=[],typeArgument*/
diff --git a/tests/compiler/dart2js/rti/emission/future_or_future_or.dart b/tests/compiler/dart2js/rti/emission/future_or_future_or.dart
index dfd18b3..55abe4b 100644
--- a/tests/compiler/dart2js/rti/emission/future_or_future_or.dart
+++ b/tests/compiler/dart2js/rti/emission/future_or_future_or.dart
@@ -2,6 +2,8 @@
 // for details. All 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';
 import 'package:expect/expect.dart';
 
diff --git a/tests/compiler/dart2js/rti/emission/future_or_future_or_generic.dart b/tests/compiler/dart2js/rti/emission/future_or_future_or_generic.dart
index 5a6b425..db1eceb 100644
--- a/tests/compiler/dart2js/rti/emission/future_or_future_or_generic.dart
+++ b/tests/compiler/dart2js/rti/emission/future_or_future_or_generic.dart
@@ -2,6 +2,8 @@
 // for details. All 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';
 import 'package:expect/expect.dart';
 
diff --git a/tests/compiler/dart2js/rti/emission/future_or_generic.dart b/tests/compiler/dart2js/rti/emission/future_or_generic.dart
index b97e5e2..95dd12f 100644
--- a/tests/compiler/dart2js/rti/emission/future_or_generic.dart
+++ b/tests/compiler/dart2js/rti/emission/future_or_generic.dart
@@ -2,6 +2,8 @@
 // for details. All 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';
 import 'package:expect/expect.dart';
 
diff --git a/tests/compiler/dart2js/rti/emission/future_or_generic2.dart b/tests/compiler/dart2js/rti/emission/future_or_generic2.dart
index 68eca4a..bd21431 100644
--- a/tests/compiler/dart2js/rti/emission/future_or_generic2.dart
+++ b/tests/compiler/dart2js/rti/emission/future_or_generic2.dart
@@ -2,6 +2,8 @@
 // for details. All 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';
 import 'package:expect/expect.dart';
 
diff --git a/tests/compiler/dart2js/rti/emission/future_or_type_argument.dart b/tests/compiler/dart2js/rti/emission/future_or_type_argument.dart
index 756d26f..e5db913 100644
--- a/tests/compiler/dart2js/rti/emission/future_or_type_argument.dart
+++ b/tests/compiler/dart2js/rti/emission/future_or_type_argument.dart
@@ -2,6 +2,8 @@
 // for details. All 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';
 import 'package:expect/expect.dart';
 
diff --git a/tests/compiler/dart2js/rti/emission/generic_instanceof4.dart b/tests/compiler/dart2js/rti/emission/generic_instanceof4.dart
index 6d2b263..c228394 100644
--- a/tests/compiler/dart2js/rti/emission/generic_instanceof4.dart
+++ b/tests/compiler/dart2js/rti/emission/generic_instanceof4.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:checks=[],instance*/
 class A<T> {
   @pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/rti/emission/generic_methods_dynamic_02.dart b/tests/compiler/dart2js/rti/emission/generic_methods_dynamic_02.dart
index 947dcca..0241ff4 100644
--- a/tests/compiler/dart2js/rti/emission/generic_methods_dynamic_02.dart
+++ b/tests/compiler/dart2js/rti/emission/generic_methods_dynamic_02.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Based on language/generic_methods_dynamic_test/02
 
 library generic_methods_dynamic_test;
diff --git a/tests/compiler/dart2js/rti/emission/indirect_through_static.dart b/tests/compiler/dart2js/rti/emission/indirect_through_static.dart
index 3571daa..5a70d24 100644
--- a/tests/compiler/dart2js/rti/emission/indirect_through_static.dart
+++ b/tests/compiler/dart2js/rti/emission/indirect_through_static.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: A:checkedInstance,checks=[],typeArgument*/
 /*omit.class: A:checkedInstance,checks=[],typeArgument*/
 abstract class A {}
diff --git a/tests/compiler/dart2js/rti/emission/inherited_is.dart b/tests/compiler/dart2js/rti/emission/inherited_is.dart
index e240c7d..608ae74 100644
--- a/tests/compiler/dart2js/rti/emission/inherited_is.dart
+++ b/tests/compiler/dart2js/rti/emission/inherited_is.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*class: A:checkedInstance*/
diff --git a/tests/compiler/dart2js/rti/emission/inherited_is2.dart b/tests/compiler/dart2js/rti/emission/inherited_is2.dart
index 95c1993..c63bcad 100644
--- a/tests/compiler/dart2js/rti/emission/inherited_is2.dart
+++ b/tests/compiler/dart2js/rti/emission/inherited_is2.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*class: A:checkedInstance*/
diff --git a/tests/compiler/dart2js/rti/emission/jsinterop.dart b/tests/compiler/dart2js/rti/emission/jsinterop.dart
index 9cadf45..422ece1 100644
--- a/tests/compiler/dart2js/rti/emission/jsinterop.dart
+++ b/tests/compiler/dart2js/rti/emission/jsinterop.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 @JS()
 library jsinterop;
 
diff --git a/tests/compiler/dart2js/rti/emission/jsinterop_generic.dart b/tests/compiler/dart2js/rti/emission/jsinterop_generic.dart
index 1a38ffe..60ab4ae 100644
--- a/tests/compiler/dart2js/rti/emission/jsinterop_generic.dart
+++ b/tests/compiler/dart2js/rti/emission/jsinterop_generic.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // dart2jsOptions=--strong
 
 @JS()
diff --git a/tests/compiler/dart2js/rti/emission/jsinterop_generic_factory_args.dart b/tests/compiler/dart2js/rti/emission/jsinterop_generic_factory_args.dart
index cd2577a..65a16f8 100644
--- a/tests/compiler/dart2js/rti/emission/jsinterop_generic_factory_args.dart
+++ b/tests/compiler/dart2js/rti/emission/jsinterop_generic_factory_args.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // dart2jsOptions=--strong
 
 @JS()
diff --git a/tests/compiler/dart2js/rti/emission/list.dart b/tests/compiler/dart2js/rti/emission/list.dart
index 6dc93d8..6efdf08 100644
--- a/tests/compiler/dart2js/rti/emission/list.dart
+++ b/tests/compiler/dart2js/rti/emission/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.7
+
 /*strong.class: A:checkedInstance,checkedTypeArgument,checks=[],typeArgument*/
 /*omit.class: A:checkedTypeArgument,checks=[],typeArgument*/
 /*strong.class: global#JSArray:checkedInstance,checks=[$isIterable],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/local_function_list_literal.dart b/tests/compiler/dart2js/rti/emission/local_function_list_literal.dart
index a873118..7573410 100644
--- a/tests/compiler/dart2js/rti/emission/local_function_list_literal.dart
+++ b/tests/compiler/dart2js/rti/emission/local_function_list_literal.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*strong.class: global#JSArray:checkedInstance,checks=[$isIterable,$isList],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/local_function_map_literal.dart b/tests/compiler/dart2js/rti/emission/local_function_map_literal.dart
index 080f72b..03ec2a1 100644
--- a/tests/compiler/dart2js/rti/emission/local_function_map_literal.dart
+++ b/tests/compiler/dart2js/rti/emission/local_function_map_literal.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*class: global#JsLinkedHashMap:checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/map_literal.dart b/tests/compiler/dart2js/rti/emission/map_literal.dart
index 66a1309..273331d 100644
--- a/tests/compiler/dart2js/rti/emission/map_literal.dart
+++ b/tests/compiler/dart2js/rti/emission/map_literal.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: global#Map:instance*/
 
 /*class: global#LinkedHashMap:*/
diff --git a/tests/compiler/dart2js/rti/emission/mixin_mixin2.dart b/tests/compiler/dart2js/rti/emission/mixin_mixin2.dart
index 578d0e1..fb95f94 100644
--- a/tests/compiler/dart2js/rti/emission/mixin_mixin2.dart
+++ b/tests/compiler/dart2js/rti/emission/mixin_mixin2.dart
@@ -2,6 +2,8 @@
 // for details. All 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 "package:expect/expect.dart";
 
 /*class: M:checks=[]*/
diff --git a/tests/compiler/dart2js/rti/emission/mixin_mixin4.dart b/tests/compiler/dart2js/rti/emission/mixin_mixin4.dart
index 0831234..e77b220 100644
--- a/tests/compiler/dart2js/rti/emission/mixin_mixin4.dart
+++ b/tests/compiler/dart2js/rti/emission/mixin_mixin4.dart
@@ -2,6 +2,8 @@
 // for details. All 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 "package:expect/expect.dart";
 
 /*class: I:checkedInstance*/
diff --git a/tests/compiler/dart2js/rti/emission/mixin_subtype.dart b/tests/compiler/dart2js/rti/emission/mixin_subtype.dart
index 2fe7a05..168c6da 100644
--- a/tests/compiler/dart2js/rti/emission/mixin_subtype.dart
+++ b/tests/compiler/dart2js/rti/emission/mixin_subtype.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Derived from language_2/mixin_declaration/mixin_declaration_subtype_test.
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js/rti/emission/mixin_type_arguments.dart b/tests/compiler/dart2js/rti/emission/mixin_type_arguments.dart
index 044ba38..8a62cab 100644
--- a/tests/compiler/dart2js/rti/emission/mixin_type_arguments.dart
+++ b/tests/compiler/dart2js/rti/emission/mixin_type_arguments.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart' show Expect;
 
 /*class: A:checks=[],typeArgument*/
diff --git a/tests/compiler/dart2js/rti/emission/native.dart b/tests/compiler/dart2js/rti/emission/native.dart
index 02698ba..6e75a73 100644
--- a/tests/compiler/dart2js/rti/emission/native.dart
+++ b/tests/compiler/dart2js/rti/emission/native.dart
@@ -2,6 +2,8 @@
 // for details. All 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 "package:expect/expect.dart";
 // ignore: import_internal_library
 import 'dart:_js_helper' show Native;
diff --git a/tests/compiler/dart2js/rti/emission/pragma_directives_instance.dart b/tests/compiler/dart2js/rti/emission/pragma_directives_instance.dart
index c241513..08e2dbbd 100644
--- a/tests/compiler/dart2js/rti/emission/pragma_directives_instance.dart
+++ b/tests/compiler/dart2js/rti/emission/pragma_directives_instance.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 @pragma('dart2js:noInline')
 @pragma('dart2js:assumeDynamic')
 value(o) => o;
diff --git a/tests/compiler/dart2js/rti/emission/pragma_directives_static.dart b/tests/compiler/dart2js/rti/emission/pragma_directives_static.dart
index 379ea28..36f671d 100644
--- a/tests/compiler/dart2js/rti/emission/pragma_directives_static.dart
+++ b/tests/compiler/dart2js/rti/emission/pragma_directives_static.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 @pragma('dart2js:noInline')
 @pragma('dart2js:assumeDynamic')
 value(o) => o;
diff --git a/tests/compiler/dart2js/rti/emission/regress_18713.dart b/tests/compiler/dart2js/rti/emission/regress_18713.dart
index 212e67b..6bd17d3 100644
--- a/tests/compiler/dart2js/rti/emission/regress_18713.dart
+++ b/tests/compiler/dart2js/rti/emission/regress_18713.dart
@@ -2,6 +2,8 @@
 // for details. All 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 "package:expect/expect.dart";
 
 /*class: T:checks=[],indirectInstance*/
diff --git a/tests/compiler/dart2js/rti/emission/replaced_type_variable.dart b/tests/compiler/dart2js/rti/emission/replaced_type_variable.dart
index 778a75e..6d75642 100644
--- a/tests/compiler/dart2js/rti/emission/replaced_type_variable.dart
+++ b/tests/compiler/dart2js/rti/emission/replaced_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.7
+
 import 'package:expect/expect.dart';
 
 // This class is inlined away.
diff --git a/tests/compiler/dart2js/rti/emission/runtime_type.dart b/tests/compiler/dart2js/rti/emission/runtime_type.dart
index 8e7fd19..2d2b913 100644
--- a/tests/compiler/dart2js/rti/emission/runtime_type.dart
+++ b/tests/compiler/dart2js/rti/emission/runtime_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.7
+
 /*class: A:checks=[],instance*/
 class A<T> {}
 
diff --git a/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string1.dart b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string1.dart
index dc43c4b..668a859 100644
--- a/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string1.dart
+++ b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string1.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   /*strong.checks=[$signature],instance*/
   /*omit.checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string2.dart b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string2.dart
index 2847c31..ab00cba 100644
--- a/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string2.dart
+++ b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string2.dart
@@ -2,6 +2,8 @@
 // for details. All 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 id<T>(T t) => t;
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string3.dart b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string3.dart
index df259f2..326ed8f 100644
--- a/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string3.dart
+++ b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string3.dart
@@ -2,6 +2,8 @@
 // for details. All 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:checks=[],instance*/
 class Class {
   T id<T>(T t) => t;
diff --git a/tests/compiler/dart2js/rti/emission/self.dart b/tests/compiler/dart2js/rti/emission/self.dart
index 07fdeea..bab2585 100644
--- a/tests/compiler/dart2js/rti/emission/self.dart
+++ b/tests/compiler/dart2js/rti/emission/self.dart
@@ -2,6 +2,8 @@
 // for details. All 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: C:checks=[],instance,typeLiteral*/
 class C {}
 
diff --git a/tests/compiler/dart2js/rti/emission/self_generic.dart b/tests/compiler/dart2js/rti/emission/self_generic.dart
index 0d45939..3deb93e 100644
--- a/tests/compiler/dart2js/rti/emission/self_generic.dart
+++ b/tests/compiler/dart2js/rti/emission/self_generic.dart
@@ -2,6 +2,8 @@
 // for details. All 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: C:checkedInstance,checks=[],instance*/
 class C<T> {}
 
diff --git a/tests/compiler/dart2js/rti/emission/static_argument.dart b/tests/compiler/dart2js/rti/emission/static_argument.dart
index f90c477..4230400 100644
--- a/tests/compiler/dart2js/rti/emission/static_argument.dart
+++ b/tests/compiler/dart2js/rti/emission/static_argument.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /*strong.class: I1:*/
 /*omit.class: I1:*/
 class I1 {}
diff --git a/tests/compiler/dart2js/rti/emission/subtype_named_args.dart b/tests/compiler/dart2js/rti/emission/subtype_named_args.dart
index cb83d5e..def20ab 100644
--- a/tests/compiler/dart2js/rti/emission/subtype_named_args.dart
+++ b/tests/compiler/dart2js/rti/emission/subtype_named_args.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // From co19/Language/Types/Function_Types/subtype_named_args_t02.
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/rti/emission/superclass.dart b/tests/compiler/dart2js/rti/emission/superclass.dart
index 0559160..74aa29f 100644
--- a/tests/compiler/dart2js/rti/emission/superclass.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass.dart
@@ -2,6 +2,8 @@
 // for details. All 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:checks=[],indirectInstance,typeLiteral*/
 class B {}
 
diff --git a/tests/compiler/dart2js/rti/emission/superclass_as.dart b/tests/compiler/dart2js/rti/emission/superclass_as.dart
index d6366d3..01f4a3e 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_as.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_as.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*class: A:checkedInstance,checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/superclass_complex.dart b/tests/compiler/dart2js/rti/emission/superclass_complex.dart
index d7c93bd..4513fda 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_complex.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_complex.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:checkedTypeArgument,checks=[],typeArgument*/
 class A<T> {}
 
diff --git a/tests/compiler/dart2js/rti/emission/superclass_fixed.dart b/tests/compiler/dart2js/rti/emission/superclass_fixed.dart
index 8470cd4..1e5c3cf 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_fixed.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_fixed.dart
@@ -2,6 +2,8 @@
 // for details. All 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:checkedInstance,checks=[],indirectInstance*/
 class B<T> {}
 
diff --git a/tests/compiler/dart2js/rti/emission/superclass_supertype.dart b/tests/compiler/dart2js/rti/emission/superclass_supertype.dart
index c9ffe06..3f5b8e6 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_supertype.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_supertype.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:checks=[],indirectInstance*/
 class A {}
 
diff --git a/tests/compiler/dart2js/rti/emission/superclass_supertype_complex.dart b/tests/compiler/dart2js/rti/emission/superclass_supertype_complex.dart
index d69c0d4..b6a325b 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_supertype_complex.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_supertype_complex.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:checkedTypeArgument,checks=[],typeArgument*/
 class A<T> {}
 
diff --git a/tests/compiler/dart2js/rti/emission/superclass_supertype_fixed.dart b/tests/compiler/dart2js/rti/emission/superclass_supertype_fixed.dart
index b6ee559..af0c86f 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_supertype_fixed.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_supertype_fixed.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:checks=[],indirectInstance*/
 class A {}
 
diff --git a/tests/compiler/dart2js/rti/emission/superclass_supertype_trivial.dart b/tests/compiler/dart2js/rti/emission/superclass_supertype_trivial.dart
index 9affb57..26f33ee 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_supertype_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_supertype_trivial.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:checks=[],indirectInstance*/
 class A<T> {}
 
diff --git a/tests/compiler/dart2js/rti/emission/superclass_trivial.dart b/tests/compiler/dart2js/rti/emission/superclass_trivial.dart
index d89f74f..ec80fe7 100644
--- a/tests/compiler/dart2js/rti/emission/superclass_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/superclass_trivial.dart
@@ -2,6 +2,8 @@
 // for details. All 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:checkedInstance,checks=[],indirectInstance*/
 class B<T> {}
 
diff --git a/tests/compiler/dart2js/rti/emission/superclasses_non_trivial.dart b/tests/compiler/dart2js/rti/emission/superclasses_non_trivial.dart
index 3d58258..8f50450 100644
--- a/tests/compiler/dart2js/rti/emission/superclasses_non_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/superclasses_non_trivial.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:checkedInstance,checks=[],indirectInstance*/
 class A<T> {}
 
diff --git a/tests/compiler/dart2js/rti/emission/superclasses_trivial.dart b/tests/compiler/dart2js/rti/emission/superclasses_trivial.dart
index 19ba5cf..b2f9615 100644
--- a/tests/compiler/dart2js/rti/emission/superclasses_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/superclasses_trivial.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:checkedInstance,checks=[],indirectInstance*/
 class A<T> {}
 
diff --git a/tests/compiler/dart2js/rti/emission/supertype.dart b/tests/compiler/dart2js/rti/emission/supertype.dart
index 9eb815b..a1d2918 100644
--- a/tests/compiler/dart2js/rti/emission/supertype.dart
+++ b/tests/compiler/dart2js/rti/emission/supertype.dart
@@ -2,6 +2,8 @@
 // for details. All 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:checkedInstance*/
 class B {}
 
diff --git a/tests/compiler/dart2js/rti/emission/supertype_complex.dart b/tests/compiler/dart2js/rti/emission/supertype_complex.dart
index 5a4b458..d51cf38 100644
--- a/tests/compiler/dart2js/rti/emission/supertype_complex.dart
+++ b/tests/compiler/dart2js/rti/emission/supertype_complex.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:checkedTypeArgument,checks=[],typeArgument*/
 class A<T> {}
 
diff --git a/tests/compiler/dart2js/rti/emission/supertype_fixed.dart b/tests/compiler/dart2js/rti/emission/supertype_fixed.dart
index 2470677..ae2b93a 100644
--- a/tests/compiler/dart2js/rti/emission/supertype_fixed.dart
+++ b/tests/compiler/dart2js/rti/emission/supertype_fixed.dart
@@ -2,6 +2,8 @@
 // for details. All 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:checkedInstance*/
 class B<T> {}
 
diff --git a/tests/compiler/dart2js/rti/emission/supertype_trivial.dart b/tests/compiler/dart2js/rti/emission/supertype_trivial.dart
index 6f44e13..241fa50 100644
--- a/tests/compiler/dart2js/rti/emission/supertype_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/supertype_trivial.dart
@@ -2,6 +2,8 @@
 // for details. All 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:checkedInstance*/
 class B<T> {}
 
diff --git a/tests/compiler/dart2js/rti/emission/supertypes_extends.dart b/tests/compiler/dart2js/rti/emission/supertypes_extends.dart
index 2629ef4..08420e0 100644
--- a/tests/compiler/dart2js/rti/emission/supertypes_extends.dart
+++ b/tests/compiler/dart2js/rti/emission/supertypes_extends.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:checkedInstance*/
 class A {}
 
diff --git a/tests/compiler/dart2js/rti/emission/supertypes_extends2.dart b/tests/compiler/dart2js/rti/emission/supertypes_extends2.dart
index 0c59cc3..d109f6c 100644
--- a/tests/compiler/dart2js/rti/emission/supertypes_extends2.dart
+++ b/tests/compiler/dart2js/rti/emission/supertypes_extends2.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:checkedInstance*/
 class A {}
 
diff --git a/tests/compiler/dart2js/rti/emission/supertypes_extends3.dart b/tests/compiler/dart2js/rti/emission/supertypes_extends3.dart
index 77dc0cb..060f825 100644
--- a/tests/compiler/dart2js/rti/emission/supertypes_extends3.dart
+++ b/tests/compiler/dart2js/rti/emission/supertypes_extends3.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:checkedInstance*/
 class A {}
 
diff --git a/tests/compiler/dart2js/rti/emission/supertypes_implements.dart b/tests/compiler/dart2js/rti/emission/supertypes_implements.dart
index f481105..12578da 100644
--- a/tests/compiler/dart2js/rti/emission/supertypes_implements.dart
+++ b/tests/compiler/dart2js/rti/emission/supertypes_implements.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:checkedInstance*/
 class A {}
 
diff --git a/tests/compiler/dart2js/rti/emission/supertypes_non_trivial.dart b/tests/compiler/dart2js/rti/emission/supertypes_non_trivial.dart
index 04106c5..465a34e 100644
--- a/tests/compiler/dart2js/rti/emission/supertypes_non_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/supertypes_non_trivial.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:checkedInstance,checks=[],indirectInstance*/
 class A<T> {}
 
diff --git a/tests/compiler/dart2js/rti/emission/supertypes_trivial.dart b/tests/compiler/dart2js/rti/emission/supertypes_trivial.dart
index 04429d2..e1f7976 100644
--- a/tests/compiler/dart2js/rti/emission/supertypes_trivial.dart
+++ b/tests/compiler/dart2js/rti/emission/supertypes_trivial.dart
@@ -2,6 +2,8 @@
 // for details. All 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: A:checkedInstance,checks=[],indirectInstance*/
 class A<T> {}
 
diff --git a/tests/compiler/dart2js/rti/emission/tear_off_types.dart b/tests/compiler/dart2js/rti/emission/tear_off_types.dart
index e3b0d2c..4381d93 100644
--- a/tests/compiler/dart2js/rti/emission/tear_off_types.dart
+++ b/tests/compiler/dart2js/rti/emission/tear_off_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.7
+
 import 'package:expect/expect.dart';
 
 main() {
diff --git a/tests/compiler/dart2js/rti/emission/type_argument_dynamic.dart b/tests/compiler/dart2js/rti/emission/type_argument_dynamic.dart
index 1d38ef6..8ff02c5 100644
--- a/tests/compiler/dart2js/rti/emission/type_argument_dynamic.dart
+++ b/tests/compiler/dart2js/rti/emission/type_argument_dynamic.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*class: A:checkedTypeArgument,checks=[],typeArgument*/
diff --git a/tests/compiler/dart2js/rti/emission/type_argument_static.dart b/tests/compiler/dart2js/rti/emission/type_argument_static.dart
index f1c6b64..d4d889b 100644
--- a/tests/compiler/dart2js/rti/emission/type_argument_static.dart
+++ b/tests/compiler/dart2js/rti/emission/type_argument_static.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*class: A:checkedTypeArgument,checks=[],typeArgument*/
diff --git a/tests/compiler/dart2js/rti/emission/type_literal.dart b/tests/compiler/dart2js/rti/emission/type_literal.dart
index e46e083..f14bb65 100644
--- a/tests/compiler/dart2js/rti/emission/type_literal.dart
+++ b/tests/compiler/dart2js/rti/emission/type_literal.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'package:expect/expect.dart';
 
 /*class: Class1:checks=[],typeLiteral*/
diff --git a/tests/compiler/dart2js/rti/emission/type_variable_function_type.dart b/tests/compiler/dart2js/rti/emission/type_variable_function_type.dart
index 44d0e88..5509423 100644
--- a/tests/compiler/dart2js/rti/emission/type_variable_function_type.dart
+++ b/tests/compiler/dart2js/rti/emission/type_variable_function_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.7
+
 // Based on tests/language_2/type_variable_function_type_test.dart
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/rti/factory_call_test.dart b/tests/compiler/dart2js/rti/factory_call_test.dart
index 803b0be..e77adc2 100644
--- a/tests/compiler/dart2js/rti/factory_call_test.dart
+++ b/tests/compiler/dart2js/rti/factory_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js/rti/instance_call_test.dart b/tests/compiler/dart2js/rti/instance_call_test.dart
index 16f5538..6b123c3 100644
--- a/tests/compiler/dart2js/rti/instance_call_test.dart
+++ b/tests/compiler/dart2js/rti/instance_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/common_elements.dart';
diff --git a/tests/compiler/dart2js/rti/is_test_with_type_parameters_test.dart b/tests/compiler/dart2js/rti/is_test_with_type_parameters_test.dart
index aeb8c3d..d174f9a 100644
--- a/tests/compiler/dart2js/rti/is_test_with_type_parameters_test.dart
+++ b/tests/compiler/dart2js/rti/is_test_with_type_parameters_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.7
+
 import "package:expect/expect.dart";
 
 // Tests that is-tests are also available for superclasses if the class is
diff --git a/tests/compiler/dart2js/rti/rti_emission_test.dart b/tests/compiler/dart2js/rti/rti_emission_test.dart
index 6a920a4..66364a9 100644
--- a/tests/compiler/dart2js/rti/rti_emission_test.dart
+++ b/tests/compiler/dart2js/rti/rti_emission_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.7
+
 import 'dart:io';
 import 'package:_fe_analyzer_shared/src/testing/features.dart';
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/rti/rti_need0_test.dart b/tests/compiler/dart2js/rti/rti_need0_test.dart
index 1ffa110..43c8681 100644
--- a/tests/compiler/dart2js/rti/rti_need0_test.dart
+++ b/tests/compiler/dart2js/rti/rti_need0_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.7
+
 import 'rti_need_test_helper.dart';
 
 main(List<String> args) {
diff --git a/tests/compiler/dart2js/rti/rti_need1_test.dart b/tests/compiler/dart2js/rti/rti_need1_test.dart
index a2d42f4..6c181e7 100644
--- a/tests/compiler/dart2js/rti/rti_need1_test.dart
+++ b/tests/compiler/dart2js/rti/rti_need1_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.7
+
 import 'rti_need_test_helper.dart';
 
 main(List<String> args) {
diff --git a/tests/compiler/dart2js/rti/rti_need_test_helper.dart b/tests/compiler/dart2js/rti/rti_need_test_helper.dart
index 168a383..faa8983 100644
--- a/tests/compiler/dart2js/rti/rti_need_test_helper.dart
+++ b/tests/compiler/dart2js/rti/rti_need_test_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.7
+
 import 'dart:io';
 import 'package:_fe_analyzer_shared/src/testing/features.dart';
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/rti/runtime_type_hint_test.dart b/tests/compiler/dart2js/rti/runtime_type_hint_test.dart
index 99b6e00..b261627 100644
--- a/tests/compiler/dart2js/rti/runtime_type_hint_test.dart
+++ b/tests/compiler/dart2js/rti/runtime_type_hint_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/diagnostics/messages.dart';
diff --git a/tests/compiler/dart2js/rti/show.dart b/tests/compiler/dart2js/rti/show.dart
index a2e9056..f6ffb3a 100644
--- a/tests/compiler/dart2js/rti/show.dart
+++ b/tests/compiler/dart2js/rti/show.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /// Helper program that shows the rti data on a dart program.
 
 import 'package:args/args.dart';
diff --git a/tests/compiler/dart2js/rti/type_representation_test.dart b/tests/compiler/dart2js/rti/type_representation_test.dart
index c2f1a34..5258d04 100644
--- a/tests/compiler/dart2js/rti/type_representation_test.dart
+++ b/tests/compiler/dart2js/rti/type_representation_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.7
+
 // TODO(johnniwinther): Port this test to be frontend agnostic.
 
 library type_representation_test;
diff --git a/tests/compiler/dart2js/serialization/data/const_literals.dart b/tests/compiler/dart2js/serialization/data/const_literals.dart
index fb8128a..80443cb 100644
--- a/tests/compiler/dart2js/serialization/data/const_literals.dart
+++ b/tests/compiler/dart2js/serialization/data/const_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.7
+
 main() {
   mapConstLiteral();
   dictionaryConstLiteral();
diff --git a/tests/compiler/dart2js/serialization/data/constructor_name.dart b/tests/compiler/dart2js/serialization/data/constructor_name.dart
index dc1e3b2..f7f66f7 100644
--- a/tests/compiler/dart2js/serialization/data/constructor_name.dart
+++ b/tests/compiler/dart2js/serialization/data/constructor_name.dart
@@ -2,6 +2,8 @@
 // for details. All 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 Class1 {
   var foo;
   Class1.foo();
diff --git a/tests/compiler/dart2js/serialization/data/continue.dart b/tests/compiler/dart2js/serialization/data/continue.dart
index 5d8c3ec..e5bc2c9 100644
--- a/tests/compiler/dart2js/serialization/data/continue.dart
+++ b/tests/compiler/dart2js/serialization/data/continue.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   continueInClosure();
 }
diff --git a/tests/compiler/dart2js/serialization/data/custom_types.dart b/tests/compiler/dart2js/serialization/data/custom_types.dart
index a301473..1190293 100644
--- a/tests/compiler/dart2js/serialization/data/custom_types.dart
+++ b/tests/compiler/dart2js/serialization/data/custom_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.7
+
 class A {
   method() {
     Object c = this;
diff --git a/tests/compiler/dart2js/serialization/data/deferred.dart b/tests/compiler/dart2js/serialization/data/deferred.dart
index b0ea93c..a161d36 100644
--- a/tests/compiler/dart2js/serialization/data/deferred.dart
+++ b/tests/compiler/dart2js/serialization/data/deferred.dart
@@ -2,6 +2,8 @@
 // for details. All 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 '../libs/deferred_lib1.dart';
 import '../libs/deferred_lib2.dart' deferred as lib2;
 
diff --git a/tests/compiler/dart2js/serialization/data/jsinterop.dart b/tests/compiler/dart2js/serialization/data/jsinterop.dart
index 208b2a9..eef8fd6 100644
--- a/tests/compiler/dart2js/serialization/data/jsinterop.dart
+++ b/tests/compiler/dart2js/serialization/data/jsinterop.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 @JS()
 library lib;
 
diff --git a/tests/compiler/dart2js/serialization/data/labels.dart b/tests/compiler/dart2js/serialization/data/labels.dart
index 4ba9f05..7919351 100644
--- a/tests/compiler/dart2js/serialization/data/labels.dart
+++ b/tests/compiler/dart2js/serialization/data/labels.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   label:
   {
diff --git a/tests/compiler/dart2js/serialization/data/maps.dart b/tests/compiler/dart2js/serialization/data/maps.dart
index ca45d28..3226303 100644
--- a/tests/compiler/dart2js/serialization/data/maps.dart
+++ b/tests/compiler/dart2js/serialization/data/maps.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   createMap();
   createDictionary();
diff --git a/tests/compiler/dart2js/serialization/data/switch.dart b/tests/compiler/dart2js/serialization/data/switch.dart
index fc9bc83..035db96 100644
--- a/tests/compiler/dart2js/serialization/data/switch.dart
+++ b/tests/compiler/dart2js/serialization/data/switch.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   switchCaseWithContinue(null);
 }
diff --git a/tests/compiler/dart2js/serialization/data/typedef.dart b/tests/compiler/dart2js/serialization/data/typedef.dart
index 01d991b..9036918 100644
--- a/tests/compiler/dart2js/serialization/data/typedef.dart
+++ b/tests/compiler/dart2js/serialization/data/typedef.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   c;
 }
diff --git a/tests/compiler/dart2js/serialization/in_memory_split_test.dart b/tests/compiler/dart2js/serialization/in_memory_split_test.dart
index 33a7912..7f4be63 100644
--- a/tests/compiler/dart2js/serialization/in_memory_split_test.dart
+++ b/tests/compiler/dart2js/serialization/in_memory_split_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.7
+
 import 'package:args/args.dart';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/serialization/strategies.dart';
diff --git a/tests/compiler/dart2js/serialization/libs/deferred_lib1.dart b/tests/compiler/dart2js/serialization/libs/deferred_lib1.dart
index 361b0fd..d34fd39 100644
--- a/tests/compiler/dart2js/serialization/libs/deferred_lib1.dart
+++ b/tests/compiler/dart2js/serialization/libs/deferred_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.7
+
 library deferred_constants1_lib1;
 
 export 'deferred_lib3.dart' show C, C1;
diff --git a/tests/compiler/dart2js/serialization/libs/deferred_lib2.dart b/tests/compiler/dart2js/serialization/libs/deferred_lib2.dart
index 379239d..081d463 100644
--- a/tests/compiler/dart2js/serialization/libs/deferred_lib2.dart
+++ b/tests/compiler/dart2js/serialization/libs/deferred_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.7
+
 library deferred_constants1_lib2;
 
 export 'deferred_lib3.dart' show C2, C3, C4, C5, C6, C7;
diff --git a/tests/compiler/dart2js/serialization/libs/deferred_lib3.dart b/tests/compiler/dart2js/serialization/libs/deferred_lib3.dart
index 708a79a..4309703 100644
--- a/tests/compiler/dart2js/serialization/libs/deferred_lib3.dart
+++ b/tests/compiler/dart2js/serialization/libs/deferred_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.7
+
 library deferred_constants1_lib3;
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/serialization/on_disk_split_test.dart b/tests/compiler/dart2js/serialization/on_disk_split_test.dart
index 163efa5..618eeb9 100644
--- a/tests/compiler/dart2js/serialization/on_disk_split_test.dart
+++ b/tests/compiler/dart2js/serialization/on_disk_split_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.7
+
 import 'dart:io';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/commandline_options.dart';
diff --git a/tests/compiler/dart2js/serialization/serialization_test.dart b/tests/compiler/dart2js/serialization/serialization_test.dart
index 75dcb9a..139dde5 100644
--- a/tests/compiler/dart2js/serialization/serialization_test.dart
+++ b/tests/compiler/dart2js/serialization/serialization_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.7
+
 import 'dart:io';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/commandline_options.dart';
diff --git a/tests/compiler/dart2js/serialization/serialization_test_helper.dart b/tests/compiler/dart2js/serialization/serialization_test_helper.dart
index 9f48d01..389d370 100644
--- a/tests/compiler/dart2js/serialization/serialization_test_helper.dart
+++ b/tests/compiler/dart2js/serialization/serialization_test_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.7
+
 import 'package:compiler/compiler_new.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/inferrer/types.dart';
diff --git a/tests/compiler/dart2js/sourcemaps/d2js_validity_test.dart b/tests/compiler/dart2js/sourcemaps/d2js_validity_test.dart
index 36ab917..0c93e47 100644
--- a/tests/compiler/dart2js/sourcemaps/d2js_validity_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/d2js_validity_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.7
+
 import 'dart:async';
 import 'dart:io';
 
diff --git a/tests/compiler/dart2js/sourcemaps/data/async.dart b/tests/compiler/dart2js/sourcemaps/data/async.dart
index 1cbc013..14a3b30 100644
--- a/tests/compiler/dart2js/sourcemaps/data/async.dart
+++ b/tests/compiler/dart2js/sourcemaps/data/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.7
+
 main() {
   asyncReturn();
   asyncThrow();
diff --git a/tests/compiler/dart2js/sourcemaps/data/invokes.dart b/tests/compiler/dart2js/sourcemaps/data/invokes.dart
index 11fad4d..37f04ff 100644
--- a/tests/compiler/dart2js/sourcemaps/data/invokes.dart
+++ b/tests/compiler/dart2js/sourcemaps/data/invokes.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Test file for testing source mappings of invocations.
 
 var counter = 0;
diff --git a/tests/compiler/dart2js/sourcemaps/data/operators.dart b/tests/compiler/dart2js/sourcemaps/data/operators.dart
index 11888e110..66ce0d4 100644
--- a/tests/compiler/dart2js/sourcemaps/data/operators.dart
+++ b/tests/compiler/dart2js/sourcemaps/data/operators.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Test file for testing source mappings of operations.
 
 var counter = 0;
diff --git a/tests/compiler/dart2js/sourcemaps/data/others.dart b/tests/compiler/dart2js/sourcemaps/data/others.dart
index 86ead71..76e2756 100644
--- a/tests/compiler/dart2js/sourcemaps/data/others.dart
+++ b/tests/compiler/dart2js/sourcemaps/data/others.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Test file for testing source mappings of various expression and statements.
 
 main() {
diff --git a/tests/compiler/dart2js/sourcemaps/data/super.dart b/tests/compiler/dart2js/sourcemaps/data/super.dart
index e94a564..3b8e30c 100644
--- a/tests/compiler/dart2js/sourcemaps/data/super.dart
+++ b/tests/compiler/dart2js/sourcemaps/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.7
+
 class Super {
   var field = 0;
 
diff --git a/tests/compiler/dart2js/sourcemaps/deferred_d2js_validity_test.dart b/tests/compiler/dart2js/sourcemaps/deferred_d2js_validity_test.dart
index 12d983d..3da203d 100644
--- a/tests/compiler/dart2js/sourcemaps/deferred_d2js_validity_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/deferred_d2js_validity_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.7
+
 import 'dart:io';
 
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/colors.dart b/tests/compiler/dart2js/sourcemaps/helpers/colors.dart
index f3d435d..70578aa 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/colors.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/colors.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /// Utility library for creating web colors.
 
 library sourcemaps.colors;
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/diff.dart b/tests/compiler/dart2js/sourcemaps/helpers/diff.dart
index 012679e..1f5ed6a 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/diff.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/diff.dart
@@ -2,6 +2,8 @@
 // for details. All 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 sourcemap.diff;
 
 import 'package:compiler/src/io/source_file.dart';
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/html_parts.dart b/tests/compiler/dart2js/sourcemaps/helpers/html_parts.dart
index ad951bc..eae6992 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/html_parts.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/html_parts.dart
@@ -2,6 +2,8 @@
 // for details. All 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 sourcemap.html_parts;
 
 import 'sourcemap_html_helper.dart';
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/js_tracer.dart b/tests/compiler/dart2js/sourcemaps/helpers/js_tracer.dart
index aa234a1..f515b73 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/js_tracer.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/js_tracer.dart
@@ -2,6 +2,8 @@
 // for details. All 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 sourcemap.js_tracer;
 
 import 'package:compiler/src/io/source_information.dart';
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/lax_json.dart b/tests/compiler/dart2js/sourcemaps/helpers/lax_json.dart
index 405ecfb..58e5f6c 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/lax_json.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/lax_json.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /// Decode a lax JSON encoded text, that is, JSON with Dart-like comments and
 /// trailing commas.
 ///
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/output_structure.dart b/tests/compiler/dart2js/sourcemaps/helpers/output_structure.dart
index ddfd8c9..be586f6 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/output_structure.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/output_structure.dart
@@ -2,6 +2,8 @@
 // for details. All 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 sourcemap.output_structure;
 
 import 'dart:math' as Math;
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/source_map_validator_helper.dart b/tests/compiler/dart2js/sourcemaps/helpers/source_map_validator_helper.dart
index aab0969..158276b 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/source_map_validator_helper.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/source_map_validator_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.7
+
 import 'dart:io';
 import 'dart:convert';
 import 'dart:async';
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart
index 058750c..f5e0509 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_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.7
+
 library sourcemap.helper;
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_html_helper.dart b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_html_helper.dart
index 57869ca..9f312d4 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_html_helper.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_html_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.7
+
 /// Helper for creating HTML visualization of the source map information
 /// generated by a [SourceMapProcessor].
 
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_html_templates.dart b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_html_templates.dart
index e99ec4e..f0b53f0 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_html_templates.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_html_templates.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /// Templates used for the HTML visualization of source map information.
 
 library sourcemap.html.templates;
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/trace_graph.dart b/tests/compiler/dart2js/sourcemaps/helpers/trace_graph.dart
index d4481f8..31d5d31b 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/trace_graph.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/trace_graph.dart
@@ -2,6 +2,8 @@
 // for details. All 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 sourcemap.trace_graph;
 
 import 'dart:collection';
diff --git a/tests/compiler/dart2js/sourcemaps/lax_json_test.dart b/tests/compiler/dart2js/sourcemaps/lax_json_test.dart
index ac532c7..abbbea1 100644
--- a/tests/compiler/dart2js/sourcemaps/lax_json_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/lax_json_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.7
+
 import 'package:expect/expect.dart';
 import 'helpers/lax_json.dart';
 
diff --git a/tests/compiler/dart2js/sourcemaps/load_save_test.dart b/tests/compiler/dart2js/sourcemaps/load_save_test.dart
index 3666fb1..3355040 100644
--- a/tests/compiler/dart2js/sourcemaps/load_save_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/load_save_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.7
+
 import 'dart:convert';
 import 'package:expect/expect.dart';
 import 'package:source_maps/source_maps.dart';
diff --git a/tests/compiler/dart2js/sourcemaps/location_collector_test.dart b/tests/compiler/dart2js/sourcemaps/location_collector_test.dart
index b5ebf2a..7352c31 100644
--- a/tests/compiler/dart2js/sourcemaps/location_collector_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/location_collector_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.7
+
 // Unittest for the [LocationCollector].
 
 import 'package:compiler/src/io/code_output.dart';
diff --git a/tests/compiler/dart2js/sourcemaps/mapping_test.dart b/tests/compiler/dart2js/sourcemaps/mapping_test.dart
index ada9f65..bbff333 100644
--- a/tests/compiler/dart2js/sourcemaps/mapping_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/mapping_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.7
+
 import 'dart:async';
 import 'dart:io';
 
diff --git a/tests/compiler/dart2js/sourcemaps/minified/cannot_read_property.dart b/tests/compiler/dart2js/sourcemaps/minified/cannot_read_property.dart
index 497cfd2..aecd6b6 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/cannot_read_property.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/cannot_read_property.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Error pattern: Cannot read property '([^']*)' of null
 // Kind of minified name: instance
 // Expected deobfuscated name: method
diff --git a/tests/compiler/dart2js/sourcemaps/minified/cannot_read_property2.dart b/tests/compiler/dart2js/sourcemaps/minified/cannot_read_property2.dart
index b1321a4..b189bf8 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/cannot_read_property2.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/cannot_read_property2.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Error pattern: Cannot read property '([^']*)' of null
 // Kind of minified name: instance
 // Expected deobfuscated name: method
diff --git a/tests/compiler/dart2js/sourcemaps/minified/instance.dart b/tests/compiler/dart2js/sourcemaps/minified/instance.dart
index 6a2f831..798c249 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/instance.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/instance.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Error pattern: Instance of '([^']*)'
 // Kind of minified name: global
 // Expected deobfuscated name: MyClass
diff --git a/tests/compiler/dart2js/sourcemaps/minified/is_not_a_function.dart b/tests/compiler/dart2js/sourcemaps/minified/is_not_a_function.dart
index 92087cd..01a3a36 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/is_not_a_function.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/is_not_a_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.7
+
 // TODO(sigmund): should this be handled as "other"? (the identifier appears
 // direclty in the line producing the error).
 //
diff --git a/tests/compiler/dart2js/sourcemaps/minified/no_such_method.dart b/tests/compiler/dart2js/sourcemaps/minified/no_such_method.dart
index 88383df..115a11b 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/no_such_method.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/no_such_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.7
+
 // Error pattern: NoSuchMethodError: method not found: '([^']*)'\r?\nReceiver: Instance of '[^']*'
 // Kind of minified name: instance
 // Expected deobfuscated name: m1
diff --git a/tests/compiler/dart2js/sourcemaps/minified/no_such_method2.dart b/tests/compiler/dart2js/sourcemaps/minified/no_such_method2.dart
index c169326..5d18472 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/no_such_method2.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/no_such_method2.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Error pattern: NoSuchMethodError: method not found: '[^']*'\r?\nReceiver: Instance of '([^']*)'
 // Kind of minified name: global
 // Expected deobfuscated name: B
diff --git a/tests/compiler/dart2js/sourcemaps/minified/no_such_method3.dart b/tests/compiler/dart2js/sourcemaps/minified/no_such_method3.dart
index 5ba0000..c5a7c5d 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/no_such_method3.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/no_such_method3.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Error pattern: NoSuchMethodError: method not found: '([^']*)' .*
 // Kind of minified name: instance
 // Expected deobfuscated name: g1
diff --git a/tests/compiler/dart2js/sourcemaps/minified/no_such_method4.dart b/tests/compiler/dart2js/sourcemaps/minified/no_such_method4.dart
index 9a4fdf6..83fb952 100644
--- a/tests/compiler/dart2js/sourcemaps/minified/no_such_method4.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified/no_such_method4.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Error pattern: NoSuchMethodError: method not found: '([^']*)' .*
 // Kind of minified name: instance
 // Expected deobfuscated name: g1=
diff --git a/tests/compiler/dart2js/sourcemaps/minified_names_test.dart b/tests/compiler/dart2js/sourcemaps/minified_names_test.dart
index 8761edc..674f151 100644
--- a/tests/compiler/dart2js/sourcemaps/minified_names_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/minified_names_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.7
+
 import 'dart:async';
 import 'dart:io';
 import 'dart:convert';
diff --git a/tests/compiler/dart2js/sourcemaps/name_test.dart b/tests/compiler/dart2js/sourcemaps/name_test.dart
index b6ecce8..5f2e197 100644
--- a/tests/compiler/dart2js/sourcemaps/name_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/name_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.7
+
 library source_map_name_test;
 
 import 'package:async_helper/async_helper.dart';
diff --git a/tests/compiler/dart2js/sourcemaps/nomapping_test.dart b/tests/compiler/dart2js/sourcemaps/nomapping_test.dart
index b38c1c6..7889b64 100644
--- a/tests/compiler/dart2js/sourcemaps/nomapping_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/nomapping_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.7
+
 import 'dart:async';
 import 'dart:io';
 
diff --git a/tests/compiler/dart2js/sourcemaps/source_map_test.dart b/tests/compiler/dart2js/sourcemaps/source_map_test.dart
index ddb75bf..2afead7 100644
--- a/tests/compiler/dart2js/sourcemaps/source_map_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/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.7
+
 // Test that options '--source-map' and '--out' correctly adds
 // `sourceMappingURL` and "file" attributes to source file and source map file.
 
diff --git a/tests/compiler/dart2js/sourcemaps/source_mapping_invokes_test.dart b/tests/compiler/dart2js/sourcemaps/source_mapping_invokes_test.dart
index 2aa8ee8e..77fbf1a 100644
--- a/tests/compiler/dart2js/sourcemaps/source_mapping_invokes_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/source_mapping_invokes_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.7
+
 import 'tools/source_mapping_tester.dart';
 
 void main() {
diff --git a/tests/compiler/dart2js/sourcemaps/source_mapping_operators_test.dart b/tests/compiler/dart2js/sourcemaps/source_mapping_operators_test.dart
index cbddf96..8c2ee61 100644
--- a/tests/compiler/dart2js/sourcemaps/source_mapping_operators_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/source_mapping_operators_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.7
+
 import 'tools/source_mapping_tester.dart';
 
 void main() {
diff --git a/tests/compiler/dart2js/sourcemaps/source_mapping_test.dart b/tests/compiler/dart2js/sourcemaps/source_mapping_test.dart
index 78c9d5e..fa6d5f9 100644
--- a/tests/compiler/dart2js/sourcemaps/source_mapping_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/source_mapping_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.7
+
 import 'helpers/sourcemap_helper.dart';
 import 'tools/source_mapping_tester.dart';
 
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/deep_inlining.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/deep_inlining.dart
index 1b30119..0e969bb 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/deep_inlining.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/deep_inlining.dart
@@ -2,6 +2,8 @@
 // for details. All 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 MyClass {}
 
 @pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/extension_method.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/extension_method.dart
index b2fe04f..1da9d2f 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/extension_method.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/extension_method.dart
@@ -1,6 +1,8 @@
 class MyClass {
   MyClass();
 
+
+// @dart = 2.7
   @pragma('dart2js:noInline')
   set internalSetter(int v) {
     /*7:MyClass.internalSetter*/ throw "error";
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining.dart
index 4e7aec1..c5ab11c 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining.dart
@@ -1,3 +1,9 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All 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 MyClass {
   int fieldName;
 
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_1.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_1.dart
index 40d9dc5..95a5bac 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_1.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_1.dart
@@ -1,3 +1,9 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All 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 MyClass {
   int fieldName;
 
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_2.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_2.dart
index 9fc9e55..609c7c7 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_2.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_2.dart
@@ -1,3 +1,9 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All 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
+
 @pragma('dart2js:noInline')
 String confuse(String x) => x;
 
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_3.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_3.dart
index 82996ca..f29039b 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_3.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_3.dart
@@ -1,3 +1,9 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All 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 MyClass {
   int fieldName;
 
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_baseline_1.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_baseline_1.dart
index 67fa7e9..aeb32d0 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_baseline_1.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_baseline_1.dart
@@ -1,3 +1,9 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All 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 MyClass {
   int fieldName;
 
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_baseline_2.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_baseline_2.dart
index 383d27d..8dc3a73 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_baseline_2.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining_baseline_2.dart
@@ -1,3 +1,9 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All 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 MyClass {
   int fieldName;
 
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/null_instance_field.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/null_instance_field.dart
index b9a347f..f47dcaa 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/null_instance_field.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/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.7
+
 main() {
   /*1:main*/ test(new Class());
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/null_instance_field_elided.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/null_instance_field_elided.dart
index 768d1f0..6089cd8 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/null_instance_field_elided.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/null_instance_field_elided.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   /*1:main*/ test(new Class());
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/null_interceptor_field.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/null_interceptor_field.dart
index 08a8072..c91a150 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/null_interceptor_field.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/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.7
+
 class MyType {
   get length => 3; // ensures we build an interceptor for `.length`
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/null_receiver_inlining.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/null_receiver_inlining.dart
index f822e35..9684ef0 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/null_receiver_inlining.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/null_receiver_inlining.dart
@@ -1,3 +1,9 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All 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 MyClass {
   int fieldName;
 
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/parameters.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/parameters.dart
index 4321fea..9a85e70 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/parameters.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/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.7
+
 main() {
   var c = new Class();
   c. /*1:main*/ instancePositional1(0);
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/parameters_elided.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/parameters_elided.dart
index b8cbd75..26b944d 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/parameters_elided.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/parameters_elided.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   var c = new Class();
   c. /*1:main*/ instancePositional1(0);
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/rethrow.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/rethrow.dart
index d1edabc..c6d733c 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/rethrow.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/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.7
+
 main() {
   /*1:main*/ test();
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/setter_inlining.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/setter_inlining.dart
index fa567c1..ed9b291 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/setter_inlining.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/setter_inlining.dart
@@ -2,6 +2,8 @@
 // for details. All 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 MyClass {
   int fieldName;
 
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart
index 3c17f40..f89ba6d 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_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.7
+
 main() {
   // This call is on the stack when the error is thrown.
   /*1:main*/ test();
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart
index 46ec972..8d1ae16 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_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.7
+
 main() {
   // This call is on the stack when the error is thrown.
   /*1:main*/ test1();
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart
index be6c6b18..d9af125 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_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.7
+
 main() {
   /*1:main*/ test();
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart
index 1ed8fd4..23b08e9 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_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.7
+
 main() {
   /*1:main*/ test1();
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_async.dart
index fe10b93..24cfc8b 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/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.7
+
 main() {
   // This call is no longer on the stack when the error is thrown.
   /*:main*/ test();
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_awaited_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_awaited_async.dart
index b9762fd..552ab2b 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_awaited_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/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.7
+
 main() {
   test1();
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_constructor.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_constructor.dart
index 6912e7c..95eb4e5 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_constructor.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/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.7
+
 main() {
   // ignore: UNUSED_LOCAL_VARIABLE
   var c = new /*1:main*/ Class();
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_constructor_from_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_constructor_from_async.dart
index ae6b2aa..aecbdb8 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_constructor_from_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/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.7
+
 main() {
   // This call is no longer on the stack when the error is thrown.
   /*:main*/ test();
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_instance_method.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_instance_method.dart
index 1accc99..f55170f 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_instance_method.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/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.7
+
 main() {
   var c = new Class();
   c. /*1:main*/ test();
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_main.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_main.dart
index f43b4d4..24cfa64 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_main.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/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.7
+
 main() {
   /*1:main*/ throw '>ExceptionMarker<';
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_static_method.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_static_method.dart
index a86c5df..53c814b 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_static_method.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/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.7
+
 main() {
   Class. /*1:main*/ test();
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_top_level_method.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_top_level_method.dart
index e740ca8..778fae8 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_top_level_method.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/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.7
+
 main() {
   /*1:main*/ test();
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_top_level_method_from_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_top_level_method_from_async.dart
index 5b315c6..ff81e33 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_top_level_method_from_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/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.7
+
 main() {
   test1();
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_try_catch.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_try_catch.dart
index 59ff684..107681e 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_try_catch.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/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.7
+
 main() {
   /*1:main*/ test();
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_try_finally.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_try_finally.dart
index c802027..6277450 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/throw_in_try_finally.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/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.7
+
 main() {
   /*1:main*/ test();
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart b/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart
index b38553d..6006fb4 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace_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.7
+
 import 'dart:async';
 import 'dart:io';
 
diff --git a/tests/compiler/dart2js/sourcemaps/stepping/print.dart b/tests/compiler/dart2js/sourcemaps/stepping/print.dart
index 934bbc9..84d3cee 100644
--- a/tests/compiler/dart2js/sourcemaps/stepping/print.dart
+++ b/tests/compiler/dart2js/sourcemaps/stepping/print.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   /*bl*/
   /*s:1*/ print("Hello, World!");
diff --git a/tests/compiler/dart2js/sourcemaps/stepping/print_class_fields.dart b/tests/compiler/dart2js/sourcemaps/stepping/print_class_fields.dart
index dec796a..9fec4d5 100644
--- a/tests/compiler/dart2js/sourcemaps/stepping/print_class_fields.dart
+++ b/tests/compiler/dart2js/sourcemaps/stepping/print_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.7
+
 /*Debugger:stepOver*/
 main() {
   /*bl*/
diff --git a/tests/compiler/dart2js/sourcemaps/stepping/print_top_level_invoke.dart b/tests/compiler/dart2js/sourcemaps/stepping/print_top_level_invoke.dart
index 147fa73..affce87 100644
--- a/tests/compiler/dart2js/sourcemaps/stepping/print_top_level_invoke.dart
+++ b/tests/compiler/dart2js/sourcemaps/stepping/print_top_level_invoke.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   print(/*bc:1*/ foo());
 }
diff --git a/tests/compiler/dart2js/sourcemaps/stepping/top_level_invoke.dart b/tests/compiler/dart2js/sourcemaps/stepping/top_level_invoke.dart
index 7108d8e..a336da4 100644
--- a/tests/compiler/dart2js/sourcemaps/stepping/top_level_invoke.dart
+++ b/tests/compiler/dart2js/sourcemaps/stepping/top_level_invoke.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   /*bl*/
   /*s:1*/ foo();
diff --git a/tests/compiler/dart2js/sourcemaps/stepping_test.dart b/tests/compiler/dart2js/sourcemaps/stepping_test.dart
index e1688e1..311d462 100644
--- a/tests/compiler/dart2js/sourcemaps/stepping_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/stepping_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.7
+
 import 'dart:async';
 import 'dart:io';
 
diff --git a/tests/compiler/dart2js/sourcemaps/test_files/deferred_validator_test_file.dart b/tests/compiler/dart2js/sourcemaps/test_files/deferred_validator_test_file.dart
index 7a0202e..3740e93 100644
--- a/tests/compiler/dart2js/sourcemaps/test_files/deferred_validator_test_file.dart
+++ b/tests/compiler/dart2js/sourcemaps/test_files/deferred_validator_test_file.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'deferred_validator_test_lib.dart' deferred as def;
 
 void main() {
diff --git a/tests/compiler/dart2js/sourcemaps/test_files/deferred_validator_test_lib.dart b/tests/compiler/dart2js/sourcemaps/test_files/deferred_validator_test_lib.dart
index 9ce7323..6b2dd89 100644
--- a/tests/compiler/dart2js/sourcemaps/test_files/deferred_validator_test_lib.dart
+++ b/tests/compiler/dart2js/sourcemaps/test_files/deferred_validator_test_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 HelloClass {
   void printHello() {
     () {
diff --git a/tests/compiler/dart2js/sourcemaps/test_files/validator_test_file.dart b/tests/compiler/dart2js/sourcemaps/test_files/validator_test_file.dart
index 4df2443..8dfd626 100644
--- a/tests/compiler/dart2js/sourcemaps/test_files/validator_test_file.dart
+++ b/tests/compiler/dart2js/sourcemaps/test_files/validator_test_file.dart
@@ -2,6 +2,8 @@
 // for details. All 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 HelloClass {
   void printHello() {
     () {
diff --git a/tests/compiler/dart2js/sourcemaps/tools/diff_view.dart b/tests/compiler/dart2js/sourcemaps/tools/diff_view.dart
index 945604cd..9f68323 100644
--- a/tests/compiler/dart2js/sourcemaps/tools/diff_view.dart
+++ b/tests/compiler/dart2js/sourcemaps/tools/diff_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.7
+
 library sourcemap.diff_view;
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/sourcemaps/tools/load.dart b/tests/compiler/dart2js/sourcemaps/tools/load.dart
index a5acb30..bc8a460 100644
--- a/tests/compiler/dart2js/sourcemaps/tools/load.dart
+++ b/tests/compiler/dart2js/sourcemaps/tools/load.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /// Loads a source map file and outputs a human-readable version of it.
 
 library load;
diff --git a/tests/compiler/dart2js/sourcemaps/tools/save.dart b/tests/compiler/dart2js/sourcemaps/tools/save.dart
index be09f20..ac860f4 100644
--- a/tests/compiler/dart2js/sourcemaps/tools/save.dart
+++ b/tests/compiler/dart2js/sourcemaps/tools/save.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /// Loads a human-readable source map and outputs the source map file for it.
 
 library save;
diff --git a/tests/compiler/dart2js/sourcemaps/tools/source_mapping_test_viewer.dart b/tests/compiler/dart2js/sourcemaps/tools/source_mapping_test_viewer.dart
index 5d617fe..903a260 100644
--- a/tests/compiler/dart2js/sourcemaps/tools/source_mapping_test_viewer.dart
+++ b/tests/compiler/dart2js/sourcemaps/tools/source_mapping_test_viewer.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /// Visualization of source mappings generated and tested in
 /// 'source_mapping_test.dart'.
 
diff --git a/tests/compiler/dart2js/sourcemaps/tools/source_mapping_tester.dart b/tests/compiler/dart2js/sourcemaps/tools/source_mapping_tester.dart
index 9b49361..7041370 100644
--- a/tests/compiler/dart2js/sourcemaps/tools/source_mapping_tester.dart
+++ b/tests/compiler/dart2js/sourcemaps/tools/source_mapping_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.7
+
 import 'dart:async';
 import 'dart:io';
 import 'package:_fe_analyzer_shared/src/util/filenames.dart';
diff --git a/tests/compiler/dart2js/sourcemaps/tools/sourcemap_visualizer.dart b/tests/compiler/dart2js/sourcemaps/tools/sourcemap_visualizer.dart
index b4761af..7919e58 100644
--- a/tests/compiler/dart2js/sourcemaps/tools/sourcemap_visualizer.dart
+++ b/tests/compiler/dart2js/sourcemaps/tools/sourcemap_visualizer.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /// Tool for visualizing the source mapped parts of a generated JS file.
 
 import 'dart:convert';
diff --git a/tests/compiler/dart2js/sourcemaps/tools/translate_dart2js_stacktrace.dart b/tests/compiler/dart2js/sourcemaps/tools/translate_dart2js_stacktrace.dart
index 3ed514e..c54f9a3 100644
--- a/tests/compiler/dart2js/sourcemaps/tools/translate_dart2js_stacktrace.dart
+++ b/tests/compiler/dart2js/sourcemaps/tools/translate_dart2js_stacktrace.dart
@@ -2,6 +2,8 @@
 // for details. All 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:args/args.dart';
 import 'package:http/http.dart' as http;
diff --git a/tests/compiler/dart2js/static_type/data/assert.dart b/tests/compiler/dart2js/static_type/data/assert.dart
index 54f2a34..39ecf52 100644
--- a/tests/compiler/dart2js/static_type/data/assert.dart
+++ b/tests/compiler/dart2js/static_type/data/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.7
+
 class Class {
   Class next;
 }
diff --git a/tests/compiler/dart2js/static_type/data/assert_ea.dart b/tests/compiler/dart2js/static_type/data/assert_ea.dart
index c28215d..e178bbc 100644
--- a/tests/compiler/dart2js/static_type/data/assert_ea.dart
+++ b/tests/compiler/dart2js/static_type/data/assert_ea.dart
@@ -2,6 +2,8 @@
 // for details. All 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 {
   Class next;
 }
diff --git a/tests/compiler/dart2js/static_type/data/cascade.dart b/tests/compiler/dart2js/static_type/data/cascade.dart
index 4f2f6a5..2b06eb3 100644
--- a/tests/compiler/dart2js/static_type/data/cascade.dart
+++ b/tests/compiler/dart2js/static_type/data/cascade.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   promotedCascade(null);
 }
diff --git a/tests/compiler/dart2js/static_type/data/closure.dart b/tests/compiler/dart2js/static_type/data/closure.dart
index f24f209..9c3eff8 100644
--- a/tests/compiler/dart2js/static_type/data/closure.dart
+++ b/tests/compiler/dart2js/static_type/data/closure.dart
@@ -2,6 +2,8 @@
 // for details. All 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 {
   Class next;
 }
diff --git a/tests/compiler/dart2js/static_type/data/do.dart b/tests/compiler/dart2js/static_type/data/do.dart
index 0d0952b..072fb39 100644
--- a/tests/compiler/dart2js/static_type/data/do.dart
+++ b/tests/compiler/dart2js/static_type/data/do.dart
@@ -2,6 +2,8 @@
 // for details. All 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 {
   Class next;
 }
diff --git a/tests/compiler/dart2js/static_type/data/effectively_final.dart b/tests/compiler/dart2js/static_type/data/effectively_final.dart
index a50cdaf..1dde98e 100644
--- a/tests/compiler/dart2js/static_type/data/effectively_final.dart
+++ b/tests/compiler/dart2js/static_type/data/effectively_final.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   effectivelyFinalList();
   notEffectivelyFinalList();
diff --git a/tests/compiler/dart2js/static_type/data/for.dart b/tests/compiler/dart2js/static_type/data/for.dart
index 3d4bb82..1128ac9 100644
--- a/tests/compiler/dart2js/static_type/data/for.dart
+++ b/tests/compiler/dart2js/static_type/data/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.7
+
 class Class {
   Class next;
 }
diff --git a/tests/compiler/dart2js/static_type/data/for_in.dart b/tests/compiler/dart2js/static_type/data/for_in.dart
index a97c74b..c8072cc 100644
--- a/tests/compiler/dart2js/static_type/data/for_in.dart
+++ b/tests/compiler/dart2js/static_type/data/for_in.dart
@@ -2,6 +2,8 @@
 // for details. All 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 {
   Iterable<Class> next;
 }
diff --git a/tests/compiler/dart2js/static_type/data/generic_method.dart b/tests/compiler/dart2js/static_type/data/generic_method.dart
index 8026b3c..4474f55 100644
--- a/tests/compiler/dart2js/static_type/data/generic_method.dart
+++ b/tests/compiler/dart2js/static_type/data/generic_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.7
+
 class Class1 {
   T method<T>(T t) => t;
 }
diff --git a/tests/compiler/dart2js/static_type/data/if.dart b/tests/compiler/dart2js/static_type/data/if.dart
index 20c3f9b..d3bd63f 100644
--- a/tests/compiler/dart2js/static_type/data/if.dart
+++ b/tests/compiler/dart2js/static_type/data/if.dart
@@ -2,6 +2,8 @@
 // for details. All 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 {
   Class next;
 }
diff --git a/tests/compiler/dart2js/static_type/data/null.dart b/tests/compiler/dart2js/static_type/data/null.dart
index dcbe522..5fd9622 100644
--- a/tests/compiler/dart2js/static_type/data/null.dart
+++ b/tests/compiler/dart2js/static_type/data/null.dart
@@ -2,6 +2,8 @@
 // for details. All 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 {
   Class next;
 }
diff --git a/tests/compiler/dart2js/static_type/data/null_access.dart b/tests/compiler/dart2js/static_type/data/null_access.dart
index c21b149..b1cdab4 100644
--- a/tests/compiler/dart2js/static_type/data/null_access.dart
+++ b/tests/compiler/dart2js/static_type/data/null_access.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   test1();
   test2();
diff --git a/tests/compiler/dart2js/static_type/data/switch.dart b/tests/compiler/dart2js/static_type/data/switch.dart
index 7b88d11..d25b1a4 100644
--- a/tests/compiler/dart2js/static_type/data/switch.dart
+++ b/tests/compiler/dart2js/static_type/data/switch.dart
@@ -2,6 +2,8 @@
 // for details. All 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 {
   Class next;
 }
diff --git a/tests/compiler/dart2js/static_type/data/try_catch.dart b/tests/compiler/dart2js/static_type/data/try_catch.dart
index b4680d7..06992f9 100644
--- a/tests/compiler/dart2js/static_type/data/try_catch.dart
+++ b/tests/compiler/dart2js/static_type/data/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.7
+
 class Class {
   Iterable<Class> next;
 }
diff --git a/tests/compiler/dart2js/static_type/data/try_finally.dart b/tests/compiler/dart2js/static_type/data/try_finally.dart
index 62d0822..98ede49 100644
--- a/tests/compiler/dart2js/static_type/data/try_finally.dart
+++ b/tests/compiler/dart2js/static_type/data/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.7
+
 class Class {
   Iterable<Class> next;
 }
diff --git a/tests/compiler/dart2js/static_type/data/while.dart b/tests/compiler/dart2js/static_type/data/while.dart
index b21dee0..671d6da 100644
--- a/tests/compiler/dart2js/static_type/data/while.dart
+++ b/tests/compiler/dart2js/static_type/data/while.dart
@@ -2,6 +2,8 @@
 // for details. All 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 {
   Class next;
 }
diff --git a/tests/compiler/dart2js/static_type/show.dart b/tests/compiler/dart2js/static_type/show.dart
index 59f85ee..a9e34bd 100644
--- a/tests/compiler/dart2js/static_type/show.dart
+++ b/tests/compiler/dart2js/static_type/show.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 /// Helper program that shows the static type data on a dart program.
 
 import 'package:args/args.dart';
diff --git a/tests/compiler/dart2js/static_type/static_type_test.dart b/tests/compiler/dart2js/static_type/static_type_test.dart
index 18ab90c..250f450 100644
--- a/tests/compiler/dart2js/static_type/static_type_test.dart
+++ b/tests/compiler/dart2js/static_type/static_type_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.7
+
 import 'dart:io';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js/static_type/type_promotion_data/bottom.dart b/tests/compiler/dart2js/static_type/type_promotion_data/bottom.dart
index 1c94829..3388fab 100644
--- a/tests/compiler/dart2js/static_type/type_promotion_data/bottom.dart
+++ b/tests/compiler/dart2js/static_type/type_promotion_data/bottom.dart
@@ -2,6 +2,8 @@
 // for details. All 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 A {}
 
 main() {
diff --git a/tests/compiler/dart2js/static_type/type_promotion_data/closure.dart b/tests/compiler/dart2js/static_type/type_promotion_data/closure.dart
index f50db9d..9fc2835 100644
--- a/tests/compiler/dart2js/static_type/type_promotion_data/closure.dart
+++ b/tests/compiler/dart2js/static_type/type_promotion_data/closure.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   closure6(null);
   closure7();
diff --git a/tests/compiler/dart2js/static_type/type_promotion_data/equals.dart b/tests/compiler/dart2js/static_type/type_promotion_data/equals.dart
index 17df94a..cd6ec3c 100644
--- a/tests/compiler/dart2js/static_type/type_promotion_data/equals.dart
+++ b/tests/compiler/dart2js/static_type/type_promotion_data/equals.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 bool equals(e1, e2, bool unordered) {
   if (/*{}*/ e1 is Set) {
     return /*{e1:[{true:Set<dynamic>}|Set<dynamic>]}*/
diff --git a/tests/compiler/dart2js/static_type/type_promotion_data/if.dart b/tests/compiler/dart2js/static_type/type_promotion_data/if.dart
index 5c54faa..b12571b 100644
--- a/tests/compiler/dart2js/static_type/type_promotion_data/if.dart
+++ b/tests/compiler/dart2js/static_type/type_promotion_data/if.dart
@@ -2,6 +2,8 @@
 // for details. All 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 A {}
 
 class B {}
diff --git a/tests/compiler/dart2js/static_type/type_promotion_data/null.dart b/tests/compiler/dart2js/static_type/type_promotion_data/null.dart
index 02a3697..40d6e7a 100644
--- a/tests/compiler/dart2js/static_type/type_promotion_data/null.dart
+++ b/tests/compiler/dart2js/static_type/type_promotion_data/null.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 main() {
   ifNull(null);
   ifNullElse(null);
diff --git a/tests/compiler/dart2js/static_type/type_promotion_data/sequence.dart b/tests/compiler/dart2js/static_type/type_promotion_data/sequence.dart
index 71cc004..ebb2549 100644
--- a/tests/compiler/dart2js/static_type/type_promotion_data/sequence.dart
+++ b/tests/compiler/dart2js/static_type/type_promotion_data/sequence.dart
@@ -2,6 +2,8 @@
 // for details. All 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 A {}
 
 class B {}
diff --git a/tests/compiler/dart2js/static_type/type_promotion_test.dart b/tests/compiler/dart2js/static_type/type_promotion_test.dart
index fe2b259..06c6bf3 100644
--- a/tests/compiler/dart2js/static_type/type_promotion_test.dart
+++ b/tests/compiler/dart2js/static_type/type_promotion_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.7
+
 import 'dart:io';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart';
diff --git a/tests/compiler/dart2js_extra/10216a_test.dart b/tests/compiler/dart2js_extra/10216a_test.dart
index 5032123..f3d151cb 100644
--- a/tests/compiler/dart2js_extra/10216a_test.dart
+++ b/tests/compiler/dart2js_extra/10216a_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.7
+
 import "package:expect/expect.dart";
 
 // Tests codegen of methods reached only via mixin.
diff --git a/tests/compiler/dart2js_extra/10216b_test.dart b/tests/compiler/dart2js_extra/10216b_test.dart
index a2ad8bb..cf8031b 100644
--- a/tests/compiler/dart2js_extra/10216b_test.dart
+++ b/tests/compiler/dart2js_extra/10216b_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.7
+
 import "package:expect/expect.dart";
 
 // Tests codegen of methods reached only via mixin.
diff --git a/tests/compiler/dart2js_extra/11673_test.dart b/tests/compiler/dart2js_extra/11673_test.dart
index 47aa416..3be867a 100644
--- a/tests/compiler/dart2js_extra/11673_test.dart
+++ b/tests/compiler/dart2js_extra/11673_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.7
+
 import "package:expect/expect.dart";
 
 // Tests codegen of methods reached only via interface implemented by mixin
diff --git a/tests/compiler/dart2js_extra/12320_test.dart b/tests/compiler/dart2js_extra/12320_test.dart
index d47c05a..9be0b41 100644
--- a/tests/compiler/dart2js_extra/12320_test.dart
+++ b/tests/compiler/dart2js_extra/12320_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.7
+
 import "package:expect/expect.dart";
 
 // Regression test for Issue 12320, Issue 12363.
diff --git a/tests/compiler/dart2js_extra/12_test.dart b/tests/compiler/dart2js_extra/12_test.dart
index 80a758a..069d26c 100644
--- a/tests/compiler/dart2js_extra/12_test.dart
+++ b/tests/compiler/dart2js_extra/12_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.7
+
 void main() {
   print(3 + 4 + 5);
 }
diff --git a/tests/compiler/dart2js_extra/16400_test.dart b/tests/compiler/dart2js_extra/16400_test.dart
index 7902f07..64b820b 100644
--- a/tests/compiler/dart2js_extra/16400_test.dart
+++ b/tests/compiler/dart2js_extra/16400_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.7
+
 main() {
   L:
   {
diff --git a/tests/compiler/dart2js_extra/16407_test.dart b/tests/compiler/dart2js_extra/16407_test.dart
index aff1ba3..a84b9a4 100644
--- a/tests/compiler/dart2js_extra/16407_test.dart
+++ b/tests/compiler/dart2js_extra/16407_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.7
+
 import "package:expect/expect.dart";
 
 // Regression test for Issue 16407.
diff --git a/tests/compiler/dart2js_extra/16967_test.dart b/tests/compiler/dart2js_extra/16967_test.dart
index 26d9df7..6185102 100644
--- a/tests/compiler/dart2js_extra/16967_test.dart
+++ b/tests/compiler/dart2js_extra/16967_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.7
+
 import 'package:expect/expect.dart';
 
 // Regression test for http://dartbug.com/16967
diff --git a/tests/compiler/dart2js_extra/17094_test.dart b/tests/compiler/dart2js_extra/17094_test.dart
index 41fba87..66fe00e 100644
--- a/tests/compiler/dart2js_extra/17094_test.dart
+++ b/tests/compiler/dart2js_extra/17094_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.7
+
 import "package:expect/expect.dart";
 
 //  Interpolation effect analysis test.
diff --git a/tests/compiler/dart2js_extra/17645_test.dart b/tests/compiler/dart2js_extra/17645_test.dart
index 7469a6c..15f7e15 100644
--- a/tests/compiler/dart2js_extra/17645_test.dart
+++ b/tests/compiler/dart2js_extra/17645_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.7
+
 import "package:expect/expect.dart";
 
 //  Regression test for issue 17645.
diff --git a/tests/compiler/dart2js_extra/17856_test.dart b/tests/compiler/dart2js_extra/17856_test.dart
index aa5a243..4b0f552 100644
--- a/tests/compiler/dart2js_extra/17856_test.dart
+++ b/tests/compiler/dart2js_extra/17856_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.7
+
 import "package:expect/expect.dart";
 
 // Regression test for Issue 17856.
diff --git a/tests/compiler/dart2js_extra/18383_test.dart b/tests/compiler/dart2js_extra/18383_test.dart
index e15526b..a059dc4 100644
--- a/tests/compiler/dart2js_extra/18383_test.dart
+++ b/tests/compiler/dart2js_extra/18383_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.7
+
 // Regression test for http://dartbug.com/18383
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/19191_test.dart b/tests/compiler/dart2js_extra/19191_test.dart
index cf2bd24..f986781 100644
--- a/tests/compiler/dart2js_extra/19191_test.dart
+++ b/tests/compiler/dart2js_extra/19191_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.7
+
 // Regression test for http://dartbug.com/19191
 
 class A {
diff --git a/tests/compiler/dart2js_extra/21351_test.dart b/tests/compiler/dart2js_extra/21351_test.dart
index f3c0e53..e9538b6 100644
--- a/tests/compiler/dart2js_extra/21351_test.dart
+++ b/tests/compiler/dart2js_extra/21351_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.7
+
 class A {
   bool _flag = false;
   bool get flag => _flag;
diff --git a/tests/compiler/dart2js_extra/21579_test.dart b/tests/compiler/dart2js_extra/21579_test.dart
index a7b3079..13869b7 100644
--- a/tests/compiler/dart2js_extra/21579_test.dart
+++ b/tests/compiler/dart2js_extra/21579_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.7
+
 // Regression test for http://dartbug.com/21579
 //
 // Fails for --trust-type-annotations:
diff --git a/tests/compiler/dart2js_extra/22487_test.dart b/tests/compiler/dart2js_extra/22487_test.dart
index 4bf5426..8e60015 100644
--- a/tests/compiler/dart2js_extra/22487_test.dart
+++ b/tests/compiler/dart2js_extra/22487_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.7
+
 // Regression test for http://dartbug.com/22487
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/22776_test.dart b/tests/compiler/dart2js_extra/22776_test.dart
index 135f505..62d7f8a 100644
--- a/tests/compiler/dart2js_extra/22776_test.dart
+++ b/tests/compiler/dart2js_extra/22776_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.7
+
 // Regression test for http://dartbug.com/22776
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/22868_test.dart b/tests/compiler/dart2js_extra/22868_test.dart
index 71907def..62b4837 100644
--- a/tests/compiler/dart2js_extra/22868_test.dart
+++ b/tests/compiler/dart2js_extra/22868_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.7
+
 // Regression test for http://dartbug.com/22868 and http://dartbug.com/22895
 // Ensure that the closure tracer properly handles await.
 
diff --git a/tests/compiler/dart2js_extra/22917_test.dart b/tests/compiler/dart2js_extra/22917_test.dart
index 35a629a..0619095 100644
--- a/tests/compiler/dart2js_extra/22917_test.dart
+++ b/tests/compiler/dart2js_extra/22917_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.7
+
 // Regression test for http://dartbug.com/22917
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/23404_test.dart b/tests/compiler/dart2js_extra/23404_test.dart
index 699e63d..a3080c1 100644
--- a/tests/compiler/dart2js_extra/23404_test.dart
+++ b/tests/compiler/dart2js_extra/23404_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.7
+
 // Regression test for http://dartbug.com/23404
 //
 // Dart2js crashed when the global metadata had escaped characters. That
diff --git a/tests/compiler/dart2js_extra/23432_test.dart b/tests/compiler/dart2js_extra/23432_test.dart
index bbb32ff..e8bdff6 100644
--- a/tests/compiler/dart2js_extra/23432_test.dart
+++ b/tests/compiler/dart2js_extra/23432_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.7
+
 // Regression test for http://dartbug.com/23432.  Test that the receiver of a
 // NoSuchMethodError is correct on an intercepted method.  The bug (issue 23432)
 // is that the interceptor is captured instead of the receiver.
diff --git a/tests/compiler/dart2js_extra/23486_helper.dart b/tests/compiler/dart2js_extra/23486_helper.dart
index c15d826..7822865 100644
--- a/tests/compiler/dart2js_extra/23486_helper.dart
+++ b/tests/compiler/dart2js_extra/23486_helper.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.7
+
 int x = 1;
diff --git a/tests/compiler/dart2js_extra/23486_test.dart b/tests/compiler/dart2js_extra/23486_test.dart
index 1d41e26..cff32df 100644
--- a/tests/compiler/dart2js_extra/23486_test.dart
+++ b/tests/compiler/dart2js_extra/23486_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.7
+
 // Regression test for http://dartbug.com/23486
 //
 // Dart2js used to crash when using `super` and prefixes inside parenthesized
diff --git a/tests/compiler/dart2js_extra/23804_test.dart b/tests/compiler/dart2js_extra/23804_test.dart
index 32bb00b..843af23 100644
--- a/tests/compiler/dart2js_extra/23804_test.dart
+++ b/tests/compiler/dart2js_extra/23804_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.7
+
 // Regression test for http://dartbug.com/23804
 //
 // Inference incorrectly assumed that `any` and `every` didn't escape the values
diff --git a/tests/compiler/dart2js_extra/23828_test.dart b/tests/compiler/dart2js_extra/23828_test.dart
index e2fbf7d..eb5f0c2 100644
--- a/tests/compiler/dart2js_extra/23828_test.dart
+++ b/tests/compiler/dart2js_extra/23828_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.7
+
 // Regression test for http://dartbug.com/23828
 // Used to fail when methods contain a name starting with `get`
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/26243_test.dart b/tests/compiler/dart2js_extra/26243_test.dart
index 7f09cf3..d637c03 100644
--- a/tests/compiler/dart2js_extra/26243_test.dart
+++ b/tests/compiler/dart2js_extra/26243_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.7
+
 import 'package:expect/expect.dart';
 
 var trace = [];
diff --git a/tests/compiler/dart2js_extra/27198_test.dart b/tests/compiler/dart2js_extra/27198_test.dart
index 721476e..bab3d07 100644
--- a/tests/compiler/dart2js_extra/27198_test.dart
+++ b/tests/compiler/dart2js_extra/27198_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.7
+
 // From co19/Language/Types/Parameterized_Types/Actual_Type_of_Declaration/actual_type_t05.dart
 import "package:expect/expect.dart";
 
diff --git a/tests/compiler/dart2js_extra/27199_test.dart b/tests/compiler/dart2js_extra/27199_test.dart
index b2d2fd5..8ac518d 100644
--- a/tests/compiler/dart2js_extra/27199_test.dart
+++ b/tests/compiler/dart2js_extra/27199_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.7
+
 // Regression test for http://dartbug.com/27199 in --checked mode.
 
 // Typedefs must be unaliased at some point before codegen to have the correct
diff --git a/tests/compiler/dart2js_extra/27323_test.dart b/tests/compiler/dart2js_extra/27323_test.dart
index c8439ec..7186e29 100644
--- a/tests/compiler/dart2js_extra/27323_test.dart
+++ b/tests/compiler/dart2js_extra/27323_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/27354_test.dart b/tests/compiler/dart2js_extra/27354_test.dart
index 942dc49..c64a621 100644
--- a/tests/compiler/dart2js_extra/27354_test.dart
+++ b/tests/compiler/dart2js_extra/27354_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.7
+
 // Regression test for Issue 27354.
 
 int total = 1;
diff --git a/tests/compiler/dart2js_extra/28749_test.dart b/tests/compiler/dart2js_extra/28749_test.dart
index 0735aa7..8b151d8 100644
--- a/tests/compiler/dart2js_extra/28749_test.dart
+++ b/tests/compiler/dart2js_extra/28749_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.7
+
 // dart2jsOptions=--strong
 
 // Regression test for http://dartbug.com/28749.
diff --git a/tests/compiler/dart2js_extra/28919_test.dart b/tests/compiler/dart2js_extra/28919_test.dart
index e9b7106..e95f996 100644
--- a/tests/compiler/dart2js_extra/28919_test.dart
+++ b/tests/compiler/dart2js_extra/28919_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.7
+
 // Regression test for http://dartbug.com/28919.
 //
 // This would crash at runtime because the type of closure parameter 'x' was
diff --git a/tests/compiler/dart2js_extra/29130_test.dart b/tests/compiler/dart2js_extra/29130_test.dart
index e4daa34..76f91c7 100644
--- a/tests/compiler/dart2js_extra/29130_test.dart
+++ b/tests/compiler/dart2js_extra/29130_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.7
+
 /// This is a regression test from issue #29310. The global type-inferrer does
 /// tracing of closures including allocated classes that implement a `call`
 /// method. We incorrectly considered also classes with invoked factory
diff --git a/tests/compiler/dart2js_extra/31803_test.dart b/tests/compiler/dart2js_extra/31803_test.dart
index 03c1f7c..88403e3 100644
--- a/tests/compiler/dart2js_extra/31803_test.dart
+++ b/tests/compiler/dart2js_extra/31803_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.7
+
 import 'package:expect/expect.dart';
 
 // Tests that the compiler doesn't crash on an annotation with fields
diff --git a/tests/compiler/dart2js_extra/32770a_test.dart b/tests/compiler/dart2js_extra/32770a_test.dart
index 24aeb60..adc3bd6 100644
--- a/tests/compiler/dart2js_extra/32770a_test.dart
+++ b/tests/compiler/dart2js_extra/32770a_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.7
+
 // dart2jsOptions=--strong
 
 // Regression test for issue 32770.
diff --git a/tests/compiler/dart2js_extra/32770b_test.dart b/tests/compiler/dart2js_extra/32770b_test.dart
index f58bcf5..beac842 100644
--- a/tests/compiler/dart2js_extra/32770b_test.dart
+++ b/tests/compiler/dart2js_extra/32770b_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.7
+
 // dart2jsOptions=--strong
 
 // Regression test for issue 32770.
diff --git a/tests/compiler/dart2js_extra/32770c_test.dart b/tests/compiler/dart2js_extra/32770c_test.dart
index 15ac166..fefd82b 100644
--- a/tests/compiler/dart2js_extra/32770c_test.dart
+++ b/tests/compiler/dart2js_extra/32770c_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.7
+
 // dart2jsOptions=--strong
 
 // Regression test for issue 32770.
diff --git a/tests/compiler/dart2js_extra/32774_test.dart b/tests/compiler/dart2js_extra/32774_test.dart
index fbf3199..a117d86 100644
--- a/tests/compiler/dart2js_extra/32774_test.dart
+++ b/tests/compiler/dart2js_extra/32774_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/32828_test.dart b/tests/compiler/dart2js_extra/32828_test.dart
index c56a904..7e0b22b 100644
--- a/tests/compiler/dart2js_extra/32828_test.dart
+++ b/tests/compiler/dart2js_extra/32828_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.7
+
 // dart2jsOptions=--strong
 
 class A {
diff --git a/tests/compiler/dart2js_extra/32853_test.dart b/tests/compiler/dart2js_extra/32853_test.dart
index ccf8dab..f90fb71 100644
--- a/tests/compiler/dart2js_extra/32853_test.dart
+++ b/tests/compiler/dart2js_extra/32853_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.7
+
 // dart2jsOptions=--strong
 
 // Regression test for issue 32853.
diff --git a/tests/compiler/dart2js_extra/32928_test.dart b/tests/compiler/dart2js_extra/32928_test.dart
index 549909b..ef392df 100644
--- a/tests/compiler/dart2js_extra/32928_test.dart
+++ b/tests/compiler/dart2js_extra/32928_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.7
+
 // dart2jsOptions=--strong
 
 /// Regression test for issue 32928.
diff --git a/tests/compiler/dart2js_extra/32969_test.dart b/tests/compiler/dart2js_extra/32969_test.dart
index 8599b3f..8f1e892 100644
--- a/tests/compiler/dart2js_extra/32969_test.dart
+++ b/tests/compiler/dart2js_extra/32969_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.7
+
 // dart2jsOptions=--strong
 
 @JS()
diff --git a/tests/compiler/dart2js_extra/32997a_lib.dart b/tests/compiler/dart2js_extra/32997a_lib.dart
index 54e4f54..5c7566d 100644
--- a/tests/compiler/dart2js_extra/32997a_lib.dart
+++ b/tests/compiler/dart2js_extra/32997a_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
+
 T getFoo<T>(T v) => v;
 
 typedef dynamic G<T>(T v);
diff --git a/tests/compiler/dart2js_extra/32997a_test.dart b/tests/compiler/dart2js_extra/32997a_test.dart
index 4e2b00a..6a0ec97 100644
--- a/tests/compiler/dart2js_extra/32997a_test.dart
+++ b/tests/compiler/dart2js_extra/32997a_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.7
+
 // dart2jsOptions=--strong
 
 import '32997a_lib.dart' deferred as b;
diff --git a/tests/compiler/dart2js_extra/32997b_lib.dart b/tests/compiler/dart2js_extra/32997b_lib.dart
index 62eee11..4d532d0 100644
--- a/tests/compiler/dart2js_extra/32997b_lib.dart
+++ b/tests/compiler/dart2js_extra/32997b_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
+
 T getFoo<T>(T v) => v;
 
 typedef dynamic G<T>(T v);
diff --git a/tests/compiler/dart2js_extra/32997b_test.dart b/tests/compiler/dart2js_extra/32997b_test.dart
index 7783285..3041932 100644
--- a/tests/compiler/dart2js_extra/32997b_test.dart
+++ b/tests/compiler/dart2js_extra/32997b_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.7
+
 // dart2jsOptions=--strong
 
 import '32997b_lib.dart' deferred as b; //# 01: compile-time error
diff --git a/tests/compiler/dart2js_extra/33296_test.dart b/tests/compiler/dart2js_extra/33296_test.dart
index 7d06619..0b8e814 100644
--- a/tests/compiler/dart2js_extra/33296_test.dart
+++ b/tests/compiler/dart2js_extra/33296_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.7
+
 import 'dart:js';
 import 'dart:html'; // TODO(33316): Remove.
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/33572_test.dart b/tests/compiler/dart2js_extra/33572_test.dart
index 2721bf7..4ae5b51 100644
--- a/tests/compiler/dart2js_extra/33572_test.dart
+++ b/tests/compiler/dart2js_extra/33572_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.7
+
 // Regression test for issue 32853.
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/33_test.dart b/tests/compiler/dart2js_extra/33_test.dart
index 0d55209..286ff35 100644
--- a/tests/compiler/dart2js_extra/33_test.dart
+++ b/tests/compiler/dart2js_extra/33_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.7
+
 void main() {
   print(3 + 4 * 10 - 8 / 2 - 19 ~/ 3);
 }
diff --git a/tests/compiler/dart2js_extra/34156_test.dart b/tests/compiler/dart2js_extra/34156_test.dart
index f4dbb81..2d216aa 100644
--- a/tests/compiler/dart2js_extra/34156_test.dart
+++ b/tests/compiler/dart2js_extra/34156_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.7
+
 import 'package:expect/expect.dart';
 
 @pragma('dart2js:tryInline')
diff --git a/tests/compiler/dart2js_extra/34701_test.dart b/tests/compiler/dart2js_extra/34701_test.dart
index 708024f..10f83ee 100644
--- a/tests/compiler/dart2js_extra/34701_test.dart
+++ b/tests/compiler/dart2js_extra/34701_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.7
+
 // dart2jsOptions=--omit-implicit-checks
 
 /// Regression test for issue 34701.
diff --git a/tests/compiler/dart2js_extra/35341_test.dart b/tests/compiler/dart2js_extra/35341_test.dart
index 80310f0..ce527af 100644
--- a/tests/compiler/dart2js_extra/35341_test.dart
+++ b/tests/compiler/dart2js_extra/35341_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.7
+
 // Regression test for issue 35341.
 
 import "dart:async";
diff --git a/tests/compiler/dart2js_extra/35356_test.dart b/tests/compiler/dart2js_extra/35356_test.dart
index 13dc082..a6b768b 100644
--- a/tests/compiler/dart2js_extra/35356_test.dart
+++ b/tests/compiler/dart2js_extra/35356_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.7
+
 main() {
   bool b = true & true;
   b |= true;
diff --git a/tests/compiler/dart2js_extra/35853_test.dart b/tests/compiler/dart2js_extra/35853_test.dart
index 3fe033ac..e3cebb6 100644
--- a/tests/compiler/dart2js_extra/35853_test.dart
+++ b/tests/compiler/dart2js_extra/35853_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.7
+
 import 'package:expect/expect.dart';
 
 typedef F1 = int Function(int);
diff --git a/tests/compiler/dart2js_extra/35965a_test.dart b/tests/compiler/dart2js_extra/35965a_test.dart
index 56a3d7a..332aa20 100644
--- a/tests/compiler/dart2js_extra/35965a_test.dart
+++ b/tests/compiler/dart2js_extra/35965a_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.7
+
 // Regression test for issue 35965.
 //
 // The combination of generator bodies on mixin methods with super-calls caused
diff --git a/tests/compiler/dart2js_extra/37494_test.dart b/tests/compiler/dart2js_extra/37494_test.dart
index d2d8283..a0abceb 100644
--- a/tests/compiler/dart2js_extra/37494_test.dart
+++ b/tests/compiler/dart2js_extra/37494_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.7
+
 // Regression test for http://dartbug.com/37494
 
 import 'dart:collection';
diff --git a/tests/compiler/dart2js_extra/37576_test.dart b/tests/compiler/dart2js_extra/37576_test.dart
index b243963..4d797e8 100644
--- a/tests/compiler/dart2js_extra/37576_test.dart
+++ b/tests/compiler/dart2js_extra/37576_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.7
+
 import 'package:js/js.dart';
 
 @JS('jsFun')
diff --git a/tests/compiler/dart2js_extra/38005_test.dart b/tests/compiler/dart2js_extra/38005_test.dart
index 2789b31..e5a4bb5 100644
--- a/tests/compiler/dart2js_extra/38005_test.dart
+++ b/tests/compiler/dart2js_extra/38005_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.7
+
 import "package:expect/expect.dart";
 
 class A {}
diff --git a/tests/compiler/dart2js_extra/38949_test.dart b/tests/compiler/dart2js_extra/38949_test.dart
index 4b0ceba..814b004 100644
--- a/tests/compiler/dart2js_extra/38949_test.dart
+++ b/tests/compiler/dart2js_extra/38949_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.7
+
 import 'package:expect/expect.dart';
 
 abstract class Foo<A, B> {
diff --git a/tests/compiler/dart2js_extra/3_test.dart b/tests/compiler/dart2js_extra/3_test.dart
index 520d8a8..aad263a 100644
--- a/tests/compiler/dart2js_extra/3_test.dart
+++ b/tests/compiler/dart2js_extra/3_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.7
+
 int main() {
   return 3;
 }
diff --git a/tests/compiler/dart2js_extra/40152a_test.dart b/tests/compiler/dart2js_extra/40152a_test.dart
index 76e0698..68dc8ae 100644
--- a/tests/compiler/dart2js_extra/40152a_test.dart
+++ b/tests/compiler/dart2js_extra/40152a_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.7
+
 // Partial regression test for #40152.
 
 import 'package:js/js.dart';
diff --git a/tests/compiler/dart2js_extra/40296_test.dart b/tests/compiler/dart2js_extra/40296_test.dart
index 989b6f7..4e40bcc 100644
--- a/tests/compiler/dart2js_extra/40296_test.dart
+++ b/tests/compiler/dart2js_extra/40296_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.7
+
 @JS()
 library test;
 
diff --git a/tests/compiler/dart2js_extra/40902_test.dart b/tests/compiler/dart2js_extra/40902_test.dart
index d62c769..e992476 100644
--- a/tests/compiler/dart2js_extra/40902_test.dart
+++ b/tests/compiler/dart2js_extra/40902_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.7
+
 import "package:expect/expect.dart";
 
 class Foo {
diff --git a/tests/compiler/dart2js_extra/43_test.dart b/tests/compiler/dart2js_extra/43_test.dart
index 2a85bb1..055815e 100644
--- a/tests/compiler/dart2js_extra/43_test.dart
+++ b/tests/compiler/dart2js_extra/43_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.7
+
 void main() {
   print(3 + 4 * 10);
 }
diff --git a/tests/compiler/dart2js_extra/7_test.dart b/tests/compiler/dart2js_extra/7_test.dart
index 742ca65..48631e0f 100644
--- a/tests/compiler/dart2js_extra/7_test.dart
+++ b/tests/compiler/dart2js_extra/7_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.7
+
 void main() {
   print(3 + 4);
 }
diff --git a/tests/compiler/dart2js_extra/881_test.dart b/tests/compiler/dart2js_extra/881_test.dart
index 5be849c..04a8f10 100644
--- a/tests/compiler/dart2js_extra/881_test.dart
+++ b/tests/compiler/dart2js_extra/881_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.7
+
 // Regression test for DartPad issue 881.
 
 @pragma('dart2js:disableFinal')
diff --git a/tests/compiler/dart2js_extra/LayoutTests_fast_mediastream_getusermedia_t01_test.dart b/tests/compiler/dart2js_extra/LayoutTests_fast_mediastream_getusermedia_t01_test.dart
index 3ca943b..31703f8 100644
--- a/tests/compiler/dart2js_extra/LayoutTests_fast_mediastream_getusermedia_t01_test.dart
+++ b/tests/compiler/dart2js_extra/LayoutTests_fast_mediastream_getusermedia_t01_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.7
+
 /// Test derived from a broken co19 test
 /// (LayoutTests/fast/mediastream/getusermedia_t01.dart). Caused dart2js to
 /// crash.
diff --git a/tests/compiler/dart2js_extra/assert_with_message_test.dart b/tests/compiler/dart2js_extra/assert_with_message_test.dart
index 993ab11..4cda95f 100644
--- a/tests/compiler/dart2js_extra/assert_with_message_test.dart
+++ b/tests/compiler/dart2js_extra/assert_with_message_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.7
+
 import "package:expect/expect.dart";
 
 @pragma('dart2js:assumeDynamic')
diff --git a/tests/compiler/dart2js_extra/async_helper.dart b/tests/compiler/dart2js_extra/async_helper.dart
index b7ee2fd..72418f7 100644
--- a/tests/compiler/dart2js_extra/async_helper.dart
+++ b/tests/compiler/dart2js_extra/async_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.7
+
 library async_helper;
 
 /**
diff --git a/tests/compiler/dart2js_extra/async_stacktrace_test.dart b/tests/compiler/dart2js_extra/async_stacktrace_test.dart
index 708706b..1e2733a 100644
--- a/tests/compiler/dart2js_extra/async_stacktrace_test.dart
+++ b/tests/compiler/dart2js_extra/async_stacktrace_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.7
+
 import "dart:async";
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/big_allocation_expression_test.dart b/tests/compiler/dart2js_extra/big_allocation_expression_test.dart
index 30653a3..d405a4d 100644
--- a/tests/compiler/dart2js_extra/big_allocation_expression_test.dart
+++ b/tests/compiler/dart2js_extra/big_allocation_expression_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.7
+
 // This program crashes the SSA backend. http://dartbug.com/24635.
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/block_expression_on_field_test.dart b/tests/compiler/dart2js_extra/block_expression_on_field_test.dart
index 7b6449f..7e4f1e4 100644
--- a/tests/compiler/dart2js_extra/block_expression_on_field_test.dart
+++ b/tests/compiler/dart2js_extra/block_expression_on_field_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.7
+
 /// Regression test for #36864
 ///
 /// Block expressions in top-level fields used to crash the compiler.
diff --git a/tests/compiler/dart2js_extra/boolean_conversion_test.dart b/tests/compiler/dart2js_extra/boolean_conversion_test.dart
index 64cd441..2c51dfc 100644
--- a/tests/compiler/dart2js_extra/boolean_conversion_test.dart
+++ b/tests/compiler/dart2js_extra/boolean_conversion_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.7
+
 // dart2jsOptions=--omit-implicit-checks
 
 // Note: --omit-implicit-checks causes Expect.isNull to misbehave, so we use
diff --git a/tests/compiler/dart2js_extra/bound_closure_interceptor_methods_test.dart b/tests/compiler/dart2js_extra/bound_closure_interceptor_methods_test.dart
index f17b647..45c1b78 100644
--- a/tests/compiler/dart2js_extra/bound_closure_interceptor_methods_test.dart
+++ b/tests/compiler/dart2js_extra/bound_closure_interceptor_methods_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/bound_closure_interceptor_type_test.dart b/tests/compiler/dart2js_extra/bound_closure_interceptor_type_test.dart
index 7d4ea10..39271c3 100644
--- a/tests/compiler/dart2js_extra/bound_closure_interceptor_type_test.dart
+++ b/tests/compiler/dart2js_extra/bound_closure_interceptor_type_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.7
+
 import "package:expect/expect.dart";
 
 // Test for type checks against tear-off closures generated in different
diff --git a/tests/compiler/dart2js_extra/bounded_type_literal_test.dart b/tests/compiler/dart2js_extra/bounded_type_literal_test.dart
index ad0fbe8..c5683d6 100644
--- a/tests/compiler/dart2js_extra/bounded_type_literal_test.dart
+++ b/tests/compiler/dart2js_extra/bounded_type_literal_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/bounds_check1a_test.dart b/tests/compiler/dart2js_extra/bounds_check1a_test.dart
index b42ca0d..781f088 100644
--- a/tests/compiler/dart2js_extra/bounds_check1a_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check1a_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/bounds_check1b_test.dart b/tests/compiler/dart2js_extra/bounds_check1b_test.dart
index 8fad189..739449e 100644
--- a/tests/compiler/dart2js_extra/bounds_check1b_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check1b_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/bounds_check2a_test.dart b/tests/compiler/dart2js_extra/bounds_check2a_test.dart
index 654c71b..f2000f6 100644
--- a/tests/compiler/dart2js_extra/bounds_check2a_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check2a_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/bounds_check2b_test.dart b/tests/compiler/dart2js_extra/bounds_check2b_test.dart
index 07cd595..373fa7c 100644
--- a/tests/compiler/dart2js_extra/bounds_check2b_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check2b_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/bounds_check3a_test.dart b/tests/compiler/dart2js_extra/bounds_check3a_test.dart
index 482b8ed..64c9a52 100644
--- a/tests/compiler/dart2js_extra/bounds_check3a_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check3a_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/bounds_check3b_test.dart b/tests/compiler/dart2js_extra/bounds_check3b_test.dart
index af34397..fba0553 100644
--- a/tests/compiler/dart2js_extra/bounds_check3b_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check3b_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/bounds_check3c_test.dart b/tests/compiler/dart2js_extra/bounds_check3c_test.dart
index 696afdd..54a5ddb 100644
--- a/tests/compiler/dart2js_extra/bounds_check3c_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check3c_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.7
+
 import 'package:expect/expect.dart';
 
 main() {
diff --git a/tests/compiler/dart2js_extra/bounds_check4a_test.dart b/tests/compiler/dart2js_extra/bounds_check4a_test.dart
index 49e8d42..7b8af1d 100644
--- a/tests/compiler/dart2js_extra/bounds_check4a_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check4a_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/bounds_check4b_test.dart b/tests/compiler/dart2js_extra/bounds_check4b_test.dart
index fdb7863..06d3056 100644
--- a/tests/compiler/dart2js_extra/bounds_check4b_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check4b_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/bounds_check_test.dart b/tests/compiler/dart2js_extra/bounds_check_test.dart
index 99223c8..50ed0f1 100644
--- a/tests/compiler/dart2js_extra/bounds_check_test.dart
+++ b/tests/compiler/dart2js_extra/bounds_check_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.7
+
 main() {
   var a = [0, 1];
   a[-1]; //                         //# 01: runtime error
diff --git a/tests/compiler/dart2js_extra/break_test.dart b/tests/compiler/dart2js_extra/break_test.dart
index 830fe73..8758d05 100644
--- a/tests/compiler/dart2js_extra/break_test.dart
+++ b/tests/compiler/dart2js_extra/break_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.7
+
 import "package:expect/expect.dart";
 
 break1(int x, int y, int ew, int ez) {
diff --git a/tests/compiler/dart2js_extra/call_is_function_test.dart b/tests/compiler/dart2js_extra/call_is_function_test.dart
index 8907cad..d824b04 100644
--- a/tests/compiler/dart2js_extra/call_is_function_test.dart
+++ b/tests/compiler/dart2js_extra/call_is_function_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.7
+
 import 'package:expect/expect.dart';
 
 class A {
diff --git a/tests/compiler/dart2js_extra/call_signature_test.dart b/tests/compiler/dart2js_extra/call_signature_test.dart
index 20978d5..014d136 100644
--- a/tests/compiler/dart2js_extra/call_signature_test.dart
+++ b/tests/compiler/dart2js_extra/call_signature_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.7
+
 // Regression test. Crash occurred when trying to create a signature function
 // for the non-live 'call' method on the live class 'A'.
 
diff --git a/tests/compiler/dart2js_extra/call_uninlined_test.dart b/tests/compiler/dart2js_extra/call_uninlined_test.dart
index ab0e750..3cdeaa7 100644
--- a/tests/compiler/dart2js_extra/call_uninlined_test.dart
+++ b/tests/compiler/dart2js_extra/call_uninlined_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.7
+
 import 'package:expect/expect.dart';
 
 class H {
diff --git a/tests/compiler/dart2js_extra/cfe_instance_constant_test.dart b/tests/compiler/dart2js_extra/cfe_instance_constant_test.dart
index 0c202c1..187b91a 100644
--- a/tests/compiler/dart2js_extra/cfe_instance_constant_test.dart
+++ b/tests/compiler/dart2js_extra/cfe_instance_constant_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.7
+
 // Regression test for CFE constant evaluation. The evaluation of [Class9.field]
 // assumed that its initializer did not hold an unevaluated constant.
 
diff --git a/tests/compiler/dart2js_extra/checked_setter_test.dart b/tests/compiler/dart2js_extra/checked_setter_test.dart
index 60ca4fa..4b0e323 100644
--- a/tests/compiler/dart2js_extra/checked_setter_test.dart
+++ b/tests/compiler/dart2js_extra/checked_setter_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.7
+
 import 'package:expect/expect.dart';
 
 class A {
diff --git a/tests/compiler/dart2js_extra/class_hierarchy_extends_clause_test.dart b/tests/compiler/dart2js_extra/class_hierarchy_extends_clause_test.dart
index 1cd8ebb..ef71e57 100644
--- a/tests/compiler/dart2js_extra/class_hierarchy_extends_clause_test.dart
+++ b/tests/compiler/dart2js_extra/class_hierarchy_extends_clause_test.dart
@@ -1,6 +1,8 @@
 // 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.
+
+// @dart = 2.7
 import 'package:expect/expect.dart';
 
 class A {}
diff --git a/tests/compiler/dart2js_extra/closure2_test.dart b/tests/compiler/dart2js_extra/closure2_test.dart
index fd8e726..22a577f 100644
--- a/tests/compiler/dart2js_extra/closure2_test.dart
+++ b/tests/compiler/dart2js_extra/closure2_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.7
+
 import "package:expect/expect.dart";
 
 closure0() {
diff --git a/tests/compiler/dart2js_extra/closure3_test.dart b/tests/compiler/dart2js_extra/closure3_test.dart
index daea300..fcd846a 100644
--- a/tests/compiler/dart2js_extra/closure3_test.dart
+++ b/tests/compiler/dart2js_extra/closure3_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.7
+
 import "package:expect/expect.dart";
 
 main() {
diff --git a/tests/compiler/dart2js_extra/closure4_test.dart b/tests/compiler/dart2js_extra/closure4_test.dart
index 08e00bd..2824079 100644
--- a/tests/compiler/dart2js_extra/closure4_test.dart
+++ b/tests/compiler/dart2js_extra/closure4_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.7
+
 import "package:expect/expect.dart";
 
 closure0() {
diff --git a/tests/compiler/dart2js_extra/closure5_test.dart b/tests/compiler/dart2js_extra/closure5_test.dart
index f135346..b241a97 100644
--- a/tests/compiler/dart2js_extra/closure5_test.dart
+++ b/tests/compiler/dart2js_extra/closure5_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/closure6_test.dart b/tests/compiler/dart2js_extra/closure6_test.dart
index a49b187..168c570 100644
--- a/tests/compiler/dart2js_extra/closure6_test.dart
+++ b/tests/compiler/dart2js_extra/closure6_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/closure7_test.dart b/tests/compiler/dart2js_extra/closure7_test.dart
index bae471e..8d8fc62 100644
--- a/tests/compiler/dart2js_extra/closure7_test.dart
+++ b/tests/compiler/dart2js_extra/closure7_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.7
+
 import "package:expect/expect.dart";
 
 var foo;
diff --git a/tests/compiler/dart2js_extra/closure_capture2_test.dart b/tests/compiler/dart2js_extra/closure_capture2_test.dart
index 4d22b10..3a11798 100644
--- a/tests/compiler/dart2js_extra/closure_capture2_test.dart
+++ b/tests/compiler/dart2js_extra/closure_capture2_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.7
+
 import "package:expect/expect.dart";
 
 closure0() {
diff --git a/tests/compiler/dart2js_extra/closure_capture3_test.dart b/tests/compiler/dart2js_extra/closure_capture3_test.dart
index f74f7f5..63b10c5 100644
--- a/tests/compiler/dart2js_extra/closure_capture3_test.dart
+++ b/tests/compiler/dart2js_extra/closure_capture3_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.7
+
 import "package:expect/expect.dart";
 
 class Closure {
diff --git a/tests/compiler/dart2js_extra/closure_capture4_test.dart b/tests/compiler/dart2js_extra/closure_capture4_test.dart
index a16cb07..be66533 100644
--- a/tests/compiler/dart2js_extra/closure_capture4_test.dart
+++ b/tests/compiler/dart2js_extra/closure_capture4_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.7
+
 import "package:expect/expect.dart";
 
 closure0() {
diff --git a/tests/compiler/dart2js_extra/closure_capture5_test.dart b/tests/compiler/dart2js_extra/closure_capture5_test.dart
index c95bbc6..f01d655 100644
--- a/tests/compiler/dart2js_extra/closure_capture5_test.dart
+++ b/tests/compiler/dart2js_extra/closure_capture5_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.7
+
 import "package:expect/expect.dart";
 
 closure0() {
diff --git a/tests/compiler/dart2js_extra/closure_capture6_test.dart b/tests/compiler/dart2js_extra/closure_capture6_test.dart
index 06f593f..547d9e7 100644
--- a/tests/compiler/dart2js_extra/closure_capture6_test.dart
+++ b/tests/compiler/dart2js_extra/closure_capture6_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.7
+
 import "package:expect/expect.dart";
 
 // Simple test for free variable in two nested scopes.
diff --git a/tests/compiler/dart2js_extra/closure_capture7_test.dart b/tests/compiler/dart2js_extra/closure_capture7_test.dart
index 045f6a5..5ec52d4 100644
--- a/tests/compiler/dart2js_extra/closure_capture7_test.dart
+++ b/tests/compiler/dart2js_extra/closure_capture7_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.7
+
 class A<T> {
   List<List> xs;
 
diff --git a/tests/compiler/dart2js_extra/closure_capture_test.dart b/tests/compiler/dart2js_extra/closure_capture_test.dart
index cc12c58..acea026 100644
--- a/tests/compiler/dart2js_extra/closure_capture_test.dart
+++ b/tests/compiler/dart2js_extra/closure_capture_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.7
+
 import "package:expect/expect.dart";
 
 closure0() {
diff --git a/tests/compiler/dart2js_extra/closure_signature_unneeded_test.dart b/tests/compiler/dart2js_extra/closure_signature_unneeded_test.dart
index 88534c7..037743a 100644
--- a/tests/compiler/dart2js_extra/closure_signature_unneeded_test.dart
+++ b/tests/compiler/dart2js_extra/closure_signature_unneeded_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.7
+
 import 'package:expect/expect.dart';
 
 class A<T> {
diff --git a/tests/compiler/dart2js_extra/closure_test.dart b/tests/compiler/dart2js_extra/closure_test.dart
index 5ad4247..c3f1448 100644
--- a/tests/compiler/dart2js_extra/closure_test.dart
+++ b/tests/compiler/dart2js_extra/closure_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.7
+
 import "package:expect/expect.dart";
 
 closure0() {
diff --git a/tests/compiler/dart2js_extra/code_motion_exception_test.dart b/tests/compiler/dart2js_extra/code_motion_exception_test.dart
index 95ed395..0bd675bd 100644
--- a/tests/compiler/dart2js_extra/code_motion_exception_test.dart
+++ b/tests/compiler/dart2js_extra/code_motion_exception_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.7
+
 import "package:expect/expect.dart";
 
 // Test for correct order of exceptions in code with checks that could be moved
diff --git a/tests/compiler/dart2js_extra/compile_time_constant4_test.dart b/tests/compiler/dart2js_extra/compile_time_constant4_test.dart
index 2349dc1..f2497bf 100644
--- a/tests/compiler/dart2js_extra/compile_time_constant4_test.dart
+++ b/tests/compiler/dart2js_extra/compile_time_constant4_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.7
+
 import "package:expect/expect.dart";
 
 const x = "foo";
diff --git a/tests/compiler/dart2js_extra/compound_operator_index_test.dart b/tests/compiler/dart2js_extra/compound_operator_index_test.dart
index 508a9e0..4c3d6f3 100644
--- a/tests/compiler/dart2js_extra/compound_operator_index_test.dart
+++ b/tests/compiler/dart2js_extra/compound_operator_index_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/conditional_rewrite_test.dart b/tests/compiler/dart2js_extra/conditional_rewrite_test.dart
index 57b0a42..936e03c 100644
--- a/tests/compiler/dart2js_extra/conditional_rewrite_test.dart
+++ b/tests/compiler/dart2js_extra/conditional_rewrite_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.7
+
 import "package:expect/expect.dart";
 
 // Test that dart2js does not rewrite conditional into logical operators
diff --git a/tests/compiler/dart2js_extra/conditional_send_test.dart b/tests/compiler/dart2js_extra/conditional_send_test.dart
index d1a27c1..86c29f0c 100644
--- a/tests/compiler/dart2js_extra/conditional_send_test.dart
+++ b/tests/compiler/dart2js_extra/conditional_send_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.7
+
 // SharedOptions=--enable-null-aware-operators
 import "package:expect/expect.dart";
 
diff --git a/tests/compiler/dart2js_extra/conditional_test.dart b/tests/compiler/dart2js_extra/conditional_test.dart
index 13cf988..0cbbd7d 100644
--- a/tests/compiler/dart2js_extra/conditional_test.dart
+++ b/tests/compiler/dart2js_extra/conditional_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.7
+
 import "package:expect/expect.dart";
 
 getZero() {
diff --git a/tests/compiler/dart2js_extra/conflict_index_test.dart b/tests/compiler/dart2js_extra/conflict_index_test.dart
index 46c74ea..e0ed5f0 100644
--- a/tests/compiler/dart2js_extra/conflict_index_test.dart
+++ b/tests/compiler/dart2js_extra/conflict_index_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.7
+
 import "package:expect/expect.dart";
 
 main() {
diff --git a/tests/compiler/dart2js_extra/consistent_add_error_test.dart b/tests/compiler/dart2js_extra/consistent_add_error_test.dart
index fd5840f..792fabd 100644
--- a/tests/compiler/dart2js_extra/consistent_add_error_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_add_error_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.7
+
 import "package:expect/expect.dart";
 
 // Test that optimized '+' and slow path '+' produce the same error.
diff --git a/tests/compiler/dart2js_extra/consistent_codeUnitAt_error_test.dart b/tests/compiler/dart2js_extra/consistent_codeUnitAt_error_test.dart
index 536279b..e43c0c4 100644
--- a/tests/compiler/dart2js_extra/consistent_codeUnitAt_error_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_codeUnitAt_error_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.7
+
 import "package:expect/expect.dart";
 
 // Test that optimized codeUnitAt and slow path codeUnitAt produce the same
diff --git a/tests/compiler/dart2js_extra/consistent_index_error_array_test.dart b/tests/compiler/dart2js_extra/consistent_index_error_array_test.dart
index 6afa8a9..aba6fbe 100644
--- a/tests/compiler/dart2js_extra/consistent_index_error_array_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_index_error_array_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.7
+
 import "package:expect/expect.dart";
 import "dart:typed_data";
 
diff --git a/tests/compiler/dart2js_extra/consistent_index_error_string_test.dart b/tests/compiler/dart2js_extra/consistent_index_error_string_test.dart
index 45155ff..935de54 100644
--- a/tests/compiler/dart2js_extra/consistent_index_error_string_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_index_error_string_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.7
+
 import "package:expect/expect.dart";
 import "dart:typed_data";
 
diff --git a/tests/compiler/dart2js_extra/consistent_index_error_typed_list_test.dart b/tests/compiler/dart2js_extra/consistent_index_error_typed_list_test.dart
index bf198c6..7646c4a 100644
--- a/tests/compiler/dart2js_extra/consistent_index_error_typed_list_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_index_error_typed_list_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.7
+
 import "package:expect/expect.dart";
 import "dart:typed_data";
 
diff --git a/tests/compiler/dart2js_extra/consistent_null_add_error_test.dart b/tests/compiler/dart2js_extra/consistent_null_add_error_test.dart
index 64ad07d..2ab6ce5 100644
--- a/tests/compiler/dart2js_extra/consistent_null_add_error_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_null_add_error_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.7
+
 import "package:expect/expect.dart";
 
 // Test that optimized 'null + x' and slow path '+' produce the same error.
diff --git a/tests/compiler/dart2js_extra/consistent_subtract_error_test.dart b/tests/compiler/dart2js_extra/consistent_subtract_error_test.dart
index a847937..6cba5c8 100644
--- a/tests/compiler/dart2js_extra/consistent_subtract_error_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_subtract_error_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.7
+
 /// dart2jsOptions=--omit-implicit-checks
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/consistent_type_error_test.dart b/tests/compiler/dart2js_extra/consistent_type_error_test.dart
index e687ba4..d8287aa 100644
--- a/tests/compiler/dart2js_extra/consistent_type_error_test.dart
+++ b/tests/compiler/dart2js_extra/consistent_type_error_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.7
+
 // Test that type checks give consistent errors for the same types. In minified
 // mode this checks that the minified class names are consistently tagged.
 
diff --git a/tests/compiler/dart2js_extra/constant_fold_number_dart2_j_s_test.dart b/tests/compiler/dart2js_extra/constant_fold_number_dart2_j_s_test.dart
index aab61d7..bb3057d 100644
--- a/tests/compiler/dart2js_extra/constant_fold_number_dart2_j_s_test.dart
+++ b/tests/compiler/dart2js_extra/constant_fold_number_dart2_j_s_test.dart
@@ -1,6 +1,8 @@
 // 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.
+
+// @dart = 2.7
 // This test is making sure we don't try to constant fold numbers
 // where the semantics differ at compile-time (Dart) and runtime (JS).
 
diff --git a/tests/compiler/dart2js_extra/constant_folding_test.dart b/tests/compiler/dart2js_extra/constant_folding_test.dart
index b9b050b..927ac28 100644
--- a/tests/compiler/dart2js_extra/constant_folding_test.dart
+++ b/tests/compiler/dart2js_extra/constant_folding_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.7
+
 import "package:expect/expect.dart";
 
 void main() {
diff --git a/tests/compiler/dart2js_extra/constant_javascript_semantics2_test.dart b/tests/compiler/dart2js_extra/constant_javascript_semantics2_test.dart
index 6ca6693..858d88b 100644
--- a/tests/compiler/dart2js_extra/constant_javascript_semantics2_test.dart
+++ b/tests/compiler/dart2js_extra/constant_javascript_semantics2_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.7
+
 import "package:expect/expect.dart";
 
 // Make sure we use JavaScript semantics when compiling compile-time constants.
diff --git a/tests/compiler/dart2js_extra/constant_javascript_semantics3_test.dart b/tests/compiler/dart2js_extra/constant_javascript_semantics3_test.dart
index 2cdf6b0..bfbfd8c 100644
--- a/tests/compiler/dart2js_extra/constant_javascript_semantics3_test.dart
+++ b/tests/compiler/dart2js_extra/constant_javascript_semantics3_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.7
+
 import "package:expect/expect.dart";
 
 // Make sure we use JavaScript semantics when compiling compile-time constants.
diff --git a/tests/compiler/dart2js_extra/constant_javascript_semantics4_test.dart b/tests/compiler/dart2js_extra/constant_javascript_semantics4_test.dart
index 9d19957..a3b26d4 100644
--- a/tests/compiler/dart2js_extra/constant_javascript_semantics4_test.dart
+++ b/tests/compiler/dart2js_extra/constant_javascript_semantics4_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.7
+
 // Make sure we use JavaScript semantics when compiling compile-time constants.
 
 // In checked mode, this return will not fail. If the compiler thinks
diff --git a/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart b/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart
index 1a09423..5f31542 100644
--- a/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart
+++ b/tests/compiler/dart2js_extra/constant_javascript_semantics_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.7
+
 import "package:expect/expect.dart";
 
 // Make sure we use JavaScript semantics when compiling compile-time constants.
diff --git a/tests/compiler/dart2js_extra/constant_javascript_semantics_test5.dart b/tests/compiler/dart2js_extra/constant_javascript_semantics_test5.dart
index e2275ea..94041a4 100644
--- a/tests/compiler/dart2js_extra/constant_javascript_semantics_test5.dart
+++ b/tests/compiler/dart2js_extra/constant_javascript_semantics_test5.dart
@@ -2,6 +2,8 @@
 // for details. All 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 "package:expect/expect.dart";
 
 // Make sure we can assert(const Foo() != null) in const initializers.
diff --git a/tests/compiler/dart2js_extra/crash_library_metadata.dart b/tests/compiler/dart2js_extra/crash_library_metadata.dart
index b274687..5b74d23 100644
--- a/tests/compiler/dart2js_extra/crash_library_metadata.dart
+++ b/tests/compiler/dart2js_extra/crash_library_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.7
+
 @Constant()
 library foo;
 
diff --git a/tests/compiler/dart2js_extra/data_uri_test.dart b/tests/compiler/dart2js_extra/data_uri_test.dart
index 90191c2..1d1ef1e 100644
--- a/tests/compiler/dart2js_extra/data_uri_test.dart
+++ b/tests/compiler/dart2js_extra/data_uri_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.7
+
 import "data:,var%20x=#_a._b;var%20y=#a._b;var%20z=#_b;";
 
 main() {
diff --git a/tests/compiler/dart2js_extra/deferred/34219_bounds_lib1.dart b/tests/compiler/dart2js_extra/deferred/34219_bounds_lib1.dart
index 81bf0ae..7b7c8b8 100644
--- a/tests/compiler/dart2js_extra/deferred/34219_bounds_lib1.dart
+++ b/tests/compiler/dart2js_extra/deferred/34219_bounds_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.7
+
 // Part of 34219_bounds_test.dart
 
 import '34219_bounds_lib2.dart';
diff --git a/tests/compiler/dart2js_extra/deferred/34219_bounds_lib2.dart b/tests/compiler/dart2js_extra/deferred/34219_bounds_lib2.dart
index 7726460..cb96b0e 100644
--- a/tests/compiler/dart2js_extra/deferred/34219_bounds_lib2.dart
+++ b/tests/compiler/dart2js_extra/deferred/34219_bounds_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.7
+
 // Part of 34219_bounds_test.dart
 
 class GeneratedMessage {}
diff --git a/tests/compiler/dart2js_extra/deferred/34219_bounds_lib3.dart b/tests/compiler/dart2js_extra/deferred/34219_bounds_lib3.dart
index a567162..4221d51 100644
--- a/tests/compiler/dart2js_extra/deferred/34219_bounds_lib3.dart
+++ b/tests/compiler/dart2js_extra/deferred/34219_bounds_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.7
+
 // Part of 34219_bounds_test.dart
 //
 // This library places GeneratedMessage into a different partition to
diff --git a/tests/compiler/dart2js_extra/deferred/34219_bounds_test.dart b/tests/compiler/dart2js_extra/deferred/34219_bounds_test.dart
index 67b77d9..1247f33 100644
--- a/tests/compiler/dart2js_extra/deferred/34219_bounds_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/34219_bounds_test.dart
@@ -1,6 +1,8 @@
 // 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.7
 // dart2jsOptions=--omit-implicit-checks
 
 // Tests that generic function type bounds are walked as dependencies of a
diff --git a/tests/compiler/dart2js_extra/deferred/34219_signature_lib1.dart b/tests/compiler/dart2js_extra/deferred/34219_signature_lib1.dart
index b3493bd..8788765 100644
--- a/tests/compiler/dart2js_extra/deferred/34219_signature_lib1.dart
+++ b/tests/compiler/dart2js_extra/deferred/34219_signature_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.7
+
 // Part of 34219_signature_test.dart
 
 import '34219_signature_lib2.dart';
diff --git a/tests/compiler/dart2js_extra/deferred/34219_signature_lib2.dart b/tests/compiler/dart2js_extra/deferred/34219_signature_lib2.dart
index e702fe6..b801bb9 100644
--- a/tests/compiler/dart2js_extra/deferred/34219_signature_lib2.dart
+++ b/tests/compiler/dart2js_extra/deferred/34219_signature_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.7
+
 // Part of 34219_signature_test.dart
 
 class GeneratedMessage {}
diff --git a/tests/compiler/dart2js_extra/deferred/34219_signature_lib3.dart b/tests/compiler/dart2js_extra/deferred/34219_signature_lib3.dart
index 35915d5..1d12aa6 100644
--- a/tests/compiler/dart2js_extra/deferred/34219_signature_lib3.dart
+++ b/tests/compiler/dart2js_extra/deferred/34219_signature_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.7
+
 // Part of 34219_signature_test.dart
 //
 // This library places GeneratedMessage into a different partition to
diff --git a/tests/compiler/dart2js_extra/deferred/34219_signature_test.dart b/tests/compiler/dart2js_extra/deferred/34219_signature_test.dart
index d6c2c05..fc5d240 100644
--- a/tests/compiler/dart2js_extra/deferred/34219_signature_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/34219_signature_test.dart
@@ -1,6 +1,8 @@
 // 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.7
 // dart2jsOptions=--omit-implicit-checks
 
 // Tests that closure signatures are walked as dependencies of a closure. If the
diff --git a/tests/compiler/dart2js_extra/deferred/default_arg_is_tearoff_lib.dart b/tests/compiler/dart2js_extra/deferred/default_arg_is_tearoff_lib.dart
index b3e8677..6be58fd 100644
--- a/tests/compiler/dart2js_extra/deferred/default_arg_is_tearoff_lib.dart
+++ b/tests/compiler/dart2js_extra/deferred/default_arg_is_tearoff_lib.dart
@@ -2,5 +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.
 
+// @dart = 2.7
+
 defaultArg() => "";
 myFunction([argumentName = defaultArg]) => argumentName();
diff --git a/tests/compiler/dart2js_extra/deferred/default_arg_is_tearoff_test.dart b/tests/compiler/dart2js_extra/deferred/default_arg_is_tearoff_test.dart
index 64c0c20..7e3d96c 100644
--- a/tests/compiler/dart2js_extra/deferred/default_arg_is_tearoff_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/default_arg_is_tearoff_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.7
+
 /// Regression test for https://github.com/dart-lang/sdk/issues/30002.
 ///
 /// The compiler used to keep all metadata (other than type information) in one
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_class_library.dart b/tests/compiler/dart2js_extra/deferred/deferred_class_library.dart
index 03dad35..46ee69d 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_class_library.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_class_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.7
+
 // Imported by deferred_class_test.dart.
 
 library deferred_class_library;
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_class_library2.dart b/tests/compiler/dart2js_extra/deferred/deferred_class_library2.dart
index fecca53..e09654f 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_class_library2.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_class_library2.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 // Imported by deferred_class_test.dart.
 
 library deferred_class_library2;
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_class_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_class_test.dart
index eb6c836..15698aa 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_class_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_class_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_constant2_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_constant2_test.dart
index 6ea3752..d8f0f11 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_constant2_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_constant2_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_constant3_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_constant3_test.dart
index 14add53..b91934f 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_constant3_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_constant3_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_constant4_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_constant4_test.dart
index af903f4..b14f649 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_constant4_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_constant4_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_constant_dependency_evaluation_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_constant_dependency_evaluation_test.dart
index 49d9558..449773b 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_constant_dependency_evaluation_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_constant_dependency_evaluation_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.7
+
 // This is a regression test for dartbug.com/26406. We test that the deferred
 // loader analyzer doesn't trip over constant expression evaluation.
 //
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_function_library.dart b/tests/compiler/dart2js_extra/deferred/deferred_function_library.dart
index 0eaebc7..120c4a3 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_function_library.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_function_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.7
+
 // Imported by deferred_function_test.dart and
 // deferred_semantics_test.dart.
 
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart
index 88fcbaf..d8e550c 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_function_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_function_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.7
+
 // Test that loading of a library (with top-level functions only) can
 // be deferred.
 
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_metadata_lib.dart b/tests/compiler/dart2js_extra/deferred/deferred_metadata_lib.dart
index 2bb5573..b973458 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_metadata_lib.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_metadata_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 Annotation {
   final annotationField;
   const Annotation([this.annotationField]);
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_metadata_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_metadata_test.dart
index 03c1b50..62cac10 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_metadata_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_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.7
+
 /// Regression tests to ensure that member metadata is not considered by the
 /// deferred loading algorithm, unless mirrors are available.
 ///
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib2.dart b/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib2.dart
index 93f32a0..2e3a238 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib2.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_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.7
+
 library lib2;
 
 import 'deferred_mirrors2_lazy.dart' deferred as admin;
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib4.dart b/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib4.dart
index 2ab9a2a..accf125 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib4.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib4.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'deferred_mirrors2_lib5.dart' show Injectable;
 
 @Injectable()
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib5.dart b/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib5.dart
index f970ed0..f449e4d 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib5.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_mirrors2_lib5.dart
@@ -2,6 +2,8 @@
 // for details. All 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 Injectable {
   const Injectable();
 }
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_overlapping_lib1.dart b/tests/compiler/dart2js_extra/deferred/deferred_overlapping_lib1.dart
index 7b2bac9..53b0e50 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_overlapping_lib1.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_overlapping_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.7
+
 import "deferred_overlapping_lib3.dart";
 
 class C1 extends C3 {}
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_overlapping_lib2.dart b/tests/compiler/dart2js_extra/deferred/deferred_overlapping_lib2.dart
index 5937171..1771c90 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_overlapping_lib2.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_overlapping_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.7
+
 import "deferred_overlapping_lib3.dart";
 
 class C2 extends C3 {}
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_overlapping_lib3.dart b/tests/compiler/dart2js_extra/deferred/deferred_overlapping_lib3.dart
index 7a87b7b..5f2e7c7 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_overlapping_lib3.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_overlapping_lib3.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.7
+
 class C3 {}
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_overlapping_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_overlapping_test.dart
index f626d58..4703ba7 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_overlapping_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_overlapping_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.7
+
 import "deferred_overlapping_lib1.dart" deferred as lib1;
 import "deferred_overlapping_lib2.dart" deferred as lib2;
 
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_unused_classes_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_unused_classes_test.dart
index 95da996..3719601 100644
--- a/tests/compiler/dart2js_extra/deferred/deferred_unused_classes_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/deferred_unused_classes_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.7
+
 // Test that deferred loader analyzer doesn't trip over unused classes.
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/deferred/interface_type_variable_lib.dart b/tests/compiler/dart2js_extra/deferred/interface_type_variable_lib.dart
index fb18b05..fecdc82 100644
--- a/tests/compiler/dart2js_extra/deferred/interface_type_variable_lib.dart
+++ b/tests/compiler/dart2js_extra/deferred/interface_type_variable_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 A {}
 
 class I<T> {}
diff --git a/tests/compiler/dart2js_extra/deferred/interface_type_variable_test.dart b/tests/compiler/dart2js_extra/deferred/interface_type_variable_test.dart
index db4b4f2..98af6f7 100644
--- a/tests/compiler/dart2js_extra/deferred/interface_type_variable_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/interface_type_variable_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.7
+
 import 'package:expect/expect.dart';
 import 'interface_type_variable_lib.dart' deferred as lib;
 
diff --git a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib1.dart b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib1.dart
index 01480aa..3b9163d 100644
--- a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib1.dart
+++ b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib1.dart
@@ -2,6 +2,8 @@
 import 'load_in_correct_order_lib5.dart';
 import 'load_in_correct_order_lib7.dart';
 
+// @dart = 2.7
+
 class C1 {
   final a;
   final b;
diff --git a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib2.dart b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib2.dart
index 4beadab..92b26b4 100644
--- a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib2.dart
+++ b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib2.dart
@@ -2,6 +2,8 @@
 import 'load_in_correct_order_lib6.dart';
 import 'load_in_correct_order_lib7.dart';
 
+// @dart = 2.7
+
 class C2 {
   final c;
   final d;
diff --git a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib3.dart b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib3.dart
index 1676e8f..1320396 100644
--- a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib3.dart
+++ b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib3.dart
@@ -2,6 +2,8 @@
 import 'load_in_correct_order_lib6.dart';
 import 'load_in_correct_order_lib7.dart';
 
+// @dart = 2.7
+
 class C3 {
   final e;
   final f;
diff --git a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib4.dart b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib4.dart
index eed0c5b..e94a037 100644
--- a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib4.dart
+++ b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib4.dart
@@ -1,6 +1,8 @@
 class C4 {
   final value = 499;
   const C4();
+
+// @dart = 2.7
 }
 
 const c4 = const C4();
diff --git a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib5.dart b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib5.dart
index 2212525..ca4085f 100644
--- a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib5.dart
+++ b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib5.dart
@@ -1,6 +1,8 @@
 class C5 {
   final value = 500;
   const C5();
+
+// @dart = 2.7
 }
 
 const c5 = const C5();
diff --git a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib6.dart b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib6.dart
index 8ee64e7..32f0093 100644
--- a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib6.dart
+++ b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib6.dart
@@ -1,6 +1,8 @@
 class C6 {
   final value = 501;
   const C6();
+
+// @dart = 2.7
 }
 
 const c6 = const C6();
diff --git a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib7.dart b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib7.dart
index 8c6f9b5..8056e2f 100644
--- a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib7.dart
+++ b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_lib7.dart
@@ -1,6 +1,8 @@
 class C7 {
   final value = 502;
   const C7();
+
+// @dart = 2.7
 }
 
 const c7 = const C7();
diff --git a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_test.dart b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_test.dart
index dc6727d..9bbf5f9 100644
--- a/tests/compiler/dart2js_extra/deferred/load_in_correct_order_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/load_in_correct_order_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.7
+
 /// This test creates a scenario to simulate what happens if hunks are loaded
 /// out of order. The compiler should initialize hunks in order regardless, but
 /// may do so in parallel while some hunks are not loaded yet.
diff --git a/tests/compiler/dart2js_extra/deferred/multiple_default_arg_lib1.dart b/tests/compiler/dart2js_extra/deferred/multiple_default_arg_lib1.dart
index 32ed7e6..2f654fe 100644
--- a/tests/compiler/dart2js_extra/deferred/multiple_default_arg_lib1.dart
+++ b/tests/compiler/dart2js_extra/deferred/multiple_default_arg_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.7
+
 defaultArg1() => 1;
 defaultArg2() => 2;
 myFunction1({argumentName1: defaultArg1, argumentName2: defaultArg2}) =>
diff --git a/tests/compiler/dart2js_extra/deferred/multiple_default_arg_lib2.dart b/tests/compiler/dart2js_extra/deferred/multiple_default_arg_lib2.dart
index eff81f4..62b487e 100644
--- a/tests/compiler/dart2js_extra/deferred/multiple_default_arg_lib2.dart
+++ b/tests/compiler/dart2js_extra/deferred/multiple_default_arg_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.7
+
 defaultArg3() => 3;
 defaultArg4() => 4;
 myFunction2({argumentName3: defaultArg3, argumentName4: defaultArg4}) =>
diff --git a/tests/compiler/dart2js_extra/deferred/multiple_default_arg_lib3.dart b/tests/compiler/dart2js_extra/deferred/multiple_default_arg_lib3.dart
index dab89a4..1fb289c 100644
--- a/tests/compiler/dart2js_extra/deferred/multiple_default_arg_lib3.dart
+++ b/tests/compiler/dart2js_extra/deferred/multiple_default_arg_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.7
+
 defaultArg3() => "3b";
 defaultArg4() => "4b";
 myFunction3(positional1, positional2,
diff --git a/tests/compiler/dart2js_extra/deferred/multiple_default_arg_test.dart b/tests/compiler/dart2js_extra/deferred/multiple_default_arg_test.dart
index 37681b9..f356e77 100644
--- a/tests/compiler/dart2js_extra/deferred/multiple_default_arg_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/multiple_default_arg_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.7
+
 /// This test is indirectly testing invariants of the generated code of dart2js.
 /// It ensures that indices to metadata information from **multiple** deferred
 /// fragments is kept separate, but that when they are loaded (and the metadata
diff --git a/tests/compiler/dart2js_extra/deferred/reflect_multiple_annotations_lib1.dart b/tests/compiler/dart2js_extra/deferred/reflect_multiple_annotations_lib1.dart
index 89e8e90..5ae2bbc 100644
--- a/tests/compiler/dart2js_extra/deferred/reflect_multiple_annotations_lib1.dart
+++ b/tests/compiler/dart2js_extra/deferred/reflect_multiple_annotations_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.7
+
 topLevelF() => 1;
 
 @MetaA("one")
diff --git a/tests/compiler/dart2js_extra/deferred/reflect_multiple_annotations_lib2.dart b/tests/compiler/dart2js_extra/deferred/reflect_multiple_annotations_lib2.dart
index 1c46957..930436f 100644
--- a/tests/compiler/dart2js_extra/deferred/reflect_multiple_annotations_lib2.dart
+++ b/tests/compiler/dart2js_extra/deferred/reflect_multiple_annotations_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.7
+
 @MetaB("lib")
 library foo;
 
diff --git a/tests/compiler/dart2js_extra/deferred/reflect_multiple_default_arg_lib1.dart b/tests/compiler/dart2js_extra/deferred/reflect_multiple_default_arg_lib1.dart
index e87a387..7f4aba9 100644
--- a/tests/compiler/dart2js_extra/deferred/reflect_multiple_default_arg_lib1.dart
+++ b/tests/compiler/dart2js_extra/deferred/reflect_multiple_default_arg_lib1.dart
@@ -2,5 +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.
 
+// @dart = 2.7
+
 defaultArg1() => 1;
 myFunction1([argumentName1 = defaultArg1]) => argumentName1();
diff --git a/tests/compiler/dart2js_extra/deferred/reflect_multiple_default_arg_lib2.dart b/tests/compiler/dart2js_extra/deferred/reflect_multiple_default_arg_lib2.dart
index f35642a..22cfd11 100644
--- a/tests/compiler/dart2js_extra/deferred/reflect_multiple_default_arg_lib2.dart
+++ b/tests/compiler/dart2js_extra/deferred/reflect_multiple_default_arg_lib2.dart
@@ -2,5 +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.
 
+// @dart = 2.7
+
 defaultArg2() => 2;
 myFunction2([argumentName2 = defaultArg2]) => argumentName2();
diff --git a/tests/compiler/dart2js_extra/deferred/shared_constant_a.dart b/tests/compiler/dart2js_extra/deferred/shared_constant_a.dart
index 388f0d3..d5520d5 100644
--- a/tests/compiler/dart2js_extra/deferred/shared_constant_a.dart
+++ b/tests/compiler/dart2js_extra/deferred/shared_constant_a.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'shared_constant_shared.dart' deferred as d;
 
 doA() async {
diff --git a/tests/compiler/dart2js_extra/deferred/shared_constant_b.dart b/tests/compiler/dart2js_extra/deferred/shared_constant_b.dart
index 177f50e..655a93b 100644
--- a/tests/compiler/dart2js_extra/deferred/shared_constant_b.dart
+++ b/tests/compiler/dart2js_extra/deferred/shared_constant_b.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'shared_constant_shared.dart' deferred as d;
 
 doB() async {
diff --git a/tests/compiler/dart2js_extra/deferred/shared_constant_c.dart b/tests/compiler/dart2js_extra/deferred/shared_constant_c.dart
index b64972e..aef7eff 100644
--- a/tests/compiler/dart2js_extra/deferred/shared_constant_c.dart
+++ b/tests/compiler/dart2js_extra/deferred/shared_constant_c.dart
@@ -2,6 +2,8 @@
 // for details. All 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 C {
   const C();
   method() => print("1");
diff --git a/tests/compiler/dart2js_extra/deferred/shared_constant_shared.dart b/tests/compiler/dart2js_extra/deferred/shared_constant_shared.dart
index a801718..cc3bc23 100644
--- a/tests/compiler/dart2js_extra/deferred/shared_constant_shared.dart
+++ b/tests/compiler/dart2js_extra/deferred/shared_constant_shared.dart
@@ -2,6 +2,8 @@
 // for details. All 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 'shared_constant_c.dart';
 
 const constant = const C(); // using `var` eludes the problem.
diff --git a/tests/compiler/dart2js_extra/deferred/shared_constant_test.dart b/tests/compiler/dart2js_extra/deferred/shared_constant_test.dart
index 3614147..d01b67f 100644
--- a/tests/compiler/dart2js_extra/deferred/shared_constant_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/shared_constant_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.7
+
 /// Regression test for issue https://github.com/dart-lang/sdk/issues/31306.
 ///
 /// When 1 constant was imported in two libraries by using the same exact
diff --git a/tests/compiler/dart2js_extra/deferred/type_literal_lib.dart b/tests/compiler/dart2js_extra/deferred/type_literal_lib.dart
index 867c399..105162f 100644
--- a/tests/compiler/dart2js_extra/deferred/type_literal_lib.dart
+++ b/tests/compiler/dart2js_extra/deferred/type_literal_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 A {}
 
 class B {}
diff --git a/tests/compiler/dart2js_extra/deferred/type_literal_test.dart b/tests/compiler/dart2js_extra/deferred/type_literal_test.dart
index 25e2c32..79c7b29 100644
--- a/tests/compiler/dart2js_extra/deferred/type_literal_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/type_literal_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.7
+
 // Regression test for Issue #33890.
 //
 // This fails if type literal constants are not deferred, but their RTI
diff --git a/tests/compiler/dart2js_extra/deferred/typedef_lib.dart b/tests/compiler/dart2js_extra/deferred/typedef_lib.dart
index 2bccab5..70b7740 100644
--- a/tests/compiler/dart2js_extra/deferred/typedef_lib.dart
+++ b/tests/compiler/dart2js_extra/deferred/typedef_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 A {}
 
 class B {}
diff --git a/tests/compiler/dart2js_extra/deferred/typedef_test.dart b/tests/compiler/dart2js_extra/deferred/typedef_test.dart
index fa4cc1f..3c45d81 100644
--- a/tests/compiler/dart2js_extra/deferred/typedef_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/typedef_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.7
+
 // Regression test for Issue #33890.
 //
 // This fails if type literal constants are not deferred, but their RTI
diff --git a/tests/compiler/dart2js_extra/deferred/uninstantiated_type_variable_lib.dart b/tests/compiler/dart2js_extra/deferred/uninstantiated_type_variable_lib.dart
index 2af788d..4780e81 100644
--- a/tests/compiler/dart2js_extra/deferred/uninstantiated_type_variable_lib.dart
+++ b/tests/compiler/dart2js_extra/deferred/uninstantiated_type_variable_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
+
 // All of these types are considered instantiated because we create an instance
 // of [C].
 
diff --git a/tests/compiler/dart2js_extra/deferred/uninstantiated_type_variable_test.dart b/tests/compiler/dart2js_extra/deferred/uninstantiated_type_variable_test.dart
index 3bd8b77..1d6c2f2 100644
--- a/tests/compiler/dart2js_extra/deferred/uninstantiated_type_variable_test.dart
+++ b/tests/compiler/dart2js_extra/deferred/uninstantiated_type_variable_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.7
+
 import 'package:expect/expect.dart';
 import 'uninstantiated_type_variable_lib.dart' deferred as lib;
 
diff --git a/tests/compiler/dart2js_extra/deferred_custom_loader_lib.dart b/tests/compiler/dart2js_extra/deferred_custom_loader_lib.dart
index e863607..4cf1b9d 100644
--- a/tests/compiler/dart2js_extra/deferred_custom_loader_lib.dart
+++ b/tests/compiler/dart2js_extra/deferred_custom_loader_lib.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.7
+
 foo() => 499;
diff --git a/tests/compiler/dart2js_extra/deferred_custom_loader_test.dart b/tests/compiler/dart2js_extra/deferred_custom_loader_test.dart
index d1f358e..50c9e97 100644
--- a/tests/compiler/dart2js_extra/deferred_custom_loader_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_custom_loader_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.7
+
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 import 'dart:_foreign_helper' show JS;
diff --git a/tests/compiler/dart2js_extra/deferred_fail_and_retry_lib.dart b/tests/compiler/dart2js_extra/deferred_fail_and_retry_lib.dart
index 48fbce6..606c26e 100644
--- a/tests/compiler/dart2js_extra/deferred_fail_and_retry_lib.dart
+++ b/tests/compiler/dart2js_extra/deferred_fail_and_retry_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
+
 foo() {
   return "loaded";
 }
diff --git a/tests/compiler/dart2js_extra/deferred_fail_and_retry_test.dart b/tests/compiler/dart2js_extra/deferred_fail_and_retry_test.dart
index 5dc34c5..23a6caa 100644
--- a/tests/compiler/dart2js_extra/deferred_fail_and_retry_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_fail_and_retry_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.7
+
 // Test that when a deferred import fails to load, it is possible to retry.
 
 import "deferred_fail_and_retry_lib.dart" deferred as lib;
diff --git a/tests/compiler/dart2js_extra/deferred_function_types1_test.dart b/tests/compiler/dart2js_extra/deferred_function_types1_test.dart
index 91c9075..2e853e1 100644
--- a/tests/compiler/dart2js_extra/deferred_function_types1_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_function_types1_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/deferred_function_types2_test.dart b/tests/compiler/dart2js_extra/deferred_function_types2_test.dart
index 4336421..586e1b8 100644
--- a/tests/compiler/dart2js_extra/deferred_function_types2_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_function_types2_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/deferred_function_types3_test.dart b/tests/compiler/dart2js_extra/deferred_function_types3_test.dart
index 98a6de8..10d69f4 100644
--- a/tests/compiler/dart2js_extra/deferred_function_types3_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_function_types3_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/deferred_function_types4_test.dart b/tests/compiler/dart2js_extra/deferred_function_types4_test.dart
index fc78d96..27fedbc 100644
--- a/tests/compiler/dart2js_extra/deferred_function_types4_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_function_types4_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/deferred_function_types5_test.dart b/tests/compiler/dart2js_extra/deferred_function_types5_test.dart
index 998d678..75b04e3 100644
--- a/tests/compiler/dart2js_extra/deferred_function_types5_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_function_types5_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/deferred_function_types6_test.dart b/tests/compiler/dart2js_extra/deferred_function_types6_test.dart
index 2423b52..0a1b2a7 100644
--- a/tests/compiler/dart2js_extra/deferred_function_types6_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_function_types6_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/deferred_function_types7_test.dart b/tests/compiler/dart2js_extra/deferred_function_types7_test.dart
index fe7c49e..ba16f2e 100644
--- a/tests/compiler/dart2js_extra/deferred_function_types7_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_function_types7_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/deferred_function_types8_test.dart b/tests/compiler/dart2js_extra/deferred_function_types8_test.dart
index 7222ef5..f6624a1 100644
--- a/tests/compiler/dart2js_extra/deferred_function_types8_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_function_types8_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/deferred_function_types_lib1.dart b/tests/compiler/dart2js_extra/deferred_function_types_lib1.dart
index 8a3a06f..da32827 100644
--- a/tests/compiler/dart2js_extra/deferred_function_types_lib1.dart
+++ b/tests/compiler/dart2js_extra/deferred_function_types_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.7
+
 method1() {
   return (int i) => i;
 }
diff --git a/tests/compiler/dart2js_extra/deferred_function_types_lib2.dart b/tests/compiler/dart2js_extra/deferred_function_types_lib2.dart
index a209dac..2ab9a1c 100644
--- a/tests/compiler/dart2js_extra/deferred_function_types_lib2.dart
+++ b/tests/compiler/dart2js_extra/deferred_function_types_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.7
+
 method2() {
   return (String s) => s;
 }
diff --git a/tests/compiler/dart2js_extra/deferred_inheritance_test.dart b/tests/compiler/dart2js_extra/deferred_inheritance_test.dart
index 2443682..0373907 100644
--- a/tests/compiler/dart2js_extra/deferred_inheritance_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_inheritance_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.7
+
 /// Regression test for --fast-startup. The compiler used to emit inherit calls
 /// on each fragment even for classes that were already loaded on a different
 /// fragment. As a result, the inheritance chain was overwritten in non-chrome
diff --git a/tests/compiler/dart2js_extra/deferred_split_lib1.dart b/tests/compiler/dart2js_extra/deferred_split_lib1.dart
index 195357a..9f80990 100644
--- a/tests/compiler/dart2js_extra/deferred_split_lib1.dart
+++ b/tests/compiler/dart2js_extra/deferred_split_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.7
+
 // Library loaded eagerly by deferred_split_test.dart
 
 class A<T> {}
diff --git a/tests/compiler/dart2js_extra/deferred_split_lib2.dart b/tests/compiler/dart2js_extra/deferred_split_lib2.dart
index d690e31..a97fef1 100644
--- a/tests/compiler/dart2js_extra/deferred_split_lib2.dart
+++ b/tests/compiler/dart2js_extra/deferred_split_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.7
+
 // Deferred library loaded by deferred_split_test.dart
 
 import 'deferred_split_lib1.dart';
diff --git a/tests/compiler/dart2js_extra/deferred_split_test.dart b/tests/compiler/dart2js_extra/deferred_split_test.dart
index 0459349..9b47f7d 100644
--- a/tests/compiler/dart2js_extra/deferred_split_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_split_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.7
+
 /// Regression for issue 23853: we used to incorrectly split and put a type in a
 /// deferred hunk if the type was used explicitly in the deferred library and
 /// was used only in a generic type in the main library.
diff --git a/tests/compiler/dart2js_extra/deferred_tearoff_load_library_lib.dart b/tests/compiler/dart2js_extra/deferred_tearoff_load_library_lib.dart
index 472c977..76dc8d1 100644
--- a/tests/compiler/dart2js_extra/deferred_tearoff_load_library_lib.dart
+++ b/tests/compiler/dart2js_extra/deferred_tearoff_load_library_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
+
 foo() {
   return "loaded";
 }
diff --git a/tests/compiler/dart2js_extra/deferred_tearoff_load_library_test.dart b/tests/compiler/dart2js_extra/deferred_tearoff_load_library_test.dart
index 5dbcf88..f4510e9 100644
--- a/tests/compiler/dart2js_extra/deferred_tearoff_load_library_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_tearoff_load_library_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.7
+
 // Test that tearoffs of `loadLibrary` work properly.
 //
 // The CFE chooses a non identifier name for `loadLibrary` methods, this test
diff --git a/tests/compiler/dart2js_extra/deferred_with_cross_origin_lib.dart b/tests/compiler/dart2js_extra/deferred_with_cross_origin_lib.dart
index 48fbce6..606c26e 100644
--- a/tests/compiler/dart2js_extra/deferred_with_cross_origin_lib.dart
+++ b/tests/compiler/dart2js_extra/deferred_with_cross_origin_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
+
 foo() {
   return "loaded";
 }
diff --git a/tests/compiler/dart2js_extra/deferred_with_cross_origin_test.dart b/tests/compiler/dart2js_extra/deferred_with_cross_origin_test.dart
index 51c10cf..76a85b4 100644
--- a/tests/compiler/dart2js_extra/deferred_with_cross_origin_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_with_cross_origin_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.7
+
 // Test that code loaded via deferred imports uses the same crossorigin value as
 // the main page.
 
diff --git a/tests/compiler/dart2js_extra/deferred_with_csp_nonce2_test.dart b/tests/compiler/dart2js_extra/deferred_with_csp_nonce2_test.dart
index 5d6f596..b21858e 100644
--- a/tests/compiler/dart2js_extra/deferred_with_csp_nonce2_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_with_csp_nonce2_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.7
+
 // Test that code loaded via deferred imports uses the same nonce value as the
 // main page.
 
diff --git a/tests/compiler/dart2js_extra/deferred_with_csp_nonce_lib.dart b/tests/compiler/dart2js_extra/deferred_with_csp_nonce_lib.dart
index 48fbce6..606c26e 100644
--- a/tests/compiler/dart2js_extra/deferred_with_csp_nonce_lib.dart
+++ b/tests/compiler/dart2js_extra/deferred_with_csp_nonce_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
+
 foo() {
   return "loaded";
 }
diff --git a/tests/compiler/dart2js_extra/deferred_with_csp_nonce_test.dart b/tests/compiler/dart2js_extra/deferred_with_csp_nonce_test.dart
index 2725df8..8409c2b 100644
--- a/tests/compiler/dart2js_extra/deferred_with_csp_nonce_test.dart
+++ b/tests/compiler/dart2js_extra/deferred_with_csp_nonce_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.7
+
 // Test that code loaded via deferred imports uses the same nonce value as the
 // main page.
 
diff --git a/tests/compiler/dart2js_extra/do_test.dart b/tests/compiler/dart2js_extra/do_test.dart
index 2b7abc0..ecc3ce9 100644
--- a/tests/compiler/dart2js_extra/do_test.dart
+++ b/tests/compiler/dart2js_extra/do_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.7
+
 import "package:expect/expect.dart";
 
 void do1() {
diff --git a/tests/compiler/dart2js_extra/dummy_compiler_test.dart b/tests/compiler/dart2js_extra/dummy_compiler_test.dart
index 0c13dbb..0505deb 100644
--- a/tests/compiler/dart2js_extra/dummy_compiler_test.dart
+++ b/tests/compiler/dart2js_extra/dummy_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.7
+
 // Tests that the dart2js compiler can be run in a js engine.  This ensures that
 // the internal compiler APIs have no dependency on dart:io.
 library dummy_compiler;
diff --git a/tests/compiler/dart2js_extra/dynamic_bounds_check_test.dart b/tests/compiler/dart2js_extra/dynamic_bounds_check_test.dart
index 9593aea..fb443f8 100644
--- a/tests/compiler/dart2js_extra/dynamic_bounds_check_test.dart
+++ b/tests/compiler/dart2js_extra/dynamic_bounds_check_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.7
+
 import "package:expect/expect.dart";
 
 class Foo {}
diff --git a/tests/compiler/dart2js_extra/dynamic_invocation_test.dart b/tests/compiler/dart2js_extra/dynamic_invocation_test.dart
index 28bfdb3..a234108 100644
--- a/tests/compiler/dart2js_extra/dynamic_invocation_test.dart
+++ b/tests/compiler/dart2js_extra/dynamic_invocation_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.7
+
 import "package:expect/expect.dart";
 
 class C1 {
diff --git a/tests/compiler/dart2js_extra/dynamic_type_literal_test.dart b/tests/compiler/dart2js_extra/dynamic_type_literal_test.dart
index 3231717..e78d113 100644
--- a/tests/compiler/dart2js_extra/dynamic_type_literal_test.dart
+++ b/tests/compiler/dart2js_extra/dynamic_type_literal_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks
 
 // Test generation of 'dynamic' type literals.
diff --git a/tests/compiler/dart2js_extra/effectively_constant_fields_test.dart b/tests/compiler/dart2js_extra/effectively_constant_fields_test.dart
index 6c9c18b..78a87bb 100644
--- a/tests/compiler/dart2js_extra/effectively_constant_fields_test.dart
+++ b/tests/compiler/dart2js_extra/effectively_constant_fields_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.7
+
 import 'package:expect/expect.dart';
 
 _field4() => 4;
diff --git a/tests/compiler/dart2js_extra/effectively_constant_instance_field_test.dart b/tests/compiler/dart2js_extra/effectively_constant_instance_field_test.dart
index 94020a2..fa1b315 100644
--- a/tests/compiler/dart2js_extra/effectively_constant_instance_field_test.dart
+++ b/tests/compiler/dart2js_extra/effectively_constant_instance_field_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.7
+
 // dart2jsOptions=--omit-implicit-checks
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/empty_method_test.dart b/tests/compiler/dart2js_extra/empty_method_test.dart
index 7bd2791..7bc26bb 100644
--- a/tests/compiler/dart2js_extra/empty_method_test.dart
+++ b/tests/compiler/dart2js_extra/empty_method_test.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.7
+
 void main() {}
diff --git a/tests/compiler/dart2js_extra/eof_line_ending_test.dart b/tests/compiler/dart2js_extra/eof_line_ending_test.dart
index dafba6c..6ff3098 100644
--- a/tests/compiler/dart2js_extra/eof_line_ending_test.dart
+++ b/tests/compiler/dart2js_extra/eof_line_ending_test.dart
@@ -1,6 +1,8 @@
 // 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.7
 

 // Regression test derived from language/issue_1578_test.dart with Windows

 // line encoding.

diff --git a/tests/compiler/dart2js_extra/equals_test.dart b/tests/compiler/dart2js_extra/equals_test.dart
index c4a5309..e19f6df 100644
--- a/tests/compiler/dart2js_extra/equals_test.dart
+++ b/tests/compiler/dart2js_extra/equals_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.7
+
 void main() {
   var x = 3;
   if (x == x) {
diff --git a/tests/compiler/dart2js_extra/expose_this1_test.dart b/tests/compiler/dart2js_extra/expose_this1_test.dart
index 84d3e70..363820e 100644
--- a/tests/compiler/dart2js_extra/expose_this1_test.dart
+++ b/tests/compiler/dart2js_extra/expose_this1_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.7
+
 // Regression test for dart2js inference. Class.field6b should be known to be
 // potentially `null`.
 
diff --git a/tests/compiler/dart2js_extra/expose_this2_test.dart b/tests/compiler/dart2js_extra/expose_this2_test.dart
index d83abda..cc1424d 100644
--- a/tests/compiler/dart2js_extra/expose_this2_test.dart
+++ b/tests/compiler/dart2js_extra/expose_this2_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.7
+
 // Regression test for dart2js inference. Class9.field9b should be known to be
 // potentially `null`.
 
diff --git a/tests/compiler/dart2js_extra/extract_type_arguments_1_test.dart b/tests/compiler/dart2js_extra/extract_type_arguments_1_test.dart
index 74d5081..16852f0 100644
--- a/tests/compiler/dart2js_extra/extract_type_arguments_1_test.dart
+++ b/tests/compiler/dart2js_extra/extract_type_arguments_1_test.dart
@@ -1,6 +1,8 @@
 // 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.7
 // dart2jsOptions=--omit-implicit-checks
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/extract_type_arguments_2_test.dart b/tests/compiler/dart2js_extra/extract_type_arguments_2_test.dart
index bf8c2f9..da7548c 100644
--- a/tests/compiler/dart2js_extra/extract_type_arguments_2_test.dart
+++ b/tests/compiler/dart2js_extra/extract_type_arguments_2_test.dart
@@ -1,6 +1,8 @@
 // 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.7
 // dart2jsOptions=--omit-implicit-checks
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/extract_type_arguments_3_test.dart b/tests/compiler/dart2js_extra/extract_type_arguments_3_test.dart
index 10fa04a..c6ef560 100644
--- a/tests/compiler/dart2js_extra/extract_type_arguments_3_test.dart
+++ b/tests/compiler/dart2js_extra/extract_type_arguments_3_test.dart
@@ -1,6 +1,8 @@
 // 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.7
 // dart2jsOptions=--omit-implicit-checks
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/field_access_test.dart b/tests/compiler/dart2js_extra/field_access_test.dart
index 044baf4..18ec93a 100644
--- a/tests/compiler/dart2js_extra/field_access_test.dart
+++ b/tests/compiler/dart2js_extra/field_access_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.7
+
 // Test the all variants of field/property access/update are emitted.
 //
 // This is needed because getter/setters are now registered as read from and
diff --git a/tests/compiler/dart2js_extra/field_in_constructor_test.dart b/tests/compiler/dart2js_extra/field_in_constructor_test.dart
index 29d1d66..895a80e 100644
--- a/tests/compiler/dart2js_extra/field_in_constructor_test.dart
+++ b/tests/compiler/dart2js_extra/field_in_constructor_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/field_initializer_test.dart b/tests/compiler/dart2js_extra/field_initializer_test.dart
index b06f763..31efa81 100644
--- a/tests/compiler/dart2js_extra/field_initializer_test.dart
+++ b/tests/compiler/dart2js_extra/field_initializer_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/fields_test.dart b/tests/compiler/dart2js_extra/fields_test.dart
index 95c2ca3..bb773d7 100644
--- a/tests/compiler/dart2js_extra/fields_test.dart
+++ b/tests/compiler/dart2js_extra/fields_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/first_class_types_hashcode_test.dart b/tests/compiler/dart2js_extra/first_class_types_hashcode_test.dart
index 06e43bd..92637ae 100644
--- a/tests/compiler/dart2js_extra/first_class_types_hashcode_test.dart
+++ b/tests/compiler/dart2js_extra/first_class_types_hashcode_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.7
+
 import "package:expect/expect.dart";
 
 // Check that Type instances work with maps. This behavior is not required by
diff --git a/tests/compiler/dart2js_extra/fixed_type_argument_implements_test.dart b/tests/compiler/dart2js_extra/fixed_type_argument_implements_test.dart
index f0c397e..cd3b180 100644
--- a/tests/compiler/dart2js_extra/fixed_type_argument_implements_test.dart
+++ b/tests/compiler/dart2js_extra/fixed_type_argument_implements_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.7
+
 // Test that we emit the relation between B and A even when B is only live
 // as a type argument through the supertype of D.
 
diff --git a/tests/compiler/dart2js_extra/fixed_type_argument_test.dart b/tests/compiler/dart2js_extra/fixed_type_argument_test.dart
index 74ac892..384c76b 100644
--- a/tests/compiler/dart2js_extra/fixed_type_argument_test.dart
+++ b/tests/compiler/dart2js_extra/fixed_type_argument_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.7
+
 // Test that we emit the relation between B and A even when B is only live
 // as a type argument through the superclass of D.
 
diff --git a/tests/compiler/dart2js_extra/foo7_test.dart b/tests/compiler/dart2js_extra/foo7_test.dart
index dc93acf..97dcbfd 100644
--- a/tests/compiler/dart2js_extra/foo7_test.dart
+++ b/tests/compiler/dart2js_extra/foo7_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.7
+
 void main() {
   print(foo());
 }
diff --git a/tests/compiler/dart2js_extra/for_in_test.dart b/tests/compiler/dart2js_extra/for_in_test.dart
index 8f0eb15..023d5ae 100644
--- a/tests/compiler/dart2js_extra/for_in_test.dart
+++ b/tests/compiler/dart2js_extra/for_in_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.7
+
 import "dart:collection";
 import "package:expect/expect.dart";
 
diff --git a/tests/compiler/dart2js_extra/for_test.dart b/tests/compiler/dart2js_extra/for_test.dart
index fc910be..a585bfb 100644
--- a/tests/compiler/dart2js_extra/for_test.dart
+++ b/tests/compiler/dart2js_extra/for_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.7
+
 import "package:expect/expect.dart";
 
 void for1() {
diff --git a/tests/compiler/dart2js_extra/function_parameters_test.dart b/tests/compiler/dart2js_extra/function_parameters_test.dart
index 1632fb6..377fc66 100644
--- a/tests/compiler/dart2js_extra/function_parameters_test.dart
+++ b/tests/compiler/dart2js_extra/function_parameters_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.7
+
 void main() {
   print(foo(3) + foo(4));
 }
diff --git a/tests/compiler/dart2js_extra/function_typed_arguments_test.dart b/tests/compiler/dart2js_extra/function_typed_arguments_test.dart
index f18daee..a441003 100644
--- a/tests/compiler/dart2js_extra/function_typed_arguments_test.dart
+++ b/tests/compiler/dart2js_extra/function_typed_arguments_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.7
+
 // dart2jsOptions=--omit-implicit-checks
 
 // Test type tests of function types used a type argument.
diff --git a/tests/compiler/dart2js_extra/generator_elided_parameter_test.dart b/tests/compiler/dart2js_extra/generator_elided_parameter_test.dart
index 60bf18b..169940d 100644
--- a/tests/compiler/dart2js_extra/generator_elided_parameter_test.dart
+++ b/tests/compiler/dart2js_extra/generator_elided_parameter_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.7
+
 /// Test that optional arguments of methods with a generator are forwarded
 /// properly when optional parameters are elided.
 ///
diff --git a/tests/compiler/dart2js_extra/generic_bounds_test.dart b/tests/compiler/dart2js_extra/generic_bounds_test.dart
index 0b9cacb..b23d8df 100644
--- a/tests/compiler/dart2js_extra/generic_bounds_test.dart
+++ b/tests/compiler/dart2js_extra/generic_bounds_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/generic_class_is_test.dart b/tests/compiler/dart2js_extra/generic_class_is_test.dart
index 6026b8d..3db6f87 100644
--- a/tests/compiler/dart2js_extra/generic_class_is_test.dart
+++ b/tests/compiler/dart2js_extra/generic_class_is_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.7
+
 import 'package:expect/expect.dart';
 
 class A<T> {}
diff --git a/tests/compiler/dart2js_extra/generic_in_mixin_field_test.dart b/tests/compiler/dart2js_extra/generic_in_mixin_field_test.dart
index 6018432..045d314 100644
--- a/tests/compiler/dart2js_extra/generic_in_mixin_field_test.dart
+++ b/tests/compiler/dart2js_extra/generic_in_mixin_field_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.7
+
 // Ensure that we prepare type variables for inlined mixin fields.
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/generic_in_redirect_test.dart b/tests/compiler/dart2js_extra/generic_in_redirect_test.dart
index 35e4564..fd289bf 100644
--- a/tests/compiler/dart2js_extra/generic_in_redirect_test.dart
+++ b/tests/compiler/dart2js_extra/generic_in_redirect_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.7
+
 // Ensure that we prepare type variables for inlined redirecting constructor
 // calls.
 
diff --git a/tests/compiler/dart2js_extra/generic_in_super_test.dart b/tests/compiler/dart2js_extra/generic_in_super_test.dart
index 79bc8c9..77f6856 100644
--- a/tests/compiler/dart2js_extra/generic_in_super_test.dart
+++ b/tests/compiler/dart2js_extra/generic_in_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.7
+
 // Ensure that we prepare type variables for inlined super constructor calls.
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/generic_instantiation1_test.dart b/tests/compiler/dart2js_extra/generic_instantiation1_test.dart
index fcfb79f..c790136 100644
--- a/tests/compiler/dart2js_extra/generic_instantiation1_test.dart
+++ b/tests/compiler/dart2js_extra/generic_instantiation1_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.7
+
 // dart2jsOptions=--strong
 
 int f<T>(T a) => null;
diff --git a/tests/compiler/dart2js_extra/generic_instantiation2_test.dart b/tests/compiler/dart2js_extra/generic_instantiation2_test.dart
index 047d221..886b69a 100644
--- a/tests/compiler/dart2js_extra/generic_instantiation2_test.dart
+++ b/tests/compiler/dart2js_extra/generic_instantiation2_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks
 
 int f<T>(T a) => null;
diff --git a/tests/compiler/dart2js_extra/generic_instantiation3_test.dart b/tests/compiler/dart2js_extra/generic_instantiation3_test.dart
index 3152565..8ab46fd 100644
--- a/tests/compiler/dart2js_extra/generic_instantiation3_test.dart
+++ b/tests/compiler/dart2js_extra/generic_instantiation3_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/generic_instantiation4_test.dart b/tests/compiler/dart2js_extra/generic_instantiation4_test.dart
index d5f8eb9..3091874 100644
--- a/tests/compiler/dart2js_extra/generic_instantiation4_test.dart
+++ b/tests/compiler/dart2js_extra/generic_instantiation4_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/generic_method_dynamic_is_test.dart b/tests/compiler/dart2js_extra/generic_method_dynamic_is_test.dart
index ff95b2b..474114a 100644
--- a/tests/compiler/dart2js_extra/generic_method_dynamic_is_test.dart
+++ b/tests/compiler/dart2js_extra/generic_method_dynamic_is_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.7
+
 import 'package:expect/expect.dart';
 
 class A {}
diff --git a/tests/compiler/dart2js_extra/generic_method_dynamic_type_test.dart b/tests/compiler/dart2js_extra/generic_method_dynamic_type_test.dart
index ab7221d..6912246 100644
--- a/tests/compiler/dart2js_extra/generic_method_dynamic_type_test.dart
+++ b/tests/compiler/dart2js_extra/generic_method_dynamic_type_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.7
+
 import 'package:expect/expect.dart';
 
 class C<CT> {
diff --git a/tests/compiler/dart2js_extra/generic_method_static_is_test.dart b/tests/compiler/dart2js_extra/generic_method_static_is_test.dart
index c05be8c..dfa6211 100644
--- a/tests/compiler/dart2js_extra/generic_method_static_is_test.dart
+++ b/tests/compiler/dart2js_extra/generic_method_static_is_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.7
+
 import 'package:expect/expect.dart';
 
 class A {}
diff --git a/tests/compiler/dart2js_extra/generic_type_error_message_test.dart b/tests/compiler/dart2js_extra/generic_type_error_message_test.dart
index e9ff104..c09fbf0 100644
--- a/tests/compiler/dart2js_extra/generic_type_error_message_test.dart
+++ b/tests/compiler/dart2js_extra/generic_type_error_message_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/generics_factories_test.dart b/tests/compiler/dart2js_extra/generics_factories_test.dart
index 5ca2d59..e36626e 100644
--- a/tests/compiler/dart2js_extra/generics_factories_test.dart
+++ b/tests/compiler/dart2js_extra/generics_factories_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.7
+
 // Test that factories are marked as needing rti.
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/generics_is_check1_test.dart b/tests/compiler/dart2js_extra/generics_is_check1_test.dart
index 24d01e5..6921c3f 100644
--- a/tests/compiler/dart2js_extra/generics_is_check1_test.dart
+++ b/tests/compiler/dart2js_extra/generics_is_check1_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.7
+
 import "package:expect/expect.dart";
 
 class Hest<X> {}
diff --git a/tests/compiler/dart2js_extra/getter_element_test.dart b/tests/compiler/dart2js_extra/getter_element_test.dart
index 9238e8f..92939c0 100644
--- a/tests/compiler/dart2js_extra/getter_element_test.dart
+++ b/tests/compiler/dart2js_extra/getter_element_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/getters_setters_test.dart b/tests/compiler/dart2js_extra/getters_setters_test.dart
index 139f366..7a43760 100644
--- a/tests/compiler/dart2js_extra/getters_setters_test.dart
+++ b/tests/compiler/dart2js_extra/getters_setters_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.7
+
 import "package:expect/expect.dart";
 
 class GettersSettersTest {
diff --git a/tests/compiler/dart2js_extra/hash_code_test.dart b/tests/compiler/dart2js_extra/hash_code_test.dart
index cb6789c..219fe34 100644
--- a/tests/compiler/dart2js_extra/hash_code_test.dart
+++ b/tests/compiler/dart2js_extra/hash_code_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.7
+
 import "package:expect/expect.dart";
 
 // dart2js specific test to make sure hashCode on intercepted types behaves as
diff --git a/tests/compiler/dart2js_extra/identical_trace_test.dart b/tests/compiler/dart2js_extra/identical_trace_test.dart
index 8fc86cb..6b24f02f 100644
--- a/tests/compiler/dart2js_extra/identical_trace_test.dart
+++ b/tests/compiler/dart2js_extra/identical_trace_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.7
+
 import 'package:expect/expect.dart';
 
 main() {
diff --git a/tests/compiler/dart2js_extra/if_in_loop_test.dart b/tests/compiler/dart2js_extra/if_in_loop_test.dart
index af3590d..98603bd 100644
--- a/tests/compiler/dart2js_extra/if_in_loop_test.dart
+++ b/tests/compiler/dart2js_extra/if_in_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.7
+
 import "package:expect/expect.dart";
 
 // Test for bug in code generation of if-with-aborting-branch-inside-loop.
diff --git a/tests/compiler/dart2js_extra/if_null2_test.dart b/tests/compiler/dart2js_extra/if_null2_test.dart
index a9923a8..907799a 100644
--- a/tests/compiler/dart2js_extra/if_null2_test.dart
+++ b/tests/compiler/dart2js_extra/if_null2_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.7
+
 /// Regression for #24134: inference was not tracking ??= correctly.
 library tests.compiler.dart2js_extra.if_null2_test;
 
diff --git a/tests/compiler/dart2js_extra/if_null3_test.dart b/tests/compiler/dart2js_extra/if_null3_test.dart
index dac99e0..49383c1 100644
--- a/tests/compiler/dart2js_extra/if_null3_test.dart
+++ b/tests/compiler/dart2js_extra/if_null3_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.7
+
 /// Regression for #24135: inference was not tracking `[]??=` correctly.
 library tests.compiler.dart2js_extra.if_null3_test;
 
diff --git a/tests/compiler/dart2js_extra/if_null_test.dart b/tests/compiler/dart2js_extra/if_null_test.dart
index 8b16c6b..b7f28a9 100644
--- a/tests/compiler/dart2js_extra/if_null_test.dart
+++ b/tests/compiler/dart2js_extra/if_null_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.7
+
 import "package:expect/expect.dart";
 
 @pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js_extra/if_test.dart b/tests/compiler/dart2js_extra/if_test.dart
index 3c1670b..cead13c 100644
--- a/tests/compiler/dart2js_extra/if_test.dart
+++ b/tests/compiler/dart2js_extra/if_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.7
+
 import "package:expect/expect.dart";
 
 int if1() {
diff --git a/tests/compiler/dart2js_extra/index_test.dart b/tests/compiler/dart2js_extra/index_test.dart
index 890d71a..5e7af77 100644
--- a/tests/compiler/dart2js_extra/index_test.dart
+++ b/tests/compiler/dart2js_extra/index_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.7
+
 import "package:expect/expect.dart";
 
 main() {
diff --git a/tests/compiler/dart2js_extra/indirect_type_literal_test.dart b/tests/compiler/dart2js_extra/indirect_type_literal_test.dart
index 8929796..c1b27cb 100644
--- a/tests/compiler/dart2js_extra/indirect_type_literal_test.dart
+++ b/tests/compiler/dart2js_extra/indirect_type_literal_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.7
+
 // dart2jsOptions=--strong
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/inference_super_set_call_test.dart b/tests/compiler/dart2js_extra/inference_super_set_call_test.dart
index 19e1a06..be138ad 100644
--- a/tests/compiler/dart2js_extra/inference_super_set_call_test.dart
+++ b/tests/compiler/dart2js_extra/inference_super_set_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.7
+
 // Regression test for dart2js: we incorrectly modeled `super.x = rhs` as a
 // call and not an assignment, so the type of the expression was incorrectly
 // assumed to be the return type of the setter rather than the type of the rhs.
diff --git a/tests/compiler/dart2js_extra/inferrer_is_int_test.dart b/tests/compiler/dart2js_extra/inferrer_is_int_test.dart
index fe3e397..056fec6 100644
--- a/tests/compiler/dart2js_extra/inferrer_is_int_test.dart
+++ b/tests/compiler/dart2js_extra/inferrer_is_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.7
+
 // Test that dart2js's inferrer and code optimizers know a double
 // literal might become an int at runtime.
 
diff --git a/tests/compiler/dart2js_extra/injected_cast_test.dart b/tests/compiler/dart2js_extra/injected_cast_test.dart
index 3ab671c..b2c8334 100644
--- a/tests/compiler/dart2js_extra/injected_cast_test.dart
+++ b/tests/compiler/dart2js_extra/injected_cast_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.7
+
 import 'package:expect/expect.dart';
 
 var field;
diff --git a/tests/compiler/dart2js_extra/inline_generic_test.dart b/tests/compiler/dart2js_extra/inline_generic_test.dart
index a5a8c38..aa621b6 100644
--- a/tests/compiler/dart2js_extra/inline_generic_test.dart
+++ b/tests/compiler/dart2js_extra/inline_generic_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.7
+
 /// Test that inlining of constructors with `double` as type argument registers
 /// that double is need for checking passed values.
 
diff --git a/tests/compiler/dart2js_extra/inline_position_crash_source.dart b/tests/compiler/dart2js_extra/inline_position_crash_source.dart
index 67194b8..ca43679 100644
--- a/tests/compiler/dart2js_extra/inline_position_crash_source.dart
+++ b/tests/compiler/dart2js_extra/inline_position_crash_source.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 part of inline_position_crash_test;
 
 /*******************************************************************************
diff --git a/tests/compiler/dart2js_extra/inline_position_crash_test.dart b/tests/compiler/dart2js_extra/inline_position_crash_test.dart
index 54f58b2..6f5d182 100644
--- a/tests/compiler/dart2js_extra/inline_position_crash_test.dart
+++ b/tests/compiler/dart2js_extra/inline_position_crash_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.7
+
 library inline_position_crash_test;
 
 part 'inline_position_crash_source.dart';
diff --git a/tests/compiler/dart2js_extra/instantiation_stub_2_test.dart b/tests/compiler/dart2js_extra/instantiation_stub_2_test.dart
index 49dfcaf..7c83a4c 100644
--- a/tests/compiler/dart2js_extra/instantiation_stub_2_test.dart
+++ b/tests/compiler/dart2js_extra/instantiation_stub_2_test.dart
@@ -1,6 +1,8 @@
 // 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.7
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/instantiation_stub_test.dart b/tests/compiler/dart2js_extra/instantiation_stub_test.dart
index 23003bc..8522498 100644
--- a/tests/compiler/dart2js_extra/instantiation_stub_test.dart
+++ b/tests/compiler/dart2js_extra/instantiation_stub_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/int_index_test.dart b/tests/compiler/dart2js_extra/int_index_test.dart
index 629338b..d3f07e6 100644
--- a/tests/compiler/dart2js_extra/int_index_test.dart
+++ b/tests/compiler/dart2js_extra/int_index_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.7
+
 main() {
   var a = [0, 1];
   a[1.2]; //                      //# 01: compile-time error
diff --git a/tests/compiler/dart2js_extra/interceptor_named_arguments_test.dart b/tests/compiler/dart2js_extra/interceptor_named_arguments_test.dart
index 407ac93..46d709c 100644
--- a/tests/compiler/dart2js_extra/interceptor_named_arguments_test.dart
+++ b/tests/compiler/dart2js_extra/interceptor_named_arguments_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.7
+
 // Test that the proper one-shot interceptor is used for different
 // combinations of named arguments.
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/interface_type_optimization_test.dart b/tests/compiler/dart2js_extra/interface_type_optimization_test.dart
index 0beb4f4..a2963a9 100644
--- a/tests/compiler/dart2js_extra/interface_type_optimization_test.dart
+++ b/tests/compiler/dart2js_extra/interface_type_optimization_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.7
+
 import "package:expect/expect.dart";
 
 main() {
diff --git a/tests/compiler/dart2js_extra/invalid_annotation_test.dart b/tests/compiler/dart2js_extra/invalid_annotation_test.dart
index fe68503..0e23538 100644
--- a/tests/compiler/dart2js_extra/invalid_annotation_test.dart
+++ b/tests/compiler/dart2js_extra/invalid_annotation_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.7
+
 // Regression test for http://dartbug.com/23893
 //
 // Because annotations are parsed lazily, dart2js used to crash when an
diff --git a/tests/compiler/dart2js_extra/invoke_dynamic_test.dart b/tests/compiler/dart2js_extra/invoke_dynamic_test.dart
index 65239f6..26616b2 100644
--- a/tests/compiler/dart2js_extra/invoke_dynamic_test.dart
+++ b/tests/compiler/dart2js_extra/invoke_dynamic_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/is_check_instanceof_test.dart b/tests/compiler/dart2js_extra/is_check_instanceof_test.dart
index 7e9c8a4..8db9f12 100644
--- a/tests/compiler/dart2js_extra/is_check_instanceof_test.dart
+++ b/tests/compiler/dart2js_extra/is_check_instanceof_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.7
+
 import "package:expect/expect.dart";
 
 // It is sometimes possible to compile is-checks to 'instanceof', when the class
diff --git a/tests/compiler/dart2js_extra/is_operator_test.dart b/tests/compiler/dart2js_extra/is_operator_test.dart
index bc18d7b9..8c4c714 100644
--- a/tests/compiler/dart2js_extra/is_operator_test.dart
+++ b/tests/compiler/dart2js_extra/is_operator_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.7
+
 import "package:expect/expect.dart";
 
 class A {}
diff --git a/tests/compiler/dart2js_extra/issue36562_test.dart b/tests/compiler/dart2js_extra/issue36562_test.dart
index cd43f16..eac7cb4 100644
--- a/tests/compiler/dart2js_extra/issue36562_test.dart
+++ b/tests/compiler/dart2js_extra/issue36562_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.7
+
 const int x = 0;
 
 const List<int> l = const [
diff --git a/tests/compiler/dart2js_extra/js_array_index_error_test.dart b/tests/compiler/dart2js_extra/js_array_index_error_test.dart
index 8af893a..5975a0b 100644
--- a/tests/compiler/dart2js_extra/js_array_index_error_test.dart
+++ b/tests/compiler/dart2js_extra/js_array_index_error_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.7
+
 // Test that optimized JSArray indexers generate the same error as dynamically
 // dispatched calls.
 
diff --git a/tests/compiler/dart2js_extra/js_array_removeLast_error_test.dart b/tests/compiler/dart2js_extra/js_array_removeLast_error_test.dart
index 5241f55..9ea4d8e 100644
--- a/tests/compiler/dart2js_extra/js_array_removeLast_error_test.dart
+++ b/tests/compiler/dart2js_extra/js_array_removeLast_error_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.7
+
 // Test that optimized JSArray removeLast() calls generate the same error as
 // dynamically dispatched calls.
 
diff --git a/tests/compiler/dart2js_extra/js_array_sort_default_test.dart b/tests/compiler/dart2js_extra/js_array_sort_default_test.dart
index 8f4e161..94f2a4d 100644
--- a/tests/compiler/dart2js_extra/js_array_sort_default_test.dart
+++ b/tests/compiler/dart2js_extra/js_array_sort_default_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.7
+
 /// Tests that the default comparable function in JSArray.sort has a valid
 /// strong-mode type.
 void main() {
diff --git a/tests/compiler/dart2js_extra/js_interop_cast_test.dart b/tests/compiler/dart2js_extra/js_interop_cast_test.dart
index 28c018a..7ce0d63 100644
--- a/tests/compiler/dart2js_extra/js_interop_cast_test.dart
+++ b/tests/compiler/dart2js_extra/js_interop_cast_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.7
+
 // Test that we don't crash on computing js-interop classes when metadata
 // constants contain implicit casts.
 //
diff --git a/tests/compiler/dart2js_extra/js_interop_implements_test.dart b/tests/compiler/dart2js_extra/js_interop_implements_test.dart
index a4c8a72..6c22db8 100644
--- a/tests/compiler/dart2js_extra/js_interop_implements_test.dart
+++ b/tests/compiler/dart2js_extra/js_interop_implements_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.7
+
 // Test that methods implemented (not extended) in js-interop classes are still
 // considered live.
 
diff --git a/tests/compiler/dart2js_extra/js_interop_no_elide_optional_arg_test.dart b/tests/compiler/dart2js_extra/js_interop_no_elide_optional_arg_test.dart
index 5d6d913..aa43f70 100644
--- a/tests/compiler/dart2js_extra/js_interop_no_elide_optional_arg_test.dart
+++ b/tests/compiler/dart2js_extra/js_interop_no_elide_optional_arg_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.7
+
 /// Test that optional arguments of js-interop factory constructors are not
 /// elided.
 /// This is a regression test for issue 35916
diff --git a/tests/compiler/dart2js_extra/js_interop_optional_arg_test.dart b/tests/compiler/dart2js_extra/js_interop_optional_arg_test.dart
index 4c50389..9547374 100644
--- a/tests/compiler/dart2js_extra/js_interop_optional_arg_test.dart
+++ b/tests/compiler/dart2js_extra/js_interop_optional_arg_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.7
+
 /// Test that optional arguments of js-interop constructors are not passed
 /// explicitly when missing.
 ///
diff --git a/tests/compiler/dart2js_extra/js_interop_test.dart b/tests/compiler/dart2js_extra/js_interop_test.dart
index 77478b1..9de19d3 100644
--- a/tests/compiler/dart2js_extra/js_interop_test.dart
+++ b/tests/compiler/dart2js_extra/js_interop_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.7
+
 import "package:js/js.dart";
 import "package:expect/expect.dart";
 import "dart:js" as js;
diff --git a/tests/compiler/dart2js_extra/jsinterop_test.dart b/tests/compiler/dart2js_extra/jsinterop_test.dart
index 07798e5..b9fb820 100644
--- a/tests/compiler/dart2js_extra/jsinterop_test.dart
+++ b/tests/compiler/dart2js_extra/jsinterop_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.7
+
 // TODO(johnniwinther): Share this test with ddc.
 
 // Test for positive and negative uses of js-interop declarations in a library
diff --git a/tests/compiler/dart2js_extra/label_test.dart b/tests/compiler/dart2js_extra/label_test.dart
index d31cb35..3fbd81d 100644
--- a/tests/compiler/dart2js_extra/label_test.dart
+++ b/tests/compiler/dart2js_extra/label_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.7
+
 // A break label must be declared where it's used.
 undeclaredBreakLabel1() {
   foo: { break bar; break foo; } // //# 01: compile-time error
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals1_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals1_test.dart
index 8f9836f..5c5fc20 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals1_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals1_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals2_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals2_test.dart
index 56afe25..2471193 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals2_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals2_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals3_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals3_test.dart
index 673211e..1db6646 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals3_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals3_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals4_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals4_test.dart
index 73b72b3..2a7eee3 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals4_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals4_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals5_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals5_test.dart
index ecad991..91a02a9 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals5_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals5_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals6_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals6_test.dart
index 23641eb..1283d49 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals6_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals6_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals7_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals7_test.dart
index 129dcca..5677d21 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals7_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals7_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals8_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals8_test.dart
index 7a1142d..578f043 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals8_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_equals8_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string1_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string1_test.dart
index 40b9f69..fccddbf 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string1_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string1_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string2_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string2_test.dart
index 6425113..1fb26ab 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string2_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string2_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string3_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string3_test.dart
index 1d244c0..bc1f41e 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string3_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string3_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string --experiment-new-rti
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string4_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string4_test.dart
index c95cf29..1dc36ae 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string4_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string4_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string5_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string5_test.dart
index cd87fa4..98d2063 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string5_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string5_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string6_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string6_test.dart
index 899a217..c197058 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string6_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string6_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string7_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string7_test.dart
index 6d77543..2fe0294 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string7_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_closure_to_string7_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.7
+
 // dart2jsOptions=--omit-implicit-checks --lax-runtime-type-to-string
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_equals1_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_equals1_test.dart
index 6ef574d..02638dc 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_equals1_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_equals1_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_equals2_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_equals2_test.dart
index 0883581..c37c733 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_equals2_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_equals2_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_equals3_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_equals3_test.dart
index c9911a5..92fc4af 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_equals3_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_equals3_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_equals4_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_equals4_test.dart
index bf77141..99218fb 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_equals4_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_equals4_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/lax_runtime_type_instantiate_to_string_test.dart b/tests/compiler/dart2js_extra/lax_runtime_type_instantiate_to_string_test.dart
index 26ba4e8..0e4d623 100644
--- a/tests/compiler/dart2js_extra/lax_runtime_type_instantiate_to_string_test.dart
+++ b/tests/compiler/dart2js_extra/lax_runtime_type_instantiate_to_string_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/list_factory_test.dart b/tests/compiler/dart2js_extra/list_factory_test.dart
index b58c925..3f1885d 100644
--- a/tests/compiler/dart2js_extra/list_factory_test.dart
+++ b/tests/compiler/dart2js_extra/list_factory_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.7
+
 import "package:expect/expect.dart";
 
 main() {
diff --git a/tests/compiler/dart2js_extra/literal_string_juxtaposition_test.dart b/tests/compiler/dart2js_extra/literal_string_juxtaposition_test.dart
index e30bce9..737b2ab 100644
--- a/tests/compiler/dart2js_extra/literal_string_juxtaposition_test.dart
+++ b/tests/compiler/dart2js_extra/literal_string_juxtaposition_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.7
+
 // Note: This test relies on LF line endings in the source file.
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/literals_test.dart b/tests/compiler/dart2js_extra/literals_test.dart
index 0de857c..b77b5cc 100644
--- a/tests/compiler/dart2js_extra/literals_test.dart
+++ b/tests/compiler/dart2js_extra/literals_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.7
+
 void main() {
   print(3 + 4 + 5);
   print(3.0 + 4.0 + 5.0);
diff --git a/tests/compiler/dart2js_extra/local_function_call2_test.dart b/tests/compiler/dart2js_extra/local_function_call2_test.dart
index 3199e66..8c6f373 100644
--- a/tests/compiler/dart2js_extra/local_function_call2_test.dart
+++ b/tests/compiler/dart2js_extra/local_function_call2_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.7
+
 // Regression test for issue 31333.
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/local_function_call_test.dart b/tests/compiler/dart2js_extra/local_function_call_test.dart
index 8075492..fa1d126 100644
--- a/tests/compiler/dart2js_extra/local_function_call_test.dart
+++ b/tests/compiler/dart2js_extra/local_function_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.7
+
 // Test that global type inference computes the correct type for .call on
 // a closure.
 
diff --git a/tests/compiler/dart2js_extra/local_function_generic_strong_test.dart b/tests/compiler/dart2js_extra/local_function_generic_strong_test.dart
index b622a6a..c299c04 100644
--- a/tests/compiler/dart2js_extra/local_function_generic_strong_test.dart
+++ b/tests/compiler/dart2js_extra/local_function_generic_strong_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/local_function_signatures_strong_test.dart b/tests/compiler/dart2js_extra/local_function_signatures_strong_test.dart
index f1df515..f49cf52 100644
--- a/tests/compiler/dart2js_extra/local_function_signatures_strong_test.dart
+++ b/tests/compiler/dart2js_extra/local_function_signatures_strong_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/local_function_signatures_test.dart b/tests/compiler/dart2js_extra/local_function_signatures_test.dart
index 11bfb83..af68ab9 100644
--- a/tests/compiler/dart2js_extra/local_function_signatures_test.dart
+++ b/tests/compiler/dart2js_extra/local_function_signatures_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/local_signature_test.dart b/tests/compiler/dart2js_extra/local_signature_test.dart
index eac7ab0..b47f40a 100644
--- a/tests/compiler/dart2js_extra/local_signature_test.dart
+++ b/tests/compiler/dart2js_extra/local_signature_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.7
+
 import 'package:expect/expect.dart';
 
 @pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js_extra/locals_test.dart b/tests/compiler/dart2js_extra/locals_test.dart
index 3169124..a635995 100644
--- a/tests/compiler/dart2js_extra/locals_test.dart
+++ b/tests/compiler/dart2js_extra/locals_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.7
+
 void main() {
   dynamic hello = 'Hello';
   dynamic world = 'world';
diff --git a/tests/compiler/dart2js_extra/logical_and_test.dart b/tests/compiler/dart2js_extra/logical_and_test.dart
index 6337969..14a3fbb 100644
--- a/tests/compiler/dart2js_extra/logical_and_test.dart
+++ b/tests/compiler/dart2js_extra/logical_and_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.7
+
 import "package:expect/expect.dart";
 
 void and1() {
diff --git a/tests/compiler/dart2js_extra/logical_or_test.dart b/tests/compiler/dart2js_extra/logical_or_test.dart
index b5923f0..f844613 100644
--- a/tests/compiler/dart2js_extra/logical_or_test.dart
+++ b/tests/compiler/dart2js_extra/logical_or_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.7
+
 import "package:expect/expect.dart";
 
 void or1() {
diff --git a/tests/compiler/dart2js_extra/loop_if_phi_test.dart b/tests/compiler/dart2js_extra/loop_if_phi_test.dart
index 044c40a..a209873 100644
--- a/tests/compiler/dart2js_extra/loop_if_phi_test.dart
+++ b/tests/compiler/dart2js_extra/loop_if_phi_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.7
+
 import "package:expect/expect.dart";
 
 void main() {
diff --git a/tests/compiler/dart2js_extra/many_constants_test.dart b/tests/compiler/dart2js_extra/many_constants_test.dart
index f28e2ff..43157c2 100644
--- a/tests/compiler/dart2js_extra/many_constants_test.dart
+++ b/tests/compiler/dart2js_extra/many_constants_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.7
+
 // This program has many similar constants that should all have distinct
 // identities. They are sufficiently similar to have name collisions and need
 // ordering by constant value.
diff --git a/tests/compiler/dart2js_extra/many_fields_test.dart b/tests/compiler/dart2js_extra/many_fields_test.dart
index 360ae34..5a25590 100644
--- a/tests/compiler/dart2js_extra/many_fields_test.dart
+++ b/tests/compiler/dart2js_extra/many_fields_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.7
+
 import "package:expect/expect.dart";
 
 // A plain class that implements many fields.
diff --git a/tests/compiler/dart2js_extra/many_instantiations_test.dart b/tests/compiler/dart2js_extra/many_instantiations_test.dart
index 9ba578a..90f3d81 100644
--- a/tests/compiler/dart2js_extra/many_instantiations_test.dart
+++ b/tests/compiler/dart2js_extra/many_instantiations_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.7
+
 // Test generic instantiation with many type arguments.
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/map_to_set_test.dart b/tests/compiler/dart2js_extra/map_to_set_test.dart
index 1bad856..b4bc1b7 100644
--- a/tests/compiler/dart2js_extra/map_to_set_test.dart
+++ b/tests/compiler/dart2js_extra/map_to_set_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.7
+
 // Regression test for a missing RTI dependency between Map and JsLinkedHashMap.
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/math_lib_prefix_test.dart b/tests/compiler/dart2js_extra/math_lib_prefix_test.dart
index 318c0cf..7399764 100644
--- a/tests/compiler/dart2js_extra/math_lib_prefix_test.dart
+++ b/tests/compiler/dart2js_extra/math_lib_prefix_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.7
+
 library math_lib_prefix_test;
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/math_lib_test.dart b/tests/compiler/dart2js_extra/math_lib_test.dart
index a8124d1..a6531e9 100644
--- a/tests/compiler/dart2js_extra/math_lib_test.dart
+++ b/tests/compiler/dart2js_extra/math_lib_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.7
+
 library math_lib_test;
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/member_namespace_test.dart b/tests/compiler/dart2js_extra/member_namespace_test.dart
index ff65d20..892cb9d 100644
--- a/tests/compiler/dart2js_extra/member_namespace_test.dart
+++ b/tests/compiler/dart2js_extra/member_namespace_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/method_signatures_strong_test.dart b/tests/compiler/dart2js_extra/method_signatures_strong_test.dart
index 3e3f256..7d18fe3 100644
--- a/tests/compiler/dart2js_extra/method_signatures_strong_test.dart
+++ b/tests/compiler/dart2js_extra/method_signatures_strong_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/method_signatures_test.dart b/tests/compiler/dart2js_extra/method_signatures_test.dart
index 79d0c7f..0126fc4 100644
--- a/tests/compiler/dart2js_extra/method_signatures_test.dart
+++ b/tests/compiler/dart2js_extra/method_signatures_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/minus_zero2_test.dart b/tests/compiler/dart2js_extra/minus_zero2_test.dart
index 02cf9f0..88c9502 100644
--- a/tests/compiler/dart2js_extra/minus_zero2_test.dart
+++ b/tests/compiler/dart2js_extra/minus_zero2_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.7
+
 // Regression test for issue 17210.
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/minus_zero_test.dart b/tests/compiler/dart2js_extra/minus_zero_test.dart
index bc3c0b6..0a4d5b4 100644
--- a/tests/compiler/dart2js_extra/minus_zero_test.dart
+++ b/tests/compiler/dart2js_extra/minus_zero_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.7
+
 // Regression test for issue 17210.
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/mixin_subtype_test.dart b/tests/compiler/dart2js_extra/mixin_subtype_test.dart
index 287776c..2509513c 100644
--- a/tests/compiler/dart2js_extra/mixin_subtype_test.dart
+++ b/tests/compiler/dart2js_extra/mixin_subtype_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.7
+
 import "package:expect/expect.dart";
 
 class A {}
diff --git a/tests/compiler/dart2js_extra/mixin_type_variable_test.dart b/tests/compiler/dart2js_extra/mixin_type_variable_test.dart
index 750e58d..407e9a0 100644
--- a/tests/compiler/dart2js_extra/mixin_type_variable_test.dart
+++ b/tests/compiler/dart2js_extra/mixin_type_variable_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.7
+
 abstract class Bar<C> {
   final List<C> _one = new List<C>();
 
diff --git a/tests/compiler/dart2js_extra/mock_libraries.dart b/tests/compiler/dart2js_extra/mock_libraries.dart
index 1667032..b05e665 100644
--- a/tests/compiler/dart2js_extra/mock_libraries.dart
+++ b/tests/compiler/dart2js_extra/mock_libraries.dart
@@ -2,6 +2,8 @@
 // for details. All 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 for creating mock versions of platform and internal libraries.
 
 library mock_libraries;
diff --git a/tests/compiler/dart2js_extra/multi_global_def_single_instantiation_test.dart b/tests/compiler/dart2js_extra/multi_global_def_single_instantiation_test.dart
index f118b61..e296868 100644
--- a/tests/compiler/dart2js_extra/multi_global_def_single_instantiation_test.dart
+++ b/tests/compiler/dart2js_extra/multi_global_def_single_instantiation_test.dart
@@ -2,5 +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.
 
+// @dart = 2.7
+
 var y, w, z, x = [], q, r = [];
 main() => [x, r];
diff --git a/tests/compiler/dart2js_extra/named_mixin_runtime_type_test.dart b/tests/compiler/dart2js_extra/named_mixin_runtime_type_test.dart
index 9059803..96c0dcb 100644
--- a/tests/compiler/dart2js_extra/named_mixin_runtime_type_test.dart
+++ b/tests/compiler/dart2js_extra/named_mixin_runtime_type_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.7
+
 import 'package:expect/expect.dart';
 
 abstract class A {}
diff --git a/tests/compiler/dart2js_extra/named_parameter_for_static_test.dart b/tests/compiler/dart2js_extra/named_parameter_for_static_test.dart
index 4a4f817..688894c 100644
--- a/tests/compiler/dart2js_extra/named_parameter_for_static_test.dart
+++ b/tests/compiler/dart2js_extra/named_parameter_for_static_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.7
+
 import "package:expect/expect.dart";
 
 oneOptionalArgument(a, {b}) {
diff --git a/tests/compiler/dart2js_extra/named_parameter_test.dart b/tests/compiler/dart2js_extra/named_parameter_test.dart
index a5f0cf8..b9cbc47 100644
--- a/tests/compiler/dart2js_extra/named_parameter_test.dart
+++ b/tests/compiler/dart2js_extra/named_parameter_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/nan_negate_test.dart b/tests/compiler/dart2js_extra/nan_negate_test.dart
index 06adfd1..e1ef301 100644
--- a/tests/compiler/dart2js_extra/nan_negate_test.dart
+++ b/tests/compiler/dart2js_extra/nan_negate_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.7
+
 import "package:expect/expect.dart";
 
 // Don't convert !(a op b) to (a neg-op b) when a or b might be NaN.
diff --git a/tests/compiler/dart2js_extra/new_from_env_test.dart b/tests/compiler/dart2js_extra/new_from_env_test.dart
index 86f62dd..7138c6b 100644
--- a/tests/compiler/dart2js_extra/new_from_env_test.dart
+++ b/tests/compiler/dart2js_extra/new_from_env_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.7
+
 import 'package:expect/expect.dart';
 
 /// Dart2js only supports the const constructor for `?.fromEnvironment`. The
@@ -9,7 +11,7 @@
 /// `new` instead of `const`.
 main() {
   Expect.isFalse(const bool.fromEnvironment('X'));
-  Expect.isNull(const String.fromEnvironment('X'));
+  Expect.equals('', const String.fromEnvironment('X', defaultValue: ''));
   Expect.equals(const int.fromEnvironment('X', defaultValue: 0), 0);
 
   Expect.throws(() => new bool.fromEnvironment('X'));
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong10_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong10_test.dart
index c09441f..095d383 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong10_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong10_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong11_lib.dart b/tests/compiler/dart2js_extra/no_such_method_strong11_lib.dart
index a1f1e15..7d8d5d4 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong11_lib.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong11_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
+
 abstract class I {
   // ignore: unused_element
   int _m1();
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong11_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong11_test.dart
index d16c31c..0631e598 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong11_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong11_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.7
+
 // dart2jsOptions=--strong
 
 // Regression test checking that nsm-forwarders do not get installed for private
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong12_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong12_test.dart
index b097966..c90e8bb 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong12_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong12_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong1_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong1_test.dart
index 62b6c60..6d6251d 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong1_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong1_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong2_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong2_test.dart
index e42f388..fdd7adc 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong2_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong2_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong3_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong3_test.dart
index 5353d7b..53fbcc1 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong3_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong3_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong4_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong4_test.dart
index 1ec9499..e491795 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong4_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong4_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong5_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong5_test.dart
index 94f1531..63f04e8 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong5_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong5_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong6_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong6_test.dart
index 0018b85..a9e4741fb 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong6_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong6_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong7_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong7_test.dart
index 7f3925f..d389d99 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong7_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong7_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong8_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong8_test.dart
index a98447b..f87769d 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong8_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong8_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/no_such_method_strong9_test.dart b/tests/compiler/dart2js_extra/no_such_method_strong9_test.dart
index 25ccc7e..9303797 100644
--- a/tests/compiler/dart2js_extra/no_such_method_strong9_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_strong9_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/no_such_method_test.dart b/tests/compiler/dart2js_extra/no_such_method_test.dart
index 38375d3..f5d3f33 100644
--- a/tests/compiler/dart2js_extra/no_such_method_test.dart
+++ b/tests/compiler/dart2js_extra/no_such_method_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.7
+
 import "package:expect/expect.dart";
 
 class NoSuchMethodInfo {
diff --git a/tests/compiler/dart2js_extra/non_jsinterop_test.dart b/tests/compiler/dart2js_extra/non_jsinterop_test.dart
index e66c5d5..abf7672 100644
--- a/tests/compiler/dart2js_extra/non_jsinterop_test.dart
+++ b/tests/compiler/dart2js_extra/non_jsinterop_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.7
+
 // TODO(johnniwinther): Share this test with ddc.
 
 // Test for positive and negative uses of js-interop declarations in a library
diff --git a/tests/compiler/dart2js_extra/non_trivial_substitution_test.dart b/tests/compiler/dart2js_extra/non_trivial_substitution_test.dart
index 2a4ebf00..6c4fd3e 100644
--- a/tests/compiler/dart2js_extra/non_trivial_substitution_test.dart
+++ b/tests/compiler/dart2js_extra/non_trivial_substitution_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.7
+
 import "package:expect/expect.dart";
 
 class A {}
diff --git a/tests/compiler/dart2js_extra/not_equals_test.dart b/tests/compiler/dart2js_extra/not_equals_test.dart
index 58003d6..6546736 100644
--- a/tests/compiler/dart2js_extra/not_equals_test.dart
+++ b/tests/compiler/dart2js_extra/not_equals_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.7
+
 void main() {
   var x = 3;
   if (x != x) {
diff --git a/tests/compiler/dart2js_extra/not_test.dart b/tests/compiler/dart2js_extra/not_test.dart
index e75f2ca..250838c 100644
--- a/tests/compiler/dart2js_extra/not_test.dart
+++ b/tests/compiler/dart2js_extra/not_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.7
+
 import "package:expect/expect.dart";
 
 void not1() {
diff --git a/tests/compiler/dart2js_extra/null_stacktrace_test.dart b/tests/compiler/dart2js_extra/null_stacktrace_test.dart
index 6e95443..fa4e7b1 100644
--- a/tests/compiler/dart2js_extra/null_stacktrace_test.dart
+++ b/tests/compiler/dart2js_extra/null_stacktrace_test.dart
@@ -2,14 +2,16 @@
 // for 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: stack trace can be null when using async-await.
+// @dart = 2.7
+
+/// Regression test: stack trace could be null when using async-await.
 import 'dart:async';
 
 import 'package:expect/expect.dart';
 
 main() async {
   C value = await test();
-  Expect.equals("[[null]]", "$value");
+  Expect.identical(StackTrace.empty, value._s);
 }
 
 Future<C> test() async {
@@ -17,7 +19,7 @@
     await throwInFuture();
     return C(StackTrace.fromString("no-throw"));
   } on MyException catch (e, s) {
-    return C(s); // Note: s is null
+    return C(s); // Note: s is *no longer* null
   }
 }
 
diff --git a/tests/compiler/dart2js_extra/null_test.dart b/tests/compiler/dart2js_extra/null_test.dart
index 2378a91..c0a4670 100644
--- a/tests/compiler/dart2js_extra/null_test.dart
+++ b/tests/compiler/dart2js_extra/null_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.7
+
 import "package:expect/expect.dart";
 
 null1() {
diff --git a/tests/compiler/dart2js_extra/operator2_test.dart b/tests/compiler/dart2js_extra/operator2_test.dart
index 7d43fb0..f187e7e 100644
--- a/tests/compiler/dart2js_extra/operator2_test.dart
+++ b/tests/compiler/dart2js_extra/operator2_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.7
+
 import "package:expect/expect.dart";
 
 int zero() {
diff --git a/tests/compiler/dart2js_extra/operator3_test.dart b/tests/compiler/dart2js_extra/operator3_test.dart
index 04ceec8..be9ec13 100644
--- a/tests/compiler/dart2js_extra/operator3_test.dart
+++ b/tests/compiler/dart2js_extra/operator3_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.7
+
 import "package:expect/expect.dart";
 
 int zero() {
diff --git a/tests/compiler/dart2js_extra/operator_equals_test.dart b/tests/compiler/dart2js_extra/operator_equals_test.dart
index 6d73309..595775a 100644
--- a/tests/compiler/dart2js_extra/operator_equals_test.dart
+++ b/tests/compiler/dart2js_extra/operator_equals_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.7
+
 import "package:expect/expect.dart";
 
 class AlwaysTrue {
diff --git a/tests/compiler/dart2js_extra/operator_test.dart b/tests/compiler/dart2js_extra/operator_test.dart
index 65edd95..5664537 100644
--- a/tests/compiler/dart2js_extra/operator_test.dart
+++ b/tests/compiler/dart2js_extra/operator_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.7
+
 import "package:expect/expect.dart";
 
 @pragma('dart2js:noInline')
diff --git a/tests/compiler/dart2js_extra/optional_parameter_test.dart b/tests/compiler/dart2js_extra/optional_parameter_test.dart
index 48418fb..790f638 100644
--- a/tests/compiler/dart2js_extra/optional_parameter_test.dart
+++ b/tests/compiler/dart2js_extra/optional_parameter_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/panda_lib.dart b/tests/compiler/dart2js_extra/panda_lib.dart
index 1d20b03..9210361 100644
--- a/tests/compiler/dart2js_extra/panda_lib.dart
+++ b/tests/compiler/dart2js_extra/panda_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
+
 library panda_lib;
 
 class Panda {
diff --git a/tests/compiler/dart2js_extra/panda_test.dart b/tests/compiler/dart2js_extra/panda_test.dart
index 2afaee6..a825aa7 100644
--- a/tests/compiler/dart2js_extra/panda_test.dart
+++ b/tests/compiler/dart2js_extra/panda_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.7
+
 library panda_test;
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/phi_elimination_test.dart b/tests/compiler/dart2js_extra/phi_elimination_test.dart
index fe3f33f..8584939 100644
--- a/tests/compiler/dart2js_extra/phi_elimination_test.dart
+++ b/tests/compiler/dart2js_extra/phi_elimination_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.7
+
 import "package:expect/expect.dart";
 
 void bar() {
diff --git a/tests/compiler/dart2js_extra/phi_gvn_test.dart b/tests/compiler/dart2js_extra/phi_gvn_test.dart
index 558ce8b..e2cf05f 100644
--- a/tests/compiler/dart2js_extra/phi_gvn_test.dart
+++ b/tests/compiler/dart2js_extra/phi_gvn_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.7
+
 import "package:expect/expect.dart";
 
 foo(x) {}
diff --git a/tests/compiler/dart2js_extra/phi_test.dart b/tests/compiler/dart2js_extra/phi_test.dart
index 14ca2be..f9b5dda 100644
--- a/tests/compiler/dart2js_extra/phi_test.dart
+++ b/tests/compiler/dart2js_extra/phi_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.7
+
 import "package:expect/expect.dart";
 
 void phi1() {
diff --git a/tests/compiler/dart2js_extra/private_symbol_literal_test.dart b/tests/compiler/dart2js_extra/private_symbol_literal_test.dart
index 1f12b06..0b1a3c3 100644
--- a/tests/compiler/dart2js_extra/private_symbol_literal_test.dart
+++ b/tests/compiler/dart2js_extra/private_symbol_literal_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.7
+
 // Test symbol literals with underscores.
 // These are currently unsupported by dart2js.
 
diff --git a/tests/compiler/dart2js_extra/recursive_metadata_test.dart b/tests/compiler/dart2js_extra/recursive_metadata_test.dart
index 1c46209..0172403 100644
--- a/tests/compiler/dart2js_extra/recursive_metadata_test.dart
+++ b/tests/compiler/dart2js_extra/recursive_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.7
+
 import 'package:expect/expect.dart';
 
 // Tests that the compiler doesn't crash resolving annotations that refer
diff --git a/tests/compiler/dart2js_extra/regress/4434_lib.dart b/tests/compiler/dart2js_extra/regress/4434_lib.dart
index a2ac7c4..f2ecb97 100644
--- a/tests/compiler/dart2js_extra/regress/4434_lib.dart
+++ b/tests/compiler/dart2js_extra/regress/4434_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
+
 library lib_a;
 
 class A {
diff --git a/tests/compiler/dart2js_extra/regress/4434_test.dart b/tests/compiler/dart2js_extra/regress/4434_test.dart
index 72582f7..fea2b7a 100644
--- a/tests/compiler/dart2js_extra/regress/4434_test.dart
+++ b/tests/compiler/dart2js_extra/regress/4434_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.7
+
 library lib_b;
 
 import '4434_lib.dart';
diff --git a/tests/compiler/dart2js_extra/regress/4492_test.dart b/tests/compiler/dart2js_extra/regress/4492_test.dart
index 2b3d6c8..ec93b4d 100644
--- a/tests/compiler/dart2js_extra/regress/4492_test.dart
+++ b/tests/compiler/dart2js_extra/regress/4492_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/regress/4515_1_test.dart b/tests/compiler/dart2js_extra/regress/4515_1_test.dart
index 8c758b0..08c00f1 100644
--- a/tests/compiler/dart2js_extra/regress/4515_1_test.dart
+++ b/tests/compiler/dart2js_extra/regress/4515_1_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/regress/4515_2_test.dart b/tests/compiler/dart2js_extra/regress/4515_2_test.dart
index 3411648..580a676 100644
--- a/tests/compiler/dart2js_extra/regress/4515_2_test.dart
+++ b/tests/compiler/dart2js_extra/regress/4515_2_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/regress/4515_3_test.dart b/tests/compiler/dart2js_extra/regress/4515_3_test.dart
index 23438ad..80c7f57 100644
--- a/tests/compiler/dart2js_extra/regress/4515_3_test.dart
+++ b/tests/compiler/dart2js_extra/regress/4515_3_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/regress/4562_test.dart b/tests/compiler/dart2js_extra/regress/4562_test.dart
index 61ba859..ba1b145 100644
--- a/tests/compiler/dart2js_extra/regress/4562_test.dart
+++ b/tests/compiler/dart2js_extra/regress/4562_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.7
+
 void main() {
   var foo = new Foo();
   var bar = new Bar(); //# 01: compile-time error
diff --git a/tests/compiler/dart2js_extra/regress/4639_test.dart b/tests/compiler/dart2js_extra/regress/4639_test.dart
index 2aa9308..87dde61 100644
--- a/tests/compiler/dart2js_extra/regress/4639_test.dart
+++ b/tests/compiler/dart2js_extra/regress/4639_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/regress/regression_type_variables_is_test.dart b/tests/compiler/dart2js_extra/regress/regression_type_variables_is_test.dart
index 9826cf4..c511808 100644
--- a/tests/compiler/dart2js_extra/regress/regression_type_variables_is_test.dart
+++ b/tests/compiler/dart2js_extra/regress/regression_type_variables_is_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.7
+
 import "package:expect/expect.dart";
 
 class Bar<X> implements Baz {}
diff --git a/tests/compiler/dart2js_extra/regress_32069_test.dart b/tests/compiler/dart2js_extra/regress_32069_test.dart
index 23a0aff..05499c8 100644
--- a/tests/compiler/dart2js_extra/regress_32069_test.dart
+++ b/tests/compiler/dart2js_extra/regress_32069_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.7
+
 import 'package:expect/expect.dart';
 
 main() {
diff --git a/tests/compiler/dart2js_extra/regress_36222_test.dart b/tests/compiler/dart2js_extra/regress_36222_test.dart
index f030833..97ac586 100644
--- a/tests/compiler/dart2js_extra/regress_36222_test.dart
+++ b/tests/compiler/dart2js_extra/regress_36222_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.7
+
 typedef int BinaryFunc(int x, int y);
 
 class A {
diff --git a/tests/compiler/dart2js_extra/regress_40349_test.dart b/tests/compiler/dart2js_extra/regress_40349_test.dart
index 796688d..50316bc 100644
--- a/tests/compiler/dart2js_extra/regress_40349_test.dart
+++ b/tests/compiler/dart2js_extra/regress_40349_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.7
+
 /// Regression test for Issue #40349:
 ///
 /// Before the fix, this code was accidentally generating a type check twice.
diff --git a/tests/compiler/dart2js_extra/regress_null_aware_test.dart b/tests/compiler/dart2js_extra/regress_null_aware_test.dart
index 4ef8dc3..68cbcdc 100644
--- a/tests/compiler/dart2js_extra/regress_null_aware_test.dart
+++ b/tests/compiler/dart2js_extra/regress_null_aware_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.md file.
 
+// @dart = 2.7
+
 // Regression test for failure on CFE null-aware encoding.
 
 class Class {
diff --git a/tests/compiler/dart2js_extra/regression_2913_test.dart b/tests/compiler/dart2js_extra/regression_2913_test.dart
index 85b0916..51a9902 100644
--- a/tests/compiler/dart2js_extra/regression_2913_test.dart
+++ b/tests/compiler/dart2js_extra/regression_2913_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.7
+
 import "package:expect/expect.dart";
 
 main() {
diff --git a/tests/compiler/dart2js_extra/replaced_type_variable_test.dart b/tests/compiler/dart2js_extra/replaced_type_variable_test.dart
index e95ea81..f9c7e7e 100644
--- a/tests/compiler/dart2js_extra/replaced_type_variable_test.dart
+++ b/tests/compiler/dart2js_extra/replaced_type_variable_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.7
+
 import 'package:expect/expect.dart';
 
 // This class is inlined away.
diff --git a/tests/compiler/dart2js_extra/return_setter_test.dart b/tests/compiler/dart2js_extra/return_setter_test.dart
index a938b71..2d56e67 100644
--- a/tests/compiler/dart2js_extra/return_setter_test.dart
+++ b/tests/compiler/dart2js_extra/return_setter_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/round_constant_folding_test.dart b/tests/compiler/dart2js_extra/round_constant_folding_test.dart
index 2c786dd..8303723 100644
--- a/tests/compiler/dart2js_extra/round_constant_folding_test.dart
+++ b/tests/compiler/dart2js_extra/round_constant_folding_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.7
+
 import 'package:expect/expect.dart';
 
 const double PD1 = 0.0;
diff --git a/tests/compiler/dart2js_extra/rti/bind_test.dart b/tests/compiler/dart2js_extra/rti/bind_test.dart
index 4e38ba6..f2b8bab 100644
--- a/tests/compiler/dart2js_extra/rti/bind_test.dart
+++ b/tests/compiler/dart2js_extra/rti/bind_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.7
+
 import 'dart:_rti' as rti;
 import "package:expect/expect.dart";
 
diff --git a/tests/compiler/dart2js_extra/rti/bound_environment_test.dart b/tests/compiler/dart2js_extra/rti/bound_environment_test.dart
index 67f8ec3..6545b43 100644
--- a/tests/compiler/dart2js_extra/rti/bound_environment_test.dart
+++ b/tests/compiler/dart2js_extra/rti/bound_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.
 
+// @dart = 2.7
+
 import 'dart:_rti' as rti;
 import "package:expect/expect.dart";
 
diff --git a/tests/compiler/dart2js_extra/rti/canonical_recipe_test.dart b/tests/compiler/dart2js_extra/rti/canonical_recipe_test.dart
index 856ca7a..3be6427 100644
--- a/tests/compiler/dart2js_extra/rti/canonical_recipe_test.dart
+++ b/tests/compiler/dart2js_extra/rti/canonical_recipe_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.7
+
 import 'dart:_rti' as rti;
 import "package:expect/expect.dart";
 
diff --git a/tests/compiler/dart2js_extra/rti/class_environment_test.dart b/tests/compiler/dart2js_extra/rti/class_environment_test.dart
index 4cf7d9e..aa1079b 100644
--- a/tests/compiler/dart2js_extra/rti/class_environment_test.dart
+++ b/tests/compiler/dart2js_extra/rti/class_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.
 
+// @dart = 2.7
+
 import 'dart:_rti' as rti;
 import "package:expect/expect.dart";
 
diff --git a/tests/compiler/dart2js_extra/rti/constant_type_test.dart b/tests/compiler/dart2js_extra/rti/constant_type_test.dart
index 6281f06..fa2d560 100644
--- a/tests/compiler/dart2js_extra/rti/constant_type_test.dart
+++ b/tests/compiler/dart2js_extra/rti/constant_type_test.dart
@@ -1,6 +1,8 @@
 // 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
 //
 // dart2jsOptions=--experiment-new-rti --no-minify
 
diff --git a/tests/compiler/dart2js_extra/rti/recipe_syntax_test.dart b/tests/compiler/dart2js_extra/rti/recipe_syntax_test.dart
index 7d4be33..bb7979d 100644
--- a/tests/compiler/dart2js_extra/rti/recipe_syntax_test.dart
+++ b/tests/compiler/dart2js_extra/rti/recipe_syntax_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.7
+
 import 'dart:_recipe_syntax';
 
 main() {
diff --git a/tests/compiler/dart2js_extra/rti/runtime_type_1_test.dart b/tests/compiler/dart2js_extra/rti/runtime_type_1_test.dart
index 1eb67ab..acf914b 100644
--- a/tests/compiler/dart2js_extra/rti/runtime_type_1_test.dart
+++ b/tests/compiler/dart2js_extra/rti/runtime_type_1_test.dart
@@ -1,6 +1,8 @@
 // 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
 //
 // dart2jsOptions=--experiment-new-rti --no-minify
 
diff --git a/tests/compiler/dart2js_extra/rti/runtime_type_2_test.dart b/tests/compiler/dart2js_extra/rti/runtime_type_2_test.dart
index 69b352a..9a3511b 100644
--- a/tests/compiler/dart2js_extra/rti/runtime_type_2_test.dart
+++ b/tests/compiler/dart2js_extra/rti/runtime_type_2_test.dart
@@ -1,6 +1,8 @@
 // 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
 //
 // dart2jsOptions=--experiment-new-rti --no-minify
 
diff --git a/tests/compiler/dart2js_extra/rti/runtime_type_3_test.dart b/tests/compiler/dart2js_extra/rti/runtime_type_3_test.dart
index 7d8d51e..1423ff4 100644
--- a/tests/compiler/dart2js_extra/rti/runtime_type_3_test.dart
+++ b/tests/compiler/dart2js_extra/rti/runtime_type_3_test.dart
@@ -1,6 +1,8 @@
 // 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
 //
 // dart2jsOptions=--experiment-new-rti --no-minify
 
diff --git a/tests/compiler/dart2js_extra/rti/simple_2_test.dart b/tests/compiler/dart2js_extra/rti/simple_2_test.dart
index e195451..1ea3c71 100644
--- a/tests/compiler/dart2js_extra/rti/simple_2_test.dart
+++ b/tests/compiler/dart2js_extra/rti/simple_2_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.7
+
 import 'dart:_rti' as rti;
 import "package:expect/expect.dart";
 
diff --git a/tests/compiler/dart2js_extra/rti/simple_is_function_type2_test.dart b/tests/compiler/dart2js_extra/rti/simple_is_function_type2_test.dart
index 1ed2045..44603a0 100644
--- a/tests/compiler/dart2js_extra/rti/simple_is_function_type2_test.dart
+++ b/tests/compiler/dart2js_extra/rti/simple_is_function_type2_test.dart
@@ -1,6 +1,8 @@
 // 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
 //
 // dart2jsOptions=--experiment-new-rti
 
diff --git a/tests/compiler/dart2js_extra/rti/simple_is_function_type3_test.dart b/tests/compiler/dart2js_extra/rti/simple_is_function_type3_test.dart
index 9843216..747d5f8 100644
--- a/tests/compiler/dart2js_extra/rti/simple_is_function_type3_test.dart
+++ b/tests/compiler/dart2js_extra/rti/simple_is_function_type3_test.dart
@@ -1,6 +1,8 @@
 // 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
 //
 // dart2jsOptions=--experiment-new-rti
 
diff --git a/tests/compiler/dart2js_extra/rti/simple_is_function_type_test.dart b/tests/compiler/dart2js_extra/rti/simple_is_function_type_test.dart
index d87c89c..e63e4b5 100644
--- a/tests/compiler/dart2js_extra/rti/simple_is_function_type_test.dart
+++ b/tests/compiler/dart2js_extra/rti/simple_is_function_type_test.dart
@@ -1,6 +1,8 @@
 // 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
 //
 // dart2jsOptions=--experiment-new-rti
 
diff --git a/tests/compiler/dart2js_extra/rti/simple_is_test.dart b/tests/compiler/dart2js_extra/rti/simple_is_test.dart
index 7c7aafa..2d27065 100644
--- a/tests/compiler/dart2js_extra/rti/simple_is_test.dart
+++ b/tests/compiler/dart2js_extra/rti/simple_is_test.dart
@@ -1,6 +1,8 @@
 // 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
 //
 // dart2jsOptions=--experiment-new-rti --no-minify
 
diff --git a/tests/compiler/dart2js_extra/rti/simple_test.dart b/tests/compiler/dart2js_extra/rti/simple_test.dart
index 13a893e..4d9c956 100644
--- a/tests/compiler/dart2js_extra/rti/simple_test.dart
+++ b/tests/compiler/dart2js_extra/rti/simple_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.7
+
 import 'dart:_rti' as rti;
 import "package:expect/expect.dart";
 
diff --git a/tests/compiler/dart2js_extra/rti/simple_type_bound_test.dart b/tests/compiler/dart2js_extra/rti/simple_type_bound_test.dart
index 064327f..cc0a860 100644
--- a/tests/compiler/dart2js_extra/rti/simple_type_bound_test.dart
+++ b/tests/compiler/dart2js_extra/rti/simple_type_bound_test.dart
@@ -1,6 +1,8 @@
 // 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
 //
 // dart2jsOptions=--experiment-new-rti
 
diff --git a/tests/compiler/dart2js_extra/rti/subtype_test.dart b/tests/compiler/dart2js_extra/rti/subtype_test.dart
index e7fff6d..0d34f3f 100644
--- a/tests/compiler/dart2js_extra/rti/subtype_test.dart
+++ b/tests/compiler/dart2js_extra/rti/subtype_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.7
+
 import 'dart:_foreign_helper' show JS, JS_GET_NAME, TYPE_REF;
 import 'dart:_js_embedded_names' show JsGetName;
 import 'dart:_rti' as rti;
diff --git a/tests/compiler/dart2js_extra/rti/subtype_utils.dart b/tests/compiler/dart2js_extra/rti/subtype_utils.dart
index dc4f608..e520a86 100644
--- a/tests/compiler/dart2js_extra/rti/subtype_utils.dart
+++ b/tests/compiler/dart2js_extra/rti/subtype_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.7
+
 import 'dart:_rti' as rti;
 import "package:expect/expect.dart";
 
diff --git a/tests/compiler/dart2js_extra/rti/variance_subtype_test.dart b/tests/compiler/dart2js_extra/rti/variance_subtype_test.dart
index a42ab3f..e0d3258 100644
--- a/tests/compiler/dart2js_extra/rti/variance_subtype_test.dart
+++ b/tests/compiler/dart2js_extra/rti/variance_subtype_test.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.
 
-// dart2jsOptions= --enable-experiment=variance
+// @dart = 2.7
+
+// SharedOptions=--enable-experiment=variance
 
 import 'dart:_foreign_helper' show JS;
 import 'dart:_rti' as rti;
diff --git a/tests/compiler/dart2js_extra/rti_need_for_closure_signature_test.dart b/tests/compiler/dart2js_extra/rti_need_for_closure_signature_test.dart
index 61fda79..362930f 100644
--- a/tests/compiler/dart2js_extra/rti_need_for_closure_signature_test.dart
+++ b/tests/compiler/dart2js_extra/rti_need_for_closure_signature_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.7
+
 /// User-facing regression test: ensure we correctly record when a closure needs
 /// runtime type information for a type parameter that may be used or
 /// .runtimeType.
diff --git a/tests/compiler/dart2js_extra/rti_need_for_runtime_type_test.dart b/tests/compiler/dart2js_extra/rti_need_for_runtime_type_test.dart
index 48c20e4..d4697ae 100644
--- a/tests/compiler/dart2js_extra/rti_need_for_runtime_type_test.dart
+++ b/tests/compiler/dart2js_extra/rti_need_for_runtime_type_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.7
+
 /// User-facing regression test: ensure we correctly record when a closure needs
 /// runtime type information for a type parameter that may be used or
 /// .runtimeType.
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals1_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals1_test.dart
index 5defc5e..7a0d823 100644
--- a/tests/compiler/dart2js_extra/runtime_type_closure_equals1_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals1_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals2_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals2_test.dart
index 86fe4b2..22aa514 100644
--- a/tests/compiler/dart2js_extra/runtime_type_closure_equals2_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals2_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals3_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals3_test.dart
index ffcd03f..6ed0c0d 100644
--- a/tests/compiler/dart2js_extra/runtime_type_closure_equals3_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals3_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals4_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals4_test.dart
index 967b5f6..7b17bb1 100644
--- a/tests/compiler/dart2js_extra/runtime_type_closure_equals4_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals4_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals5_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals5_test.dart
index 1b19f8d..fd2616e 100644
--- a/tests/compiler/dart2js_extra/runtime_type_closure_equals5_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals5_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals6_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals6_test.dart
index 5090f04..3cb0589 100644
--- a/tests/compiler/dart2js_extra/runtime_type_closure_equals6_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals6_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals7_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals7_test.dart
index 73348c9..860f25c 100644
--- a/tests/compiler/dart2js_extra/runtime_type_closure_equals7_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals7_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_closure_equals8_test.dart b/tests/compiler/dart2js_extra/runtime_type_closure_equals8_test.dart
index 5f03539..9cfe492 100644
--- a/tests/compiler/dart2js_extra/runtime_type_closure_equals8_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_closure_equals8_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals1_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals1_test.dart
index f625055..5f20dfa 100644
--- a/tests/compiler/dart2js_extra/runtime_type_equals1_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_equals1_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals2_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals2_test.dart
index ce93178..f73ced5 100644
--- a/tests/compiler/dart2js_extra/runtime_type_equals2_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_equals2_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals3_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals3_test.dart
index f412f86..3d909c4 100644
--- a/tests/compiler/dart2js_extra/runtime_type_equals3_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_equals3_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals4_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals4_test.dart
index 4a1c8d9..8aa0647 100644
--- a/tests/compiler/dart2js_extra/runtime_type_equals4_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_equals4_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals5_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals5_test.dart
index cd6926e..532deb9 100644
--- a/tests/compiler/dart2js_extra/runtime_type_equals5_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_equals5_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.7
+
 import 'package:expect/expect.dart';
 
 class Class1 {
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals6_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals6_test.dart
index af98ea6..f71999f 100644
--- a/tests/compiler/dart2js_extra/runtime_type_equals6_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_equals6_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals7_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals7_test.dart
index 0d2727b..bf1460f 100644
--- a/tests/compiler/dart2js_extra/runtime_type_equals7_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_equals7_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_equals8_test.dart b/tests/compiler/dart2js_extra/runtime_type_equals8_test.dart
index 145ceae..31f9f8e 100644
--- a/tests/compiler/dart2js_extra/runtime_type_equals8_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_equals8_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/runtime_type_int_test.dart b/tests/compiler/dart2js_extra/runtime_type_int_test.dart
index d98484a..71ac242 100644
--- a/tests/compiler/dart2js_extra/runtime_type_int_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_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.7
+
 // Test that in dart2js, the constant system matches the runtime
 // handling of numbers.
 
diff --git a/tests/compiler/dart2js_extra/runtime_type_test.dart b/tests/compiler/dart2js_extra/runtime_type_test.dart
index f127dbe..9cd1bee 100644
--- a/tests/compiler/dart2js_extra/runtime_type_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_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.7
+
 // dart2jsOptions=--strong
 
 // Test that Type.toString returns nice strings for native classes with
diff --git a/tests/compiler/dart2js_extra/runtime_type_to_string1_test.dart b/tests/compiler/dart2js_extra/runtime_type_to_string1_test.dart
index d61335f..611c16f 100644
--- a/tests/compiler/dart2js_extra/runtime_type_to_string1_test.dart
+++ b/tests/compiler/dart2js_extra/runtime_type_to_string1_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.7
+
 // dart2jsOptions=--strong --omit-implicit-checks --lax-runtime-type-to-string --experiment-new-rti
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/send_test.dart b/tests/compiler/dart2js_extra/send_test.dart
index 3c98c51..c37b5eb 100644
--- a/tests/compiler/dart2js_extra/send_test.dart
+++ b/tests/compiler/dart2js_extra/send_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.7
+
 class A {
   int foo() {
     return 42;
diff --git a/tests/compiler/dart2js_extra/simple_string_constant_test.dart b/tests/compiler/dart2js_extra/simple_string_constant_test.dart
index 746e4d2..51b980b 100644
--- a/tests/compiler/dart2js_extra/simple_string_constant_test.dart
+++ b/tests/compiler/dart2js_extra/simple_string_constant_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.7
+
 import "package:expect/expect.dart";
 
 const String m = "\u{21}";
diff --git a/tests/compiler/dart2js_extra/source_mapping_crash_source.dart b/tests/compiler/dart2js_extra/source_mapping_crash_source.dart
index 78f15e3..470204de 100644
--- a/tests/compiler/dart2js_extra/source_mapping_crash_source.dart
+++ b/tests/compiler/dart2js_extra/source_mapping_crash_source.dart
@@ -2,6 +2,8 @@
 // for details. All 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
+
 part of source_mapping_crash_test;
 
 /*******************************************************************************
diff --git a/tests/compiler/dart2js_extra/source_mapping_crash_test.dart b/tests/compiler/dart2js_extra/source_mapping_crash_test.dart
index 38ca4c6..8700f37 100644
--- a/tests/compiler/dart2js_extra/source_mapping_crash_test.dart
+++ b/tests/compiler/dart2js_extra/source_mapping_crash_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.7
+
 library source_mapping_crash_test;
 
 part 'source_mapping_crash_source.dart';
diff --git a/tests/compiler/dart2js_extra/statements_test.dart b/tests/compiler/dart2js_extra/statements_test.dart
index 7e45397..8bc5323 100644
--- a/tests/compiler/dart2js_extra/statements_test.dart
+++ b/tests/compiler/dart2js_extra/statements_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.7
+
 void main() {
   print(3);
   print(4);
diff --git a/tests/compiler/dart2js_extra/static_field2_test.dart b/tests/compiler/dart2js_extra/static_field2_test.dart
index d2f5cc7..fe0b891 100644
--- a/tests/compiler/dart2js_extra/static_field2_test.dart
+++ b/tests/compiler/dart2js_extra/static_field2_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/static_field_test.dart b/tests/compiler/dart2js_extra/static_field_test.dart
index 63c96af..a449c5d 100644
--- a/tests/compiler/dart2js_extra/static_field_test.dart
+++ b/tests/compiler/dart2js_extra/static_field_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/static_method2_test.dart b/tests/compiler/dart2js_extra/static_method2_test.dart
index ab6517f..43c55dd 100644
--- a/tests/compiler/dart2js_extra/static_method2_test.dart
+++ b/tests/compiler/dart2js_extra/static_method2_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/static_method_test.dart b/tests/compiler/dart2js_extra/static_method_test.dart
index a65e0b6..aa14749 100644
--- a/tests/compiler/dart2js_extra/static_method_test.dart
+++ b/tests/compiler/dart2js_extra/static_method_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/static_var_no_initializer_test.dart b/tests/compiler/dart2js_extra/static_var_no_initializer_test.dart
index e6cb720..d03a222 100644
--- a/tests/compiler/dart2js_extra/static_var_no_initializer_test.dart
+++ b/tests/compiler/dart2js_extra/static_var_no_initializer_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.7
+
 import "package:expect/expect.dart";
 
 int one;
diff --git a/tests/compiler/dart2js_extra/static_var_test.dart b/tests/compiler/dart2js_extra/static_var_test.dart
index 1b3a9fc..56c2591 100644
--- a/tests/compiler/dart2js_extra/static_var_test.dart
+++ b/tests/compiler/dart2js_extra/static_var_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.7
+
 import "package:expect/expect.dart";
 
 int one = 1;
diff --git a/tests/compiler/dart2js_extra/string_escape_test.dart b/tests/compiler/dart2js_extra/string_escape_test.dart
index 3bd1b99..0ee8d16 100644
--- a/tests/compiler/dart2js_extra/string_escape_test.dart
+++ b/tests/compiler/dart2js_extra/string_escape_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.7
+
 import "package:expect/expect.dart";
 
 // Test that string escapes work correctly.
diff --git a/tests/compiler/dart2js_extra/string_interpolation_dynamic_test.dart b/tests/compiler/dart2js_extra/string_interpolation_dynamic_test.dart
index 115f070..304f024 100644
--- a/tests/compiler/dart2js_extra/string_interpolation_dynamic_test.dart
+++ b/tests/compiler/dart2js_extra/string_interpolation_dynamic_test.dart
Binary files differ
diff --git a/tests/compiler/dart2js_extra/string_interpolation_opt1_test.dart b/tests/compiler/dart2js_extra/string_interpolation_opt1_test.dart
index 60e92d4..e0a63dd 100644
--- a/tests/compiler/dart2js_extra/string_interpolation_opt1_test.dart
+++ b/tests/compiler/dart2js_extra/string_interpolation_opt1_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.7
+
 import "package:expect/expect.dart";
 import 'dart:math';
 
diff --git a/tests/compiler/dart2js_extra/string_interpolation_test.dart b/tests/compiler/dart2js_extra/string_interpolation_test.dart
index 027128a..e6c9562 100644
--- a/tests/compiler/dart2js_extra/string_interpolation_test.dart
+++ b/tests/compiler/dart2js_extra/string_interpolation_test.dart
Binary files differ
diff --git a/tests/compiler/dart2js_extra/super_call_test.dart b/tests/compiler/dart2js_extra/super_call_test.dart
index c9f777f..a5b46da 100644
--- a/tests/compiler/dart2js_extra/super_call_test.dart
+++ b/tests/compiler/dart2js_extra/super_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/super_constructor1_test.dart b/tests/compiler/dart2js_extra/super_constructor1_test.dart
index a0aaf86..8c5a760 100644
--- a/tests/compiler/dart2js_extra/super_constructor1_test.dart
+++ b/tests/compiler/dart2js_extra/super_constructor1_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.7
+
 import "package:expect/expect.dart";
 
 String message;
diff --git a/tests/compiler/dart2js_extra/super_constructor2_test.dart b/tests/compiler/dart2js_extra/super_constructor2_test.dart
index 73ac20a..8fbe812 100644
--- a/tests/compiler/dart2js_extra/super_constructor2_test.dart
+++ b/tests/compiler/dart2js_extra/super_constructor2_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin10_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin10_test.dart
index 361e98b..f0ac915 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin10_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin10_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.7
+
 import 'package:expect/expect.dart';
 
 class SuperA {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin11_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin11_test.dart
index efd86c0..538391f 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin11_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin11_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.7
+
 import 'package:expect/expect.dart';
 
 class SuperA1 {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin12_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin12_test.dart
index 81fa7f29..2765557 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin12_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin12_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.7
+
 import 'package:expect/expect.dart';
 
 class SuperA {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin13_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin13_test.dart
index 142e893..99311fe 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin13_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin13_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.7
+
 import 'package:expect/expect.dart';
 
 class SuperA {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin14_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin14_test.dart
index 224baa4..4e10577 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin14_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin14_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.7
+
 import 'package:expect/expect.dart';
 
 class SuperA {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin15_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin15_test.dart
index a2df040..006d1c9 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin15_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin15_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.7
+
 import 'package:expect/expect.dart';
 
 class SuperA {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin16_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin16_test.dart
index 09e0267..612990e 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin16_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin16_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.7
+
 import 'package:expect/expect.dart';
 
 class SuperA1 {}
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin17_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin17_test.dart
index 14aa9e3..f85910c 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin17_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin17_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.7
+
 import 'package:expect/expect.dart';
 
 class S {}
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin18_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin18_test.dart
index d29409c..bd52195 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin18_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin18_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.7
+
 import 'package:expect/expect.dart';
 
 class S {}
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin1_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin1_test.dart
index 6f6d16a..23fb6be 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin1_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin1_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.7
+
 import 'package:expect/expect.dart';
 
 class SuperA {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin2_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin2_test.dart
index 846fe88..edf6d4a 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin2_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin2_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.7
+
 import 'package:expect/expect.dart';
 
 class SuperA {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin3_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin3_test.dart
index c5bfca0..f5d2ac5 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin3_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin3_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.7
+
 import 'package:expect/expect.dart';
 
 class SuperA {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin4_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin4_test.dart
index a450c76..0f9e418 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin4_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin4_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.7
+
 import 'package:expect/expect.dart';
 
 class SuperA {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin5_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin5_test.dart
index 41ea90c..316ab8d 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin5_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin5_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.7
+
 import 'package:expect/expect.dart';
 
 class SuperA {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin6_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin6_test.dart
index 86a998f..1d94b58 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin6_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin6_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.7
+
 import 'package:expect/expect.dart';
 
 class SuperA {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin7_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin7_test.dart
index 80e0a17..b9ab301 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin7_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin7_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.7
+
 import 'package:expect/expect.dart';
 
 class SuperA<T> {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin8_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin8_test.dart
index 42af785..b93aac6 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin8_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin8_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.7
+
 import 'package:expect/expect.dart';
 
 class SuperA<T, S> {
diff --git a/tests/compiler/dart2js_extra/supermixin/supermixin9_test.dart b/tests/compiler/dart2js_extra/supermixin/supermixin9_test.dart
index 41a688f..24c6b12 100644
--- a/tests/compiler/dart2js_extra/supermixin/supermixin9_test.dart
+++ b/tests/compiler/dart2js_extra/supermixin/supermixin9_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.7
+
 import 'package:expect/expect.dart';
 
 class SuperA<T> {
diff --git a/tests/compiler/dart2js_extra/switch_equals_test.dart b/tests/compiler/dart2js_extra/switch_equals_test.dart
index 72030e6..b628863 100644
--- a/tests/compiler/dart2js_extra/switch_equals_test.dart
+++ b/tests/compiler/dart2js_extra/switch_equals_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.7
+
 class SuperClass {
   const SuperClass();
 
@@ -21,19 +23,29 @@
 }
 
 main() {
-  switch (null) {
+  // This test verifies that when overriding `==` it is a compile time error to
+  // use that class as a key in a switch, but only if the override provides a
+  // body. However, with NNBD, all of these switches became compile time errors
+  // so now we cast `null` as `dynamic` to get these first two switches past
+  // the compiler.
+  switch (null as dynamic) {
     case const SuperClass():
       break;
     default:
   }
-  switch (null) {
+  switch (null as dynamic) {
     case const Class():
       break;
     default:
   }
-  switch (null) {
+  switch (null as dynamic) {
     case const SubClass(): //# 01: compile-time error
       break; //# 01: continued
     default:
   }
+  switch (null) {
+    case null:
+      break;
+    default:
+  }
 }
diff --git a/tests/compiler/dart2js_extra/switch_test.dart b/tests/compiler/dart2js_extra/switch_test.dart
index 9e5eef1..517d4eb 100644
--- a/tests/compiler/dart2js_extra/switch_test.dart
+++ b/tests/compiler/dart2js_extra/switch_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.7
+
 import "package:expect/expect.dart";
 
 switcher(val) {
diff --git a/tests/compiler/dart2js_extra/tear_off_types_test.dart b/tests/compiler/dart2js_extra/tear_off_types_test.dart
index d7f6c41..59aef28 100644
--- a/tests/compiler/dart2js_extra/tear_off_types_test.dart
+++ b/tests/compiler/dart2js_extra/tear_off_types_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.7
+
 // dart2jsOptions=--omit-implicit-checks
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/this_phi_elimination_test.dart b/tests/compiler/dart2js_extra/this_phi_elimination_test.dart
index 80f7bb0..95679f8 100644
--- a/tests/compiler/dart2js_extra/this_phi_elimination_test.dart
+++ b/tests/compiler/dart2js_extra/this_phi_elimination_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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/this_redirecting_constructor_test.dart b/tests/compiler/dart2js_extra/this_redirecting_constructor_test.dart
index feeedd4..32a5fce 100644
--- a/tests/compiler/dart2js_extra/this_redirecting_constructor_test.dart
+++ b/tests/compiler/dart2js_extra/this_redirecting_constructor_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.7
+
 import "package:expect/expect.dart";
 
 // Confirm that redirecting named constructors are properly resolved.
diff --git a/tests/compiler/dart2js_extra/this_test.dart b/tests/compiler/dart2js_extra/this_test.dart
index e0804e7..3bc167a 100644
--- a/tests/compiler/dart2js_extra/this_test.dart
+++ b/tests/compiler/dart2js_extra/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.7
+
 import "package:expect/expect.dart";
 
 class A {
diff --git a/tests/compiler/dart2js_extra/throw1_test.dart b/tests/compiler/dart2js_extra/throw1_test.dart
index b91485c..aa79f9f 100644
--- a/tests/compiler/dart2js_extra/throw1_test.dart
+++ b/tests/compiler/dart2js_extra/throw1_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.7
+
 void main() {
   throw "foo"; // //# 01: runtime error
 }
diff --git a/tests/compiler/dart2js_extra/throw2_test.dart b/tests/compiler/dart2js_extra/throw2_test.dart
index 350ec72..89c7c45 100644
--- a/tests/compiler/dart2js_extra/throw2_test.dart
+++ b/tests/compiler/dart2js_extra/throw2_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.7
+
 void throw1() {
   throw "foo";
 }
diff --git a/tests/compiler/dart2js_extra/timer_test.dart b/tests/compiler/dart2js_extra/timer_test.dart
index 818a6ae..578b5b3 100644
--- a/tests/compiler/dart2js_extra/timer_test.dart
+++ b/tests/compiler/dart2js_extra/timer_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.7
+
 import 'dart:async';
 import 'dart:isolate';
 
diff --git a/tests/compiler/dart2js_extra/to_string_test.dart b/tests/compiler/dart2js_extra/to_string_test.dart
index 7157548..de328f1 100644
--- a/tests/compiler/dart2js_extra/to_string_test.dart
+++ b/tests/compiler/dart2js_extra/to_string_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.7
+
 import "package:expect/expect.dart";
 
 class A extends Object {}
diff --git a/tests/compiler/dart2js_extra/truncation_errors_test.dart b/tests/compiler/dart2js_extra/truncation_errors_test.dart
index 92532f2..a4b24f7 100644
--- a/tests/compiler/dart2js_extra/truncation_errors_test.dart
+++ b/tests/compiler/dart2js_extra/truncation_errors_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.7
+
 // Check that exception messages for truncating operations contains the
 // operands.
 
diff --git a/tests/compiler/dart2js_extra/type_argument_factory_crash_test.dart b/tests/compiler/dart2js_extra/type_argument_factory_crash_test.dart
index 36dd8eb..8726cf3 100644
--- a/tests/compiler/dart2js_extra/type_argument_factory_crash_test.dart
+++ b/tests/compiler/dart2js_extra/type_argument_factory_crash_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.7
+
 // A regression test for a dart2js crash.
 library type.argument.factory.crash.test;
 
diff --git a/tests/compiler/dart2js_extra/type_argument_factory_nocrash_test.dart b/tests/compiler/dart2js_extra/type_argument_factory_nocrash_test.dart
index 1708b04..580cebd 100644
--- a/tests/compiler/dart2js_extra/type_argument_factory_nocrash_test.dart
+++ b/tests/compiler/dart2js_extra/type_argument_factory_nocrash_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.7
+
 // A regression test for a dart2js crash.
 library type.argument.factory.nocrash.test;
 
diff --git a/tests/compiler/dart2js_extra/type_argument_optimization_test.dart b/tests/compiler/dart2js_extra/type_argument_optimization_test.dart
index 21b41c5..a80b370 100644
--- a/tests/compiler/dart2js_extra/type_argument_optimization_test.dart
+++ b/tests/compiler/dart2js_extra/type_argument_optimization_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.7
+
 // Regression test for issue 37267.
 
 typedef UpdateShouldNotify<T> = bool Function(T previous, T current);
diff --git a/tests/compiler/dart2js_extra/type_constant_switch_test.dart b/tests/compiler/dart2js_extra/type_constant_switch_test.dart
index 875c9d8..f3a45b0 100644
--- a/tests/compiler/dart2js_extra/type_constant_switch_test.dart
+++ b/tests/compiler/dart2js_extra/type_constant_switch_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.7
+
 // Test that switching on type literals leads to a compile time error in
 // dart2js since its implementation of [Type] implements 'operator =='.
 
diff --git a/tests/compiler/dart2js_extra/type_error_message_test.dart b/tests/compiler/dart2js_extra/type_error_message_test.dart
index 6f34931..30de186 100644
--- a/tests/compiler/dart2js_extra/type_error_message_test.dart
+++ b/tests/compiler/dart2js_extra/type_error_message_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.7
+
 // Test that the error message for a failing subtype test includes type
 // arguments.
 
diff --git a/tests/compiler/dart2js_extra/type_literal2_test.dart b/tests/compiler/dart2js_extra/type_literal2_test.dart
index 53d06a3..dd0580c 100644
--- a/tests/compiler/dart2js_extra/type_literal2_test.dart
+++ b/tests/compiler/dart2js_extra/type_literal2_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.7
+
 import 'dart:async';
 import 'package:expect/expect.dart';
 
diff --git a/tests/compiler/dart2js_extra/type_literal_test.dart b/tests/compiler/dart2js_extra/type_literal_test.dart
index 4426847..3712300 100644
--- a/tests/compiler/dart2js_extra/type_literal_test.dart
+++ b/tests/compiler/dart2js_extra/type_literal_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.7
+
 // dart2jsOptions=--strong
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_extra/typevariable_factory_test.dart b/tests/compiler/dart2js_extra/typevariable_factory_test.dart
index 2f977cf..3c51f03 100644
--- a/tests/compiler/dart2js_extra/typevariable_factory_test.dart
+++ b/tests/compiler/dart2js_extra/typevariable_factory_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.7
+
 // Regression test to ensure that we can use type variable in factories.
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/typevariable_substitution_test.dart b/tests/compiler/dart2js_extra/typevariable_substitution_test.dart
index dd5e75f..723b098 100644
--- a/tests/compiler/dart2js_extra/typevariable_substitution_test.dart
+++ b/tests/compiler/dart2js_extra/typevariable_substitution_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.7
+
 // Regression test to ensure that we substitute type variables in is-tests.
 
 import "package:expect/expect.dart";
diff --git a/tests/compiler/dart2js_extra/typevariable_typedef_test.dart b/tests/compiler/dart2js_extra/typevariable_typedef_test.dart
index 5dc6d2b..6ac736e 100644
--- a/tests/compiler/dart2js_extra/typevariable_typedef_test.dart
+++ b/tests/compiler/dart2js_extra/typevariable_typedef_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.7
+
 import "package:expect/expect.dart";
 
 typedef T Func<T>(T x);
diff --git a/tests/compiler/dart2js_extra/unconditional_dartio_import_test.dart b/tests/compiler/dart2js_extra/unconditional_dartio_import_test.dart
index d6c869a..fd07b70 100644
--- a/tests/compiler/dart2js_extra/unconditional_dartio_import_test.dart
+++ b/tests/compiler/dart2js_extra/unconditional_dartio_import_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.7
+
 /// Tests that dart2js allows to import dart:io for web clients, but it
 /// continues to indicate that it is not supported (so config-specific imports
 /// continue to have the same semantics as before).
diff --git a/tests/compiler/dart2js_extra/unused_local_const_test.dart b/tests/compiler/dart2js_extra/unused_local_const_test.dart
index 5829129..77ef3f1 100644
--- a/tests/compiler/dart2js_extra/unused_local_const_test.dart
+++ b/tests/compiler/dart2js_extra/unused_local_const_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.7
+
 class A {
   const A();
 
diff --git a/tests/compiler/dart2js_extra/useful_error_message_1_test.dart b/tests/compiler/dart2js_extra/useful_error_message_1_test.dart
index 7fbaa6b..07e8dcd 100644
--- a/tests/compiler/dart2js_extra/useful_error_message_1_test.dart
+++ b/tests/compiler/dart2js_extra/useful_error_message_1_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.7
+
 // Test that closures have a useful string that identifies the function by name
 // in error messages.
 
diff --git a/tests/compiler/dart2js_extra/while_test.dart b/tests/compiler/dart2js_extra/while_test.dart
index 4ac3ec3..ce18e73 100644
--- a/tests/compiler/dart2js_extra/while_test.dart
+++ b/tests/compiler/dart2js_extra/while_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.7
+
 import "package:expect/expect.dart";
 
 void while1() {
diff --git a/tests/compiler/dart2js_native/abstract_class_test.dart b/tests/compiler/dart2js_native/abstract_class_test.dart
index 6773385..988157c 100644
--- a/tests/compiler/dart2js_native/abstract_class_test.dart
+++ b/tests/compiler/dart2js_native/abstract_class_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.7
+
 import "native_testing.dart";
 
 // Native classes can have subclasses that are not declared to the program.  The
diff --git a/tests/compiler/dart2js_native/bound_closure_super_test.dart b/tests/compiler/dart2js_native/bound_closure_super_test.dart
index d97d8e1..67c36ed 100644
--- a/tests/compiler/dart2js_native/bound_closure_super_test.dart
+++ b/tests/compiler/dart2js_native/bound_closure_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.7
+
 // Test calling convention of property extraction closures (super edition).
 library bound_closure_super_test;
 
diff --git a/tests/compiler/dart2js_native/bound_closure_test.dart b/tests/compiler/dart2js_native/bound_closure_test.dart
index 3509722..09bc341 100644
--- a/tests/compiler/dart2js_native/bound_closure_test.dart
+++ b/tests/compiler/dart2js_native/bound_closure_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.7
+
 import 'native_testing.dart';
 
 // Test calling convention of property extraction closures.
diff --git a/tests/compiler/dart2js_native/browser_compat_1_prepatched_test.dart b/tests/compiler/dart2js_native/browser_compat_1_prepatched_test.dart
index bfd62f5..01fb0fe 100644
--- a/tests/compiler/dart2js_native/browser_compat_1_prepatched_test.dart
+++ b/tests/compiler/dart2js_native/browser_compat_1_prepatched_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.7
+
 import "native_testing.dart";
 
 // Test for dartNativeDispatchHooksTransformer, getTag hook.
diff --git a/tests/compiler/dart2js_native/browser_compat_1_unpatched_test.dart b/tests/compiler/dart2js_native/browser_compat_1_unpatched_test.dart
index 779b72a..1f1e0fc 100644
--- a/tests/compiler/dart2js_native/browser_compat_1_unpatched_test.dart
+++ b/tests/compiler/dart2js_native/browser_compat_1_unpatched_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.7
+
 import "native_testing.dart";
 
 // Test for dartNativeDispatchHooksTransformer, getTag hook.
diff --git a/tests/compiler/dart2js_native/browser_compat_2_test.dart b/tests/compiler/dart2js_native/browser_compat_2_test.dart
index aa8f131..349c9a7 100644
--- a/tests/compiler/dart2js_native/browser_compat_2_test.dart
+++ b/tests/compiler/dart2js_native/browser_compat_2_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.7
+
 import "native_testing.dart";
 
 // Test for dartNativeDispatchHooksTransformer
diff --git a/tests/compiler/dart2js_native/catch_javascript_null_stack_trace_test.dart b/tests/compiler/dart2js_native/catch_javascript_null_stack_trace_test.dart
index cf9f528..e9b4ad1 100644
--- a/tests/compiler/dart2js_native/catch_javascript_null_stack_trace_test.dart
+++ b/tests/compiler/dart2js_native/catch_javascript_null_stack_trace_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.7
+
 import 'native_testing.dart';
 
 // Try throwing a javascript null, and getting a stack-trace from it.
diff --git a/tests/compiler/dart2js_native/compiler_test_internals.dart b/tests/compiler/dart2js_native/compiler_test_internals.dart
index 08e96d0..c7b0218 100644
--- a/tests/compiler/dart2js_native/compiler_test_internals.dart
+++ b/tests/compiler/dart2js_native/compiler_test_internals.dart
@@ -2,6 +2,8 @@
 // for details. All 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 compiler_test_internals;
 
 export 'dart:_js_helper' show NoSideEffects, NoThrows, NoInline;
diff --git a/tests/compiler/dart2js_native/compute_this_script_test.dart b/tests/compiler/dart2js_native/compute_this_script_test.dart
index ee5c855..45f26cc 100644
--- a/tests/compiler/dart2js_native/compute_this_script_test.dart
+++ b/tests/compiler/dart2js_native/compute_this_script_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.7
+
 // Test of _computeThisScript().
 
 import 'dart:_js_helper' show thisScript;
diff --git a/tests/compiler/dart2js_native/core_type_check_native_test.dart b/tests/compiler/dart2js_native/core_type_check_native_test.dart
index 6356192..a7b6d8b 100644
--- a/tests/compiler/dart2js_native/core_type_check_native_test.dart
+++ b/tests/compiler/dart2js_native/core_type_check_native_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.7
+
 import "native_testing.dart";
 
 @Native("A")
diff --git a/tests/compiler/dart2js_native/dispatch_property_initialization_test.dart b/tests/compiler/dart2js_native/dispatch_property_initialization_test.dart
index 4e4ed95..d5c90b7 100644
--- a/tests/compiler/dart2js_native/dispatch_property_initialization_test.dart
+++ b/tests/compiler/dart2js_native/dispatch_property_initialization_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.7
+
 // Test for initialization of dispatchPropertyName.
 
 import 'native_testing.dart';
diff --git a/tests/compiler/dart2js_native/downcast_test.dart b/tests/compiler/dart2js_native/downcast_test.dart
index ab74f5f..f479b77 100644
--- a/tests/compiler/dart2js_native/downcast_test.dart
+++ b/tests/compiler/dart2js_native/downcast_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.7
+
 // Test for downcasts on native classes.
 
 import "native_testing.dart";
diff --git a/tests/compiler/dart2js_native/error_safeToString_test.dart b/tests/compiler/dart2js_native/error_safeToString_test.dart
index 115c908..8b9acce0 100644
--- a/tests/compiler/dart2js_native/error_safeToString_test.dart
+++ b/tests/compiler/dart2js_native/error_safeToString_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.7
+
 import "native_testing.dart";
 import 'dart:_foreign_helper' show JS_INTERCEPTOR_CONSTANT;
 import 'dart:_interceptors'
diff --git a/tests/compiler/dart2js_native/event_loop_test.dart b/tests/compiler/dart2js_native/event_loop_test.dart
index e69d542..1fc7b1d 100644
--- a/tests/compiler/dart2js_native/event_loop_test.dart
+++ b/tests/compiler/dart2js_native/event_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.7
+
 import "dart:async";
 import "package:async_helper/async_helper.dart";
 import "native_testing.dart";
diff --git a/tests/compiler/dart2js_native/fake_thing_2_test.dart b/tests/compiler/dart2js_native/fake_thing_2_test.dart
index f630746..7209073 100644
--- a/tests/compiler/dart2js_native/fake_thing_2_test.dart
+++ b/tests/compiler/dart2js_native/fake_thing_2_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.7
+
 import 'native_testing.dart';
 
 // Test that native objects cannot accidentally or maliciously be mistaken for
diff --git a/tests/compiler/dart2js_native/fake_thing_test.dart b/tests/compiler/dart2js_native/fake_thing_test.dart
index 0131821..8e1ca18 100644
--- a/tests/compiler/dart2js_native/fake_thing_test.dart
+++ b/tests/compiler/dart2js_native/fake_thing_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.7
+
 import "package:expect/expect.dart";
 import "dart:_foreign_helper" show JS;
 
diff --git a/tests/compiler/dart2js_native/field_type2_test.dart b/tests/compiler/dart2js_native/field_type2_test.dart
index 3bc2e10..abf0d94 100644
--- a/tests/compiler/dart2js_native/field_type2_test.dart
+++ b/tests/compiler/dart2js_native/field_type2_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.7
+
 // Test that a closure call on a native field is recognized by the
 // type inferrer.
 
diff --git a/tests/compiler/dart2js_native/field_type_test.dart b/tests/compiler/dart2js_native/field_type_test.dart
index 8e2e83d..e59ad72 100644
--- a/tests/compiler/dart2js_native/field_type_test.dart
+++ b/tests/compiler/dart2js_native/field_type_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.7
+
 // A native class has no defined constructor.
 // This regression test verifies that compiler accounts for hidden constructor
 // when analysing field values.
diff --git a/tests/compiler/dart2js_native/fixup_get_tag_test.dart b/tests/compiler/dart2js_native/fixup_get_tag_test.dart
index e4e1ab8..8853041 100644
--- a/tests/compiler/dart2js_native/fixup_get_tag_test.dart
+++ b/tests/compiler/dart2js_native/fixup_get_tag_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.7
+
 import "native_testing.dart";
 
 // Test for dartExperimentalFixupGetTag.
diff --git a/tests/compiler/dart2js_native/foreign_test.dart b/tests/compiler/dart2js_native/foreign_test.dart
index 31ab23b..3553d28 100644
--- a/tests/compiler/dart2js_native/foreign_test.dart
+++ b/tests/compiler/dart2js_native/foreign_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.7
+
 import "native_testing.dart";
 
 foreign1(var a, var b) {
diff --git a/tests/compiler/dart2js_native/hash_code_test.dart b/tests/compiler/dart2js_native/hash_code_test.dart
index 137be8f..9024625 100644
--- a/tests/compiler/dart2js_native/hash_code_test.dart
+++ b/tests/compiler/dart2js_native/hash_code_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.7
+
 import 'native_testing.dart';
 
 @Native("A")
diff --git a/tests/compiler/dart2js_native/inference_of_helper_methods_test.dart b/tests/compiler/dart2js_native/inference_of_helper_methods_test.dart
index 3185f05..f0d426c 100644
--- a/tests/compiler/dart2js_native/inference_of_helper_methods_test.dart
+++ b/tests/compiler/dart2js_native/inference_of_helper_methods_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.7
+
 import 'native_testing.dart';
 import 'dart:_js_helper' show intTypeCheck;
 
diff --git a/tests/compiler/dart2js_native/internal_library_test.dart b/tests/compiler/dart2js_native/internal_library_test.dart
index 7f81f6c..e08339c 100644
--- a/tests/compiler/dart2js_native/internal_library_test.dart
+++ b/tests/compiler/dart2js_native/internal_library_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.7
+
 // Test that a private library can be accessed from libraries in this special
 // test folder.
 
diff --git a/tests/compiler/dart2js_native/is_check_test.dart b/tests/compiler/dart2js_native/is_check_test.dart
index ec1d703..13d2599 100644
--- a/tests/compiler/dart2js_native/is_check_test.dart
+++ b/tests/compiler/dart2js_native/is_check_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.7
+
 import 'native_testing.dart';
 
 @Native("A")
diff --git a/tests/compiler/dart2js_native/issue9182_test.dart b/tests/compiler/dart2js_native/issue9182_test.dart
index 62a0a60..cfbb2b2 100644
--- a/tests/compiler/dart2js_native/issue9182_test.dart
+++ b/tests/compiler/dart2js_native/issue9182_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.7
+
 // Regression test for Issue 9182.  The generative constructor body function
 // should not have the interceptor calling convention.
 
diff --git a/tests/compiler/dart2js_native/js_const_test.dart b/tests/compiler/dart2js_native/js_const_test.dart
index d777e1e..a119f54 100644
--- a/tests/compiler/dart2js_native/js_const_test.dart
+++ b/tests/compiler/dart2js_native/js_const_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.7
+
 import 'package:expect/expect.dart';
 
 import 'dart:_foreign_helper' show JS, JS_CONST;
diff --git a/tests/compiler/dart2js_native/js_constant_test.dart b/tests/compiler/dart2js_native/js_constant_test.dart
index 40ce27c..1ff176a 100644
--- a/tests/compiler/dart2js_native/js_constant_test.dart
+++ b/tests/compiler/dart2js_native/js_constant_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.7
+
 import 'native_testing.dart';
 
 // Negative constant numbers must be generated as negation, not just a literal
diff --git a/tests/compiler/dart2js_native/jsobject_test.dart b/tests/compiler/dart2js_native/jsobject_test.dart
index dd0ec8e..f5febe0 100644
--- a/tests/compiler/dart2js_native/jsobject_test.dart
+++ b/tests/compiler/dart2js_native/jsobject_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.7
+
 import 'native_testing.dart';
 import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
 import 'dart:_interceptors'
diff --git a/tests/compiler/dart2js_native/load_elim_refinement_test.dart b/tests/compiler/dart2js_native/load_elim_refinement_test.dart
index ee9dfee..a4ed700 100644
--- a/tests/compiler/dart2js_native/load_elim_refinement_test.dart
+++ b/tests/compiler/dart2js_native/load_elim_refinement_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.7
+
 import 'native_testing.dart';
 
 class A {
diff --git a/tests/compiler/dart2js_native/native_call_arity1_frog_test.dart b/tests/compiler/dart2js_native/native_call_arity1_frog_test.dart
index f590001..c7041fd 100644
--- a/tests/compiler/dart2js_native/native_call_arity1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_call_arity1_frog_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.7
+
 import "native_testing.dart";
 
 // Test that native methods with unnamed* optional arguments are called with the
diff --git a/tests/compiler/dart2js_native/native_call_arity2_frog_test.dart b/tests/compiler/dart2js_native/native_call_arity2_frog_test.dart
index 1646809..b66ddce 100644
--- a/tests/compiler/dart2js_native/native_call_arity2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_call_arity2_frog_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.7
+
 import "native_testing.dart";
 
 // This is a similar test to NativeCallArity1FrogTest, but makes sure
diff --git a/tests/compiler/dart2js_native/native_call_arity3_frog_test.dart b/tests/compiler/dart2js_native/native_call_arity3_frog_test.dart
index 3be4585..28e0412 100644
--- a/tests/compiler/dart2js_native/native_call_arity3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_call_arity3_frog_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.7
+
 import "native_testing.dart";
 
 // Test similar to NativeCallArity1FrogTest, but with default values to
diff --git a/tests/compiler/dart2js_native/native_checked_arguments1_frog_test.dart b/tests/compiler/dart2js_native/native_checked_arguments1_frog_test.dart
index ddce60e..ff52fa3 100644
--- a/tests/compiler/dart2js_native/native_checked_arguments1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_checked_arguments1_frog_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.7
+
 import 'native_testing.dart';
 
 // Test that type checks occur on native methods.
diff --git a/tests/compiler/dart2js_native/native_checked_fields_frog_test.dart b/tests/compiler/dart2js_native/native_checked_fields_frog_test.dart
index f9fdece..76f512d 100644
--- a/tests/compiler/dart2js_native/native_checked_fields_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_checked_fields_frog_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.7
+
 import 'native_testing.dart';
 
 // Test that type checks occur on assignment to fields of native methods.
diff --git a/tests/compiler/dart2js_native/native_class_avoids_hidden_name_frog_test.dart b/tests/compiler/dart2js_native/native_class_avoids_hidden_name_frog_test.dart
index 6e4a95c..488cd67 100644
--- a/tests/compiler/dart2js_native/native_class_avoids_hidden_name_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_avoids_hidden_name_frog_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.7
+
 import "native_testing.dart";
 
 // Test that hidden native class names are not used by generated code.
diff --git a/tests/compiler/dart2js_native/native_class_fields_2_test.dart b/tests/compiler/dart2js_native/native_class_fields_2_test.dart
index 3b3d265..b8b031e 100644
--- a/tests/compiler/dart2js_native/native_class_fields_2_test.dart
+++ b/tests/compiler/dart2js_native/native_class_fields_2_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.7
+
 import "native_testing.dart";
 
 // Verify that methods are not renamed to clash with native field names
diff --git a/tests/compiler/dart2js_native/native_class_fields_3_test.dart b/tests/compiler/dart2js_native/native_class_fields_3_test.dart
index 4812292..ad96532 100644
--- a/tests/compiler/dart2js_native/native_class_fields_3_test.dart
+++ b/tests/compiler/dart2js_native/native_class_fields_3_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.7
+
 import "native_testing.dart";
 
 // Verify that we can have fields with names that start with g and s even
diff --git a/tests/compiler/dart2js_native/native_class_fields_test.dart b/tests/compiler/dart2js_native/native_class_fields_test.dart
index e37adbe..a960803 100644
--- a/tests/compiler/dart2js_native/native_class_fields_test.dart
+++ b/tests/compiler/dart2js_native/native_class_fields_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.7
+
 import "native_testing.dart";
 
 // Verify that native fields on classes are not renamed by the minifier.
diff --git a/tests/compiler/dart2js_native/native_class_inheritance1_frog_test.dart b/tests/compiler/dart2js_native/native_class_inheritance1_frog_test.dart
index 322dcba..298a5f7 100644
--- a/tests/compiler/dart2js_native/native_class_inheritance1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_inheritance1_frog_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.7
+
 import "native_testing.dart";
 
 // Test to see if resolving a hidden native class's method interferes with
diff --git a/tests/compiler/dart2js_native/native_class_inheritance2_frog_test.dart b/tests/compiler/dart2js_native/native_class_inheritance2_frog_test.dart
index 8fa4b67..865ff93 100644
--- a/tests/compiler/dart2js_native/native_class_inheritance2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_inheritance2_frog_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.7
+
 import "native_testing.dart";
 
 // Test to see if resolving a hidden native class's method interferes with
diff --git a/tests/compiler/dart2js_native/native_class_inheritance3_frog_test.dart b/tests/compiler/dart2js_native/native_class_inheritance3_frog_test.dart
index af5a8e3..d6bc323 100644
--- a/tests/compiler/dart2js_native/native_class_inheritance3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_inheritance3_frog_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.7
+
 import "native_testing.dart";
 
 // Test to see if resolving a hidden native class's method to noSuchMethod
diff --git a/tests/compiler/dart2js_native/native_class_inheritance4_frog_test.dart b/tests/compiler/dart2js_native/native_class_inheritance4_frog_test.dart
index 25f8fcd..c230a0e 100644
--- a/tests/compiler/dart2js_native/native_class_inheritance4_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_inheritance4_frog_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.7
+
 import "native_testing.dart";
 
 // Additional Dart code may be 'placed on' hidden native classes.  With
diff --git a/tests/compiler/dart2js_native/native_class_is_check1_frog_test.dart b/tests/compiler/dart2js_native/native_class_is_check1_frog_test.dart
index 6b8bb37..0294507 100644
--- a/tests/compiler/dart2js_native/native_class_is_check1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_is_check1_frog_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.7
+
 import "native_testing.dart";
 
 // Test for correct simple is-checks on hidden native classes.
diff --git a/tests/compiler/dart2js_native/native_class_is_check3_frog_test.dart b/tests/compiler/dart2js_native/native_class_is_check3_frog_test.dart
index 98cbf91..fdd225a 100644
--- a/tests/compiler/dart2js_native/native_class_is_check3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_is_check3_frog_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.7
+
 import "native_testing.dart";
 
 // Test for correct simple is-checks on hidden native classes.
diff --git a/tests/compiler/dart2js_native/native_class_with_dart_methods_frog_test.dart b/tests/compiler/dart2js_native/native_class_with_dart_methods_frog_test.dart
index 574e684..c3061d8 100644
--- a/tests/compiler/dart2js_native/native_class_with_dart_methods_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_class_with_dart_methods_frog_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.7
+
 import 'native_testing.dart';
 
 // Additional Dart code may be 'placed on' hidden native classes.
diff --git a/tests/compiler/dart2js_native/native_closure_identity_frog_test.dart b/tests/compiler/dart2js_native/native_closure_identity_frog_test.dart
index c5f5084..2f85058 100644
--- a/tests/compiler/dart2js_native/native_closure_identity_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_closure_identity_frog_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.7
+
 import 'native_testing.dart';
 
 typedef MyFunctionType();
diff --git a/tests/compiler/dart2js_native/native_constructor_name_test.dart b/tests/compiler/dart2js_native/native_constructor_name_test.dart
index 9d60a40..1dc6d6c 100644
--- a/tests/compiler/dart2js_native/native_constructor_name_test.dart
+++ b/tests/compiler/dart2js_native/native_constructor_name_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.7
+
 // Test to see if a Dart class name is confused with dispatch tag.  Both class A
 // and class Z have a JavaScript constructor named "A".  The dynamic native
 // class dispatch hook on Object.prototype should avoid patching the Dart class
diff --git a/tests/compiler/dart2js_native/native_equals_frog_test.dart b/tests/compiler/dart2js_native/native_equals_frog_test.dart
index 0b460b9..1b5b38b 100644
--- a/tests/compiler/dart2js_native/native_equals_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_equals_frog_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.7
+
 import 'native_testing.dart';
 
 @Native("A")
diff --git a/tests/compiler/dart2js_native/native_exception2_test.dart b/tests/compiler/dart2js_native/native_exception2_test.dart
index 59cf5b0..4bbc029 100644
--- a/tests/compiler/dart2js_native/native_exception2_test.dart
+++ b/tests/compiler/dart2js_native/native_exception2_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.7
+
 // Similar to native_exception_test.dart but also defines a native
 // class.  This exercises a different code path in emitter.dart.
 
diff --git a/tests/compiler/dart2js_native/native_exception_test.dart b/tests/compiler/dart2js_native/native_exception_test.dart
index e3e4a98..c3684b4 100644
--- a/tests/compiler/dart2js_native/native_exception_test.dart
+++ b/tests/compiler/dart2js_native/native_exception_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.7
+
 // Test that dart2js can handle unexpected exception types.
 
 library native_exception_test;
diff --git a/tests/compiler/dart2js_native/native_exceptions1_frog_test.dart b/tests/compiler/dart2js_native/native_exceptions1_frog_test.dart
index 497a80c..084075e 100644
--- a/tests/compiler/dart2js_native/native_exceptions1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_exceptions1_frog_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.7
+
 import 'native_testing.dart';
 
 // Test that hidden native exception classes can be marked as existing.
diff --git a/tests/compiler/dart2js_native/native_field_invocation2_test.dart b/tests/compiler/dart2js_native/native_field_invocation2_test.dart
index 9c150687..2a4d013 100644
--- a/tests/compiler/dart2js_native/native_field_invocation2_test.dart
+++ b/tests/compiler/dart2js_native/native_field_invocation2_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.7
+
 import "native_testing.dart";
 
 @Native("NNative")
diff --git a/tests/compiler/dart2js_native/native_field_invocation3_test.dart b/tests/compiler/dart2js_native/native_field_invocation3_test.dart
index 9ed3d9c..8e0d918 100644
--- a/tests/compiler/dart2js_native/native_field_invocation3_test.dart
+++ b/tests/compiler/dart2js_native/native_field_invocation3_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.7
+
 import "native_testing.dart";
 
 makeCC() native;
diff --git a/tests/compiler/dart2js_native/native_field_invocation4_test.dart b/tests/compiler/dart2js_native/native_field_invocation4_test.dart
index afce3c09..7e5b0d4 100644
--- a/tests/compiler/dart2js_native/native_field_invocation4_test.dart
+++ b/tests/compiler/dart2js_native/native_field_invocation4_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.7
+
 import "native_testing.dart";
 
 @Native("A")
diff --git a/tests/compiler/dart2js_native/native_field_invocation5_test.dart b/tests/compiler/dart2js_native/native_field_invocation5_test.dart
index abd0169..5e9e853 100644
--- a/tests/compiler/dart2js_native/native_field_invocation5_test.dart
+++ b/tests/compiler/dart2js_native/native_field_invocation5_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.7
+
 import "native_testing.dart";
 
 makeCC() native;
diff --git a/tests/compiler/dart2js_native/native_field_invocation6_test.dart b/tests/compiler/dart2js_native/native_field_invocation6_test.dart
index 17ed660..3ca229f 100644
--- a/tests/compiler/dart2js_native/native_field_invocation6_test.dart
+++ b/tests/compiler/dart2js_native/native_field_invocation6_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.7
+
 import "native_testing.dart";
 
 makeA() native;
diff --git a/tests/compiler/dart2js_native/native_field_invocation_test.dart b/tests/compiler/dart2js_native/native_field_invocation_test.dart
index e6f13b6..65077fe 100644
--- a/tests/compiler/dart2js_native/native_field_invocation_test.dart
+++ b/tests/compiler/dart2js_native/native_field_invocation_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.7
+
 import "native_testing.dart";
 
 @Native("A")
diff --git a/tests/compiler/dart2js_native/native_field_name_test.dart b/tests/compiler/dart2js_native/native_field_name_test.dart
index 66e25ac..c03a88d 100644
--- a/tests/compiler/dart2js_native/native_field_name_test.dart
+++ b/tests/compiler/dart2js_native/native_field_name_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.7
+
 import 'native_testing.dart';
 
 // Check that native fields are not incorrectly renamed.
diff --git a/tests/compiler/dart2js_native/native_field_optimization_test.dart b/tests/compiler/dart2js_native/native_field_optimization_test.dart
index 5b7e061..6b5a976 100644
--- a/tests/compiler/dart2js_native/native_field_optimization_test.dart
+++ b/tests/compiler/dart2js_native/native_field_optimization_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.7
+
 import 'native_testing.dart';
 
 // Test that compiler is cautious with optimizations on native fields.  The
diff --git a/tests/compiler/dart2js_native/native_field_rename_1_frog_test.dart b/tests/compiler/dart2js_native/native_field_rename_1_frog_test.dart
index 5fd6602..11420c4 100644
--- a/tests/compiler/dart2js_native/native_field_rename_1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_field_rename_1_frog_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.7
+
 // A native method prevents other members from having that name, including
 // fields.  However, native fields keep their name.  The implication: a getter
 // for the field must be based on the field's name, not the field's jsname.
diff --git a/tests/compiler/dart2js_native/native_field_rename_2_frog_test.dart b/tests/compiler/dart2js_native/native_field_rename_2_frog_test.dart
index 2c44d54..1591a28 100644
--- a/tests/compiler/dart2js_native/native_field_rename_2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_field_rename_2_frog_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.7
+
 // A native method prevents other members from having that name, including
 // fields.  However, native fields keep their name.  The implication: a getter
 // for the field must be based on the field's name, not the field's jsname.
diff --git a/tests/compiler/dart2js_native/native_library_same_name_used_frog_test.dart b/tests/compiler/dart2js_native/native_library_same_name_used_frog_test.dart
index 4909b7f..974bf07 100644
--- a/tests/compiler/dart2js_native/native_library_same_name_used_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_library_same_name_used_frog_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.7
+
 // Test for correct hidden native class when abstract class has same name.
 
 library main;
diff --git a/tests/compiler/dart2js_native/native_library_same_name_used_lib1.dart b/tests/compiler/dart2js_native/native_library_same_name_used_lib1.dart
index 5046ff7..9e21adf 100644
--- a/tests/compiler/dart2js_native/native_library_same_name_used_lib1.dart
+++ b/tests/compiler/dart2js_native/native_library_same_name_used_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.7
+
 // 'I' is the name of an abstract class and the name of the native class.
 
 library native_library_same_name_used_lib1;
diff --git a/tests/compiler/dart2js_native/native_library_same_name_used_lib2.dart b/tests/compiler/dart2js_native/native_library_same_name_used_lib2.dart
index feec6bb..bec6852 100644
--- a/tests/compiler/dart2js_native/native_library_same_name_used_lib2.dart
+++ b/tests/compiler/dart2js_native/native_library_same_name_used_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.7
+
 // Native implementation.
 
 library lib2;
diff --git a/tests/compiler/dart2js_native/native_method_inlining_test.dart b/tests/compiler/dart2js_native/native_method_inlining_test.dart
index ba0ee3b..0df556d 100644
--- a/tests/compiler/dart2js_native/native_method_inlining_test.dart
+++ b/tests/compiler/dart2js_native/native_method_inlining_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.7
+
 // dart2jsOptions=--omit-implicit-checks
 
 // Test that native methods with unnamed optional arguments are called with the
diff --git a/tests/compiler/dart2js_native/native_method_rename1_frog_test.dart b/tests/compiler/dart2js_native/native_method_rename1_frog_test.dart
index 5d05694..65d0741 100644
--- a/tests/compiler/dart2js_native/native_method_rename1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_method_rename1_frog_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.7
+
 // Test the feature where the native string declares the native method's name.
 
 import 'native_testing.dart';
diff --git a/tests/compiler/dart2js_native/native_method_rename2_frog_test.dart b/tests/compiler/dart2js_native/native_method_rename2_frog_test.dart
index 35713a2..d2c5b49 100644
--- a/tests/compiler/dart2js_native/native_method_rename2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_method_rename2_frog_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.7
+
 // Test the feature where the native string declares the native method's name.
 
 import "native_testing.dart";
diff --git a/tests/compiler/dart2js_native/native_method_rename3_frog_test.dart b/tests/compiler/dart2js_native/native_method_rename3_frog_test.dart
index c5759b2..b2875a9 100644
--- a/tests/compiler/dart2js_native/native_method_rename3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_method_rename3_frog_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.7
+
 // Test the feature where the native string declares the native method's name.
 // #3. The name does not get
 
diff --git a/tests/compiler/dart2js_native/native_method_with_keyword_name_test.dart b/tests/compiler/dart2js_native/native_method_with_keyword_name_test.dart
index c535d90..1245550 100644
--- a/tests/compiler/dart2js_native/native_method_with_keyword_name_test.dart
+++ b/tests/compiler/dart2js_native/native_method_with_keyword_name_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.7
+
 import 'native_testing.dart';
 
 // Make sure we can have a native with a name that is a JavaScript keyword.
diff --git a/tests/compiler/dart2js_native/native_missing_method1_frog_test.dart b/tests/compiler/dart2js_native/native_missing_method1_frog_test.dart
index d0595f6..e083b17 100644
--- a/tests/compiler/dart2js_native/native_missing_method1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_missing_method1_frog_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.7
+
 import 'native_testing.dart';
 
 @Native("A")
diff --git a/tests/compiler/dart2js_native/native_missing_method2_frog_test.dart b/tests/compiler/dart2js_native/native_missing_method2_frog_test.dart
index ae5799f..7b96c87 100644
--- a/tests/compiler/dart2js_native/native_missing_method2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_missing_method2_frog_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.7
+
 import 'native_testing.dart';
 
 @Native("A")
diff --git a/tests/compiler/dart2js_native/native_mixin_field2_test.dart b/tests/compiler/dart2js_native/native_mixin_field2_test.dart
index 4612391..a2b9062 100644
--- a/tests/compiler/dart2js_native/native_mixin_field2_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_field2_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.7
+
 import "native_testing.dart";
 
 // Test that native classes can use ordinary Dart classes with fields
diff --git a/tests/compiler/dart2js_native/native_mixin_field_test.dart b/tests/compiler/dart2js_native/native_mixin_field_test.dart
index 7f1aebb..bc7d36c 100644
--- a/tests/compiler/dart2js_native/native_mixin_field_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_field_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.7
+
 import "native_testing.dart";
 
 // Test that native classes can use ordinary Dart classes with fields
diff --git a/tests/compiler/dart2js_native/native_mixin_multiple2_test.dart b/tests/compiler/dart2js_native/native_mixin_multiple2_test.dart
index 0747e6b..aa95f87 100644
--- a/tests/compiler/dart2js_native/native_mixin_multiple2_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_multiple2_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.7
+
 import "native_testing.dart";
 
 // Test that native classes can access methods defined only by mixins.
diff --git a/tests/compiler/dart2js_native/native_mixin_multiple3_test.dart b/tests/compiler/dart2js_native/native_mixin_multiple3_test.dart
index 1963186..9992295 100644
--- a/tests/compiler/dart2js_native/native_mixin_multiple3_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_multiple3_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.7
+
 import "native_testing.dart";
 
 // Test that native classes and plain classes can access methods defined only by
diff --git a/tests/compiler/dart2js_native/native_mixin_multiple_test.dart b/tests/compiler/dart2js_native/native_mixin_multiple_test.dart
index 310d75b..377353c 100644
--- a/tests/compiler/dart2js_native/native_mixin_multiple_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_multiple_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.7
+
 import "native_testing.dart";
 
 // Test that native classes can use ordinary Dart classes as mixins.
diff --git a/tests/compiler/dart2js_native/native_mixin_test.dart b/tests/compiler/dart2js_native/native_mixin_test.dart
index 64bd3e4..096f39e 100644
--- a/tests/compiler/dart2js_native/native_mixin_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_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.7
+
 import "native_testing.dart";
 
 // Test that native classes can use ordinary Dart classes as mixins.
diff --git a/tests/compiler/dart2js_native/native_mixin_with_plain_test.dart b/tests/compiler/dart2js_native/native_mixin_with_plain_test.dart
index aea5e67..d3ad80c 100644
--- a/tests/compiler/dart2js_native/native_mixin_with_plain_test.dart
+++ b/tests/compiler/dart2js_native/native_mixin_with_plain_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.7
+
 import "native_testing.dart";
 
 // Test that native classes and ordinary Dart classes can both use the same
diff --git a/tests/compiler/dart2js_native/native_named_constructors2_frog_test.dart b/tests/compiler/dart2js_native/native_named_constructors2_frog_test.dart
index b200628..916b9ec 100644
--- a/tests/compiler/dart2js_native/native_named_constructors2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_named_constructors2_frog_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.7
+
 import "native_testing.dart";
 
 // Native class with named constructors and static methods.
diff --git a/tests/compiler/dart2js_native/native_named_constructors3_frog_test.dart b/tests/compiler/dart2js_native/native_named_constructors3_frog_test.dart
index 949a405..d90df20 100644
--- a/tests/compiler/dart2js_native/native_named_constructors3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_named_constructors3_frog_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.7
+
 import "native_testing.dart";
 
 // Hidden native class with factory constructors and NO static methods.
diff --git a/tests/compiler/dart2js_native/native_no_such_method_exception2_frog_test.dart b/tests/compiler/dart2js_native/native_no_such_method_exception2_frog_test.dart
index 5df3c12..b562085 100644
--- a/tests/compiler/dart2js_native/native_no_such_method_exception2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_no_such_method_exception2_frog_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.7
+
 import "native_testing.dart";
 
 @Native("A")
diff --git a/tests/compiler/dart2js_native/native_no_such_method_exception_frog_test.dart b/tests/compiler/dart2js_native/native_no_such_method_exception_frog_test.dart
index c4a7951..857bf54 100644
--- a/tests/compiler/dart2js_native/native_no_such_method_exception_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_no_such_method_exception_frog_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.7
+
 import "native_testing.dart";
 
 @Native("A")
diff --git a/tests/compiler/dart2js_native/native_novel_html_test.dart b/tests/compiler/dart2js_native/native_novel_html_test.dart
index 19f9eca..fdd3e1f 100644
--- a/tests/compiler/dart2js_native/native_novel_html_test.dart
+++ b/tests/compiler/dart2js_native/native_novel_html_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.7
+
 import 'native_testing.dart';
 
 // Test to see if novel HTML tags are interpreted as HTMLElement.
diff --git a/tests/compiler/dart2js_native/native_null_closure_frog_test.dart b/tests/compiler/dart2js_native/native_null_closure_frog_test.dart
index 1768cac..a7c83a3 100644
--- a/tests/compiler/dart2js_native/native_null_closure_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_null_closure_frog_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.7
+
 // Test that exception unwrapping handle cases like ({foo:null}).foo().
 
 import "native_testing.dart";
diff --git a/tests/compiler/dart2js_native/native_null_frog_test.dart b/tests/compiler/dart2js_native/native_null_frog_test.dart
index 0abdd35..9cf083d 100644
--- a/tests/compiler/dart2js_native/native_null_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_null_frog_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.7
+
 import "native_testing.dart";
 
 // Test for values of some basic types.
diff --git a/tests/compiler/dart2js_native/native_property_frog_test.dart b/tests/compiler/dart2js_native/native_property_frog_test.dart
index 0c4d3ef..2deeed5 100644
--- a/tests/compiler/dart2js_native/native_property_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_property_frog_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.7
+
 // Properties on hidden native classes.
 
 import 'native_testing.dart';
diff --git a/tests/compiler/dart2js_native/native_test.dart b/tests/compiler/dart2js_native/native_test.dart
index 0eb52d6..dc14fe6 100644
--- a/tests/compiler/dart2js_native/native_test.dart
+++ b/tests/compiler/dart2js_native/native_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.7
+
 // Test for positive and negative uses of named declarations. This file is
 // also used in tests/compiler/dart2js/model/native_test.dart.
 
diff --git a/tests/compiler/dart2js_native/native_testing.dart b/tests/compiler/dart2js_native/native_testing.dart
index 5dcaa24..9eb9246 100644
--- a/tests/compiler/dart2js_native/native_testing.dart
+++ b/tests/compiler/dart2js_native/native_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.7
+
 // Native testing library. Provides support for mock @Native classes and
 // collects common imports.
 
diff --git a/tests/compiler/dart2js_native/native_to_string_frog_test.dart b/tests/compiler/dart2js_native/native_to_string_frog_test.dart
index 6fdca6f..f17ad7b 100644
--- a/tests/compiler/dart2js_native/native_to_string_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_to_string_frog_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.7
+
 import 'native_testing.dart';
 
 @Native("A")
diff --git a/tests/compiler/dart2js_native/native_use_native_name_in_table_frog_test.dart b/tests/compiler/dart2js_native/native_use_native_name_in_table_frog_test.dart
index 0bd930a..ef7b2a7 100644
--- a/tests/compiler/dart2js_native/native_use_native_name_in_table_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_use_native_name_in_table_frog_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.7
+
 import 'native_testing.dart';
 
 // Test that we put native names and not Dart names into the dynamic
diff --git a/tests/compiler/dart2js_native/native_window1_frog_test.dart b/tests/compiler/dart2js_native/native_window1_frog_test.dart
index f47b66d..add29bc 100644
--- a/tests/compiler/dart2js_native/native_window1_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_window1_frog_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.7
+
 import "native_testing.dart";
 
 abstract class Window {
diff --git a/tests/compiler/dart2js_native/native_window2_frog_test.dart b/tests/compiler/dart2js_native/native_window2_frog_test.dart
index 143c1e6..5593517 100644
--- a/tests/compiler/dart2js_native/native_window2_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_window2_frog_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.7
+
 import "native_testing.dart";
 
 abstract class Window {
diff --git a/tests/compiler/dart2js_native/native_wrapping_function3_frog_test.dart b/tests/compiler/dart2js_native/native_wrapping_function3_frog_test.dart
index 111e2f5..e3de1ed 100644
--- a/tests/compiler/dart2js_native/native_wrapping_function3_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_wrapping_function3_frog_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.7
+
 import "native_testing.dart";
 
 typedef void Callback0();
diff --git a/tests/compiler/dart2js_native/native_wrapping_function_frog_test.dart b/tests/compiler/dart2js_native/native_wrapping_function_frog_test.dart
index 53473b8..e05b809 100644
--- a/tests/compiler/dart2js_native/native_wrapping_function_frog_test.dart
+++ b/tests/compiler/dart2js_native/native_wrapping_function_frog_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.7
+
 import "native_testing.dart";
 
 typedef void Callback0();
diff --git a/tests/compiler/dart2js_native/oddly_named_fields_test.dart b/tests/compiler/dart2js_native/oddly_named_fields_test.dart
index 54d9bd4..e59f247 100644
--- a/tests/compiler/dart2js_native/oddly_named_fields_test.dart
+++ b/tests/compiler/dart2js_native/oddly_named_fields_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.7
+
 import 'native_testing.dart';
 
 // JavaScript reserved words:
diff --git a/tests/compiler/dart2js_native/optimization_hints_test.dart b/tests/compiler/dart2js_native/optimization_hints_test.dart
index 45ee3ad..5b73d79 100644
--- a/tests/compiler/dart2js_native/optimization_hints_test.dart
+++ b/tests/compiler/dart2js_native/optimization_hints_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.7
+
 import 'dart:_foreign_helper' show JS;
 
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js_native/rti_only_native_test.dart b/tests/compiler/dart2js_native/rti_only_native_test.dart
index ec2fa525..71d5e90 100644
--- a/tests/compiler/dart2js_native/rti_only_native_test.dart
+++ b/tests/compiler/dart2js_native/rti_only_native_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.7
+
 // Regression test for a bug that was caused by uninstantiated classes being
 // added to emitted classes by runtime-type system.
 // See my explanation in https://codereview.chromium.org/14018036/.
diff --git a/tests/compiler/dart2js_native/runtimetype_test.dart b/tests/compiler/dart2js_native/runtimetype_test.dart
index 558f7ee..4465ae1 100644
--- a/tests/compiler/dart2js_native/runtimetype_test.dart
+++ b/tests/compiler/dart2js_native/runtimetype_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.7
+
 import 'native_testing.dart';
 
 // Test to see runtimeType works on native classes and does not use the native
diff --git a/tests/compiler/dart2js_native/static_methods_test.dart b/tests/compiler/dart2js_native/static_methods_test.dart
index d356c25..3b1b31c 100644
--- a/tests/compiler/dart2js_native/static_methods_test.dart
+++ b/tests/compiler/dart2js_native/static_methods_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.7
+
 // Accessing static native methods names:
 //   plain declaration ->  use @Native tag as 'scope' for declared name.
 //   identifier @JSName -> use @Native tag as 'scope' for @JSName.
diff --git a/tests/compiler/dart2js_native/subclassing_1_test.dart b/tests/compiler/dart2js_native/subclassing_1_test.dart
index 77a636f..fd3dc84 100644
--- a/tests/compiler/dart2js_native/subclassing_1_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_1_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.7
+
 import "native_testing.dart";
 import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
 import 'dart:_interceptors' show findInterceptorForType;
diff --git a/tests/compiler/dart2js_native/subclassing_2_test.dart b/tests/compiler/dart2js_native/subclassing_2_test.dart
index 66c8d68..63f3711 100644
--- a/tests/compiler/dart2js_native/subclassing_2_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_2_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.7
+
 import 'native_testing.dart';
 import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
 import 'dart:_interceptors' show findInterceptorForType;
diff --git a/tests/compiler/dart2js_native/subclassing_3_test.dart b/tests/compiler/dart2js_native/subclassing_3_test.dart
index 5a2c3d9..fb7a794 100644
--- a/tests/compiler/dart2js_native/subclassing_3_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_3_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.7
+
 import 'native_testing.dart';
 import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
 import 'dart:_interceptors' show Interceptor, findInterceptorForType;
diff --git a/tests/compiler/dart2js_native/subclassing_4_test.dart b/tests/compiler/dart2js_native/subclassing_4_test.dart
index 07a2d4c..089f134 100644
--- a/tests/compiler/dart2js_native/subclassing_4_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_4_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.7
+
 import 'native_testing.dart';
 import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
 import 'dart:_interceptors' show Interceptor, findInterceptorForType;
diff --git a/tests/compiler/dart2js_native/subclassing_5_test.dart b/tests/compiler/dart2js_native/subclassing_5_test.dart
index 220563b..3ae3859 100644
--- a/tests/compiler/dart2js_native/subclassing_5_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_5_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.7
+
 import 'native_testing.dart';
 import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
 import 'dart:_interceptors' show Interceptor, findInterceptorForType;
diff --git a/tests/compiler/dart2js_native/subclassing_constructor_1_test.dart b/tests/compiler/dart2js_native/subclassing_constructor_1_test.dart
index bf989a7..ebf8929 100644
--- a/tests/compiler/dart2js_native/subclassing_constructor_1_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_constructor_1_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.7
+
 import "native_testing.dart";
 import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
 import 'dart:_interceptors'
diff --git a/tests/compiler/dart2js_native/subclassing_constructor_2_test.dart b/tests/compiler/dart2js_native/subclassing_constructor_2_test.dart
index f1c8dd1..9228a85 100644
--- a/tests/compiler/dart2js_native/subclassing_constructor_2_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_constructor_2_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.7
+
 import "native_testing.dart";
 
 // Test that native classes and subclasses of native classes cannot be directly
diff --git a/tests/compiler/dart2js_native/subclassing_super_call_test.dart b/tests/compiler/dart2js_native/subclassing_super_call_test.dart
index 61e3fc1..71a77e5 100644
--- a/tests/compiler/dart2js_native/subclassing_super_call_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_super_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.7
+
 import "native_testing.dart";
 import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
 import 'dart:_interceptors'
diff --git a/tests/compiler/dart2js_native/subclassing_super_field_1_test.dart b/tests/compiler/dart2js_native/subclassing_super_field_1_test.dart
index 827cb358..a1e3c2a 100644
--- a/tests/compiler/dart2js_native/subclassing_super_field_1_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_super_field_1_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.7
+
 import "native_testing.dart";
 import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
 import 'dart:_interceptors'
diff --git a/tests/compiler/dart2js_native/subclassing_super_field_2_test.dart b/tests/compiler/dart2js_native/subclassing_super_field_2_test.dart
index 837568a..efd1bf6 100644
--- a/tests/compiler/dart2js_native/subclassing_super_field_2_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_super_field_2_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.7
+
 import "native_testing.dart";
 import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
 import 'dart:_interceptors'
diff --git a/tests/compiler/dart2js_native/subclassing_type_test.dart b/tests/compiler/dart2js_native/subclassing_type_test.dart
index b99872e..3abc875 100644
--- a/tests/compiler/dart2js_native/subclassing_type_test.dart
+++ b/tests/compiler/dart2js_native/subclassing_type_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.7
+
 import 'native_testing.dart';
 import 'dart:_js_helper' show setNativeSubclassDispatchRecord;
 import 'dart:_interceptors' show Interceptor, findInterceptorForType;
diff --git a/tests/compiler/dart2js_native/super_call_test.dart b/tests/compiler/dart2js_native/super_call_test.dart
index 5238bb5..2dfff1a 100644
--- a/tests/compiler/dart2js_native/super_call_test.dart
+++ b/tests/compiler/dart2js_native/super_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.7
+
 import "native_testing.dart";
 
 // Test to see if resolving a hidden native class's method interferes with
diff --git a/tests/compiler/dart2js_native/super_property_test.dart b/tests/compiler/dart2js_native/super_property_test.dart
index 68e815a..5efcf62 100644
--- a/tests/compiler/dart2js_native/super_property_test.dart
+++ b/tests/compiler/dart2js_native/super_property_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.7
+
 import "native_testing.dart";
 
 // Tests super setter where the HInvokeSuper is using interceptor aka
diff --git a/tests/compiler/dart2js_native/type_error_decode_test.dart b/tests/compiler/dart2js_native/type_error_decode_test.dart
index ba97210..c61c84d 100644
--- a/tests/compiler/dart2js_native/type_error_decode_test.dart
+++ b/tests/compiler/dart2js_native/type_error_decode_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.7
+
 library test.type_error_decode_test;
 
 import 'native_testing.dart';
diff --git a/tests/compiler/dart2js_native/undefined_bailout_test.dart b/tests/compiler/dart2js_native/undefined_bailout_test.dart
index feff806..1fb021c 100644
--- a/tests/compiler/dart2js_native/undefined_bailout_test.dart
+++ b/tests/compiler/dart2js_native/undefined_bailout_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.7
+
 // dart2js regression test where the SSA backend would use the wrong
 // type for an instruction: when doing a speculative type propagation,
 // if an instruction gets analyzed multiple times, we used to save the
diff --git a/tests/compiler/dart2js_native/uninstantiated_type_parameter_test.dart b/tests/compiler/dart2js_native/uninstantiated_type_parameter_test.dart
index 158063c..968ca87 100644
--- a/tests/compiler/dart2js_native/uninstantiated_type_parameter_test.dart
+++ b/tests/compiler/dart2js_native/uninstantiated_type_parameter_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.7
+
 import "native_testing.dart";
 
 // Test for uninstantiated native classes as type parameters.
diff --git a/tests/compiler/dartdevc_native/assertion_failure_message_test.dart b/tests/compiler/dartdevc_native/assertion_failure_message_test.dart
index 4a7fe7b..f85d05e 100644
--- a/tests/compiler/dartdevc_native/assertion_failure_message_test.dart
+++ b/tests/compiler/dartdevc_native/assertion_failure_message_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.6
+
 import "utils.dart";
 
 void main() {
@@ -10,7 +12,7 @@
   } on AssertionError catch (error) {
     var message = error.toString();
     expectStringContains('Assertion failed:', message);
-    expectStringContains('assertion_failure_message_test.dart:9:12', message);
+    expectStringContains('assertion_failure_message_test.dart:11:12', message);
     expectStringContains('false', message);
     expectStringContains('failure message', message);
   }
@@ -22,7 +24,7 @@
   } on AssertionError catch (error) {
     var message = error.toString();
     expectStringContains('Assertion failed:', message);
-    expectStringContains('assertion_failure_message_test.dart:21:12', message);
+    expectStringContains('assertion_failure_message_test.dart:23:12', message);
     expectStringContains('false', message);
     expectStringContains('after a non-UTF8 character', message);
   }
diff --git a/tests/compiler/dartdevc_native/const_test.dart b/tests/compiler/dartdevc_native/const_test.dart
index b2dbf27..63394cf 100644
--- a/tests/compiler/dartdevc_native/const_test.dart
+++ b/tests/compiler/dartdevc_native/const_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.6
+
 import "package:expect/expect.dart";
 import 'dart:_foreign_helper' show JS;
 import 'dart:_runtime' as dart;
diff --git a/tests/compiler/dartdevc_native/debugger/debugger_test.dart b/tests/compiler/dartdevc_native/debugger/debugger_test.dart
index da2e982..e02bd53 100644
--- a/tests/compiler/dartdevc_native/debugger/debugger_test.dart
+++ b/tests/compiler/dartdevc_native/debugger/debugger_test.dart
@@ -1,3 +1,5 @@
+// @dart = 2.6
+
 /// Debugger custom formatter tests.
 /// If the tests fail, paste the expected output into the [expectedGolden]
 /// string literal in this file and audit the diff to ensure changes are
@@ -84,7 +86,7 @@
 String format(value) {
   // Avoid double-escaping strings.
   if (value is String) return value;
-  return stringify(value, replacer, 4);
+  return stringify(value, allowInterop(replacer), 4);
 }
 
 class FormattedObject {
diff --git a/tests/compiler/dartdevc_native/hot_restart_test.dart b/tests/compiler/dartdevc_native/hot_restart_test.dart
index 37f01ba..c34f5d9 100644
--- a/tests/compiler/dartdevc_native/hot_restart_test.dart
+++ b/tests/compiler/dartdevc_native/hot_restart_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.6
+
 import 'package:expect/expect.dart';
 import 'dart:_foreign_helper' show JS;
 import 'dart:_runtime' as dart;
diff --git a/tests/compiler/dartdevc_native/hot_restart_timer_test.dart b/tests/compiler/dartdevc_native/hot_restart_timer_test.dart
index 9685f51..2a8d6df 100644
--- a/tests/compiler/dartdevc_native/hot_restart_timer_test.dart
+++ b/tests/compiler/dartdevc_native/hot_restart_timer_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.6
+
 import 'package:expect/expect.dart';
 import 'dart:async';
 import 'dart:_runtime' as dart;
diff --git a/tests/compiler/dartdevc_native/js_interop_test.dart b/tests/compiler/dartdevc_native/js_interop_test.dart
index 4303dfc..f067d17 100644
--- a/tests/compiler/dartdevc_native/js_interop_test.dart
+++ b/tests/compiler/dartdevc_native/js_interop_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.6
+
 @JS()
 library js_interop_test;
 
diff --git a/tests/compiler/dartdevc_native/libraries_part.dart b/tests/compiler/dartdevc_native/libraries_part.dart
index d5ac766..c26498e 100644
--- a/tests/compiler/dartdevc_native/libraries_part.dart
+++ b/tests/compiler/dartdevc_native/libraries_part.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.6
+
 part of 'libraries_test.dart';
diff --git a/tests/compiler/dartdevc_native/libraries_test.dart b/tests/compiler/dartdevc_native/libraries_test.dart
index 533eb5d..d22324f 100644
--- a/tests/compiler/dartdevc_native/libraries_test.dart
+++ b/tests/compiler/dartdevc_native/libraries_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.6
+
 import 'package:expect/expect.dart';
 import 'dart:_foreign_helper' show JS;
 import 'dart:_runtime' as dart;
diff --git a/tests/compiler/dartdevc_native/nnbd_basic_assignment.dart b/tests/compiler/dartdevc_native/nnbd_basic_assignment.dart
index 5bc08a7..f9f7fb8 100644
--- a/tests/compiler/dartdevc_native/nnbd_basic_assignment.dart
+++ b/tests/compiler/dartdevc_native/nnbd_basic_assignment.dart
@@ -1,10 +1,11 @@
 // 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';
 
 // Requirements=nnbd
 
+import 'package:expect/expect.dart';
+
 void main() {
   int x = 42;
   int? y;
diff --git a/tests/compiler/dartdevc_native/nnbd_js_interop_test.dart b/tests/compiler/dartdevc_native/nnbd_js_interop_test.dart
index 56ce33f..ef7f6b3 100644
--- a/tests/compiler/dartdevc_native/nnbd_js_interop_test.dart
+++ b/tests/compiler/dartdevc_native/nnbd_js_interop_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.
 
+// Requirements=nnbd
+
 @JS()
 library js_interop_test;
 
@@ -12,8 +14,6 @@
 import 'package:expect/expect.dart';
 import 'package:js/js.dart';
 
-// Requirements=nnbd
-
 @JS()
 class Console {
   @JS()
@@ -53,7 +53,7 @@
 @JS()
 @anonymous
 class NestedJs {
-  external factory NestedJs({String Function() constructorArg});
+  external factory NestedJs({required String Function() constructorArg});
   external String get stringField;
 }
 
@@ -96,10 +96,10 @@
     _jsStaticVariable = localNonNull;
   });
   Expect.throws(() {
-    _jsStaticVariable = localNullableLegacy;
+    _jsStaticVariable = localNullableLegacy!;
   });
   Expect.throws(() {
-    _jsStaticVariable = localNullable;
+    _jsStaticVariable = localNullable!;
   });
   _jsStaticVariable = allowInterop(dartStaticMethod);
   _jsStaticVariable = wrappedDartStaticMethod;
@@ -114,16 +114,16 @@
     jsStaticFunction(dartStaticMethod);
   });
   Expect.throws(() {
-    jsStaticFunction(localNonNullLegacy);
+    jsStaticFunction(localNonNullLegacy as String Function());
   });
   Expect.throws(() {
     jsStaticFunction(localNonNull);
   });
   Expect.throws(() {
-    jsStaticFunction(localNullableLegacy);
+    jsStaticFunction(localNullableLegacy as String Function());
   });
   Expect.throws(() {
-    jsStaticFunction(localNullable);
+    jsStaticFunction(localNullable!);
   });
   jsStaticFunction(allowInterop(() => 'hello'));
   jsStaticFunction(wrappedDartStaticMethod);
@@ -143,10 +143,10 @@
     method(localNonNull);
   });
   Expect.throws(() {
-    method(localNullableLegacy);
+    method(localNullableLegacy!);
   });
   Expect.throws(() {
-    method(localNullable);
+    method(localNullable!);
   });
   method(allowInterop(() => 'hello'));
   method(wrappedDartStaticMethod);
@@ -164,16 +164,16 @@
     someClass.jsFunctionFieldSetter = dartStaticMethod;
   }));
   Expect.throws((() {
-    someClass.jsFunctionFieldSetter = localNonNullLegacy;
+    someClass.jsFunctionFieldSetter = localNonNullLegacy as String Function();
   }));
   Expect.throws((() {
     someClass.jsFunctionFieldSetter = localNonNull;
   }));
   Expect.throws((() {
-    someClass.jsFunctionFieldSetter = localNullableLegacy;
+    someClass.jsFunctionFieldSetter = localNullableLegacy as String Function();
   }));
   Expect.throws((() {
-    someClass.jsFunctionFieldSetter = localNullable;
+    someClass.jsFunctionFieldSetter = localNullable!;
   }));
   someClass.jsFunctionFieldSetter = allowInterop(() => 'hello');
   someClass.jsFunctionFieldSetter = wrappedDartStaticMethod;
@@ -186,16 +186,16 @@
     someClass.jsInstanceMethod(dartStaticMethod);
   });
   Expect.throws(() {
-    someClass.jsInstanceMethod(localNonNullLegacy);
+    someClass.jsInstanceMethod(localNonNullLegacy as String Function());
   });
   Expect.throws(() {
     someClass.jsInstanceMethod(localNonNull);
   });
   Expect.throws(() {
-    someClass.jsInstanceMethod(localNullableLegacy);
+    someClass.jsInstanceMethod(localNullableLegacy as String Function());
   });
   Expect.throws(() {
-    someClass.jsInstanceMethod(localNullable);
+    someClass.jsInstanceMethod(localNullable!);
   });
   someClass.jsInstanceMethod(allowInterop(() => 'hello'));
   someClass.jsInstanceMethod(wrappedDartStaticMethod);
@@ -209,16 +209,16 @@
     SomeClass(dartStaticMethod);
   });
   Expect.throws(() {
-    SomeClass(localNonNullLegacy);
+    SomeClass(localNonNullLegacy as String Function());
   });
   Expect.throws(() {
     SomeClass(localNonNull);
   });
   Expect.throws(() {
-    SomeClass(localNullableLegacy);
+    SomeClass(localNullableLegacy as String Function());
   });
   Expect.throws(() {
-    SomeClass(localNullable);
+    SomeClass(localNullable!);
   });
   SomeClass(allowInterop(() => 'hello'));
   SomeClass(wrappedDartStaticMethod);
@@ -231,16 +231,16 @@
     NestedJs(constructorArg: dartStaticMethod);
   });
   Expect.throws(() {
-    NestedJs(constructorArg: localNonNullLegacy);
+    NestedJs(constructorArg: localNonNullLegacy as String Function());
   });
   Expect.throws(() {
     NestedJs(constructorArg: localNonNull);
   });
   Expect.throws(() {
-    NestedJs(constructorArg: localNullableLegacy);
+    NestedJs(constructorArg: localNullableLegacy as String Function());
   });
   Expect.throws(() {
-    NestedJs(constructorArg: localNullable);
+    NestedJs(constructorArg: localNullable!);
   });
   NestedJs(constructorArg: allowInterop(() => 'hello'));
   NestedJs(constructorArg: wrappedDartStaticMethod);
@@ -260,10 +260,10 @@
     method(localNonNull);
   });
   Expect.throws(() {
-    method(localNullableLegacy);
+    method(localNullableLegacy!);
   });
   Expect.throws(() {
-    method(localNullable);
+    method(localNullable!);
   });
   method(allowInterop(() => 'hello'));
   method(wrappedDartStaticMethod);
@@ -276,16 +276,16 @@
     someClass.jsFunctionFieldGetter(dartStaticMethod);
   });
   Expect.throws(() {
-    someClass.jsFunctionFieldGetter(localNonNullLegacy);
+    someClass.jsFunctionFieldGetter(localNonNullLegacy as String Function());
   });
   Expect.throws(() {
     someClass.jsFunctionFieldGetter(localNonNull);
   });
   Expect.throws(() {
-    someClass.jsFunctionFieldGetter(localNullableLegacy);
+    someClass.jsFunctionFieldGetter(localNullableLegacy as String Function());
   });
   Expect.throws(() {
-    someClass.jsFunctionFieldGetter(localNullable);
+    someClass.jsFunctionFieldGetter(localNullable!);
   });
   someClass.jsFunctionFieldGetter(allowInterop(() => 'hello'));
   someClass.jsFunctionFieldGetter(wrappedDartStaticMethod);
@@ -309,10 +309,10 @@
   //  method(localNonNull);
   //});
   //Expect.throws(() {
-  //  method(localNullableLegacy);
+  //  method(localNullableLegacy as String Function());
   //});
   //Expect.throws(() {
-  //  method(localNullable);
+  //  method(localNullable!);
   //});
   method(allowInterop(() => 'hello'));
   method(wrappedDartStaticMethod);
diff --git a/tests/compiler/dartdevc_native/nnbd_strong_subtype_test.dart b/tests/compiler/dartdevc_native/nnbd_strong_subtype_test.dart
index afe9afa..9bc25d9 100644
--- a/tests/compiler/dartdevc_native/nnbd_strong_subtype_test.dart
+++ b/tests/compiler/dartdevc_native/nnbd_strong_subtype_test.dart
@@ -4,7 +4,7 @@
 
 // Requirements=nnbd-strong
 
-import 'dart:async';
+import 'dart:async' show Future;
 
 import 'runtime_utils.dart' show futureOrOf, voidType;
 import 'runtime_utils_nnbd.dart';
diff --git a/tests/compiler/dartdevc_native/no_such_method_errors_test.dart b/tests/compiler/dartdevc_native/no_such_method_errors_test.dart
index 1edcf7e..64d3302 100644
--- a/tests/compiler/dartdevc_native/no_such_method_errors_test.dart
+++ b/tests/compiler/dartdevc_native/no_such_method_errors_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.6
+
 import "utils.dart";
 
 class A {
diff --git a/tests/compiler/dartdevc_native/runtime_utils.dart b/tests/compiler/dartdevc_native/runtime_utils.dart
index 79134c3..b5a32c0 100644
--- a/tests/compiler/dartdevc_native/runtime_utils.dart
+++ b/tests/compiler/dartdevc_native/runtime_utils.dart
@@ -5,7 +5,7 @@
 import 'dart:_foreign_helper' show JS;
 import 'dart:_runtime' as dart;
 
-import 'dart:async';
+import 'dart:async' show FutureOr;
 import 'package:expect/expect.dart';
 
 // Function type used to extract the FutureOr now that a raw FutureOr gets
diff --git a/tests/compiler/dartdevc_native/subtype_test.dart b/tests/compiler/dartdevc_native/subtype_test.dart
index e8c0534..93d7ebc7 100644
--- a/tests/compiler/dartdevc_native/subtype_test.dart
+++ b/tests/compiler/dartdevc_native/subtype_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.6
+
 import 'dart:async';
 
 import 'runtime_utils.dart';
diff --git a/tests/compiler/dartdevc_native/utils.dart b/tests/compiler/dartdevc_native/utils.dart
index 79440f7..dff17dc 100644
--- a/tests/compiler/dartdevc_native/utils.dart
+++ b/tests/compiler/dartdevc_native/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.6
+
 import "package:expect/expect.dart";
 
 /// Expects that [expected] appears as a substring in [actual].
diff --git a/tests/compiler/dartdevc_native/variance_subtype_test.dart b/tests/compiler/dartdevc_native/variance_subtype_test.dart
index 6b993bc..96090bb 100644
--- a/tests/compiler/dartdevc_native/variance_subtype_test.dart
+++ b/tests/compiler/dartdevc_native/variance_subtype_test.dart
@@ -2,10 +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.
 
-// Tests runtime subtyping with explicit variance modifiers.
+// @dart = 2.6
 
 // SharedOptions=--enable-experiment=variance
 
+// Tests runtime subtyping with explicit variance modifiers.
+
 import 'dart:async';
 
 import 'runtime_utils.dart';
diff --git a/tests/compiler/dartdevc_native/variance_test.dart b/tests/compiler/dartdevc_native/variance_test.dart
index ec4fca2..b649ca3 100644
--- a/tests/compiler/dartdevc_native/variance_test.dart
+++ b/tests/compiler/dartdevc_native/variance_test.dart
@@ -2,10 +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.
 
-// Tests the emission of explicit variance modifiers.
+// @dart = 2.6
 
 // SharedOptions=--enable-experiment=variance
 
+// Tests the emission of explicit variance modifiers.
+
 import 'dart:_runtime' as dart;
 
 import 'package:expect/expect.dart';
diff --git a/tests/corelib/errors_test.dart b/tests/corelib/errors_test.dart
index 763b486..9d040c9 100644
--- a/tests/corelib/errors_test.dart
+++ b/tests/corelib/errors_test.dart
@@ -74,4 +74,27 @@
       "RangeError: Index out of range: "
       "index must not be negative: -5",
       new RangeError.index(-5, [1, 2, 3]).toString());
+
+  Expect.equals(42, ArgumentError.checkNotNull(42));
+  Expect.equals(42, ArgumentError.checkNotNull(42, "name"));
+  Expect.throwsArgumentError(() => ArgumentError.checkNotNull(null));
+
+  Expect.equals(1, RangeError.checkNotNegative(1));
+  Expect.equals(0, RangeError.checkNotNegative(0));
+  Expect.throwsRangeError(() => RangeError.checkNotNegative(-1));
+
+  Expect.equals(1, RangeError.checkValueInInterval(1, 0, 2));
+  Expect.equals(1, RangeError.checkValueInInterval(1, 1, 2));
+  Expect.equals(1, RangeError.checkValueInInterval(1, 0, 1));
+  Expect.equals(1, RangeError.checkValueInInterval(1, 1, 1));
+  Expect.throwsRangeError(() => RangeError.checkValueInInterval(1, 2, 3));
+  Expect.throwsRangeError(() => RangeError.checkValueInInterval(1, 1, 0));
+  Expect.throwsRangeError(() => RangeError.checkValueInInterval(0, 1, 0));
+
+  Expect.equals(1, RangeError.checkValidIndex(1, [1, 2]));
+  Expect.equals(1, RangeError.checkValidIndex(1, null, null, 2));
+  Expect.throwsRangeError(() => RangeError.checkValidIndex(1, []));
+  Expect.throwsRangeError(() => RangeError.checkValidIndex(1, null, null, 1));
+  Expect.throwsRangeError(() => RangeError.checkValidIndex(-1, [1, 2, 3]));
+  Expect.throwsRangeError(() => RangeError.checkValidIndex(-1, null, null, 3));
 }
diff --git a/tests/corelib/map_entry_test.dart b/tests/corelib/map_entry_test.dart
index 640b8cc..152fd6b 100644
--- a/tests/corelib/map_entry_test.dart
+++ b/tests/corelib/map_entry_test.dart
@@ -27,18 +27,18 @@
   checkEntries(baseMap, baseMap);
   checkEntries(baseMap, new Map<String, Object>.unmodifiable(baseMap));
   checkMap({"x": 0, "y": 1});
-  checkMap(new Map<String, Object>.from(baseMap));
-  checkMap(new HashMap<String, Object>.from(baseMap));
-  checkMap(new LinkedHashMap<String, Object>.from(baseMap));
-  checkMap(new SplayTreeMap<String, Object>.from(baseMap));
+  checkMap(new Map<String, dynamic>.from(baseMap));
+  checkMap(new HashMap<String, dynamic>.from(baseMap));
+  checkMap(new LinkedHashMap<String, dynamic>.from(baseMap));
+  checkMap(new SplayTreeMap<String, dynamic>.from(baseMap));
   checkMap(json.decode('{"x":0,"y":1}'));
 }
 
-void checkMap(Map<String, Object> map) {
+void checkMap(Map<String, dynamic> map) {
   checkEntries(baseMap, map);
-  map.addEntries([new MapEntry<String, Object>("z", 2)]);
+  map.addEntries([new MapEntry<String, dynamic>("z", 2)]);
   checkEntries({"x": 0, "y": 1, "z": 2}, map);
-  map.addEntries(<MapEntry<String, Object>>[
+  map.addEntries(<MapEntry<String, dynamic>>[
     new MapEntry("y", 11),
     new MapEntry("v", 3),
     new MapEntry("w", 4)
diff --git a/tests/corelib/map_set_undefined_test.dart b/tests/corelib/map_set_undefined_test.dart
index 338259e..22f7e71 100644
--- a/tests/corelib/map_set_undefined_test.dart
+++ b/tests/corelib/map_set_undefined_test.dart
@@ -23,7 +23,7 @@
       isValidKey: (_) => true));
 }
 
-testMap(Map<Object, Object> map) {
+testMap(Map<Object, Object?> map) {
   var t = map.runtimeType.toString();
   var s = ' (length ${map.length})';
   checkUndefined('$t.[]$s', map['hi']);
diff --git a/tests/corelib/map_test.dart b/tests/corelib/map_test.dart
index a768aa3..74f0577 100644
--- a/tests/corelib/map_test.dart
+++ b/tests/corelib/map_test.dart
@@ -382,7 +382,7 @@
   Map m = {"a": 1, "b": 2, "c": 3};
   Expect.equals(3, m.length);
   int sum = 0;
-  m.forEach((a, int b) {
+  m.forEach((a, b) {
     sum += b;
   });
   Expect.equals(6, sum);
diff --git a/tests/corelib/queue_iterator_test.dart b/tests/corelib/queue_iterator_test.dart
index c42e7b7..d7da61f 100644
--- a/tests/corelib/queue_iterator_test.dart
+++ b/tests/corelib/queue_iterator_test.dart
@@ -14,7 +14,7 @@
     testEmptyQueue();
   }
 
-  static int sum(int expected, Iterator<int> it) {
+  static void sum(int expected, Iterator<int> it) {
     int count = 0;
     while (it.moveNext()) {
       count += it.current;
diff --git a/tests/corelib/set_iterator_test.dart b/tests/corelib/set_iterator_test.dart
index 4b36545..17bf821 100644
--- a/tests/corelib/set_iterator_test.dart
+++ b/tests/corelib/set_iterator_test.dart
@@ -23,7 +23,7 @@
     testDifferentHashCodes();
   }
 
-  static int sum(int expected, Iterator<int> it) {
+  static void sum(int expected, Iterator<int> it) {
     int count = 0;
     while (it.moveNext()) {
       count += it.current;
diff --git a/tests/corelib_2/errors_test.dart b/tests/corelib_2/errors_test.dart
index 763b486..9d040c9 100644
--- a/tests/corelib_2/errors_test.dart
+++ b/tests/corelib_2/errors_test.dart
@@ -74,4 +74,27 @@
       "RangeError: Index out of range: "
       "index must not be negative: -5",
       new RangeError.index(-5, [1, 2, 3]).toString());
+
+  Expect.equals(42, ArgumentError.checkNotNull(42));
+  Expect.equals(42, ArgumentError.checkNotNull(42, "name"));
+  Expect.throwsArgumentError(() => ArgumentError.checkNotNull(null));
+
+  Expect.equals(1, RangeError.checkNotNegative(1));
+  Expect.equals(0, RangeError.checkNotNegative(0));
+  Expect.throwsRangeError(() => RangeError.checkNotNegative(-1));
+
+  Expect.equals(1, RangeError.checkValueInInterval(1, 0, 2));
+  Expect.equals(1, RangeError.checkValueInInterval(1, 1, 2));
+  Expect.equals(1, RangeError.checkValueInInterval(1, 0, 1));
+  Expect.equals(1, RangeError.checkValueInInterval(1, 1, 1));
+  Expect.throwsRangeError(() => RangeError.checkValueInInterval(1, 2, 3));
+  Expect.throwsRangeError(() => RangeError.checkValueInInterval(1, 1, 0));
+  Expect.throwsRangeError(() => RangeError.checkValueInInterval(0, 1, 0));
+
+  Expect.equals(1, RangeError.checkValidIndex(1, [1, 2]));
+  Expect.equals(1, RangeError.checkValidIndex(1, null, null, 2));
+  Expect.throwsRangeError(() => RangeError.checkValidIndex(1, []));
+  Expect.throwsRangeError(() => RangeError.checkValidIndex(1, null, null, 1));
+  Expect.throwsRangeError(() => RangeError.checkValidIndex(-1, [1, 2, 3]));
+  Expect.throwsRangeError(() => RangeError.checkValidIndex(-1, null, null, 3));
 }
diff --git a/tests/corelib_2/from_environment_const_type_undefined_test.dart b/tests/corelib_2/from_environment_const_type_undefined_test.dart
index c2e90ef..d63d75f 100644
--- a/tests/corelib_2/from_environment_const_type_undefined_test.dart
+++ b/tests/corelib_2/from_environment_const_type_undefined_test.dart
@@ -25,14 +25,14 @@
     int //   //# 10: ok
     String //# 11: compile-time error
     Foo //   //# 12: compile-time error
-    c = const int.fromEnvironment('c');
+    c = const int.fromEnvironment('c', defaultValue: 0);
 
 const
     bool //  //# 13: compile-time error
     int //   //# 14: compile-time error
     String //# 15: ok
     Foo //   //# 16: compile-time error
-    d = const String.fromEnvironment('d');
+    d = const String.fromEnvironment('d', defaultValue: '');
 
 main() {
   Expect.equals(false, a);
diff --git a/tests/corelib_2/map_entry_test.dart b/tests/corelib_2/map_entry_test.dart
index 59c1cc9..98628d2 100644
--- a/tests/corelib_2/map_entry_test.dart
+++ b/tests/corelib_2/map_entry_test.dart
@@ -27,18 +27,18 @@
   checkEntries(baseMap, baseMap);
   checkEntries(baseMap, new Map<String, Object>.unmodifiable(baseMap));
   checkMap({"x": 0, "y": 1});
-  checkMap(new Map<String, Object>.from(baseMap));
-  checkMap(new HashMap<String, Object>.from(baseMap));
-  checkMap(new LinkedHashMap<String, Object>.from(baseMap));
-  checkMap(new SplayTreeMap<String, Object>.from(baseMap));
+  checkMap(new Map<String, dynamic>.from(baseMap));
+  checkMap(new HashMap<String, dynamic>.from(baseMap));
+  checkMap(new LinkedHashMap<String, dynamic>.from(baseMap));
+  checkMap(new SplayTreeMap<String, dynamic>.from(baseMap));
   checkMap(json.decode('{"x":0,"y":1}'));
 }
 
-void checkMap(Map<String, Object> map) {
+void checkMap(Map<String, dynamic> map) {
   checkEntries(baseMap, map);
-  map.addEntries([new MapEntry<String, Object>("z", 2)]);
+  map.addEntries([new MapEntry<String, dynamic>("z", 2)]);
   checkEntries({"x": 0, "y": 1, "z": 2}, map);
-  map.addEntries(<MapEntry<String, Object>>[
+  map.addEntries(<MapEntry<String, dynamic>>[
     new MapEntry("y", 11),
     new MapEntry("v", 3),
     new MapEntry("w", 4)
diff --git a/tests/dart/.blazeproject b/tests/dart/.blazeproject
deleted file mode 100644
index 6877be6..0000000
--- a/tests/dart/.blazeproject
+++ /dev/null
@@ -1,10 +0,0 @@
-
-directories:
-  # Add the directories you want added as source here
-  experimental/users/jcollins/dart
-
-targets:
-  # Add targets that reach the source code that you want to resolve here
-  //experimental/users/jcollins/dart:deep_nesting1_negative_test
-additional_languages:
-  dart
\ No newline at end of file
diff --git a/tests/ffi_2/ffi_2.status b/tests/ffi_2/ffi_2.status
index 8db64fb..c138d83 100644
--- a/tests/ffi_2/ffi_2.status
+++ b/tests/ffi_2/ffi_2.status
@@ -2,9 +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.
 
-[ $builder_tag == asan ]
-data_not_asan_test: SkipByDesign # This test tries to allocate too much memory on purpose.
-
 [ $system == android ]
 *: Pass, Slow # https://github.com/dart-lang/sdk/issues/38489
 
@@ -17,6 +14,9 @@
 [ $arch == simarm || $arch == simarm64 ]
 *: Skip # FFI not yet supported on the arm simulator.
 
+[ $builder_tag == asan || $builder_tag == msan || $builder_tag == tsan ]
+data_not_asan_test: SkipByDesign # This test tries to allocate too much memory on purpose.
+
 # These tests trigger and catch an abort (intentionally) and terminate the VM.
 # They're incompatible with ASAN because not all memory is freed when aborting and
 # with AppJit because the abort the VM before it can generate a snapshot.
diff --git a/tests/language/assert/initializer_test.dart b/tests/language/assert/initializer_test.dart
index b2fe755..b5de1eb 100644
--- a/tests/language/assert/initializer_test.dart
+++ b/tests/language/assert/initializer_test.dart
@@ -82,7 +82,7 @@
   bool assertionsEnabled = false;
   assert(assertionsEnabled = true);
 
-  bool Function(C Function()) doTest = (assertionsEnabled && x >= y)
+  void Function(C Function()) doTest = (assertionsEnabled && x >= y)
     ? (f) { Expect.throwsAssertionError(f); }
     : (f) { Expect.equals(x, f().x); };
 
diff --git a/tests/language/async/await_test.dart b/tests/language/async/await_test.dart
index 6803b91..de063c9 100644
--- a/tests/language/async/await_test.dart
+++ b/tests/language/async/await_test.dart
@@ -2248,7 +2248,8 @@
   Future timeout(Duration duration, {onTimeout()?}) => this;
 }
 
-typedef BinaryFunction(a, b);
+typedef OnErrorCallback2 = dynamic Function(Object, StackTrace);
+typedef OnErrorCallback1 = dynamic Function(Object);
 
 /**
  * A non-standard implementation of Future with an error.
@@ -2258,10 +2259,17 @@
   FakeErrorFuture(this._error);
   Future<S> then<S>(callback(value), {Function? onError}) {
     if (onError != null) {
-      if (onError is BinaryFunction) {
-        return new Future<S>.microtask(() => onError(_error, null));
+      if (onError is OnErrorCallback2) {
+        return new Future<S>.microtask(() => onError(_error, StackTrace.empty));
+      } else if (onError is OnErrorCallback1) {
+        return new Future<S>.microtask(() => onError(_error));
+      } else {
+        throw new ArgumentError.value(
+          onError,
+          "onError",
+          "Error handler must accept one Object or one Object and a StackTrace"
+          " as arguments, and return a valid result");
       }
-      return new Future<S>.microtask(() => onError(_error));
     }
     return new Future<S>.error(_error);
   }
@@ -2275,10 +2283,17 @@
   Future catchError(Function onError, {bool test(Object error)?}) {
     return new Future.microtask(() {
       if (test != null && !test(_error)) return this;
-      if (onError is BinaryFunction) {
-        return onError(_error, null);
+      if (onError is OnErrorCallback2) {
+        return onError(_error, StackTrace.empty);
+      } else if (onError is OnErrorCallback1) {
+        return onError(_error);
+      } else {
+        throw new ArgumentError.value(
+          onError,
+          "onError",
+          "Error handler must accept one Object or one Object and a StackTrace"
+          " as arguments, and return a valid result");
       }
-      return onError(_error);
     });
   }
 
diff --git a/tests/language/async/or_generator_return_type_stacktrace_test.dart b/tests/language/async/or_generator_return_type_stacktrace_test.dart
index 39fdb56..35f1f2d 100644
--- a/tests/language/async/or_generator_return_type_stacktrace_test.dart
+++ b/tests/language/async/or_generator_return_type_stacktrace_test.dart
@@ -4,7 +4,7 @@
 
 import "package:expect/expect.dart";
 
-int badReturnTypeAsync() async {}
+int badReturnTypeAsync() async => 0;
 // [error line 7, column 1, length 3]
 // [analyzer] STATIC_TYPE_WARNING.ILLEGAL_ASYNC_RETURN_TYPE
 //  ^
diff --git a/tests/language/bool/has_environment_not_new_test.dart b/tests/language/bool/has_environment_not_new_test.dart
new file mode 100644
index 0000000..947c6be
--- /dev/null
+++ b/tests/language/bool/has_environment_not_new_test.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for 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";
+
+main() {
+  Expect.throws(() => new bool.hasEnvironment("Anything"));
+}
diff --git a/tests/language/bool/has_environment_test.dart b/tests/language/bool/has_environment_test.dart
new file mode 100644
index 0000000..df593f1
--- /dev/null
+++ b/tests/language/bool/has_environment_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.
+
+// SharedOptions=-Da= -Db=b -Dc=Something
+
+import 'package:expect/expect.dart';
+
+main() {
+  Expect.isTrue(const bool.hasEnvironment('dart.library.core'));
+  Expect.isTrue(const bool.hasEnvironment('a'));
+  Expect.isTrue(const bool.hasEnvironment('b'));
+  Expect.isTrue(const bool.hasEnvironment('c'));
+  Expect.isFalse(const bool.hasEnvironment('d'));
+}
diff --git a/tests/language/call/non_method_field_test.dart b/tests/language/call/non_method_field_test.dart
index 83a022d..6d30f27 100644
--- a/tests/language/call/non_method_field_test.dart
+++ b/tests/language/call/non_method_field_test.dart
@@ -15,13 +15,13 @@
   x1.i();
 //^^^^
 // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
-//   ^
+//    ^
 // [cfe] 'i' isn't a function or method and can't be invoked.
 
   Hest x2 = new Hest();
   x2.i();
 //^^^^
 // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
-//   ^
+//    ^
 // [cfe] 'i' isn't a function or method and can't be invoked.
 }
diff --git a/tests/language_2/async/await_test.dart b/tests/language_2/async/await_test.dart
index d434da9..8c7bf2f 100644
--- a/tests/language_2/async/await_test.dart
+++ b/tests/language_2/async/await_test.dart
@@ -2247,7 +2247,8 @@
   Future timeout(Duration duration, {onTimeout()}) => this;
 }
 
-typedef BinaryFunction(a, b);
+typedef OnErrorCallback2 = dynamic Function(Object, StackTrace);
+typedef OnErrorCallback1 = dynamic Function(Object);
 
 /**
  * A non-standard implementation of Future with an error.
@@ -2257,10 +2258,17 @@
   FakeErrorFuture(this._error);
   Future<S> then<S>(callback(value), {Function onError}) {
     if (onError != null) {
-      if (onError is BinaryFunction) {
+      if (onError is OnErrorCallback2) {
         return new Future<S>.microtask(() => onError(_error, null));
+      } else if (onError is OnErrorCallback1) {
+        return new Future<S>.microtask(() => onError(_error));
+      } else {
+        throw new ArgumentError.value(
+          onError,
+          "onError",
+          "Error handler must accept one Object or one Object and a StackTrace"
+          " as arguments, and return a valid result");
       }
-      return new Future<S>.microtask(() => onError(_error));
     }
     return new Future<S>.error(_error);
   }
@@ -2274,10 +2282,17 @@
   Future catchError(Function onError, {bool test(error)}) {
     return new Future.microtask(() {
       if (test != null && !test(_error)) return this;
-      if (onError is BinaryFunction) {
+      if (onError is OnErrorCallback2) {
         return onError(_error, null);
+      } else if (onError is OnErrorCallback1) {
+        return onError(_error);
+      } else {
+        throw new ArgumentError.value(
+          onError,
+          "onError",
+          "Error handler must accept one Object or one Object and a StackTrace"
+          " as arguments, and return a valid result");
       }
-      return onError(_error);
     });
   }
 
diff --git a/tests/language_2/call/non_method_field_test.dart b/tests/language_2/call/non_method_field_test.dart
index 7bd4490..8fbd2a9 100644
--- a/tests/language_2/call/non_method_field_test.dart
+++ b/tests/language_2/call/non_method_field_test.dart
@@ -15,13 +15,13 @@
   x1.i();
 //^^^^
 // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
-//   ^
+//    ^
 // [cfe] 'i' isn't a function or method and can't be invoked.
 
   Hest x2 = new Hest();
   x2.i();
 //^^^^
 // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
-//   ^
+//    ^
 // [cfe] 'i' isn't a function or method and can't be invoked.
 }
diff --git a/tests/language_2/extension_methods/static_extension_getter_setter_conflicts_test.dart b/tests/language_2/extension_methods/static_extension_getter_setter_conflicts_test.dart
index a2aea8c..5cf5c20 100644
--- a/tests/language_2/extension_methods/static_extension_getter_setter_conflicts_test.dart
+++ b/tests/language_2/extension_methods/static_extension_getter_setter_conflicts_test.dart
@@ -63,7 +63,7 @@
   c0[0] = 0;
   //^^^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '[]=' isn't defined for the class 'C0'.
+  // [cfe] The operator '[]=' isn't defined for the class 'C0'.
   E0(c0)[0];
   //    ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_EXTENSION_OPERATOR
@@ -73,20 +73,20 @@
   c0[0] += 0;
   //^^^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '[]=' isn't defined for the class 'C0'.
+  // [cfe] The operator '[]=' isn't defined for the class 'C0'.
   c0[0]++;
   //^^^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '[]=' isn't defined for the class 'C0'.
+  // [cfe] The operator '[]=' isn't defined for the class 'C0'.
 
   E0(c0)[0] += 0;
   //    ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_EXTENSION_OPERATOR
-  // [cfe] The method '[]' isn't defined for the class 'C0'.
+  // [cfe] The operator '[]' isn't defined for the class 'C0'.
   E0(c0)[0]++;
   //    ^^^
   // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_EXTENSION_OPERATOR
-  // [cfe] The method '[]' isn't defined for the class 'C0'.
+  // [cfe] The operator '[]' isn't defined for the class 'C0'.
 }
 
 // Conflicting extensions.
@@ -124,17 +124,17 @@
   c1a[0] = 0;
   // ^^^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '[]=' isn't defined for the class 'C1<int>'.
+  // [cfe] The operator '[]=' isn't defined for the class 'C1<int>'.
 
   c1a[0] += 0;
   // ^^^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '[]=' isn't defined for the class 'C1<int>'.
+  // [cfe] The operator '[]=' isn't defined for the class 'C1<int>'.
 
   c1a[0]++;
   // ^^^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '[]=' isn't defined for the class 'C1<int>'.
+  // [cfe] The operator '[]=' isn't defined for the class 'C1<int>'.
 
   c1a[0];
 
@@ -143,59 +143,55 @@
   c1b.m1;
   //  ^^
   // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-  // [cfe] The getter 'm1' isn't defined for the class 'C1<Object>'.
+  // [cfe] The property 'm1' is defined in multiple extensions for 'C1<Object>' and neither is more specific.
 
   c1b.m1 = 0;
   //  ^^
   // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-  // [cfe] The setter 'm1' isn't defined for the class 'C1<Object>'.
+  // [cfe] The property 'm1' is defined in multiple extensions for 'C1<Object>' and neither is more specific.
 
   c1b.m1 += 0;
   //  ^^
   // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-  // [cfe] The getter 'm1' isn't defined for the class 'C1<Object>'.
-  //  ^
-  // [cfe] The setter 'm1' isn't defined for the class 'C1<Object>'.
+  // [cfe] The property 'm1' is defined in multiple extensions for 'C1<Object>' and neither is more specific.
 
   c1b.m1++;
   //  ^^
   // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-  // [cfe] The getter 'm1' isn't defined for the class 'C1<Object>'.
-  //  ^
-  // [cfe] The setter 'm1' isn't defined for the class 'C1<Object>'.
+  // [cfe] The property 'm1' is defined in multiple extensions for 'C1<Object>' and neither is more specific.
 
   c1b.m2;
   //  ^^
   // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-  // [cfe] The getter 'm2' isn't defined for the class 'C1<Object>'.
+  // [cfe] The property 'm2' is defined in multiple extensions for 'C1<Object>' and neither is more specific.
 
   c1b[0];
 //^^^
 // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-  // ^
-  // [cfe] The method '[]' isn't defined for the class 'C1<Object>'.
+//   ^
+// [cfe] The operator '[]' is defined in multiple extensions for 'C1<Object>' and neither is more specific.
 
   c1b[0] = 0;
 //^^^
 // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-  // ^
-  // [cfe] The method '[]=' isn't defined for the class 'C1<Object>'.
+//   ^
+// [cfe] The operator '[]=' is defined in multiple extensions for 'C1<Object>' and neither is more specific.
 
   c1b[0] += 0;
 //^^^
 // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-  // ^
-  // [cfe] The method '[]' isn't defined for the class 'C1<Object>'.
-  // ^
-  // [cfe] The method '[]=' isn't defined for the class 'C1<Object>'.
+//   ^
+// [cfe] The operator '[]' is defined in multiple extensions for 'C1<Object>' and neither is more specific.
+//   ^
+// [cfe] The operator '[]=' is defined in multiple extensions for 'C1<Object>' and neither is more specific.
 
   c1b[0]++;
 //^^^
 // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-  // ^
-  // [cfe] The method '[]' isn't defined for the class 'C1<Object>'.
-  // ^
-  // [cfe] The method '[]=' isn't defined for the class 'C1<Object>'.
+//   ^
+// [cfe] The operator '[]' is defined in multiple extensions for 'C1<Object>' and neither is more specific.
+//   ^
+// [cfe] The operator '[]=' is defined in multiple extensions for 'C1<Object>' and neither is more specific.
 }
 
 // Getter on the extension itself.
@@ -231,17 +227,17 @@
     this[0];
     //  ^^^
     // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-    // [cfe] The method '[]' isn't defined for the class 'C2'.
+    // [cfe] The operator '[]' isn't defined for the class 'C2'.
 
     this[0] += 0;
     //  ^^^
     // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-    // [cfe] The method '[]' isn't defined for the class 'C2'.
+    // [cfe] The operator '[]' isn't defined for the class 'C2'.
 
     this[0]++;
     //  ^^^
     // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-    // [cfe] The method '[]' isn't defined for the class 'C2'.
+    // [cfe] The operator '[]' isn't defined for the class 'C2'.
 
     // Check that `this.mc` refers to `C2.mc`.
     this.mc.toRadixString(16);
diff --git a/tests/language_2/extension_methods/static_extension_internal_basename_shadowing_error_test.dart b/tests/language_2/extension_methods/static_extension_internal_basename_shadowing_error_test.dart
index 04d90b6..5c5c1c7 100644
--- a/tests/language_2/extension_methods/static_extension_internal_basename_shadowing_error_test.dart
+++ b/tests/language_2/extension_methods/static_extension_internal_basename_shadowing_error_test.dart
@@ -259,6 +259,7 @@
     extensionMethod(4);
 //  ^^^^^^^^^^^^^^^
 // [analyzer] STATIC_TYPE_WARNING.INVOCATION_OF_NON_FUNCTION_EXPRESSION
+//                 ^
 // [cfe] 'extensionMethod' isn't a function or method and can't be invoked.
   }
 }
diff --git a/tests/language_2/extension_methods/static_extension_internal_resolution_3_error_test.dart b/tests/language_2/extension_methods/static_extension_internal_resolution_3_error_test.dart
index 01886be..b0409f9 100644
--- a/tests/language_2/extension_methods/static_extension_internal_resolution_3_error_test.dart
+++ b/tests/language_2/extension_methods/static_extension_internal_resolution_3_error_test.dart
@@ -96,21 +96,21 @@
       bool t0 = this.fieldInGlobalScope;
       //             ^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The getter 'fieldInGlobalScope' isn't defined for the class 'A'.
+      // [cfe] The property 'fieldInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
       checkExtensionValue(t0);
       bool t1 = this.getterInGlobalScope;
       //             ^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The getter 'getterInGlobalScope' isn't defined for the class 'A'.
+      // [cfe] The property 'getterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
       checkExtensionValue(t1);
       this.setterInGlobalScope = extensionValue;
       //   ^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The setter 'setterInGlobalScope' isn't defined for the class 'A'.
+      // [cfe] The property 'setterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
       bool t2 = this.methodInGlobalScope();
       //             ^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The method 'methodInGlobalScope' isn't defined for the class 'A'.
+      // [cfe] The method 'methodInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
       checkExtensionValue(t2);
     }
 
@@ -140,21 +140,21 @@
       bool t0 = self.fieldInGlobalScope;
       //             ^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The getter 'fieldInGlobalScope' isn't defined for the class 'A'.
+      // [cfe] The property 'fieldInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
       checkExtensionValue(t0);
       bool t1 = self.getterInGlobalScope;
       //             ^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The getter 'getterInGlobalScope' isn't defined for the class 'A'.
+      // [cfe] The property 'getterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
       checkExtensionValue(t1);
       self.setterInGlobalScope = extensionValue;
       //   ^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The setter 'setterInGlobalScope' isn't defined for the class 'A'.
+      // [cfe] The property 'setterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
       bool t2 = self.methodInGlobalScope();
       //             ^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The method 'methodInGlobalScope' isn't defined for the class 'A'.
+      // [cfe] The method 'methodInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
       checkExtensionValue(t2);
     }
 
@@ -224,21 +224,21 @@
     bool t0 = a.fieldInGlobalScope;
     //          ^^^^^^^^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-    // [cfe] The getter 'fieldInGlobalScope' isn't defined for the class 'A'.
+    // [cfe] The property 'fieldInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
     checkExtensionValue(t0);
     bool t1 = a.getterInGlobalScope;
     //          ^^^^^^^^^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-    // [cfe] The getter 'getterInGlobalScope' isn't defined for the class 'A'.
+    // [cfe] The property 'getterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
     checkExtensionValue(t1);
     a.setterInGlobalScope = extensionValue;
     //^^^^^^^^^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-    // [cfe] The setter 'setterInGlobalScope' isn't defined for the class 'A'.
+    // [cfe] The property 'setterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
     bool t2 = a.methodInGlobalScope();
     //          ^^^^^^^^^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-    // [cfe] The method 'methodInGlobalScope' isn't defined for the class 'A'.
+    // [cfe] The method 'methodInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
     checkExtensionValue(t2);
   }
 
diff --git a/tests/language_2/extension_methods/static_extension_internal_resolution_4_error_test.dart b/tests/language_2/extension_methods/static_extension_internal_resolution_4_error_test.dart
index dcb362a..6cd8d4b 100644
--- a/tests/language_2/extension_methods/static_extension_internal_resolution_4_error_test.dart
+++ b/tests/language_2/extension_methods/static_extension_internal_resolution_4_error_test.dart
@@ -96,21 +96,21 @@
       bool t0 = this.fieldInGlobalScope;
       //             ^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The getter 'fieldInGlobalScope' isn't defined for the class 'A'.
+      // [cfe] The property 'fieldInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
       checkExtensionValue(t0);
       bool t1 = this.getterInGlobalScope;
       //             ^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The getter 'getterInGlobalScope' isn't defined for the class 'A'.
+      // [cfe] The property 'getterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
       checkExtensionValue(t1);
       this.setterInGlobalScope = extensionValue;
       //   ^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The setter 'setterInGlobalScope' isn't defined for the class 'A'.
+      // [cfe] The property 'setterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
       bool t2 = this.methodInGlobalScope();
       //             ^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The method 'methodInGlobalScope' isn't defined for the class 'A'.
+      // [cfe] The method 'methodInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
       checkExtensionValue(t2);
     }
 
@@ -125,21 +125,21 @@
       bool t0 = this.fieldInExtensionScope;
       //             ^^^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The getter 'fieldInExtensionScope' isn't defined for the class 'A'.
+      // [cfe] The property 'fieldInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
       checkExtensionValue(t0);
       bool t1 = this.getterInExtensionScope;
       //             ^^^^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The getter 'getterInExtensionScope' isn't defined for the class 'A'.
+      // [cfe] The property 'getterInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
       checkExtensionValue(t1);
       this.setterInExtensionScope = extensionValue;
       //   ^^^^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The setter 'setterInExtensionScope' isn't defined for the class 'A'.
+      // [cfe] The property 'setterInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
       bool t2 = this.methodInExtensionScope();
       //             ^^^^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The method 'methodInExtensionScope' isn't defined for the class 'A'.
+      // [cfe] The method 'methodInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
       checkExtensionValue(t2);
     }
 
@@ -158,21 +158,21 @@
       bool t0 = self.fieldInGlobalScope;
       //             ^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The getter 'fieldInGlobalScope' isn't defined for the class 'A'.
+      // [cfe] The property 'fieldInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
       checkExtensionValue(t0);
       bool t1 = self.getterInGlobalScope;
       //             ^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The getter 'getterInGlobalScope' isn't defined for the class 'A'.
+      // [cfe] The property 'getterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
       checkExtensionValue(t1);
       self.setterInGlobalScope = extensionValue;
       //   ^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The setter 'setterInGlobalScope' isn't defined for the class 'A'.
+      // [cfe] The property 'setterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
       bool t2 = self.methodInGlobalScope();
       //             ^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The method 'methodInGlobalScope' isn't defined for the class 'A'.
+      // [cfe] The method 'methodInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
       checkExtensionValue(t2);
     }
 
@@ -187,21 +187,21 @@
       bool t0 = self.fieldInExtensionScope;
       //             ^^^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The getter 'fieldInExtensionScope' isn't defined for the class 'A'.
+      // [cfe] The property 'fieldInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
       checkExtensionValue(t0);
       bool t1 = self.getterInExtensionScope;
       //             ^^^^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The getter 'getterInExtensionScope' isn't defined for the class 'A'.
+      // [cfe] The property 'getterInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
       checkExtensionValue(t1);
       self.setterInExtensionScope = extensionValue;
       //   ^^^^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The setter 'setterInExtensionScope' isn't defined for the class 'A'.
+      // [cfe] The property 'setterInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
       bool t2 = self.methodInExtensionScope();
       //             ^^^^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The method 'methodInExtensionScope' isn't defined for the class 'A'.
+      // [cfe] The method 'methodInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
       checkExtensionValue(t2);
     }
 
@@ -238,27 +238,27 @@
       bool t0 = fieldInExtensionScope;
       //        ^^^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The getter 'fieldInExtensionScope' isn't defined for the class 'B'.
+      // [cfe] The property 'fieldInExtensionScope' is defined in multiple extensions for 'B' and neither is more specific.
       //        ^^^^^^^^^^^^^^^^^^^^^
       // [analyzer] STATIC_WARNING.UNDEFINED_IDENTIFIER
       checkExtensionValue(t0);
       bool t1 = getterInExtensionScope;
       //        ^^^^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The getter 'getterInExtensionScope' isn't defined for the class 'B'.
+      // [cfe] The property 'getterInExtensionScope' is defined in multiple extensions for 'B' and neither is more specific.
       //        ^^^^^^^^^^^^^^^^^^^^^^
       // [analyzer] STATIC_WARNING.UNDEFINED_IDENTIFIER
       checkExtensionValue(t1);
       setterInExtensionScope = extensionValue;
 //    ^^^^^^^^^^^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-// [cfe] The setter 'setterInExtensionScope' isn't defined for the class 'B'.
+// [cfe] The property 'setterInExtensionScope' is defined in multiple extensions for 'B' and neither is more specific.
 //    ^^^^^^^^^^^^^^^^^^^^^^
 // [analyzer] STATIC_WARNING.UNDEFINED_IDENTIFIER
       bool t2 = methodInExtensionScope();
       //        ^^^^^^^^^^^^^^^^^^^^^^
       // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-      // [cfe] The method 'methodInExtensionScope' isn't defined for the class 'B'.
+      // [cfe] The method 'methodInExtensionScope' is defined in multiple extensions for 'B' and neither is more specific.
       checkExtensionValue(t2);
     }
 
@@ -283,21 +283,21 @@
     bool t0 = a.fieldInGlobalScope;
     //          ^^^^^^^^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-    // [cfe] The getter 'fieldInGlobalScope' isn't defined for the class 'A'.
+    // [cfe] The property 'fieldInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
     checkExtensionValue(t0);
     bool t1 = a.getterInGlobalScope;
     //          ^^^^^^^^^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-    // [cfe] The getter 'getterInGlobalScope' isn't defined for the class 'A'.
+    // [cfe] The property 'getterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
     checkExtensionValue(t1);
     a.setterInGlobalScope = extensionValue;
     //^^^^^^^^^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-    // [cfe] The setter 'setterInGlobalScope' isn't defined for the class 'A'.
+    // [cfe] The property 'setterInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
     bool t2 = a.methodInGlobalScope();
     //          ^^^^^^^^^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-    // [cfe] The method 'methodInGlobalScope' isn't defined for the class 'A'.
+    // [cfe] The method 'methodInGlobalScope' is defined in multiple extensions for 'A' and neither is more specific.
     checkExtensionValue(t2);
   }
 
@@ -312,21 +312,21 @@
     bool t0 = a.fieldInExtensionScope;
     //          ^^^^^^^^^^^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-    // [cfe] The getter 'fieldInExtensionScope' isn't defined for the class 'A'.
+    // [cfe] The property 'fieldInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
     checkExtensionValue(t0);
     bool t1 = a.getterInExtensionScope;
     //          ^^^^^^^^^^^^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-    // [cfe] The getter 'getterInExtensionScope' isn't defined for the class 'A'.
+    // [cfe] The property 'getterInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
     checkExtensionValue(t1);
     a.setterInExtensionScope = extensionValue;
     //^^^^^^^^^^^^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-    // [cfe] The setter 'setterInExtensionScope' isn't defined for the class 'A'.
+    // [cfe] The property 'setterInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
     bool t2 = a.methodInExtensionScope();
     //          ^^^^^^^^^^^^^^^^^^^^^^
     // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-    // [cfe] The method 'methodInExtensionScope' isn't defined for the class 'A'.
+    // [cfe] The method 'methodInExtensionScope' is defined in multiple extensions for 'A' and neither is more specific.
     checkExtensionValue(t2);
   }
 
diff --git a/tests/language_2/extension_methods/static_extension_prefix_import_conflict_test.dart b/tests/language_2/extension_methods/static_extension_prefix_import_conflict_test.dart
index 666fbcf7..7f3993f 100644
--- a/tests/language_2/extension_methods/static_extension_prefix_import_conflict_test.dart
+++ b/tests/language_2/extension_methods/static_extension_prefix_import_conflict_test.dart
@@ -12,5 +12,5 @@
   o.onObject;
   //^^^^^^^^
   // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-  // [cfe] The getter 'onObject' isn't defined for the class 'Object'.
+  // [cfe] The property 'onObject' is defined in multiple extensions for 'Object' and neither is more specific.
 }
diff --git a/tests/language_2/extension_methods/static_extension_resolution_failures_test.dart b/tests/language_2/extension_methods/static_extension_resolution_failures_test.dart
index dc9b18c..f68d72b 100644
--- a/tests/language_2/extension_methods/static_extension_resolution_failures_test.dart
+++ b/tests/language_2/extension_methods/static_extension_resolution_failures_test.dart
@@ -26,7 +26,7 @@
   c.v2;
   //^^
   // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-  // [cfe] The getter 'v2' isn't defined for the class 'C'.
+  // [cfe] The property 'v2' is defined in multiple extensions for 'C' and neither is more specific.
 
   Expect.equals("EA.v3", a.v3);
   Expect.equals("EA.v3", b1.v3);
@@ -51,20 +51,20 @@
   li.i_num;
   // ^^^^^
   // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-  // [cfe] The getter 'i_num' isn't defined for the class 'List<int>'.
+  // [cfe] The property 'i_num' is defined in multiple extensions for 'List<int>' and neither is more specific.
 
   // no most specific because both are equally specific.
   c.cs;
   //^^
   // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-  // [cfe] The getter 'cs' isn't defined for the class 'C'.
+  // [cfe] The property 'cs' is defined in multiple extensions for 'C' and neither is more specific.
 
   // Both EIT.e1 and ELO.e1 apply, but their instantiated on
   // types are incomparable, and hence this is an error.
   ln.e1();
   // ^^
   // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_MEMBER_ACCESS
-  // [cfe] The method 'e1' isn't defined for the class 'List<num>'.
+  // [cfe] The method 'e1' is defined in multiple extensions for 'List<num>' and neither is more specific.
 }
 
 // Diamond class hierarchy.
diff --git a/tests/language_2/string/const_interpolation2_test.dart b/tests/language_2/string/const_interpolation2_test.dart
index 968d2c2..c9c373c 100644
--- a/tests/language_2/string/const_interpolation2_test.dart
+++ b/tests/language_2/string/const_interpolation2_test.dart
@@ -9,9 +9,15 @@
 const u1 = null;
 const int u2 = null;
 const List u3 = null;
-const u4 = const String.fromEnvironment("XXXXX");
-const u5 = const int.fromEnvironment("XXXXX");
-const u6 = const bool.fromEnvironment("XXXXX", defaultValue: null);
+const u4 = const bool.hasEnvironment("XXXXX")
+    ? const String.fromEnvironment("XXXXX")
+    : null;
+const u5 = const bool.hasEnvironment("XXXXX")
+    ? const int.fromEnvironment("XXXXX")
+    : null;
+const u6 = bool.hasEnvironment("XXXXX")
+    ? const bool.fromEnvironment("XXXXX")
+    : null;
 const n1 = 42;
 const n2 = 3.1415;
 const int n3 = 37;
@@ -88,7 +94,7 @@
   Expect.equals(b2.toString(), sb2);
   Expect.equals(b3.toString(), sb3);
   Expect.equals(b4.toString(), sb4);
-  var expect = "null null null  0 null 42 3.1415 37 4.6692 2.71828 87 "
+  var expect = "null null null null null null 42 3.1415 37 4.6692 2.71828 87 "
       "s1 s2 s1s2 s4 true false false true";
   Expect.equals(expect, interpolation1);
   Expect.equals(expect, interpolation2);
diff --git a/tests/language_2/string/no_operator_test.dart b/tests/language_2/string/no_operator_test.dart
index e6bf231..e6da249 100644
--- a/tests/language_2/string/no_operator_test.dart
+++ b/tests/language_2/string/no_operator_test.dart
@@ -10,23 +10,23 @@
   Expect.throws(() => x < y);
   //                    ^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '<' isn't defined for the class 'String'.
+  // [cfe] The operator '<' isn't defined for the class 'String'.
   Expect.throws(() => x <= y);
   //                    ^^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '<=' isn't defined for the class 'String'.
+  // [cfe] The operator '<=' isn't defined for the class 'String'.
   Expect.throws(() => x > y);
   //                    ^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '>' isn't defined for the class 'String'.
+  // [cfe] The operator '>' isn't defined for the class 'String'.
   Expect.throws(() => x >= y);
   //                    ^^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '>=' isn't defined for the class 'String'.
+  // [cfe] The operator '>=' isn't defined for the class 'String'.
   Expect.throws(() => x - y);
   //                    ^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '-' isn't defined for the class 'String'.
+  // [cfe] The operator '-' isn't defined for the class 'String'.
   Expect.throws(() => x * y);
   //                      ^
   // [analyzer] STATIC_WARNING.ARGUMENT_TYPE_NOT_ASSIGNABLE
@@ -34,41 +34,41 @@
   Expect.throws(() => x / y);
   //                    ^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '/' isn't defined for the class 'String'.
+  // [cfe] The operator '/' isn't defined for the class 'String'.
   Expect.throws(() => x ~/ y);
   //                    ^^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '~/' isn't defined for the class 'String'.
+  // [cfe] The operator '~/' isn't defined for the class 'String'.
   Expect.throws(() => x % y);
   //                    ^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '%' isn't defined for the class 'String'.
+  // [cfe] The operator '%' isn't defined for the class 'String'.
   Expect.throws(() => x >> y);
   //                    ^^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '>>' isn't defined for the class 'String'.
+  // [cfe] The operator '>>' isn't defined for the class 'String'.
   Expect.throws(() => x << y);
   //                    ^^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '<<' isn't defined for the class 'String'.
+  // [cfe] The operator '<<' isn't defined for the class 'String'.
   Expect.throws(() => x & y);
   //                    ^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '&' isn't defined for the class 'String'.
+  // [cfe] The operator '&' isn't defined for the class 'String'.
   Expect.throws(() => x | y);
   //                    ^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '|' isn't defined for the class 'String'.
+  // [cfe] The operator '|' isn't defined for the class 'String'.
   Expect.throws(() => x ^ y);
   //                    ^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '^' isn't defined for the class 'String'.
+  // [cfe] The operator '^' isn't defined for the class 'String'.
   Expect.throws(() => -x);
   //                  ^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method 'unary-' isn't defined for the class 'String'.
+  // [cfe] The operator 'unary-' isn't defined for the class 'String'.
   Expect.throws(() => ~x);
   //                  ^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '~' isn't defined for the class 'String'.
+  // [cfe] The operator '~' isn't defined for the class 'String'.
 }
diff --git a/tests/language_2/string/string_test.dart b/tests/language_2/string/string_test.dart
index 275d888..da6d40a 100644
--- a/tests/language_2/string/string_test.dart
+++ b/tests/language_2/string/string_test.dart
@@ -34,7 +34,7 @@
     a[1] = 12;
 //   ^^^
 // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-// [cfe] The method '[]=' isn't defined for the class 'String'.
+// [cfe] The operator '[]=' isn't defined for the class 'String'.
   }
 
   static testCharCodes() {
diff --git a/tests/language_2/type_object/first_class_types_literals_test.dart b/tests/language_2/type_object/first_class_types_literals_test.dart
index e256332..77cf8b6 100644
--- a/tests/language_2/type_object/first_class_types_literals_test.dart
+++ b/tests/language_2/type_object/first_class_types_literals_test.dart
@@ -64,15 +64,15 @@
   Expect.throwsNoSuchMethodError(() => C + 1);
   //                                     ^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '+' isn't defined for the class 'Type'.
+  // [cfe] The operator '+' isn't defined for the class 'Type'.
   Expect.throwsNoSuchMethodError(() => C[2]);
   //                                    ^^^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '[]' isn't defined for the class 'Type'.
+  // [cfe] The operator '[]' isn't defined for the class 'Type'.
   Expect.throwsNoSuchMethodError(() => C[2] = 'hest');
   //                                    ^^^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '[]=' isn't defined for the class 'Type'.
+  // [cfe] The operator '[]=' isn't defined for the class 'Type'.
   Expect.throwsNoSuchMethodError(() => dynamic = 1);
   //                                   ^
   // [cfe] Setter not found: 'dynamic'.
@@ -86,15 +86,15 @@
   Expect.throwsNoSuchMethodError(() => dynamic + 1);
   //                                           ^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '+' isn't defined for the class 'Type'.
+  // [cfe] The operator '+' isn't defined for the class 'Type'.
   Expect.throwsNoSuchMethodError(() => dynamic[2]);
   //                                          ^^^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '[]' isn't defined for the class 'Type'.
+  // [cfe] The operator '[]' isn't defined for the class 'Type'.
   Expect.throwsNoSuchMethodError(() => dynamic[2] = 'hest');
   //                                          ^^^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '[]=' isn't defined for the class 'Type'.
+  // [cfe] The operator '[]=' isn't defined for the class 'Type'.
 
   Expect.equals((dynamic).toString(), 'dynamic');
 }
diff --git a/tests/language_2/type_variable/conflict2_test.dart b/tests/language_2/type_variable/conflict2_test.dart
index c164e5d..4a03e01 100644
--- a/tests/language_2/type_variable/conflict2_test.dart
+++ b/tests/language_2/type_variable/conflict2_test.dart
@@ -58,7 +58,7 @@
   grault() => T[0];
   //           ^^^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '[]' isn't defined for the class 'Type'.
+  // [cfe] The operator '[]' isn't defined for the class 'Type'.
 
   // Runtime type T not accessible from static context. Compile-time error.
   static garply() => T[0];
@@ -67,7 +67,7 @@
   // [cfe] Type variables can't be used in static members.
   //                  ^^^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '[]' isn't defined for the class 'Type'.
+  // [cfe] The operator '[]' isn't defined for the class 'Type'.
 
   // Class '_Type' has no member m: NoSuchMethodError.
   waldo() => T.m;
diff --git a/tests/language_2/unsorted/unevaluated_field.dart b/tests/language_2/unsorted/unevaluated_field.dart
index 3567a7c..5c701db 100644
--- a/tests/language_2/unsorted/unevaluated_field.dart
+++ b/tests/language_2/unsorted/unevaluated_field.dart
@@ -6,11 +6,13 @@
 
 import "package:expect/expect.dart";
 
-const int gx = const int.fromEnvironment("x");
+const int gx =
+    const bool.hasEnvironment("x") ? const int.fromEnvironment("x") : null;
 
 class A {
   final int x = gx;
-  final int y = const int.fromEnvironment("y");
+  final int y =
+      const bool.hasEnvironment("y") ? const int.fromEnvironment("y") : null;
   const A();
 }
 
diff --git a/tests/language_2/variance/syntax/variance_type_parameter_error_syntax_test.dart b/tests/language_2/variance/syntax/variance_type_parameter_error_syntax_test.dart
index 38c1d84..28c1add 100644
--- a/tests/language_2/variance/syntax/variance_type_parameter_error_syntax_test.dart
+++ b/tests/language_2/variance/syntax/variance_type_parameter_error_syntax_test.dart
@@ -18,7 +18,7 @@
   List<out String> bar;
   //  ^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '<' isn't defined for the class 'Type'.
+  // [cfe] The operator '<' isn't defined for the class 'Type'.
   //   ^^^
   // [analyzer] STATIC_WARNING.UNDEFINED_IDENTIFIER
   // [cfe] Expected ';' after this.
@@ -27,7 +27,7 @@
   // [cfe] Getter not found: 'out'.
   //             ^
   // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_OPERATOR
-  // [cfe] The method '>' isn't defined for the class 'Type'.
+  // [cfe] The operator '>' isn't defined for the class 'Type'.
   //               ^^^
   // [analyzer] STATIC_WARNING.UNDEFINED_IDENTIFIER
   // [cfe] Getter not found: 'bar'.
diff --git a/tests/language_2/vm/regress_28325_test.dart b/tests/language_2/vm/regress_28325_test.dart
deleted file mode 100644
index 95791ac..0000000
--- a/tests/language_2/vm/regress_28325_test.dart
+++ /dev/null
@@ -1,20 +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.
-
-// Test source positions in async errors.
-
-import "package:expect/expect.dart";
-import "dart:io";
-
-main() async {
-  try {
-    await Socket.connect("localhost", 0);
-    Expect.isTrue(false); // Unreachable.
-  } catch (e, s) {
-    Expect.isTrue(e is SocketException);
-    Expect.isTrue(s.toString().contains("regress_28325_test.dart"));
-    print(s);
-    Expect.isTrue(s.toString().contains(":12")); // Line number of "await".
-  }
-}
diff --git a/tests/lib/async/future_foreach_test.dart b/tests/lib/async/future_foreach_test.dart
index 904ae80..af5426f 100644
--- a/tests/lib/async/future_foreach_test.dart
+++ b/tests/lib/async/future_foreach_test.dart
@@ -67,6 +67,7 @@
         case 2:
           return new Future.microtask(() {});
       }
+      return new Future.value();
     }).then((_) {
       Expect.fail("Did not throw");
     }, onError: (e) {
@@ -101,6 +102,7 @@
         case 2:
           return new Future.microtask(() {});
       }
+      return new Future.value();
     }).then((_) {
       Expect.fail("Did not throw");
     }, onError: (e) {
diff --git a/tests/lib/async/futures_test.dart b/tests/lib/async/futures_test.dart
index 6dd4311..1fd0648 100644
--- a/tests/lib/async/futures_test.dart
+++ b/tests/lib/async/futures_test.dart
@@ -56,7 +56,7 @@
     throw 'incorrect error';
   }).catchError((error, stackTrace) {
     Expect.equals('correct error', error);
-    Expect.isNull(stackTrace);
+    Expect.isNotNull(stackTrace);
   });
 }
 
@@ -73,7 +73,7 @@
     throw 'incorrect error 2';
   }).catchError((error, stackTrace) {
     Expect.equals('correct error', error);
-    Expect.isNull(stackTrace);
+    Expect.isNotNull(stackTrace);
   });
 }
 
@@ -90,7 +90,7 @@
     throw 'incorrect error 2';
   }).catchError((error, stackTrace) {
     Expect.equals('correct error', error);
-    Expect.isNull(stackTrace);
+    Expect.isNotNull(stackTrace);
   });
 }
 
@@ -192,8 +192,8 @@
 
 Future testForEachSync() {
   final seen = <int>[];
-  return Future.forEach([1, 2, 3, 4, 5], seen.add).then(
-      (_) => Expect.listEquals([1, 2, 3, 4, 5], seen));
+  return Future.forEach([1, 2, 3, 4, 5], seen.add)
+      .then((_) => Expect.listEquals([1, 2, 3, 4, 5], seen));
 }
 
 Future testForEachWithException() {
diff --git a/tests/lib/async/schedule_microtask_test.dart b/tests/lib/async/schedule_microtask_test.dart
index 8e12f4e..7ee540a 100644
--- a/tests/lib/async/schedule_microtask_test.dart
+++ b/tests/lib/async/schedule_microtask_test.dart
@@ -71,7 +71,7 @@
       Expect.equals(TOTAL, scheduleMicrotaskDone);
       completer.complete();
     });
-    Future scheduleMicrotaskCallback() {
+    void scheduleMicrotaskCallback() {
       scheduleMicrotaskDone++;
       if (scheduleMicrotaskDone != TOTAL) {
         scheduleMicrotask(scheduleMicrotaskCallback);
diff --git a/tests/lib/async/stream_timeout_test.dart b/tests/lib/async/stream_timeout_test.dart
index eb33ad2..d0ddc0d 100644
--- a/tests/lib/async/stream_timeout_test.dart
+++ b/tests/lib/async/stream_timeout_test.dart
@@ -16,7 +16,7 @@
     expect(tos.isBroadcast, false);
     tos.handleError(expectAsync((e, s) {
       expect(e, new isInstanceOf<TimeoutException>());
-      expect(s, null);
+      expect(s, StackTrace.empty);
     })).listen((v) {
       fail("Unexpected event");
     });
@@ -77,7 +77,7 @@
     expect(tos.isBroadcast, true);
     tos.handleError(expectAsync((e, s) {
       expect(e, new isInstanceOf<TimeoutException>());
-      expect(s, null);
+      expect(s, StackTrace.empty);
     })).listen((v) {
       fail("Unexpected event");
     });
@@ -89,7 +89,7 @@
     expect(tos.isBroadcast, true);
     tos.handleError(expectAsync((e, s) {
       expect(e, new isInstanceOf<TimeoutException>());
-      expect(s, null);
+      expect(s, StackTrace.empty);
     })).listen((v) {
       fail("Unexpected event");
     });
@@ -101,7 +101,7 @@
     expect(tos.isBroadcast, false);
     tos.handleError(expectAsync((e, s) {
       expect(e, new isInstanceOf<TimeoutException>());
-      expect(s, null);
+      expect(s, StackTrace.empty);
     })).listen((v) {
       fail("Unexpected event");
     });
diff --git a/tests/lib/async/stream_type_test.dart b/tests/lib/async/stream_type_test.dart
index 2a76d73..f13f0f3 100644
--- a/tests/lib/async/stream_type_test.dart
+++ b/tests/lib/async/stream_type_test.dart
@@ -26,7 +26,7 @@
   // Generic function used as parameter for, e.g., `skipWhile` and `reduce`.
   f([_1, _2]) => throw "unreachable";
 
-  bool testIntStream(stream(), name, int recursionDepth) {
+  void testIntStream(stream(), name, int recursionDepth) {
     checkIntStream(stream(), name);
     if (recursionDepth > 0) {
       checkIntSubscription(stream().listen(null), "$name.listen");
diff --git a/tests/lib/async/zone_run_test.dart b/tests/lib/async/zone_run_test.dart
index 5c319d0..508060e 100644
--- a/tests/lib/async/zone_run_test.dart
+++ b/tests/lib/async/zone_run_test.dart
@@ -35,6 +35,7 @@
   shouldForward = false;
   result = forked.run(() {
     Expect.fail("should not be invoked");
+    return -1;
   });
   Expect.equals(42, result);
   events.add("executed run2");
diff --git a/tests/lib/async/zone_run_unary_test.dart b/tests/lib/async/zone_run_unary_test.dart
index ebf78ee..b505bc5d 100644
--- a/tests/lib/async/zone_run_unary_test.dart
+++ b/tests/lib/async/zone_run_unary_test.dart
@@ -36,6 +36,7 @@
   shouldForward = false;
   result = forked.runUnary<int, int>((arg) {
     Expect.fail("should not be invoked");
+    return -1;
   }, 99);
   Expect.equals(42, result);
   events.add("executed run2");
diff --git a/tests/lib/isolate/bool_from_environment_default_value_test.dart b/tests/lib/isolate/bool_from_environment_default_value_test.dart
new file mode 100644
index 0000000..fb9d49b
--- /dev/null
+++ b/tests/lib/isolate/bool_from_environment_default_value_test.dart
@@ -0,0 +1,24 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+
+import "package:expect/expect.dart";
+
+void test(port) {
+  Expect.isFalse(const bool.fromEnvironment('NOT_FOUND'));
+  Expect.isTrue(const bool.fromEnvironment('NOT_FOUND', defaultValue: true));
+  Expect.isFalse(const bool.fromEnvironment('NOT_FOUND', defaultValue: false));
+  if (port != null) port.send(null);
+}
+
+main() {
+  test(null);
+  var port = new ReceivePort();
+  Isolate.spawn(test, port.sendPort);
+  port.listen((_) => port.close());
+}
diff --git a/tests/lib/isolate/capability_test.dart b/tests/lib/isolate/capability_test.dart
new file mode 100644
index 0000000..fd6c4d3
--- /dev/null
+++ b/tests/lib/isolate/capability_test.dart
@@ -0,0 +1,36 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+void main() {
+  asyncStart();
+
+  test(c1, c2) {
+    asyncStart();
+    Expect.notEquals(c1, c2);
+    var receive = new RawReceivePort();
+    receive.sendPort.send(c1);
+    receive.handler = (c3) {
+      Expect.equals(c3, c1);
+      Expect.notEquals(c3, c2);
+      receive.close();
+      asyncEnd();
+    };
+  }
+
+  Capability c1 = new Capability();
+  Capability c2 = new Capability();
+  Capability c3 = (new RawReceivePort()..close()).sendPort;
+  Capability c4 = (new RawReceivePort()..close()).sendPort;
+  test(c1, c2);
+  test(c3, c4);
+  test(c1, c3);
+  asyncEnd();
+}
diff --git a/tests/lib/isolate/compile_time_error_test.dart b/tests/lib/isolate/compile_time_error_test.dart
new file mode 100644
index 0000000..21197fa
--- /dev/null
+++ b/tests/lib/isolate/compile_time_error_test.dart
@@ -0,0 +1,39 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Dart test program for testing that errors thrown from isolates are
+// processed correctly and don't result in crashes.
+
+library Isolate3NegativeTest;
+
+import 'dart:isolate';
+import 'dart:async';
+import "package:async_helper/async_helper.dart";
+
+class TestClass {
+  TestClass.named(num this.fld1)
+  // Should cause a compilation error (for the spawned isolate). It is a
+  // runtime error for the test.
+    : fld2 = this.fld1 // //# 01: compile-time error
+  ;
+  late num fld1;
+  late num fld2;
+}
+
+void entry(SendPort replyTo) {
+  var tmp = new TestClass.named(10);
+  replyTo.send("done");
+}
+
+main() {
+  asyncStart();
+  ReceivePort response = new ReceivePort();
+  Isolate.spawn(entry, response.sendPort);
+  response.first.then((_) {
+    asyncEnd();
+  });
+}
diff --git a/tests/lib/isolate/count_test.dart b/tests/lib/isolate/count_test.dart
new file mode 100644
index 0000000..6a7de3b
--- /dev/null
+++ b/tests/lib/isolate/count_test.dart
@@ -0,0 +1,63 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library CountTest;
+
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+void countMessages(replyTo) {
+  int count = 0;
+  var port = new ReceivePort();
+  replyTo.send(["init", port.sendPort]);
+  port.listen((_message) {
+    int message = _message;
+    if (message == -1) {
+      Expect.equals(count, 10);
+      replyTo.send(["done"]);
+      port.close();
+      return;
+    }
+    count++;
+    Expect.equals(message, count);
+    replyTo.send(["count", message * 2]);
+  });
+}
+
+void main([args, port]) {
+  //testRemote(main, port);
+  ReceivePort local = new ReceivePort();
+  Isolate.spawn(countMessages, local.sendPort);
+  SendPort? remote;
+  int count = 0;
+  asyncStart();
+  local.listen((msg) {
+    switch (msg[0]) {
+      case "init":
+        Expect.equals(remote, null);
+        remote = msg[1];
+        remote!.send(++count);
+        break;
+      case "count":
+        Expect.equals(msg[1], count * 2);
+        if (count == 10) {
+          remote!.send(-1);
+        } else {
+          remote!.send(++count);
+        }
+        break;
+      case "done":
+        Expect.equals(count, 10);
+        local.close();
+        asyncEnd();
+        break;
+      default:
+        Expect.fail("unreachable: ${msg[0]}");
+    }
+  });
+}
diff --git a/tests/lib/isolate/cross_isolate_message_test.dart b/tests/lib/isolate/cross_isolate_message_test.dart
new file mode 100644
index 0000000..ede3792
--- /dev/null
+++ b/tests/lib/isolate/cross_isolate_message_test.dart
@@ -0,0 +1,61 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Dart test program for testing that isolates can communicate to isolates
+// other than the main isolate.
+
+library CrossIsolateMessageTest;
+
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+/*
+ * Everything starts in the main-isolate (in the main-method).
+ * The main isolate spawns two isolates: isolate1 (with entry point
+ * 'crossIsolate1') and isolate2 (with entry point 'crossIsolate2').
+ *
+ * The main isolate creates two isolates, isolate1 and isolate2.
+ * The second isolate is created with a send-port being listened on by
+ * isolate1. A message is passed along this from isolate2 to isolate1.
+ * Isolate1 then sends the result back to the main isolate for final checking.
+ */
+
+void crossIsolate1(SendPort mainIsolate) {
+  ReceivePort local = new ReceivePort();
+  mainIsolate.send(["ready1", local.sendPort]);
+  local.first.then((msg) {
+    // Message from crossIsolate2
+    Expect.equals(msg[0], "fromIsolate2");
+    mainIsolate.send(["fromIsolate1", msg[1] + 58]); // 100.
+  });
+}
+
+void crossIsolate2(SendPort toIsolate1) {
+  toIsolate1.send(["fromIsolate2", 42]);
+}
+
+void main([args, port]) {
+  ReceivePort fromIsolate1 = new ReceivePort();
+  Isolate.spawn(crossIsolate1, fromIsolate1.sendPort);
+
+  asyncStart();
+  fromIsolate1.listen((msg) {
+    switch (msg[0]) {
+      case "ready1":
+        SendPort toIsolate1 = msg[1];
+        Isolate.spawn(crossIsolate2, toIsolate1);
+        break;
+      case "fromIsolate1":
+        Expect.equals(msg[1], 100);
+        fromIsolate1.close();
+        break;
+      default:
+        Expect.fail("unreachable! Tag: ${msg[0]}");
+    }
+  }, onDone: asyncEnd);
+}
diff --git a/tests/lib/isolate/deferred_in_isolate2_lib.dart b/tests/lib/isolate/deferred_in_isolate2_lib.dart
new file mode 100644
index 0000000..e3fea39
--- /dev/null
+++ b/tests/lib/isolate/deferred_in_isolate2_lib.dart
@@ -0,0 +1,8 @@
+// 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.
+
+// Used by deferred_in_isolate2_test.
+library deferred_in_isolate2_lib;
+
+String f() => "hi";
diff --git a/tests/lib/isolate/deferred_in_isolate2_test.dart b/tests/lib/isolate/deferred_in_isolate2_test.dart
new file mode 100644
index 0000000..52e5428
--- /dev/null
+++ b/tests/lib/isolate/deferred_in_isolate2_test.dart
@@ -0,0 +1,30 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library deferred_in_isolate2_test;
+
+import 'dart:isolate';
+import 'dart:async';
+import 'package:async_helper/async_minitest.dart';
+
+import 'deferred_in_isolate2_lib.dart' deferred as lib;
+
+loadDeferred(port) {
+  lib.loadLibrary().then((_) {
+    port.send(lib.f());
+  });
+}
+
+main() {
+  test("Deferred loading in isolate", () {
+    ReceivePort port = new ReceivePort();
+    port.first.then(expectAsync((msg) {
+      expect(msg, equals("hi"));
+    }));
+    Isolate.spawn(loadDeferred, port.sendPort);
+  });
+}
diff --git a/tests/lib/isolate/deferred_in_isolate_app.dart b/tests/lib/isolate/deferred_in_isolate_app.dart
new file mode 100644
index 0000000..3c1f9dc
--- /dev/null
+++ b/tests/lib/isolate/deferred_in_isolate_app.dart
@@ -0,0 +1,28 @@
+// 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 'deferred_in_isolate_lib.dart' deferred as test;
+
+void main(args, msg) {
+  assert(args != null);
+  assert(args.length == 1);
+  assert(msg != null);
+  assert(msg.length == 1);
+
+  var expectedMsg = args[0];
+  var replyPort = msg[0];
+
+  try {
+    print("BeforeLibraryLoading");
+
+    test.loadLibrary().then((_) {
+      var obj = new test.DeferredObj(expectedMsg);
+      replyPort.send(obj.toString());
+    }).catchError((error) {
+      replyPort.send("Error from isolate:\n$error");
+    });
+  } catch (exception, stacktrace) {
+    replyPort.send("Exception from isolate:\n$exception\n$stacktrace");
+  }
+}
diff --git a/tests/lib/isolate/deferred_in_isolate_lib.dart b/tests/lib/isolate/deferred_in_isolate_lib.dart
new file mode 100644
index 0000000..ed7e475
--- /dev/null
+++ b/tests/lib/isolate/deferred_in_isolate_lib.dart
@@ -0,0 +1,12 @@
+// 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.
+
+library deferred_in_isolate_lib;
+
+class DeferredObj {
+  DeferredObj(this._val);
+  toString() => "$_val";
+
+  var _val;
+}
diff --git a/tests/lib/isolate/deferred_in_isolate_test.dart b/tests/lib/isolate/deferred_in_isolate_test.dart
new file mode 100644
index 0000000..d44f075
--- /dev/null
+++ b/tests/lib/isolate/deferred_in_isolate_test.dart
@@ -0,0 +1,40 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Test that deferred libraries are supported from isolates other than the root
+// isolate.
+
+import 'dart:isolate';
+
+main() {
+  try {
+    var receivePort = new RawReceivePort();
+    var expectedMsg = "Deferred Loaded.";
+
+    receivePort.handler = (msg) {
+      if (msg != expectedMsg) {
+        print("Test failed.");
+        throw msg; // Fail the test if the message is not expected.
+      }
+      print('Test done.');
+      receivePort.close();
+    };
+
+    var stopwatch = new Stopwatch()..start();
+    Isolate.spawnUri(new Uri(path: 'deferred_in_isolate_app.dart'),
+        [expectedMsg], [receivePort.sendPort]).then((isolate) {
+      print('Isolate spawn: ${stopwatch.elapsedMilliseconds}ms');
+    }).catchError((error) {
+      print(error);
+    });
+  } catch (exception, stackTrace) {
+    print('Test failed.');
+    print(exception);
+    print(stackTrace);
+    rethrow;
+  }
+}
diff --git a/tests/lib/isolate/deferred_loaded_lib.dart b/tests/lib/isolate/deferred_loaded_lib.dart
new file mode 100644
index 0000000..4fcc2d0
--- /dev/null
+++ b/tests/lib/isolate/deferred_loaded_lib.dart
@@ -0,0 +1,8 @@
+// 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.
+
+class FromChildIsolate {
+  String toString() => 'from child isolate';
+  int get fld => 10;
+}
diff --git a/tests/lib/isolate/enum_const_test.dart b/tests/lib/isolate/enum_const_test.dart
new file mode 100644
index 0000000..0a57f13
--- /dev/null
+++ b/tests/lib/isolate/enum_const_test.dart
@@ -0,0 +1,31 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "package:expect/expect.dart";
+
+enum Foo { BAR, BAZ }
+
+verify(val) {
+  Expect.identical(Foo.BAR, val);
+}
+
+main() {
+  test1(); //# 01: ok
+  test2(); //# 02: ok
+}
+
+test1() => verify(Foo.BAR);
+
+test2() {
+  var rp;
+  rp = new RawReceivePort((val) {
+    verify(val);
+    rp.close();
+  });
+  rp.sendPort.send(Foo.BAR);
+}
diff --git a/tests/lib/isolate/error_at_spawn_test.dart b/tests/lib/isolate/error_at_spawn_test.dart
new file mode 100644
index 0000000..c22f41e
--- /dev/null
+++ b/tests/lib/isolate/error_at_spawn_test.dart
@@ -0,0 +1,36 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library error_at_spawn;
+
+import "dart:isolate";
+import "dart:async";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+isomain(args) {
+  throw new ArgumentError("fast error");
+}
+
+main() {
+  asyncStart();
+
+  // Capture errors from other isolate as raw messages.
+  RawReceivePort errorPort = new RawReceivePort();
+  errorPort.handler = (message) {
+    String error = message[0];
+    String stack = message[1];
+    Expect.equals(new ArgumentError("fast error").toString(), "$error");
+    errorPort.close();
+    asyncEnd();
+  };
+
+  Isolate.spawn(isomain, null,
+      // Setup handler as part of spawn.
+      errorsAreFatal: false,
+      onError: errorPort.sendPort);
+}
diff --git a/tests/lib/isolate/error_at_spawnuri_iso.dart b/tests/lib/isolate/error_at_spawnuri_iso.dart
new file mode 100644
index 0000000..b165051
--- /dev/null
+++ b/tests/lib/isolate/error_at_spawnuri_iso.dart
@@ -0,0 +1,9 @@
+// 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.
+
+library error_at_spawnuri_iso;
+
+main() {
+  throw new ArgumentError("fast error");
+}
diff --git a/tests/lib/isolate/error_at_spawnuri_test.dart b/tests/lib/isolate/error_at_spawnuri_test.dart
new file mode 100644
index 0000000..6d0e073
--- /dev/null
+++ b/tests/lib/isolate/error_at_spawnuri_test.dart
@@ -0,0 +1,32 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library error_at_spawnuri;
+
+import "dart:isolate";
+import "dart:async";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+main() {
+  asyncStart();
+
+  // Capture errors from other isolate as raw messages.
+  RawReceivePort errorPort = new RawReceivePort();
+  errorPort.handler = (message) {
+    String error = message[0];
+    String stack = message[1];
+    Expect.equals(new ArgumentError("fast error").toString(), "$error");
+    errorPort.close();
+    asyncEnd();
+  };
+
+  Isolate.spawnUri(Uri.parse("error_at_spawnuri_iso.dart"), [], null,
+      // Setup handler as part of spawn.
+      errorsAreFatal: false,
+      onError: errorPort.sendPort);
+}
diff --git a/tests/lib/isolate/error_exit_at_spawn_test.dart b/tests/lib/isolate/error_exit_at_spawn_test.dart
new file mode 100644
index 0000000..9543025
--- /dev/null
+++ b/tests/lib/isolate/error_exit_at_spawn_test.dart
@@ -0,0 +1,22 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library error_exit_at_spawn;
+
+import "dart:isolate";
+
+import 'error_exit_at_spawning_shared.dart';
+
+main() {
+  testIsolate((SendPort replyPort, SendPort errorPort, SendPort exitPort) {
+    Isolate.spawn(isomain, replyPort,
+        // Setup handlers as part of spawn.
+        errorsAreFatal: false,
+        onError: errorPort,
+        onExit: exitPort);
+  });
+}
diff --git a/tests/lib/isolate/error_exit_at_spawning_shared.dart b/tests/lib/isolate/error_exit_at_spawning_shared.dart
new file mode 100644
index 0000000..d59140e
--- /dev/null
+++ b/tests/lib/isolate/error_exit_at_spawning_shared.dart
@@ -0,0 +1,91 @@
+// 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.
+
+library error_exit_at_spawning_shared;
+
+import "dart:isolate";
+
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+// Used by
+//   isolate/error_exit_at_spawn_test.dart
+//   isolate/error_exit_at_spawnuri_test.dart
+
+isomain(replyPort) {
+  final RawReceivePort port = new RawReceivePort();
+  port.handler = (v) {
+    switch (v) {
+      case 0:
+        replyPort.send(42);
+        break;
+      case 1:
+        throw new ArgumentError("whoops");
+      case 2:
+        throw new RangeError.value(37);
+      case 3:
+        port.close();
+    }
+  };
+  replyPort.send(port.sendPort);
+}
+
+testIsolate(
+    void spawnIsolate(SendPort reply, SendPort errorPort, SendPort exitPort)) {
+  asyncStart();
+  // Setup the port for communication with the newly spawned isolate.
+  RawReceivePort reply = new RawReceivePort(null);
+  late SendPort sendPort;
+  int state = 0;
+  reply.handler = (port) {
+    sendPort = port;
+    port.send(state);
+    reply.handler = (v) {
+      Expect.equals(0, state);
+      Expect.equals(42, v);
+      state++;
+      sendPort.send(state);
+    };
+  };
+
+  // Capture errors from other isolate as raw messages.
+  RawReceivePort errorPort = new RawReceivePort();
+  errorPort.handler = (List errorStackTuple) {
+    String error = errorStackTuple[0];
+    switch (state) {
+      case 1:
+        Expect.equals(new ArgumentError("whoops").toString(), "$error");
+        state++;
+        sendPort.send(state);
+        break;
+      case 2:
+        Expect.equals(new RangeError.value(37).toString(), "$error");
+        state++;
+        sendPort.send(state);
+        reply.close();
+        errorPort.close();
+        break;
+      default:
+        throw "Bad state for error: $state: $error";
+    }
+  };
+
+  // Get exit notifications from other isolate as raw messages.
+  RawReceivePort exitPort = new RawReceivePort();
+  exitPort.handler = (message) {
+    // onExit ports registered at spawn cannot have a particular message
+    // associated.
+    Expect.equals(null, message);
+    // Only exit after sending the termination message.
+    Expect.equals(3, state);
+    exitPort.close();
+    asyncEnd();
+  };
+
+  spawnIsolate(reply.sendPort, errorPort.sendPort, exitPort.sendPort);
+}
+
+// Used by
+//    isolate/error_exit_at_spawnuri_test.dart
+main(args, replyPort) => isomain(replyPort);
diff --git a/tests/lib/isolate/error_exit_at_spawnuri_test.dart b/tests/lib/isolate/error_exit_at_spawnuri_test.dart
new file mode 100644
index 0000000..cf32b98
--- /dev/null
+++ b/tests/lib/isolate/error_exit_at_spawnuri_test.dart
@@ -0,0 +1,23 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library error_exit_at_spawnuri;
+
+import "dart:isolate";
+
+import 'error_exit_at_spawning_shared.dart';
+
+main() {
+  testIsolate((SendPort replyPort, SendPort errorPort, SendPort exitPort) {
+    Isolate.spawnUri(
+        Uri.parse("error_exit_at_spawning_shared.dart"), [], replyPort,
+        // Setup handlers as part of spawn.
+        errorsAreFatal: false,
+        onError: errorPort,
+        onExit: exitPort);
+  });
+}
diff --git a/tests/lib/isolate/exit_at_spawn_test.dart b/tests/lib/isolate/exit_at_spawn_test.dart
new file mode 100644
index 0000000..4a2574e
--- /dev/null
+++ b/tests/lib/isolate/exit_at_spawn_test.dart
@@ -0,0 +1,53 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library exit_at_spawn;
+
+import "dart:isolate";
+import "dart:async";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+// Isolate exiting immediately.
+isomain(args) {}
+
+// Isolate exiting after running microtasks.
+isomain2(args) {
+  scheduleMicrotask(() {});
+}
+
+// Isolate exiting after running timers.
+isomain3(args) {
+  new Timer(Duration.zero, () {});
+}
+
+main() {
+  asyncStart();
+
+  test(isomain);
+  test(isomain2);
+  test(isomain3);
+
+  asyncEnd();
+}
+
+void test(mainFunction) {
+  asyncStart();
+
+  RawReceivePort exitPort = new RawReceivePort();
+  exitPort.handler = (message) {
+    Expect.equals(null, message);
+    exitPort.close();
+    asyncEnd();
+  };
+
+  // Ignore returned Future.
+  Isolate.spawn(mainFunction, null,
+      // Setup handler as part of spawn.
+      errorsAreFatal: false,
+      onExit: exitPort.sendPort);
+}
diff --git a/tests/lib/isolate/exit_at_spawnuri_iso.dart b/tests/lib/isolate/exit_at_spawnuri_iso.dart
new file mode 100644
index 0000000..9bc892e
--- /dev/null
+++ b/tests/lib/isolate/exit_at_spawnuri_iso.dart
@@ -0,0 +1,7 @@
+// 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.
+
+library exit_at_spawn_iso;
+
+main() {}
diff --git a/tests/lib/isolate/exit_at_spawnuri_test.dart b/tests/lib/isolate/exit_at_spawnuri_test.dart
new file mode 100644
index 0000000..5bb9ed8
--- /dev/null
+++ b/tests/lib/isolate/exit_at_spawnuri_test.dart
@@ -0,0 +1,29 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library exit_at_spawn;
+
+import "dart:isolate";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+main() {
+  asyncStart();
+
+  RawReceivePort exitPort = new RawReceivePort();
+  exitPort.handler = (message) {
+    Expect.equals(null, message);
+    exitPort.close();
+    asyncEnd();
+  };
+
+  // Ignore returned Future.
+  Isolate.spawnUri(Uri.parse("exit_at_spawnuri_iso.dart"), [], null,
+      // Setup handler as part of spawn.
+      errorsAreFatal: false,
+      onExit: exitPort.sendPort);
+}
diff --git a/tests/lib/isolate/function_send1_test.dart b/tests/lib/isolate/function_send1_test.dart
new file mode 100644
index 0000000..b25042e
--- /dev/null
+++ b/tests/lib/isolate/function_send1_test.dart
@@ -0,0 +1,150 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+void toplevel(port, message) {
+  port.send("toplevel:$message");
+}
+
+Function createFuncToplevel() => (p, m) {
+      p.send(m);
+    };
+
+class C {
+  Function initializer;
+  Function body;
+  C()
+      : initializer = ((p, m) {
+          throw "initializer";
+        }),
+        body = ((p, m) {
+          throw "body";
+        }) {}
+  static void staticFunc(port, message) {
+    port.send("static:$message");
+  }
+
+  static Function createFuncStatic() => (p, m) {
+        throw "static expr";
+      };
+  void instanceMethod(p, m) {
+    throw "instanceMethod";
+  }
+
+  Function createFuncMember() => (p, m) {
+        throw "instance expr";
+      };
+  void call(n, p) {
+    throw "C";
+  }
+}
+
+class Callable {
+  void call(p, m) {
+    p.send(["callable", m]);
+  }
+}
+
+void main() {
+  asyncStart();
+
+  // top-level functions, static functions, closures, instance methods
+  // or function expressions are not sendable to an isolate spawned using
+  // spawnUri.
+  testUnsendable("toplevel", toplevel);
+  testUnsendable("static", C.staticFunc);
+  var c = new C();
+  testUnsendable("instance method", c.instanceMethod);
+  testUnsendable("static context expression", createFuncToplevel());
+  testUnsendable("static context expression", C.createFuncStatic());
+  testUnsendable("initializer context expression", c.initializer);
+  testUnsendable("constructor context expression", c.body);
+  testUnsendable("instance method context expression", c.createFuncMember());
+  testUnsendable("toplevel", toplevel.call);
+  testUnsendable("static", C.staticFunc.call);
+  testUnsendable("callable object", new Callable().call);
+
+  asyncEnd();
+  return;
+}
+
+// Create a receive port that expects exactly one message.
+// Pass the message to `callback` and return the sendPort.
+SendPort singleMessagePort(callback) {
+  var p;
+  p = new RawReceivePort((v) {
+    p.close();
+    callback(v);
+  });
+  return p.sendPort;
+}
+
+// A singleMessagePort that expects the message to be a specific value.
+SendPort expectMessagePort(message) {
+  asyncStart();
+  return singleMessagePort((v) {
+    Expect.equals(message, v);
+    asyncEnd();
+  });
+}
+
+// Creates a new isolate and a pair of ports that expect a single message
+// to be sent to the other isolate and back to the callback function.
+Future<SendPort> echoPort(callback(value)) {
+  Completer<SendPort> completer = new Completer<SendPort>();
+  SendPort replyPort = singleMessagePort(callback);
+  late RawReceivePort initPort;
+  initPort = new RawReceivePort((p) {
+    completer.complete(p);
+    initPort.close();
+  });
+  return Isolate.spawn(_echo, [replyPort, initPort.sendPort])
+      .then((isolate) => completer.future);
+}
+
+void _echo(msg) {
+  var replyPort = msg[0];
+  late RawReceivePort requestPort;
+  requestPort = new RawReceivePort((msg) {
+    replyPort.send(msg);
+    requestPort.close(); // Single echo only.
+  });
+  msg[1].send(requestPort.sendPort);
+}
+
+// Creates other isolate that waits for a single message, `msg`, on the returned
+// port, and executes it as `msg[0](msg[1],msg[2])` in the other isolate.
+Future<SendPort> callPort() {
+  Completer<SendPort> completer = new Completer<SendPort>();
+  SendPort initPort = singleMessagePort(completer.complete);
+  return Isolate.spawn(_call, initPort).then((_) => completer.future);
+}
+
+void _call(initPort) {
+  initPort.send(singleMessagePort(callFunc));
+}
+
+void testUnsendable(name, func) {
+  asyncStart();
+  Isolate.spawnUri(Uri.parse("function_send_test.dart"), [], func)
+      .then((v) => throw "allowed spawn direct?", onError: (e, s) {
+    asyncEnd();
+  });
+  asyncStart();
+  Isolate.spawnUri(Uri.parse("function_send_test.dart"), [], [func])
+      .then((v) => throw "allowed spawn wrapped?", onError: (e, s) {
+    asyncEnd();
+  });
+}
+
+void callFunc(message) {
+  message[0](message[1], message[2]);
+}
diff --git a/tests/lib/isolate/function_send_test.dart b/tests/lib/isolate/function_send_test.dart
new file mode 100644
index 0000000..24e9d77
--- /dev/null
+++ b/tests/lib/isolate/function_send_test.dart
@@ -0,0 +1,222 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+void toplevel(port, message) {
+  port.send("toplevel:$message");
+}
+
+Function createFuncToplevel() => (p, m) {
+      p.send(m);
+    };
+
+class C {
+  Function initializer;
+  Function body;
+  C()
+      : initializer = ((p, m) {
+          throw "initializer";
+        }),
+        body = ((p, m) {
+          throw "body";
+        }) {}
+  static void staticFunc(port, message) {
+    port.send("static:$message");
+  }
+
+  static Function createFuncStatic() => (p, m) {
+        throw "static expr";
+      };
+  void instanceMethod(p, m) {
+    throw "instanceMethod";
+  }
+
+  Function createFuncMember() => (p, m) {
+        throw "instance expr";
+      };
+  void call(n, p) {
+    throw "C";
+  }
+}
+
+class Callable {
+  void call(p, m) {
+    p.send(["callable", m]);
+  }
+}
+
+void main() {
+  asyncStart();
+
+  // Sendables are top-level functions and static functions only.
+  testSendable("toplevel", toplevel);
+  testSendable("static", C.staticFunc);
+  // Unsendables are any closure - instance methods or function expression.
+  var c = new C();
+  testUnsendable("instance method", c.instanceMethod);
+  testUnsendable("static context expression", createFuncToplevel());
+  testUnsendable("static context expression", C.createFuncStatic());
+  testUnsendable("initializer context expression", c.initializer);
+  testUnsendable("constructor context expression", c.body);
+  testUnsendable("instance method context expression", c.createFuncMember());
+
+  // The result of `toplevel.call` and `staticFunc.call` may or may not be
+  // identical to `toplevel` and `staticFunc` respectively. If they are not
+  // equal, they may or may not be considered toplevel/static functions anyway,
+  // and therefore sendable. The VM and dart2js currently disagree on whether
+  // `toplevel` and `toplevel.call` are identical, both allow them to be sent.
+  // If this is ever specified to something else, use:
+  //     testUnsendable("toplevel.call", toplevel.call);
+  //     testUnsendable("static.call", C.staticFunc.call);
+  // instead.
+  // These two tests should be considered canaries for accidental behavior
+  // change rather than requirements.
+  testSendable("toplevel", toplevel.call);
+  testSendable("static", C.staticFunc.call);
+
+  // Callable objects are sendable if general objects are (VM yes, dart2js no).
+  // It's unspecified whether arbitrary objects can be sent. If it is specified,
+  // add a test that `new Callable()` is either sendable or unsendable.
+
+  // The call method of a callable object is a closure holding the object,
+  // not a top-level or static function, so it should be blocked, just as
+  // a normal method.
+  testUnsendable("callable object", new Callable().call);
+
+  asyncEnd();
+  return;
+}
+
+// Create a receive port that expects exactly one message.
+// Pass the message to `callback` and return the sendPort.
+SendPort singleMessagePort(callback) {
+  var p;
+  p = new RawReceivePort((v) {
+    p.close();
+    callback(v);
+  });
+  return p.sendPort;
+}
+
+// A singleMessagePort that expects the message to be a specific value.
+SendPort expectMessagePort(message) {
+  asyncStart();
+  return singleMessagePort((v) {
+    Expect.equals(message, v);
+    asyncEnd();
+  });
+}
+
+void testSendable(name, func) {
+  // Function as spawn message.
+  Isolate.spawn(callFunc, [func, expectMessagePort("$name:spawn"), "spawn"]);
+
+  // Send function to same isolate.
+  var reply = expectMessagePort("$name:direct");
+  singleMessagePort(callFunc).send([func, reply, "direct"]);
+
+  // Send function to other isolate, call it there.
+  reply = expectMessagePort("$name:other isolate");
+  callPort().then((p) {
+    p.send([func, reply, "other isolate"]);
+  });
+
+  // Round-trip function trough other isolate.
+  echoPort((roundtripFunc) {
+    Expect.identical(func, roundtripFunc, "$name:send through isolate");
+  }).then((port) {
+    port.send(func);
+  });
+}
+
+// Creates a new isolate and a pair of ports that expect a single message
+// to be sent to the other isolate and back to the callback function.
+Future<SendPort> echoPort(callback(value)) {
+  final completer = new Completer<SendPort>();
+  SendPort replyPort = singleMessagePort(callback);
+  late RawReceivePort initPort;
+  initPort = new RawReceivePort((p) {
+    completer.complete(p);
+    initPort.close();
+  });
+  return Isolate.spawn(_echo, [replyPort, initPort.sendPort])
+      .then((isolate) => completer.future);
+}
+
+void _echo(msg) {
+  var replyPort = msg[0];
+  late RawReceivePort requestPort;
+  requestPort = new RawReceivePort((msg) {
+    replyPort.send(msg);
+    requestPort.close(); // Single echo only.
+  });
+  msg[1].send(requestPort.sendPort);
+}
+
+// Creates other isolate that waits for a single message, `msg`, on the returned
+// port, and executes it as `msg[0](msg[1],msg[2])` in the other isolate.
+Future<SendPort> callPort() {
+  final completer = new Completer<SendPort>();
+  SendPort initPort = singleMessagePort(completer.complete);
+  return Isolate.spawn(_call, initPort).then((_) => completer.future);
+}
+
+void _call(initPort) {
+  initPort.send(singleMessagePort(callFunc));
+}
+
+void testUnsendable(name, func) {
+  asyncStart();
+  Isolate.spawn(nop, func).then((v) => throw "allowed spawn direct?",
+      onError: (e, s) {
+    asyncEnd();
+  });
+  asyncStart();
+  Isolate.spawn(nop, [func]).then((v) => throw "allowed spawn wrapped?",
+      onError: (e, s) {
+    asyncEnd();
+  });
+
+  asyncStart();
+  var noReply = new RawReceivePort((_) {
+    throw "Unexpected message: $_";
+  });
+  Expect.throws(() {
+    noReply.sendPort.send(func);
+  }, null, "send direct");
+  Expect.throws(() {
+    noReply.sendPort.send([func]);
+  }, null, "send wrapped");
+  scheduleMicrotask(() {
+    noReply.close();
+    asyncEnd();
+  });
+
+  // Try sending through other isolate.
+  asyncStart();
+  echoPort((v) {
+    Expect.equals(0, v);
+  }).then((p) {
+    try {
+      p.send(func);
+    } finally {
+      p.send(0); //   Closes echo port.
+    }
+  }).then((p) => throw "unreachable 2", onError: (e, s) {
+    asyncEnd();
+  });
+}
+
+void nop(_) {}
+
+void callFunc(message) {
+  message[0](message[1], message[2]);
+}
diff --git a/tests/lib/isolate/handle_error2_test.dart b/tests/lib/isolate/handle_error2_test.dart
new file mode 100644
index 0000000..8e36364
--- /dev/null
+++ b/tests/lib/isolate/handle_error2_test.dart
@@ -0,0 +1,90 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library handle_error_test;
+
+import "dart:isolate";
+import "dart:async";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+isomain1(replyPort) {
+  RawReceivePort port = new RawReceivePort();
+  port.handler = (v) {
+    switch (v) {
+      case 0:
+        replyPort.send(42);
+        break;
+      case 1:
+        throw new ArgumentError("whoops");
+      case 2:
+        throw new RangeError.value(37);
+      case 3:
+        port.close();
+    }
+  };
+  replyPort.send(port.sendPort);
+}
+
+/// Do Isolate.spawn(entry) and get a sendPort from the isolate that it
+/// expects commands on.
+/// The isolate has errors set to non-fatal.
+/// Returns a list of `[isolate, commandPort]` in a future.
+Future spawn(entry) {
+  ReceivePort reply = new ReceivePort();
+  var isolate = Isolate.spawn(entry, reply.sendPort, paused: true);
+  return isolate.then((Isolate isolate) {
+    isolate.setErrorsFatal(false);
+    isolate.resume(isolate.pauseCapability!);
+    Future result = reply.first.then((sendPort) {
+      return [isolate, sendPort];
+    });
+    return result;
+  });
+}
+
+main() {
+  asyncStart();
+  RawReceivePort reply = new RawReceivePort(null);
+  // Create two isolates waiting for commands, with errors non-fatal.
+  Future iso1 = spawn(isomain1);
+  Future iso2 = spawn(isomain1);
+  Future.wait([iso1, iso2]).then((l) {
+    var isolate1 = l[0][0];
+    var sendPort1 = l[0][1];
+    var isolate2 = l[1][0];
+    var sendPort2 = l[1][1];
+    Stream errors = isolate1.errors; // Broadcast stream, never a done message.
+    int state = 1;
+    var subscription;
+    subscription = errors.listen(null, onError: (error, stack) {
+      switch (state) {
+        case 1:
+          Expect.equals(new ArgumentError("whoops").toString(), "$error");
+          state++;
+          break;
+        case 2:
+          Expect.equals(new RangeError.value(37).toString(), "$error");
+          state++;
+          reply.close();
+          subscription.cancel();
+          asyncEnd();
+          break;
+        default:
+          throw "Bad state for error: $state: $error";
+      }
+    });
+    sendPort1.send(0);
+    sendPort2.send(0);
+    sendPort1.send(1);
+    sendPort2.send(1);
+    sendPort1.send(2);
+    sendPort2.send(2);
+    sendPort1.send(3);
+    sendPort2.send(3);
+  });
+}
diff --git a/tests/lib/isolate/handle_error3_test.dart b/tests/lib/isolate/handle_error3_test.dart
new file mode 100644
index 0000000..170f130
--- /dev/null
+++ b/tests/lib/isolate/handle_error3_test.dart
@@ -0,0 +1,118 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library handle_error_test;
+
+import "dart:isolate";
+import "dart:async";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+isomain1(replyPort) {
+  RawReceivePort port = new RawReceivePort();
+  port.handler = (v) {
+    switch (v) {
+      case 0:
+        replyPort.send(42);
+        break;
+      case 1:
+        throw new ArgumentError("whoops");
+      case 2:
+        throw new RangeError.value(37);
+      case 3:
+        port.close();
+    }
+  };
+  replyPort.send(port.sendPort);
+}
+
+/// Do Isolate.spawn(entry) and get a sendPort from the isolate that it
+/// expects commands on.
+/// The isolate has errors set to non-fatal.
+/// Returns a list of `[isolate, commandPort]` in a future.
+Future spawn(entry) {
+  ReceivePort reply = new ReceivePort();
+  var isolate = Isolate.spawn(entry, reply.sendPort, paused: true);
+  return isolate.then((Isolate isolate) {
+    isolate.setErrorsFatal(false);
+    isolate.resume(isolate.pauseCapability!);
+    Future result = reply.first.then((sendPort) {
+      return [isolate, sendPort];
+    });
+    return result;
+  });
+}
+
+main() {
+  asyncStart();
+  asyncStart();
+  RawReceivePort reply = new RawReceivePort(null);
+  RawReceivePort reply2 = new RawReceivePort(null);
+  // Create two isolates waiting for commands, with errors non-fatal.
+  Future iso1 = spawn(isomain1);
+  Future iso2 = spawn(isomain1);
+  Future.wait([iso1, iso2]).then((l) {
+    var isolate1 = l[0][0];
+    var sendPort1 = l[0][1];
+    var isolate2 = l[1][0];
+    var sendPort2 = l[1][1];
+    // Capture errors from one isolate as stream.
+    Stream errors = isolate1.errors; // Broadcast stream, never a done message.
+    int state = 1;
+    var subscription;
+    subscription = errors.listen(null, onError: (error, stack) {
+      switch (state) {
+        case 1:
+          Expect.equals(new ArgumentError("whoops").toString(), "$error");
+          state++;
+          break;
+        case 2:
+          Expect.equals(new RangeError.value(37).toString(), "$error");
+          state++;
+          reply.close();
+          subscription.cancel();
+          asyncEnd();
+          break;
+        default:
+          throw "Bad state for error: $state: $error";
+      }
+    });
+    // Capture errors from other isolate as raw messages.
+    RawReceivePort errorPort2 = new RawReceivePort();
+    int state2 = 1;
+    errorPort2.handler = (message) {
+      String error = message[0];
+      String stack = message[1];
+      switch (state2) {
+        case 1:
+          Expect.equals(new ArgumentError("whoops").toString(), "$error");
+          state2++;
+          break;
+        case 2:
+          Expect.equals(new RangeError.value(37).toString(), "$error");
+          state2++;
+          reply2.close();
+          isolate2.removeErrorListener(errorPort2.sendPort);
+          errorPort2.close();
+          asyncEnd();
+          break;
+        default:
+          throw "Bad state-2 for error: $state: $error";
+      }
+    };
+    isolate2.addErrorListener(errorPort2.sendPort);
+
+    sendPort1.send(0);
+    sendPort2.send(0);
+    sendPort1.send(1);
+    sendPort2.send(1);
+    sendPort1.send(2);
+    sendPort2.send(2);
+    sendPort1.send(3);
+    sendPort2.send(3);
+  });
+}
diff --git a/tests/lib/isolate/handle_error_test.dart b/tests/lib/isolate/handle_error_test.dart
new file mode 100644
index 0000000..a453072
--- /dev/null
+++ b/tests/lib/isolate/handle_error_test.dart
@@ -0,0 +1,74 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library handle_error_test;
+
+import "dart:isolate";
+import "dart:async";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+isomain1(replyPort) {
+  RawReceivePort port = new RawReceivePort();
+  port.handler = (v) {
+    switch (v) {
+      case 0:
+        replyPort.send(42);
+        break;
+      case 1:
+        throw new ArgumentError("whoops");
+      case 2:
+        throw new RangeError.value(37);
+      case 3:
+        port.close();
+    }
+  };
+  replyPort.send(port.sendPort);
+}
+
+main() {
+  asyncStart();
+  RawReceivePort reply = new RawReceivePort(null);
+  // Start paused so we have time to set up the error handler.
+  Isolate.spawn(isomain1, reply.sendPort, paused: true).then((Isolate isolate) {
+    isolate.setErrorsFatal(false);
+    Stream errors = isolate.errors; // Broadcast stream, never a done message.
+    late SendPort sendPort;
+    late StreamSubscription subscription;
+    int state = 0;
+    reply.handler = (port) {
+      sendPort = port;
+      port.send(state);
+      reply.handler = (v) {
+        Expect.equals(0, state);
+        Expect.equals(42, v);
+        state++;
+        sendPort.send(state);
+      };
+    };
+    subscription = errors.listen(null, onError: (error, stack) {
+      switch (state) {
+        case 1:
+          Expect.equals(new ArgumentError("whoops").toString(), "$error");
+          state++;
+          sendPort.send(state);
+          break;
+        case 2:
+          Expect.equals(new RangeError.value(37).toString(), "$error");
+          state++;
+          sendPort.send(state);
+          reply.close();
+          subscription.cancel();
+          asyncEnd();
+          break;
+        default:
+          throw "Bad state for error: $state: $error";
+      }
+    });
+    isolate.resume(isolate.pauseCapability!);
+  });
+}
diff --git a/tests/lib/isolate/illegal_msg_function_test.dart b/tests/lib/isolate/illegal_msg_function_test.dart
new file mode 100644
index 0000000..5b5aa45
--- /dev/null
+++ b/tests/lib/isolate/illegal_msg_function_test.dart
@@ -0,0 +1,44 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library illegal_msg_function_test;
+
+import "dart:isolate";
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+echo(sendPort) {
+  var port = new ReceivePort();
+  sendPort.send(port.sendPort);
+  port.listen((msg) {
+    sendPort.send("echoing ${msg(1)}}");
+  });
+}
+
+void main() {
+  asyncStart();
+
+  final port = new ReceivePort();
+
+  // Ignore returned Future.
+  Isolate.spawn(echo, port.sendPort);
+
+  port.first.then((_snd) {
+    SendPort snd = _snd;
+    int function(x) => x + 2;
+    try {
+      snd.send(function);
+    } catch (e) {
+      // Expected behavior.
+      port.close();
+      asyncEnd();
+      return;
+    }
+    Expect.fail("Should not be reached. Message sending didn't throw.");
+  });
+}
diff --git a/tests/lib/isolate/illegal_msg_mirror_test.dart b/tests/lib/isolate/illegal_msg_mirror_test.dart
new file mode 100644
index 0000000..a15572d
--- /dev/null
+++ b/tests/lib/isolate/illegal_msg_mirror_test.dart
@@ -0,0 +1,49 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library illegal_msg_mirror_test;
+
+import "dart:isolate";
+import "dart:mirrors";
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+class Class {
+  method() {}
+}
+
+echo(sendPort) {
+  final port = new ReceivePort();
+  sendPort.send(port.sendPort);
+  port.listen((msg) {
+    sendPort.send("echoing ${msg(1)}}");
+  });
+}
+
+void main([args, port]) {
+  asyncStart();
+
+  final ReceivePort port = new ReceivePort();
+
+  // Ignore returned Future.
+  Isolate.spawn(echo, port.sendPort);
+
+  port.first.then((_snd) {
+    SendPort snd = _snd;
+    final methodMirror = reflectClass(Class).declarations[#method];
+    try {
+      snd.send(methodMirror);
+    } catch (e) {
+      // Expected behavior.
+      port.close();
+      asyncEnd();
+      return;
+    }
+    Expect.fail("Should not be reached. Message sending didn't throw.");
+  });
+}
diff --git a/tests/lib/isolate/int32_length_overflow_test.dart b/tests/lib/isolate/int32_length_overflow_test.dart
new file mode 100644
index 0000000..85e2bd7
--- /dev/null
+++ b/tests/lib/isolate/int32_length_overflow_test.dart
@@ -0,0 +1,96 @@
+// 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=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:async";
+import "dart:isolate";
+import "dart:typed_data";
+import "package:expect/expect.dart";
+
+const large = 1 << 30;
+
+void child(replyPort) {
+  print("Child start");
+
+  print("Child Uint8List");
+  dynamic x = new Uint8List(large);
+  for (int i = 0; i < 4; i++) {
+    x[i] = i;
+  }
+  for (int i = x.length - 4; i < x.length; i++) {
+    x[i] = x.length - i;
+  }
+  replyPort.send(x);
+  x = null;
+
+  // Too slow.
+  // print("Child Array");
+  // x = new List(large);
+  // for (int i = 0; i < 4; i++) {
+  //   x[i] = i;
+  // }
+  // replyPort.send(x);
+  // x = null;
+
+  print("Child OneByteString");
+  x = null;
+  x = "Z";
+  while (x.length < large) {
+    x = x * 2;
+  }
+  replyPort.send(x);
+  x = null;
+
+  print("Child done");
+}
+
+Future<void> main(List<String> args) async {
+  print("Parent start");
+
+  ReceivePort port = new ReceivePort();
+  Isolate.spawn(child, port.sendPort);
+  StreamIterator<dynamic> incoming = new StreamIterator<dynamic>(port);
+
+  print("Parent Uint8");
+  Expect.isTrue(await incoming.moveNext());
+  dynamic x = incoming.current;
+  Expect.isTrue(x is Uint8List);
+  Expect.equals(large, x.length);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, x[i]);
+  }
+  for (int i = x.length - 4; i < x.length; i++) {
+    Expect.equals(x.length - i, x[i]);
+  }
+  x = null;
+
+  // Too slow.
+  // print("Parent Array");
+  // Expect.isTrue(await incoming.moveNext());
+  // x = incoming.current;
+  // Expect.isTrue(x is List);
+  // Expect.equals(large, x.length);
+  // for (int i = 0; i < 4; i++) {
+  //   Expect.equals(i, x[i]);
+  // }
+  // x = null;
+
+  print("Parent OneByteString");
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is String);
+  Expect.equals(large, x.length);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals("Z", x[i]);
+  }
+  for (int i = x.length - 4; i < x.length; i++) {
+    Expect.equals("Z", x[i]);
+  }
+  x = null;
+
+  port.close();
+  print("Parent done");
+}
diff --git a/tests/lib/isolate/int_from_environment_default_value_test.dart b/tests/lib/isolate/int_from_environment_default_value_test.dart
new file mode 100644
index 0000000..af7ccac
--- /dev/null
+++ b/tests/lib/isolate/int_from_environment_default_value_test.dart
@@ -0,0 +1,30 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+void test(port) {
+  Expect.equals(0, const int.fromEnvironment('NOT_FOUND'));
+  Expect.equals(
+      12345, const int.fromEnvironment('NOT_FOUND', defaultValue: 12345));
+  if (port != null) port.send(null);
+}
+
+main() {
+  asyncStart();
+
+  test(null);
+  final port = new ReceivePort();
+  Isolate.spawn(test, port.sendPort);
+  port.forEach((_) {
+    port.close();
+    asyncEnd();
+  });
+}
diff --git a/tests/lib/isolate/isolate_complex_messages_test.dart b/tests/lib/isolate/isolate_complex_messages_test.dart
new file mode 100644
index 0000000..64992dc
--- /dev/null
+++ b/tests/lib/isolate/isolate_complex_messages_test.dart
@@ -0,0 +1,94 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Dart test program for testing isolate communication with
+// complex messages.
+
+library IsolateComplexMessagesTest;
+
+import 'dart:isolate';
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+void main() {
+  asyncStart();
+
+  ReceivePort local = new ReceivePort();
+  Isolate.spawn(logMessages, local.sendPort);
+
+  int messagesReceived = 0;
+  local.listen((msg) {
+    switch (msg[0]) {
+      case "init":
+        messagesReceived++;
+        var remote = msg[1];
+        remote.send(1);
+        remote.send("Hello");
+        remote.send("World");
+        remote.send(const [null, 1, 2, 3, 4]);
+        remote.send(const [1, 2.0, true, false, 0xffffffffff]);
+        remote.send(const ["Hello", "World", 0xffffffffff]);
+        // Shutdown the LogRunner.
+        remote.send(-1);
+        break;
+      case "done":
+        messagesReceived++;
+        local.close();
+        Expect.equals(6, msg[1]);
+        Expect.equals(2, messagesReceived);
+        asyncEnd();
+    }
+  });
+}
+
+void logMessages(mainPort) {
+  int count = 0;
+  ReceivePort port = new ReceivePort();
+  mainPort.send(["init", port.sendPort]);
+  port.forEach((var message) {
+    if (message == -1) {
+      port.close();
+      mainPort.send(["done", count]);
+    } else {
+      switch (count) {
+        case 0:
+          Expect.equals(1, message);
+          break;
+        case 1:
+          Expect.equals("Hello", message);
+          break;
+        case 2:
+          Expect.equals("World", message);
+          break;
+        case 3:
+          Expect.equals(5, message.length);
+          Expect.equals(null, message[0]);
+          Expect.equals(1, message[1]);
+          Expect.equals(2, message[2]);
+          Expect.equals(3, message[3]);
+          Expect.equals(4, message[4]);
+          break;
+        case 4:
+          Expect.equals(5, message.length);
+          Expect.equals(1, message[0]);
+          Expect.equals(2.0, message[1]);
+          Expect.equals(true, message[2]);
+          Expect.equals(false, message[3]);
+          Expect.equals(0xffffffffff, message[4]);
+          break;
+        case 5:
+          Expect.equals(3, message.length);
+          Expect.equals("Hello", message[0]);
+          Expect.equals("World", message[1]);
+          Expect.equals(0xffffffffff, message[2]);
+          break;
+      }
+      count++;
+    }
+  });
+}
diff --git a/tests/lib/isolate/isolate_current_test.dart b/tests/lib/isolate/isolate_current_test.dart
new file mode 100644
index 0000000..908c42d
--- /dev/null
+++ b/tests/lib/isolate/isolate_current_test.dart
@@ -0,0 +1,138 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library isolate_current_test;
+
+import "dart:isolate";
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+void main() {
+  asyncStart();
+
+  Expect.isNotNull(Isolate.current);
+
+  // Sending controlPort and capabilities as list.
+  testSend(i2l, l2i);
+  testSpawnReturnVsCurrent(true);
+  testSpawnReturnVsCurrent2(true);
+
+  // Sending Isolate itself.
+  testSend(id, id);
+  testSpawnReturnVsCurrent(false);
+  testSpawnReturnVsCurrent2(false);
+
+  asyncEnd();
+}
+
+/** Test sending the isolate data or isolate through a [SendPort]. */
+void testSend(i2l, l2i) {
+  asyncStart();
+  RawReceivePort p = new RawReceivePort();
+  Isolate isolate = Isolate.current;
+  p.handler = (list) {
+    var isolate2 = l2i(list);
+    Expect.equals(isolate.controlPort, isolate2.controlPort);
+    Expect.equals(isolate.pauseCapability, isolate2.pauseCapability);
+    Expect.equals(isolate.terminateCapability, isolate2.terminateCapability);
+    p.close();
+    asyncEnd();
+  };
+  p.sendPort.send(i2l(isolate));
+}
+
+/**
+ * Test that the isolate returned by [Isolate.spawn] is the same as
+ * the one returned by [Isolate.current] in the spawned isolate.
+ * Checked in the spawning isolate.
+ */
+void testSpawnReturnVsCurrent(bool asList) {
+  asyncStart();
+  Function transform = asList ? l2i : id;
+  Completer response = new Completer();
+  var p = new RawReceivePort();
+  p.handler = (v) {
+    response.complete(transform(v));
+    p.close();
+  };
+
+  Isolate.spawn(replyCurrent, [p.sendPort, asList]).then((Isolate isolate) {
+    return response.future.then((isolate2) {
+      expectIsolateEquals(isolate, isolate2 as Isolate);
+      asyncEnd();
+    });
+  });
+}
+
+void replyCurrent(args) {
+  SendPort responsePort = args[0];
+  Function transform = args[1] ? i2l : id;
+  responsePort.send(transform(Isolate.current));
+}
+
+/**
+ * Test that the isolate returned by [Isolate.spawn] is the same as
+ * the one returned by [Isolate.current] in the spawned isolate.
+ * Checked in the spawned isolate.
+ */
+void testSpawnReturnVsCurrent2(bool asList) {
+  asyncStart();
+  Function transform = asList ? i2l : id;
+
+  Completer response = new Completer();
+  var p = new RawReceivePort();
+  int state = 0;
+  p.handler = (v) {
+    switch (state) {
+      case 0:
+        response.complete(v);
+        state++;
+        break;
+      case 1:
+        p.close();
+        Expect.isTrue(v);
+        asyncEnd();
+    }
+  };
+
+  Isolate.spawn(expectCurrent, [p.sendPort, asList]).then((Isolate isolate) {
+    return response.future.then((port) {
+      (port as SendPort).send(transform(isolate));
+    });
+  });
+}
+
+void expectCurrent(args) {
+  SendPort responsePort = args[0];
+  Function transform = args[1] ? l2i : id;
+  RawReceivePort port = new RawReceivePort();
+  port.handler = (isoData) {
+    Isolate isolate2 = transform(isoData);
+    port.close();
+    Isolate isolate = Isolate.current;
+    expectIsolateEquals(isolate, isolate2);
+    responsePort.send(true);
+  };
+  responsePort.send(port.sendPort);
+}
+
+/** Convert isolate to list (of control port and capabilities). */
+i2l(Isolate isolate) =>
+    [isolate.controlPort, isolate.pauseCapability, isolate.terminateCapability];
+/** Convert list to isolate. */
+l2i(List list) => new Isolate(list[0],
+    pauseCapability: list[1], terminateCapability: list[2]);
+
+/** Identity transformation. */
+id(Isolate isolate) => isolate;
+
+void expectIsolateEquals(Isolate expect, Isolate actual) {
+  Expect.equals(expect.controlPort, actual.controlPort);
+  Expect.equals(expect.pauseCapability, actual.pauseCapability);
+  Expect.equals(expect.terminateCapability, actual.terminateCapability);
+}
diff --git a/tests/lib/isolate/isolate_import_test.dart b/tests/lib/isolate/isolate_import_test.dart
new file mode 100644
index 0000000..211cced
--- /dev/null
+++ b/tests/lib/isolate/isolate_import_test.dart
@@ -0,0 +1,21 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library IsolateImportNegativeTest;
+
+// Omitting the following import is an error:
+/* // //# 01: runtime error, compile-time error
+import 'dart:isolate';
+*/ // //# 01: continued
+import 'package:async_helper/async_helper.dart';
+
+void entry(msg) {}
+
+main() {
+  asyncStart();
+  Isolate.spawn(entry, null).whenComplete(asyncEnd);
+}
diff --git a/tests/lib/isolate/issue_21398_child_isolate.dart b/tests/lib/isolate/issue_21398_child_isolate.dart
new file mode 100644
index 0000000..c35fcb2
--- /dev/null
+++ b/tests/lib/isolate/issue_21398_child_isolate.dart
@@ -0,0 +1,20 @@
+// 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.
+
+import 'dart:isolate';
+import "package:expect/expect.dart";
+
+class FromChildIsolate {
+  String toString() => 'from child isolate';
+}
+
+main(List<String> args, message) {
+  var sendPort = message;
+  try {
+    sendPort.send(new FromChildIsolate());
+  } catch (error) {
+    Expect.isTrue(error is ArgumentError);
+    sendPort.send("Invalid Argument(s).");
+  }
+}
diff --git a/tests/lib/isolate/issue_21398_child_isolate1.dart b/tests/lib/isolate/issue_21398_child_isolate1.dart
new file mode 100644
index 0000000..9911733
--- /dev/null
+++ b/tests/lib/isolate/issue_21398_child_isolate1.dart
@@ -0,0 +1,12 @@
+// 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.
+
+import 'dart:isolate';
+import "package:expect/expect.dart";
+
+main(List<String> args, message) {
+  var sendPort1 = message[0] as SendPort;
+  var sendPort2 = message[1] as SendPort;
+  sendPort2.send(sendPort1);
+}
diff --git a/tests/lib/isolate/issue_21398_child_isolate11.dart b/tests/lib/isolate/issue_21398_child_isolate11.dart
new file mode 100644
index 0000000..fd19d60
--- /dev/null
+++ b/tests/lib/isolate/issue_21398_child_isolate11.dart
@@ -0,0 +1,25 @@
+// 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.
+
+import 'dart:isolate';
+import "package:expect/expect.dart";
+
+class FromChildIsolate {
+  String toString() => 'from child isolate';
+}
+
+main(List<String> args, message) {
+  var receivePort = new ReceivePort();
+  var sendPort = message;
+  sendPort.send(receivePort.sendPort);
+  receivePort.listen((msg) {
+    Expect.isTrue(msg is SendPort);
+    try {
+      msg.send(new FromChildIsolate());
+    } catch (error) {
+      Expect.isTrue(error is ArgumentError);
+      msg.send("Invalid Argument(s).");
+    }
+  }, onError: (e) => print('$e'));
+}
diff --git a/tests/lib/isolate/issue_21398_parent_isolate1_test.dart b/tests/lib/isolate/issue_21398_parent_isolate1_test.dart
new file mode 100644
index 0000000..6a0b458
--- /dev/null
+++ b/tests/lib/isolate/issue_21398_parent_isolate1_test.dart
@@ -0,0 +1,145 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import 'dart:isolate';
+import "package:expect/expect.dart";
+import 'package:async_helper/async_helper.dart';
+
+class FromMainIsolate {
+  String toString() => 'from main isolate';
+  int get fld => 10;
+}
+
+func1Child(args) {
+  var receivePort = new ReceivePort();
+  var sendPort = args[0];
+  sendPort.send(receivePort.sendPort);
+  receivePort.listen((msg) {
+    Expect.isTrue(msg is FromMainIsolate);
+    Expect.equals(10, msg.fld);
+    receivePort.close();
+    sendPort.send("done");
+  }, onError: (e) => print('$e'));
+}
+
+func2Child(args) {
+  var receivePort = new ReceivePort();
+  var sendPort = args[0];
+  sendPort.send(receivePort.sendPort);
+  receivePort.listen((msg) {
+    Expect.isTrue(msg is SendPort);
+    msg.send(new FromMainIsolate());
+    receivePort.close();
+  }, onError: (e) => print('$e'));
+}
+
+spawnFuncTest() {
+  var receive1 = new ReceivePort();
+  var receive2 = new ReceivePort();
+
+  var spawnFunctionIsolate1SendPort;
+  var spawnFunctionIsolate2SendPort;
+
+  // First spawn the first isolate using spawnFunction, this isolate will
+  // create a receivePort and send it's sendPort back and then it will just
+  // sit there listening for a message from the second isolate spawned
+  // using spawnFunction.
+  asyncStart();
+  return Isolate.spawn(func1Child, [receive1.sendPort]).then((isolate) {
+    receive1.listen((msg) {
+      if (msg is SendPort) {
+        spawnFunctionIsolate1SendPort = msg;
+
+        // Now spawn the second isolate using spawnFunction, this isolate
+        // will create a receivePort and send it's sendPort back and then
+        // wait for the third isolate spawned using spawnUri to send it
+        // a sendPort to which it will try and send a non "literal-like"
+        // object.
+        Isolate.spawn(func2Child, [receive2.sendPort]).then((isolate) {
+          receive2.listen((msg) {
+            spawnFunctionIsolate2SendPort = msg;
+            receive2.close();
+
+            // Now spawn an isolate using spawnUri and send these send
+            // ports over to it. This isolate will send one of the
+            // sendports over to the other.
+            Isolate.spawnUri(Uri.parse('issue_21398_child_isolate1.dart'), [],
+                [spawnFunctionIsolate1SendPort, spawnFunctionIsolate2SendPort]);
+          }, onError: (e) => print('$e'));
+        });
+      } else if (msg == "done") {
+        receive1.close();
+        asyncEnd();
+      } else {
+        Expect.fail("Invalid message received: $msg");
+      }
+    }, onError: (e) => print('$e'));
+  });
+}
+
+uriChild(args) {
+  var receivePort = new ReceivePort();
+  var sendPort = args[0];
+  sendPort.send(receivePort.sendPort);
+  receivePort.listen((msg) {
+    Expect.isTrue(msg is String);
+    Expect.equals("Invalid Argument(s).", msg);
+    receivePort.close();
+    sendPort.send("done");
+  }, onError: (e) => print('$e'));
+}
+
+spawnUriTest() {
+  var receive1 = new ReceivePort();
+  var receive2 = new ReceivePort();
+
+  var spawnFunctionIsolateSendPort;
+  var spawnUriIsolateSendPort;
+
+  // First spawn the first isolate using spawnFunction, this isolate will
+  // create a receivePort and send it's sendPort back and then it will just
+  // sit there listening for a message from the second isolate spawned
+  // using spawnFunction.
+  asyncStart();
+  Isolate.spawn(uriChild, [receive1.sendPort]).then((isolate) {
+    receive1.listen((msg) {
+      if (msg is SendPort) {
+        spawnFunctionIsolateSendPort = msg;
+
+        // Now spawn the second isolate using spawnUri, this isolate
+        // will create a receivePort and send it's sendPort back and then
+        // wait for the third isolate spawned using spawnUri to send it
+        // a sendPort to which it will try and send a non "literal-like"
+        // object.
+        Isolate.spawnUri(Uri.parse('issue_21398_child_isolate11.dart'), [],
+                receive2.sendPort)
+            .then((isolate) {
+          receive2.listen((msg) {
+            spawnUriIsolateSendPort = msg;
+            receive2.close();
+
+            // Now spawn an isolate using spawnUri and send these send
+            // ports over to it. This isolate will send one of the
+            // sendports over to the other.
+            Isolate.spawnUri(Uri.parse('issue_21398_child_isolate1.dart'), [],
+                [spawnFunctionIsolateSendPort, spawnUriIsolateSendPort]);
+          }, onError: (e) => print('$e'));
+        });
+      } else if (msg == "done") {
+        receive1.close();
+        asyncEnd();
+      } else {
+        Expect.fail("Invalid message received: $msg");
+      }
+    }, onError: (e) => print('$e'));
+  });
+}
+
+main() {
+  spawnFuncTest();
+  spawnUriTest();
+}
diff --git a/tests/lib/isolate/issue_21398_parent_isolate2_test.dart b/tests/lib/isolate/issue_21398_parent_isolate2_test.dart
new file mode 100644
index 0000000..feee51b
--- /dev/null
+++ b/tests/lib/isolate/issue_21398_parent_isolate2_test.dart
@@ -0,0 +1,50 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import 'dart:isolate';
+import "package:expect/expect.dart";
+import 'package:async_helper/async_helper.dart';
+
+import "deferred_loaded_lib.dart" deferred as lib;
+
+// In this test case we send an object created from a deferred library
+// that is loaded in the child isolate but not the parent isolate. The
+// parent isolate does not know about the type of this object and throws
+// an unhandled exception.
+funcChild(args) {
+  var replyPort = args[0];
+  // Deferred load a library, create an object from that library and send
+  // it over to the parent isolate which has not yet loaded that library.
+  lib.loadLibrary().then((_) {
+    replyPort.send(new lib.FromChildIsolate());
+  });
+}
+
+void helperFunction() {
+  var receivePort = new ReceivePort();
+  asyncStart();
+
+  // Spawn an isolate using spawnFunction.
+  Isolate.spawn(funcChild, [receivePort.sendPort]).then((isolate) {
+    receivePort.listen((msg) {
+      // We don't expect to receive any valid messages.
+      Expect.fail("We don't expect to receive any valid messages");
+      receivePort.close();
+      asyncEnd();
+    }, onError: (e) {
+      // We don't expect to receive any error messages, per spec listen
+      // does not receive an error object.
+      Expect.fail("We don't expect to receive any error messages");
+      receivePort.close();
+      asyncEnd();
+    });
+  });
+}
+
+main() {
+  helperFunction(); //# 01: runtime error
+}
diff --git a/tests/lib/isolate/issue_21398_parent_isolate_test.dart b/tests/lib/isolate/issue_21398_parent_isolate_test.dart
new file mode 100644
index 0000000..34e91de
--- /dev/null
+++ b/tests/lib/isolate/issue_21398_parent_isolate_test.dart
@@ -0,0 +1,61 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import 'dart:isolate';
+import "package:expect/expect.dart";
+import 'package:async_helper/async_helper.dart';
+
+class FromMainIsolate {
+  String toString() => 'from main isolate';
+  int get fld => 10;
+}
+
+funcChild(args) {
+  var reply = args[1];
+  var obj = args[0];
+  Expect.isTrue(obj is FromMainIsolate);
+  Expect.equals(10, obj.fld);
+  reply.send(new FromMainIsolate());
+}
+
+main() {
+  var receive1 = new ReceivePort();
+  var receive2 = new ReceivePort();
+
+  // First spawn an isolate using spawnURI and have it
+  // send back a "non-literal" like object.
+  asyncStart();
+  Isolate.spawnUri(Uri.parse('issue_21398_child_isolate.dart'), [],
+      [new FromMainIsolate(), receive1.sendPort]).catchError((error) {
+    Expect.isTrue(error is ArgumentError);
+    asyncEnd();
+  });
+  asyncStart();
+  Isolate.spawnUri(
+          Uri.parse('issue_21398_child_isolate.dart'), [], receive1.sendPort)
+      .then((isolate) {
+    receive1.listen((msg) {
+      Expect.stringEquals(msg, "Invalid Argument(s).");
+      receive1.close();
+      asyncEnd();
+    }, onError: (e) => print('$e'));
+  });
+
+  // Now spawn an isolate using spawnFunction and send it a "non-literal"
+  // like object and also have the child isolate send back a "non-literal"
+  // like object.
+  asyncStart();
+  Isolate.spawn(funcChild, [new FromMainIsolate(), receive2.sendPort])
+      .then((isolate) {
+    receive2.listen((msg) {
+      Expect.isTrue(msg is FromMainIsolate);
+      Expect.equals(10, msg.fld);
+      receive2.close();
+      asyncEnd();
+    }, onError: (e) => print('$e'));
+  });
+}
diff --git a/tests/lib/isolate/issue_22778_test.dart b/tests/lib/isolate/issue_22778_test.dart
new file mode 100644
index 0000000..28107cc
--- /dev/null
+++ b/tests/lib/isolate/issue_22778_test.dart
@@ -0,0 +1,20 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "package:expect/expect.dart";
+
+func() {}
+
+main() {
+  var r = new RawReceivePort();
+  r.handler = (v) {
+    Expect.isTrue(v[0] == v[1]);
+    r.close();
+  };
+  r.sendPort.send(<Function>[func, func]);
+}
diff --git a/tests/lib/isolate/issue_24243_child1_isolate.dart b/tests/lib/isolate/issue_24243_child1_isolate.dart
new file mode 100644
index 0000000..4565cd16
--- /dev/null
+++ b/tests/lib/isolate/issue_24243_child1_isolate.dart
@@ -0,0 +1,18 @@
+// 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.
+
+import 'dart:isolate';
+
+main(List<String> args, message) {
+  var sendPort = message;
+  try {
+    var list0 = <int>[1, 2, 3];
+    var list1 = <int>[4, 5, 6];
+    var list2 = <int>[7, 8, 9];
+    var list = new List<List<int>>.from([list0, list1, list2]);
+    sendPort.send(list);
+  } catch (error) {
+    sendPort.send("Invalid Argument(s).");
+  }
+}
diff --git a/tests/lib/isolate/issue_24243_child2_isolate.dart b/tests/lib/isolate/issue_24243_child2_isolate.dart
new file mode 100644
index 0000000..a603309
--- /dev/null
+++ b/tests/lib/isolate/issue_24243_child2_isolate.dart
@@ -0,0 +1,18 @@
+// 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.
+
+import 'dart:isolate';
+
+main(List<String> args, message) {
+  var sendPort = message;
+  try {
+    var map0 = <int, String>{1: 'one', 2: 'two', 3: 'three'};
+    var map1 = <int, String>{4: 'four', 5: 'five', 6: 'six'};
+    var map2 = <int, String>{7: 'seven', 8: 'eight', 9: 'nine'};
+    var map = new Map<int, Map<int, String>>.from({0: map0, 1: map1, 2: map2});
+    sendPort.send(map);
+  } catch (error) {
+    sendPort.send("Invalid Argument(s).");
+  }
+}
diff --git a/tests/lib/isolate/issue_24243_child3_isolate.dart b/tests/lib/isolate/issue_24243_child3_isolate.dart
new file mode 100644
index 0000000..e45930c
--- /dev/null
+++ b/tests/lib/isolate/issue_24243_child3_isolate.dart
@@ -0,0 +1,30 @@
+// 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.
+
+import 'dart:collection';
+import 'dart:isolate';
+
+main(List<String> args, message) {
+  var sendPort = message;
+  try {
+    var map0 = new LinkedHashMap<int, String>();
+    map0[1] = 'one';
+    map0[2] = 'two';
+    map0[3] = 'three';
+    var map1 = new LinkedHashMap<int, String>();
+    map1[4] = 'four';
+    map1[5] = 'five';
+    map1[6] = 'size';
+    var map2 = new LinkedHashMap<int, String>();
+    map2[7] = 'seven';
+    map2[8] = 'eight';
+    map2[9] = 'nine';
+
+    var map = new Map<int, LinkedHashMap<int, String>>.from(
+        {0: map0, 1: map1, 2: map2});
+    sendPort.send(map);
+  } catch (error) {
+    sendPort.send("Invalid Argument(s).");
+  }
+}
diff --git a/tests/lib/isolate/issue_24243_parent_isolate_test.dart b/tests/lib/isolate/issue_24243_parent_isolate_test.dart
new file mode 100644
index 0000000..c38e5e4
--- /dev/null
+++ b/tests/lib/isolate/issue_24243_parent_isolate_test.dart
@@ -0,0 +1,79 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import 'dart:collection';
+import 'dart:isolate';
+
+import "package:expect/expect.dart";
+
+main() {
+  // First spawn an isolate using spawnURI and have it
+  // send back a "literal" like list object.
+  var receive1 = new ReceivePort();
+  Isolate.spawnUri(
+          Uri.parse('issue_24243_child1_isolate.dart'), [], receive1.sendPort)
+      .then((isolate) {
+    receive1.listen((msg) {
+      var list0 = <int>[1, 2, 3];
+      var list1 = <int>[4, 5, 6];
+      var list2 = <int>[7, 8, 9];
+      Expect.isTrue(msg is List<List<int>>);
+      Expect.listEquals(msg[0], list0);
+      Expect.listEquals(msg[1], list1);
+      Expect.listEquals(msg[2], list2);
+      Expect.throws(() => msg[0] = "throw an exception");
+      receive1.close();
+    }, onError: (e) => print('$e'));
+  });
+
+  // Now spawn an isolate using spawnURI and have it
+  // send back a "literal" like map object.
+  var receive2 = new ReceivePort();
+  Isolate.spawnUri(
+          Uri.parse('issue_24243_child2_isolate.dart'), [], receive2.sendPort)
+      .then((isolate) {
+    receive2.listen((msg) {
+      var map0 = <int, String>{1: 'one', 2: 'two', 3: 'three'};
+      var map1 = <int, String>{4: 'four', 5: 'five', 6: 'six'};
+      var map2 = <int, String>{7: 'seven', 8: 'eight', 9: 'nine'};
+      Expect.isTrue(msg is Map<int, Map<int, String>>);
+      Expect.mapEquals(msg[0], map0);
+      Expect.mapEquals(msg[1], map1);
+      Expect.mapEquals(msg[2], map2);
+      Expect.throws(() => msg[0] = "throw an exception");
+      receive2.close();
+    }, onError: (e) => print('$e'));
+  });
+
+  // Now spawn an isolate using spawnURI and have it
+  // send back a "literal" like LinkedHashMap object.
+  var receive3 = new ReceivePort();
+  Isolate.spawnUri(
+          Uri.parse('issue_24243_child3_isolate.dart'), [], receive3.sendPort)
+      .then((isolate) {
+    receive3.listen((msg) {
+      var map0 = new LinkedHashMap<int, String>();
+      map0[1] = 'one';
+      map0[2] = 'two';
+      map0[3] = 'three';
+      var map1 = new LinkedHashMap<int, String>();
+      map1[4] = 'four';
+      map1[5] = 'five';
+      map1[6] = 'size';
+      var map2 = new LinkedHashMap<int, String>();
+      map2[7] = 'seven';
+      map2[8] = 'eight';
+      map2[9] = 'nine';
+      Expect.isTrue(msg is Map<int, LinkedHashMap<int, String>>);
+      Expect.mapEquals(msg[0], map0);
+      Expect.mapEquals(msg[1], map1);
+      Expect.mapEquals(msg[2], map2);
+      Expect.throws(() => msg[0] = "throw an exception");
+      receive3.close();
+    }, onError: (e) => print('$e'));
+  });
+}
diff --git a/tests/lib/isolate/issue_35626_test.dart b/tests/lib/isolate/issue_35626_test.dart
new file mode 100644
index 0000000..1563a8392
--- /dev/null
+++ b/tests/lib/isolate/issue_35626_test.dart
@@ -0,0 +1,36 @@
+// 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=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Tests that sets of enums can be set through ports.
+// https://github.com/dart-lang/sdk/issues/35626
+
+library spawn_tests;
+
+import "dart:io";
+import "dart:isolate";
+import "package:expect/expect.dart";
+
+enum MyEnum { foo, bar, baz }
+
+void sendSetOfEnums(SendPort port) {
+  Set<MyEnum> remoteSet = Set()..add(MyEnum.bar);
+  port.send(remoteSet);
+}
+
+void main() async {
+  Set<MyEnum> localSet = Set()..add(MyEnum.foo)..add(MyEnum.bar);
+  localSet.lookup(MyEnum.foo);
+
+  final port = ReceivePort();
+  await Isolate.spawn(sendSetOfEnums, port.sendPort);
+  Set<MyEnum> remoteSet = await port.first;
+
+  print(localSet);
+  print(remoteSet);
+  Expect.setEquals([MyEnum.bar], localSet.intersection(remoteSet));
+  Expect.setEquals([MyEnum.bar], remoteSet.intersection(localSet));
+}
diff --git a/tests/lib/isolate/issue_6610_test.dart b/tests/lib/isolate/issue_6610_test.dart
new file mode 100644
index 0000000..962955e
--- /dev/null
+++ b/tests/lib/isolate/issue_6610_test.dart
@@ -0,0 +1,77 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Testing that Isolate.spawn copies the source code of the parent isolate,
+// rather than rereading the parent's source URI.
+// https://github.com/dart-lang/sdk/issues/6610
+
+// Isolate structure:
+//     Root 1 -> Branch 1 -> Leaf 1
+//     /
+//  main
+//     \
+//     Root 2 -> Branch 2 -> Leaf 2
+
+library spawn_tests;
+
+import "dart:io";
+import 'dart:isolate';
+import 'package:expect/expect.dart';
+
+void main() {
+  HttpServer.bind("127.0.0.1", 0).then((server) {
+    var count = 0;
+    server.listen((HttpRequest request) {
+      ++count;
+      request.response.write("""
+        import 'dart:isolate';
+
+        void main(_, SendPort port) {
+          root(port);
+        }
+
+        void root(SendPort port) {
+          port.send("Root ${count}");
+          Isolate.spawn(branch, port);
+        }
+
+        void branch(SendPort port) {
+          port.send("Branch ${count}");
+          Isolate.spawn(leaf, port);
+        }
+
+        void leaf(SendPort port) {
+          port.send("Leaf ${count}");
+        }
+      """);
+      request.response.close();
+    });
+
+    ReceivePort port = new ReceivePort();
+    var messageSet = Set();
+    port.listen((message) {
+      messageSet.add(message);
+      if (messageSet.length >= 6) {
+        server.close();
+        port.close();
+        Expect.setEquals([
+          "Root 1",
+          "Root 2",
+          "Branch 1",
+          "Branch 2",
+          "Leaf 1",
+          "Leaf 2",
+        ], messageSet);
+      }
+    });
+
+    Isolate.spawnUri(
+        Uri.parse("http://127.0.0.1:${server.port}"), [], port.sendPort);
+    Isolate.spawnUri(
+        Uri.parse("http://127.0.0.1:${server.port}"), [], port.sendPort);
+  });
+}
diff --git a/tests/lib/isolate/kill2_test.dart b/tests/lib/isolate/kill2_test.dart
new file mode 100644
index 0000000..9391fc8
--- /dev/null
+++ b/tests/lib/isolate/kill2_test.dart
@@ -0,0 +1,47 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+isomain1(replyPort) {
+  RawReceivePort port = new RawReceivePort();
+  port.handler = (v) {
+    replyPort.send(v);
+    if (v == 0) port.close();
+  };
+  replyPort.send(port.sendPort);
+}
+
+void main() {
+  asyncStart();
+  var completer = new Completer(); // Completed by first reply from isolate.
+  RawReceivePort reply = new RawReceivePort(completer.complete);
+  Isolate.spawn(isomain1, reply.sendPort).then((Isolate isolate) {
+    List result = [];
+    completer.future.then((echoPort) {
+      reply.handler = (v) {
+        result.add(v);
+        if (v == 2) {
+          isolate.kill(priority: Isolate.beforeNextEvent);
+        }
+        echoPort.send(v - 1);
+      };
+      late RawReceivePort exitSignal;
+      exitSignal = new RawReceivePort((_) {
+        Expect.listEquals([4, 3, 2], result);
+        exitSignal.close();
+        reply.close();
+        asyncEnd();
+      });
+      isolate.addOnExitListener(exitSignal.sendPort);
+      echoPort.send(4);
+    });
+  });
+}
diff --git a/tests/lib/isolate/kill_self_synchronously_test.dart b/tests/lib/isolate/kill_self_synchronously_test.dart
new file mode 100644
index 0000000..19f3a2e
--- /dev/null
+++ b/tests/lib/isolate/kill_self_synchronously_test.dart
@@ -0,0 +1,36 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "dart:io";
+
+void main(List<String> args) {
+  if (args.contains("--child")) {
+    new RawReceivePort(); // Hang if not killed.
+    Isolate.current.kill(priority: Isolate.immediate);
+    // No intervening call.
+    throw "QQQ Should not be reached";
+  } else {
+    var exec = Platform.resolvedExecutable;
+    var args = <String>[];
+    args.addAll(Platform.executableArguments);
+    args.add(Platform.script.toFilePath());
+    args.add("--child");
+    var result = Process.runSync(exec, args);
+    if (result.exitCode != 255) {
+      throw "Wrong exit code: ${result.exitCode}";
+    }
+    if (result.stderr.contains("QQQ Should not be reached")) {
+      print(result.stderr);
+      throw "Not killed synchronously";
+    }
+    if (!result.stderr.contains("isolate terminated by Isolate.kill")) {
+      print(result.stderr);
+      throw "Missing killed message";
+    }
+  }
+}
diff --git a/tests/lib/isolate/kill_self_test.dart b/tests/lib/isolate/kill_self_test.dart
new file mode 100644
index 0000000..157b30f
--- /dev/null
+++ b/tests/lib/isolate/kill_self_test.dart
@@ -0,0 +1,45 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+isomain1(replyPort) {
+  RawReceivePort port = new RawReceivePort();
+  bool firstEvent = true;
+  port.handler = (v) {
+    if (!firstEvent) {
+      throw "Survived suicide";
+    }
+    var controlPort = v[0];
+    var killCapability = v[1];
+    firstEvent = false;
+    var isolate = new Isolate(controlPort, terminateCapability: killCapability);
+    isolate.kill(priority: Isolate.immediate);
+  };
+  replyPort.send(port.sendPort);
+}
+
+void main() {
+  asyncStart();
+  var completer = new Completer(); // Completed by first reply from isolate.
+  RawReceivePort reply = new RawReceivePort(completer.complete);
+  Isolate.spawn(isomain1, reply.sendPort).then((Isolate isolate) {
+    completer.future.then((isolatePort) {
+      late RawReceivePort exitSignal;
+      exitSignal = new RawReceivePort((_) {
+        exitSignal.close();
+        asyncEnd();
+      });
+      isolate.addOnExitListener(exitSignal.sendPort);
+      isolatePort.send([isolate.controlPort, isolate.terminateCapability]);
+      reply.close();
+    });
+  });
+}
diff --git a/tests/lib/isolate/kill_test.dart b/tests/lib/isolate/kill_test.dart
new file mode 100644
index 0000000..07e0dfe8
--- /dev/null
+++ b/tests/lib/isolate/kill_test.dart
@@ -0,0 +1,48 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+isomain1(replyPort) {
+  RawReceivePort port = new RawReceivePort();
+  port.handler = (v) {
+    replyPort.send(v);
+    if (v == 0) port.close();
+  };
+  replyPort.send(port.sendPort);
+}
+
+void main() {
+  asyncStart();
+  var completer = new Completer(); // Completed by first reply from isolate.
+  RawReceivePort reply = new RawReceivePort(completer.complete);
+  Isolate.spawn(isomain1, reply.sendPort).then((Isolate isolate) {
+    completer.future.then((_echoPort) {
+      SendPort echoPort = _echoPort;
+      List result = [];
+      reply.handler = (v) {
+        result.add(v);
+        if (v == 2) {
+          isolate.kill(priority: Isolate.immediate);
+        }
+        echoPort.send(v - 1);
+      };
+      late RawReceivePort exitSignal;
+      exitSignal = new RawReceivePort((_) {
+        Expect.listEquals([4, 3, 2], result);
+        exitSignal.close();
+        reply.close();
+        asyncEnd();
+      });
+      isolate.addOnExitListener(exitSignal.sendPort);
+      echoPort.send(4);
+    });
+  });
+}
diff --git a/tests/lib/isolate/large_byte_data_leak_test.dart b/tests/lib/isolate/large_byte_data_leak_test.dart
new file mode 100644
index 0000000..1313519
--- /dev/null
+++ b/tests/lib/isolate/large_byte_data_leak_test.dart
@@ -0,0 +1,44 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:async";
+import "dart:developer" show UserTag;
+import "dart:isolate" show Isolate, ReceivePort;
+import "dart:typed_data" show ByteData;
+import "package:expect/expect.dart";
+
+const large = 2 * 1024 * 1024;
+
+void child(replyPort) {
+  print("Child start");
+
+  Expect.throws(() {
+    replyPort.send([
+      new ByteData(large),
+      new UserTag("User tags are not allowed in isolate messages"),
+      new ByteData(large),
+    ]);
+    replyPort.send("Not reached");
+  }, (e) {
+    return e.toString().contains("Illegal argument in isolate message");
+  });
+
+  replyPort.send("Done");
+
+  print("Child done");
+}
+
+Future<void> main(List<String> args) async {
+  print("Parent start");
+
+  ReceivePort port = new ReceivePort();
+  Isolate.spawn(child, port.sendPort);
+
+  Expect.equals("Done", await port.first);
+
+  print("Parent done");
+}
diff --git a/tests/lib/isolate/large_byte_data_test.dart b/tests/lib/isolate/large_byte_data_test.dart
new file mode 100644
index 0000000..8a78238
--- /dev/null
+++ b/tests/lib/isolate/large_byte_data_test.dart
@@ -0,0 +1,174 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:async";
+import "dart:isolate";
+import "dart:typed_data";
+import "package:expect/expect.dart";
+
+const large = 2 * 1024 * 1024;
+
+void child(replyPort) {
+  print("Child start");
+
+  print("Child ByteData");
+  dynamic x = new ByteData(large);
+  for (int i = 0; i < 4; i++) {
+    x.setInt8(i, i);
+  }
+  replyPort.send(x);
+
+  print("Child Uint8List");
+  x = new Uint8List(large);
+  for (int i = 0; i < 4; i++) {
+    x[i] = i;
+  }
+  replyPort.send(x);
+
+  print("Child Int8List");
+  x = new Int8List(large);
+  for (int i = 0; i < 4; i++) {
+    x[i] = i;
+  }
+  replyPort.send(x);
+
+  print("Child Uint16List");
+  x = new Uint16List(large);
+  for (int i = 0; i < 4; i++) {
+    x[i] = i;
+  }
+  replyPort.send(x);
+
+  print("Child Int16List");
+  x = new Int16List(large);
+  for (int i = 0; i < 4; i++) {
+    x[i] = i;
+  }
+  replyPort.send(x);
+
+  print("Child Uint32List");
+  x = new Uint32List(large);
+  for (int i = 0; i < 4; i++) {
+    x[i] = i;
+  }
+  replyPort.send(x);
+
+  print("Child Int32List");
+  x = new Int32List(large);
+  for (int i = 0; i < 4; i++) {
+    x[i] = i;
+  }
+  replyPort.send(x);
+
+  print("Child Uint64List");
+  x = new Uint64List(large);
+  for (int i = 0; i < 4; i++) {
+    x[i] = i;
+  }
+  replyPort.send(x);
+
+  print("Child Int64List");
+  x = new Int64List(large);
+  for (int i = 0; i < 4; i++) {
+    x[i] = i;
+  }
+  replyPort.send(x);
+
+  print("Child done");
+}
+
+Future<void> main(List<String> args) async {
+  print("Parent start");
+
+  ReceivePort port = new ReceivePort();
+  Isolate.spawn(child, port.sendPort);
+  StreamIterator<dynamic> incoming = new StreamIterator<dynamic>(port);
+
+  print("Parent ByteData");
+  Expect.isTrue(await incoming.moveNext());
+  dynamic x = incoming.current;
+  Expect.isTrue(x is ByteData);
+  Expect.equals(large, x.lengthInBytes);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, x.getUint8(i));
+  }
+
+  print("Parent Uint8");
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Uint8List);
+  Expect.equals(large, x.length);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, x[i]);
+  }
+
+  print("Parent Int8");
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Int8List);
+  Expect.equals(large, x.length);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, x[i]);
+  }
+
+  print("Parent Uint16");
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Uint16List);
+  Expect.equals(large, x.length);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, x[i]);
+  }
+
+  print("Parent Int16");
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Int16List);
+  Expect.equals(large, x.length);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, x[i]);
+  }
+
+  print("Parent Uint32");
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Uint32List);
+  Expect.equals(large, x.length);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, x[i]);
+  }
+
+  print("Parent Int32");
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Int32List);
+  Expect.equals(large, x.length);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, x[i]);
+  }
+
+  print("Parent Uint64");
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Uint64List);
+  Expect.equals(large, x.length);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, x[i]);
+  }
+
+  print("Parent Int64");
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Int64List);
+  Expect.equals(large, x.length);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, x[i]);
+  }
+
+  port.close();
+  print("Parent done");
+}
diff --git a/tests/lib/isolate/mandel_isolate_test.dart b/tests/lib/isolate/mandel_isolate_test.dart
new file mode 100644
index 0000000..50d564a
--- /dev/null
+++ b/tests/lib/isolate/mandel_isolate_test.dart
@@ -0,0 +1,159 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library MandelIsolateTest;
+
+import 'dart:async';
+import 'dart:isolate';
+import 'dart:math';
+
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+const TERMINATION_MESSAGE = -1;
+const N = 100;
+const ISOLATES = 20;
+
+void main([args, port]) {
+  final state = new MandelbrotState();
+  asyncStart();
+  state._validated.future.then((result) {
+    Expect.isTrue(result);
+    asyncEnd();
+  });
+  for (int i = 0; i < min(ISOLATES, N); i++) state.startClient(i);
+}
+
+class MandelbrotState {
+  MandelbrotState() {
+    _result = new List<List<int>>.filled(N, []);
+    _lineProcessedBy = new List<LineProcessorClient?>.filled(N, null);
+    _sent = 0;
+    _missing = N;
+    _validated = new Completer<bool>();
+  }
+
+  void startClient(int id) {
+    assert(_sent < N);
+    int line = _sent++;
+    LineProcessorClient.create(this, id).then((final client) {
+      client.processLine(line);
+    });
+  }
+
+  void notifyProcessedLine(LineProcessorClient client, int y, List<int> line) {
+    assert(_result[y].isEmpty);
+    _result[y] = line;
+    _lineProcessedBy[y] = client;
+
+    if (_sent != N) {
+      client.processLine(_sent++);
+    } else {
+      client.shutdown();
+    }
+
+    // If all lines have been computed, validate the result.
+    if (--_missing == 0) {
+      _printResult();
+      _validateResult();
+    }
+  }
+
+  void _validateResult() {
+    // TODO(ngeoffray): Implement this.
+    _validated.complete(true);
+  }
+
+  void _printResult() {
+    var output = new StringBuffer();
+    for (int i = 0; i < _result.length; i++) {
+      List<int> line = _result[i];
+      for (int j = 0; j < line.length; j++) {
+        if (line[j] < 10) output.write("0");
+        output.write(line[j]);
+      }
+      output.write("\n");
+    }
+    // print(output);
+  }
+
+  late List<List<int>> _result;
+  late List<LineProcessorClient?> _lineProcessedBy;
+  late int _sent;
+  late int _missing;
+  late Completer<bool> _validated;
+}
+
+class LineProcessorClient {
+  MandelbrotState _state;
+  int _id;
+  SendPort _port;
+
+  LineProcessorClient(this._state, this._id, this._port);
+
+  static Future<LineProcessorClient> create(MandelbrotState state, int id) {
+    ReceivePort reply = new ReceivePort();
+    return Isolate.spawn(processLines, reply.sendPort).then((_) {
+      return reply.first.then((port) {
+        return new LineProcessorClient(state, id, port);
+      });
+    });
+  }
+
+  void processLine(int y) {
+    ReceivePort reply = new ReceivePort();
+    _port.send([y, reply.sendPort]);
+    reply.first.then((message) {
+      _state.notifyProcessedLine(this, y, message as List<int>);
+    });
+  }
+
+  void shutdown() {
+    _port.send(TERMINATION_MESSAGE);
+  }
+}
+
+List<int> processLine(int y) {
+  double inverseN = 2.0 / N;
+  double Civ = y * inverseN - 1.0;
+  List<int> result = new List<int>.filled(N, 0);
+  for (int x = 0; x < N; x++) {
+    double Crv = x * inverseN - 1.5;
+
+    double Zrv = Crv;
+    double Ziv = Civ;
+
+    double Trv = Crv * Crv;
+    double Tiv = Civ * Civ;
+
+    int i = 49;
+    do {
+      Ziv = (Zrv * Ziv) + (Zrv * Ziv) + Civ;
+      Zrv = Trv - Tiv + Crv;
+
+      Trv = Zrv * Zrv;
+      Tiv = Ziv * Ziv;
+    } while (((Trv + Tiv) <= 4.0) && (--i > 0));
+
+    result[x] = i;
+  }
+  return result;
+}
+
+void processLines(SendPort replyPort) {
+  ReceivePort port = new ReceivePort();
+  port.listen((message) {
+    if (message != TERMINATION_MESSAGE) {
+      int line = message[0];
+      SendPort replyTo = message[1];
+      replyTo.send(processLine(line));
+    } else {
+      port.close();
+    }
+  });
+  replyPort.send(port.sendPort);
+}
diff --git a/tests/lib/isolate/message2_test.dart b/tests/lib/isolate/message2_test.dart
new file mode 100644
index 0000000..7c2e691
--- /dev/null
+++ b/tests/lib/isolate/message2_test.dart
@@ -0,0 +1,87 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Dart test program for testing serialization of messages.
+// VMOptions=--enable_type_checks --enable_asserts
+
+library Message2Test;
+
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+// ---------------------------------------------------------------------------
+// Message passing test 2.
+// ---------------------------------------------------------------------------
+
+class MessageTest {
+  static void mapEqualsDeep(Map expected, Map actual) {
+    Expect.equals(actual.length, expected.length);
+    testForEachMap(key, value) {
+      if (value is List) {
+        listEqualsDeep(value, actual[key]);
+      } else {
+        Expect.equals(actual[key], value);
+      }
+    }
+
+    expected.forEach(testForEachMap);
+  }
+
+  static void listEqualsDeep(List expected, List actual) {
+    for (int i = 0; i < expected.length; i++) {
+      if (expected[i] is List) {
+        Expect.type<List>(actual[i]);
+        listEqualsDeep(expected[i], actual[i]);
+      } else if (expected[i] is Map) {
+        Expect.type<Map>(actual[i]);
+        mapEqualsDeep(expected[i], actual[i]);
+      } else {
+        Expect.equals(actual[i], expected[i]);
+      }
+    }
+  }
+}
+
+void pingPong(replyPort) {
+  ReceivePort port = new ReceivePort();
+  port.listen((message) {
+    if (message is SendPort) {
+      message.send('done');
+      port.close();
+    } else {
+      // Bounce the received object back so that the sender
+      // can make sure that the object matches.
+      message[1].send(message[0]);
+    }
+  });
+  replyPort.send(port.sendPort);
+}
+
+void main([args, port]) {
+  ReceivePort port = new ReceivePort();
+  Isolate.spawn(pingPong, port.sendPort);
+  asyncStart();
+  port.first.then((remote) {
+    Map m = new Map();
+    m[1] = "eins";
+    m[2] = "deux";
+    m[3] = "tre";
+    m[4] = "four";
+    ReceivePort replyPort = new ReceivePort();
+    remote.send([m, replyPort.sendPort]);
+    replyPort.listen((var received) {
+      if (received == 'done') {
+        replyPort.close();
+        asyncEnd();
+      } else {
+        MessageTest.mapEqualsDeep(m, received);
+        remote.send(replyPort.sendPort);
+      }
+    });
+  });
+}
diff --git a/tests/lib/isolate/message3_test.dart b/tests/lib/isolate/message3_test.dart
new file mode 100644
index 0000000..0bc63ff
--- /dev/null
+++ b/tests/lib/isolate/message3_test.dart
@@ -0,0 +1,503 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Dart test program for testing serialization of messages.
+// VMOptions=--enable_type_checks --enable_asserts
+
+library MessageTest;
+
+import 'dart:async';
+import 'dart:collection';
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+import 'dart:typed_data';
+
+void echoMain(msg) {
+  SendPort replyTo = msg[0];
+  SendPort pong = msg[1];
+  ReceivePort port = new ReceivePort();
+  replyTo.send(port.sendPort);
+  port.listen((msg) {
+    if (msg == "halt") {
+      port.close();
+    } else {
+      pong.send(msg);
+    }
+  });
+}
+
+class A {
+  var field = 499;
+
+  A();
+  A.named(this.field);
+}
+
+class B extends A {
+  final field2;
+  B() : field2 = 99;
+  B.named(this.field2, x) : super.named(x);
+}
+
+class C extends B {
+  var field = 33;
+
+  get superField => super.field;
+  get superField2 => super.field2;
+}
+
+class M {
+  get field2 => 11;
+}
+
+class D extends C with M {
+  var gee = 123;
+}
+
+class E {
+  Function fun;
+  E(this.fun);
+
+  static fooFun() => 499;
+  instanceFun() => 1234;
+}
+
+barFun() => 42;
+
+class F {
+  final field = "field";
+  const F();
+}
+
+class G {
+  final field;
+  const G(this.field);
+}
+
+class Value {
+  final val;
+  Value(this.val);
+
+  operator ==(other) {
+    if (other is! Value) return false;
+    return other.val == val;
+  }
+
+  get hashCode => val;
+}
+
+void runTests(SendPort ping, Queue checks) {
+  ping.send("abc");
+  checks.add((x) => Expect.equals("abc", x));
+
+  ping.send([1, 2]);
+  checks.add((x) {
+    Expect.isTrue(x is List);
+    Expect.listEquals([1, 2], x);
+    // Make sure the list is mutable.
+    x[0] = 0;
+    Expect.equals(0, x[0]);
+    // List must be extendable.
+    x.add(3);
+    Expect.equals(3, x[2]);
+  });
+
+  var fixed = List.filled(2, 0);
+  fixed[0] = 0;
+  fixed[1] = 1;
+  ping.send(fixed);
+  checks.add((x) {
+    Expect.isTrue(x is List);
+    Expect.listEquals([0, 1], x);
+    // List must be mutable.
+    x[0] = 3;
+    Expect.equals(3, x[0]);
+    // List must be fixed length.
+    Expect.throws(() {
+      x.add(5);
+    });
+  });
+
+  List cyclic = [];
+  cyclic.add(cyclic);
+  ping.send(cyclic);
+  checks.add((x) {
+    Expect.isTrue(x is List);
+    Expect.equals(1, x.length);
+    Expect.identical(x, x[0]);
+    // List must be mutable.
+    x[0] = 55;
+    Expect.equals(55, x[0]);
+    // List must be extendable.
+    x.add(42);
+    Expect.equals(42, x[1]);
+  });
+
+  var cyclic2 = List<Object?>.filled(1, null);
+  cyclic2[0] = cyclic2;
+  ping.send(cyclic2);
+  checks.add((x) {
+    Expect.isTrue(x is List);
+    Expect.equals(1, x.length);
+    Expect.identical(x, x[0]);
+    // List must be mutable.
+    x[0] = 55;
+    Expect.equals(55, x[0]);
+    // List must be fixed.
+    Expect.throws(() => x.add(42));
+  });
+
+  List constList = const [1, 2];
+  ping.send(constList);
+  checks.add((x) {
+    Expect.isTrue(x is List);
+    Expect.listEquals([1, 2], x);
+    // Make sure the list is immutable.
+    Expect.throws(() => x[0] = 0); // //# constList: ok
+    // List must not be extendable.
+    Expect.throws(() => x.add(3));
+    Expect.identical(x, constList); // //# constList_identical: ok
+  });
+
+  Uint8List uint8 = new Uint8List(2);
+  uint8[0] = 0;
+  uint8[1] = 1;
+  ping.send(uint8);
+  checks.add((x) {
+    Expect.isTrue(x is Uint8List);
+    Expect.equals(2, x.length);
+    Expect.equals(0, x[0]);
+    Expect.equals(1, x[1]);
+  });
+
+  Uint16List uint16 = new Uint16List(2);
+  uint16[0] = 0;
+  uint16[1] = 1;
+  ByteBuffer byteBuffer = uint16.buffer;
+  ping.send(byteBuffer); // //# byteBuffer: ok
+  checks.add( //            //# byteBuffer: ok
+  (x) {
+    Expect.isTrue(x is ByteBuffer);
+    Uint16List uint16View = new Uint16List.view(x);
+    Expect.equals(2, uint16View.length);
+    Expect.equals(0, uint16View[0]);
+    Expect.equals(1, uint16View[1]);
+  }
+  ) //                      //# byteBuffer: ok
+      ;
+
+  Int32x4List list32x4 = new Int32x4List(2);
+  list32x4[0] = new Int32x4(1, 2, 3, 4);
+  list32x4[1] = new Int32x4(5, 6, 7, 8);
+  ping.send(list32x4);
+  checks.add(
+  (x) {
+    Expect.isTrue(x is Int32x4List);
+    Expect.equals(2, x.length);
+    Int32x4 entry1 = x[0];
+    Int32x4 entry2 = x[1];
+    Expect.equals(1, entry1.x);
+    Expect.equals(2, entry1.y);
+    Expect.equals(3, entry1.z);
+    Expect.equals(4, entry1.w);
+    Expect.equals(5, entry2.x);
+    Expect.equals(6, entry2.y);
+    Expect.equals(7, entry2.z);
+    Expect.equals(8, entry2.w);
+  });
+
+  Float32x4List flist32x4 = new Float32x4List(2);
+  flist32x4[0] = new Float32x4(1.5, 2.5, 3.5, 4.5);
+  flist32x4[1] = new Float32x4(5.5, 6.5, 7.5, 8.5);
+  ping.send(flist32x4);
+  checks.add(
+  (x) {
+    Expect.isTrue(x is Float32x4List);
+    Expect.equals(2, x.length);
+    Float32x4 entry1 = x[0];
+    Float32x4 entry2 = x[1];
+    Expect.equals(1.5, entry1.x);
+    Expect.equals(2.5, entry1.y);
+    Expect.equals(3.5, entry1.z);
+    Expect.equals(4.5, entry1.w);
+    Expect.equals(5.5, entry2.x);
+    Expect.equals(6.5, entry2.y);
+    Expect.equals(7.5, entry2.z);
+    Expect.equals(8.5, entry2.w);
+  });
+
+  Float64x2List flist64x2 = new Float64x2List(2);
+  flist64x2[0] = new Float64x2(1.5, 2.5);
+  flist64x2[1] = new Float64x2(5.5, 6.5);
+  ping.send(flist64x2);
+  checks.add(
+  (x) {
+    Expect.isTrue(x is Float64x2List);
+    Expect.equals(2, x.length);
+    Float64x2 entry1 = x[0];
+    Float64x2 entry2 = x[1];
+    Expect.equals(1.5, entry1.x);
+    Expect.equals(2.5, entry1.y);
+    Expect.equals(5.5, entry2.x);
+    Expect.equals(6.5, entry2.y);
+  });
+
+  ping.send({"foo": 499, "bar": 32});
+  checks.add((x) {
+    Expect.isTrue(x is LinkedHashMap);
+    Expect.listEquals(["foo", "bar"], x.keys.toList());
+    Expect.listEquals([499, 32], x.values.toList());
+    Expect.equals(499, x["foo"]);
+    Expect.equals(32, x["bar"]);
+    // Must be mutable.
+    x["foo"] = 22;
+    Expect.equals(22, x["foo"]);
+    // Must be extendable.
+    x["gee"] = 499;
+    Expect.equals(499, x["gee"]);
+  });
+
+  Map<String, int> mapWithRemovedKey = {"foo": 499, "bar": 32};
+  mapWithRemovedKey.remove("foo");
+  ping.send(mapWithRemovedKey);
+  checks.add((x) {
+    Expect.isTrue(x is LinkedHashMap);
+    Expect.listEquals(["bar"], x.keys.toList());
+    Expect.listEquals([32], x.values.toList());
+    Expect.equals(32, x["bar"]);
+  });
+
+  // Test map where a key does not define ==/hashCode.
+  Map<A, int> mapWithIdentityKey = new Map<A, int>();
+  mapWithIdentityKey[new A()] = 499;
+  ping.send(mapWithIdentityKey);
+  checks.add((x) {
+    Expect.isTrue(x is LinkedHashMap);
+    int value = x.values.first;
+    Expect.equals(499, value);
+    A key = x.keys.first;
+    Expect.equals(499, x[key]);
+  });
+
+  ping.send({0: 499, 1: 32});
+  checks.add((x) {
+    Expect.isTrue(x is LinkedHashMap);
+    Expect.listEquals([0, 1], x.keys.toList());
+    Expect.listEquals([499, 32], x.values.toList());
+    // Must be mutable.
+    x[0] = 22;
+    Expect.equals(22, x[0]);
+    // Must be extendable.
+    x[123] = 499;
+    Expect.equals(499, x[123]);
+  });
+
+  Map cyclicMap = {};
+  cyclicMap["cycle"] = cyclicMap;
+  ping.send(cyclicMap);
+  checks.add((x) {
+    Expect.isTrue(x is LinkedHashMap);
+    Expect.identical(x, x["cycle"]);
+    // Must be mutable.
+    x["cycle"] = 22;
+    Expect.equals(22, x["cycle"]);
+    // Must be extendable.
+    x["gee"] = 499;
+    Expect.equals(499, x["gee"]);
+  });
+
+  Map constMap = const {'foo': 499};
+  ping.send(constMap);
+  checks.add((x) {
+    Expect.isTrue(x is Map);
+    print(x.length);
+    Expect.equals(1, x.length);
+    Expect.equals(499, x['foo']);
+    Expect.identical(constMap, x); // //# constMap: ok
+    Expect.throws(() => constMap['bar'] = 42);
+  });
+
+  ping.send(new A());
+  checks.add((x) {
+    Expect.isTrue(x is A);
+    Expect.equals(499, x.field);
+  });
+
+  ping.send(new A.named(42));
+  checks.add((x) {
+    Expect.isTrue(x is A);
+    Expect.equals(42, x.field);
+  });
+
+  ping.send(new B());
+  checks.add((x) {
+    Expect.isTrue(x is A);
+    Expect.isTrue(x is B);
+    Expect.equals(499, x.field);
+    Expect.equals(99, x.field2);
+    Expect.throws(() => x.field2 = 22);
+  });
+
+  ping.send(new B.named(1, 2));
+  checks.add((x) {
+    Expect.isTrue(x is A);
+    Expect.isTrue(x is B);
+    Expect.equals(2, x.field);
+    Expect.equals(1, x.field2);
+    Expect.throws(() => x.field2 = 22);
+  });
+
+  ping.send(new C());
+  checks.add((x) {
+    Expect.isTrue(x is A);
+    Expect.isTrue(x is B);
+    Expect.isTrue(x is C);
+    Expect.equals(33, x.field);
+    Expect.equals(99, x.field2);
+    Expect.equals(499, x.superField);
+    Expect.throws(() => x.field2 = 22);
+  });
+
+  ping.send(new D());
+  checks.add((x) {
+    Expect.isTrue(x is A);
+    Expect.isTrue(x is B);
+    Expect.isTrue(x is C);
+    Expect.isTrue(x is D);
+    Expect.isTrue(x is M);
+    Expect.equals(33, x.field);
+    Expect.equals(11, x.field2);
+    Expect.equals(499, x.superField);
+    Expect.equals(99, x.superField2);
+    Expect.throws(() => x.field2 = 22);
+  });
+
+  D cyclicD = new D();
+  ping.send(cyclicD);
+  checks.add((x) {
+    Expect.isTrue(x is A);
+    Expect.isTrue(x is B);
+    Expect.isTrue(x is C);
+    Expect.isTrue(x is D);
+    Expect.isTrue(x is M);
+    Expect.equals(11, x.field2);
+    Expect.equals(499, x.superField);
+    Expect.equals(99, x.superField2);
+    Expect.throws(() => x.field2 = 22);
+  });
+
+  ping.send(new E(E.fooFun)); //       //# fun: ok
+  checks.add((x) { //                  //# fun: continued
+    Expect.equals(E.fooFun, x.fun); // //# fun: continued
+    Expect.equals(499, x.fun()); //    //# fun: continued
+  }); //                               //# fun: continued
+
+  ping.send(new E(barFun)); //         //# fun: continued
+  checks.add((x) { //                  //# fun: continued
+    Expect.equals(barFun, x.fun); //   //# fun: continued
+    Expect.equals(42, x.fun()); //     //# fun: continued
+  }); //                               //# fun: continued
+
+  Expect.throws(() => ping.send(new E(new E(E.fooFun).instanceFun)));
+
+  F nonConstF = new F();
+  ping.send(nonConstF);
+  checks.add((x) {
+    Expect.equals("field", x.field);
+    Expect.isFalse(identical(nonConstF, x));
+  });
+
+  const F constF = const F();
+  ping.send(constF);
+  checks.add((x) {
+    Expect.equals("field", x.field);
+    Expect.identical(constF, x); // //# constInstance: ok
+  });
+
+  G g1 = new G(nonConstF);
+  G g2 = new G(constF);
+  G g3 = const G(constF);
+  ping.send(g1);
+  ping.send(g2);
+  ping.send(g3);
+
+  checks.add((x) {
+    // g1.
+    Expect.isTrue(x is G);
+    Expect.isFalse(identical(g1, x));
+    F f = x.field;
+    Expect.equals("field", f.field);
+    Expect.isFalse(identical(nonConstF, f));
+  });
+  checks.add((x) {
+    // g2.
+    Expect.isTrue(x is G);
+    Expect.isFalse(identical(g1, x));
+    F f = x.field;
+    Expect.equals("field", f.field);
+    Expect.identical(constF, f); // //# constInstance: continued
+  });
+  checks.add((x) {
+    // g3.
+    Expect.isTrue(x is G);
+    Expect.identical(g3, x); // //# constInstance: continued
+    F f = x.field;
+    Expect.equals("field", f.field);
+    Expect.identical(constF, f); // //# constInstance: continued
+  });
+
+  // Make sure objects in a map are serialized and deserialized in the correct
+  // order.
+  Map m = new Map();
+  Value val1 = new Value(1);
+  Value val2 = new Value(2);
+  m[val1] = val2;
+  m[val2] = val1;
+  // Possible bug we want to catch:
+  // serializer runs through keys first, and then the values:
+  //    - id1 = val1, id2 = val2, ref[id2], ref[id1]
+  // deserializer runs through the keys and values in order:
+  //    - val1;  // id1.
+  //    - ref[id2];  // boom. Wasn't deserialized yet.
+  ping.send(m);
+  checks.add((x) {
+    Expect.isTrue(x is Map);
+    Expect.equals(2, x.length);
+    Expect.equals(val2, x[val1]);
+    Expect.equals(val1, x[val2]);
+    Expect.identical(x.keys.elementAt(0), x.values.elementAt(1));
+    Expect.identical(x.keys.elementAt(1), x.values.elementAt(0));
+  });
+}
+
+void main() {
+  asyncStart();
+  Queue checks = new Queue();
+  ReceivePort testPort = new ReceivePort();
+  Completer completer = new Completer();
+
+  testPort.listen((msg) {
+    Function check = checks.removeFirst();
+    check(msg);
+    if (checks.isEmpty) {
+      completer.complete();
+      testPort.close();
+    }
+  });
+
+  ReceivePort initialReplyPort = new ReceivePort();
+  Isolate
+      .spawn(echoMain, [initialReplyPort.sendPort, testPort.sendPort])
+      .then((_) => initialReplyPort.first)
+      .then((_ping) {
+        SendPort ping = _ping;
+        runTests(ping, checks);
+        Expect.isTrue(checks.length > 0);
+        completer.future.then((_) => ping.send("halt")).then((_) => asyncEnd());
+      });
+}
diff --git a/tests/lib/isolate/message4_test.dart b/tests/lib/isolate/message4_test.dart
new file mode 100644
index 0000000..4644ddb
--- /dev/null
+++ b/tests/lib/isolate/message4_test.dart
@@ -0,0 +1,72 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Dart test program for testing serialization of messages with static
+// native functions.
+
+library MessageTest;
+
+import 'dart:async';
+import 'dart:collection';
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+void echoMain(msg) {
+  SendPort replyTo = msg[0];
+  SendPort pong = msg[1];
+  ReceivePort port = new ReceivePort();
+  replyTo.send(port.sendPort);
+  port.listen((msg) {
+    if (msg == "halt") {
+      port.close();
+    } else {
+      pong.send(msg);
+    }
+  });
+}
+
+void runTests(SendPort ping, Queue checks) {
+  ping.send("abc");
+  checks.add((x) => Expect.equals("abc", x));
+
+  ping.send(int.parse);
+  checks.add((x) => Expect.identical(int.parse, x));
+
+  ping.send(identityHashCode);
+  checks.add((x) => Expect.identical(identityHashCode, x));
+
+  ping.send(identical);
+  checks.add((x) => Expect.identical(identical, x));
+}
+
+main() async {
+  asyncStart();
+  Queue checks = new Queue();
+  ReceivePort testPort = new ReceivePort();
+  Completer completer = new Completer();
+
+  testPort.listen((msg) {
+    Function check = checks.removeFirst();
+    check(msg);
+    if (checks.isEmpty) {
+      completer.complete();
+      testPort.close();
+    }
+  });
+
+  ReceivePort initialReplyPort = new ReceivePort();
+
+  Isolate i = await Isolate.spawn(
+      echoMain, [initialReplyPort.sendPort, testPort.sendPort]);
+  SendPort ping = await initialReplyPort.first;
+  runTests(ping, checks);
+  Expect.isTrue(checks.length > 0);
+  await completer.future;
+  ping.send("halt");
+  asyncEnd();
+}
diff --git a/tests/lib/isolate/message_const_type_arguments_1_test.dart b/tests/lib/isolate/message_const_type_arguments_1_test.dart
new file mode 100644
index 0000000..e5133aa
--- /dev/null
+++ b/tests/lib/isolate/message_const_type_arguments_1_test.dart
@@ -0,0 +1,410 @@
+// 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=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// https://github.com/dart-lang/sdk/issues/35778
+
+import "dart:async";
+import "dart:isolate";
+import "dart:typed_data";
+import "package:expect/expect.dart";
+
+void child(replyPort) {
+  print("Child start");
+
+  replyPort.send(const <List>[]);
+  replyPort.send(const <Map>[]);
+  replyPort.send(const <Null>[]);
+  replyPort.send(const <Object>[]);
+  replyPort.send(const <String>[]);
+  replyPort.send(const <bool>[]);
+  replyPort.send(const <double>[]);
+  replyPort.send(const <int>[]);
+  replyPort.send(const <num>[]);
+
+  replyPort.send(const <List, List>{});
+  replyPort.send(const <List, Map>{});
+  replyPort.send(const <List, Null>{});
+  replyPort.send(const <List, Object>{});
+  replyPort.send(const <List, String>{});
+  replyPort.send(const <List, bool>{});
+  replyPort.send(const <List, double>{});
+  replyPort.send(const <List, int>{});
+  replyPort.send(const <List, num>{});
+
+  replyPort.send(const <Map, List>{});
+  replyPort.send(const <Map, Map>{});
+  replyPort.send(const <Map, Null>{});
+  replyPort.send(const <Map, Object>{});
+  replyPort.send(const <Map, String>{});
+  replyPort.send(const <Map, bool>{});
+  replyPort.send(const <Map, double>{});
+  replyPort.send(const <Map, int>{});
+  replyPort.send(const <Map, num>{});
+
+  replyPort.send(const <Null, List>{});
+  replyPort.send(const <Null, Map>{});
+  replyPort.send(const <Null, Null>{});
+  replyPort.send(const <Null, Object>{});
+  replyPort.send(const <Null, String>{});
+  replyPort.send(const <Null, bool>{});
+  replyPort.send(const <Null, double>{});
+  replyPort.send(const <Null, int>{});
+  replyPort.send(const <Null, num>{});
+
+  replyPort.send(const <Object, List>{});
+  replyPort.send(const <Object, Map>{});
+  replyPort.send(const <Object, Null>{});
+  replyPort.send(const <Object, Object>{});
+  replyPort.send(const <Object, String>{});
+  replyPort.send(const <Object, bool>{});
+  replyPort.send(const <Object, double>{});
+  replyPort.send(const <Object, int>{});
+  replyPort.send(const <Object, num>{});
+
+  replyPort.send(const <String, List>{});
+  replyPort.send(const <String, Map>{});
+  replyPort.send(const <String, Null>{});
+  replyPort.send(const <String, Object>{});
+  replyPort.send(const <String, String>{});
+  replyPort.send(const <String, bool>{});
+  replyPort.send(const <String, double>{});
+  replyPort.send(const <String, int>{});
+  replyPort.send(const <String, num>{});
+
+  replyPort.send(const <bool, List>{});
+  replyPort.send(const <bool, Map>{});
+  replyPort.send(const <bool, Null>{});
+  replyPort.send(const <bool, Object>{});
+  replyPort.send(const <bool, String>{});
+  replyPort.send(const <bool, bool>{});
+  replyPort.send(const <bool, double>{});
+  replyPort.send(const <bool, int>{});
+  replyPort.send(const <bool, num>{});
+
+  replyPort.send(const <double, List>{});
+  replyPort.send(const <double, Map>{});
+  replyPort.send(const <double, Null>{});
+  replyPort.send(const <double, Object>{});
+  replyPort.send(const <double, String>{});
+  replyPort.send(const <double, bool>{});
+  replyPort.send(const <double, double>{});
+  replyPort.send(const <double, int>{});
+  replyPort.send(const <double, num>{});
+
+  replyPort.send(const <int, List>{});
+  replyPort.send(const <int, Map>{});
+  replyPort.send(const <int, Null>{});
+  replyPort.send(const <int, Object>{});
+  replyPort.send(const <int, String>{});
+  replyPort.send(const <int, bool>{});
+  replyPort.send(const <int, double>{});
+  replyPort.send(const <int, int>{});
+  replyPort.send(const <int, num>{});
+
+  replyPort.send(const <num, List>{});
+  replyPort.send(const <num, Map>{});
+  replyPort.send(const <num, Null>{});
+  replyPort.send(const <num, Object>{});
+  replyPort.send(const <num, String>{});
+  replyPort.send(const <num, bool>{});
+  replyPort.send(const <num, double>{});
+  replyPort.send(const <num, int>{});
+  replyPort.send(const <num, num>{});
+
+  print("Child done");
+}
+
+Future<void> main(List<String> args) async {
+  print("Parent start");
+
+  ReceivePort port = new ReceivePort();
+  Isolate.spawn(child, port.sendPort);
+  StreamIterator<dynamic> incoming = new StreamIterator<dynamic>(port);
+
+  Expect.isTrue(await incoming.moveNext());
+  dynamic x = incoming.current;
+  Expect.isTrue(x is List<List>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is List<Map>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is List<Null>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is List<Object>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is List<String>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is List<bool>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is List<double>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is List<int>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is List<num>);
+
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<List, List>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<List, Map>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<List, Null>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<List, Object>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<List, String>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<List, bool>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<List, double>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<List, int>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<List, num>);
+
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Map, List>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Map, Map>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Map, Null>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Map, Object>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Map, String>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Map, bool>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Map, double>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Map, int>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Map, num>);
+
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Null, List>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Null, Map>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Null, Null>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Null, Object>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Null, String>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Null, bool>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Null, double>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Null, int>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Null, num>);
+
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Object, List>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Object, Map>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Object, Null>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Object, Object>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Object, String>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Object, bool>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Object, double>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Object, int>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<Object, num>);
+
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<String, List>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<String, Map>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<String, Null>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<String, Object>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<String, String>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<String, bool>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<String, double>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<String, int>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<String, num>);
+
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<bool, List>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<bool, Map>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<bool, Null>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<bool, Object>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<bool, String>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<bool, bool>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<bool, double>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<bool, int>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<bool, num>);
+
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<double, List>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<double, Map>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<double, Null>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<double, Object>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<double, String>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<double, bool>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<double, double>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<double, int>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<double, num>);
+
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<int, List>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<int, Map>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<int, Null>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<int, Object>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<int, String>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<int, bool>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<int, double>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<int, int>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<int, num>);
+
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<num, List>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<num, Map>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<num, Null>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<num, Object>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<num, String>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<num, bool>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<num, double>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<num, int>);
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current;
+  Expect.isTrue(x is Map<num, num>);
+
+  port.close();
+  print("Parent done");
+}
diff --git a/tests/lib/isolate/message_const_type_arguments_2_test.dart b/tests/lib/isolate/message_const_type_arguments_2_test.dart
new file mode 100644
index 0000000..002aa6e
--- /dev/null
+++ b/tests/lib/isolate/message_const_type_arguments_2_test.dart
@@ -0,0 +1,320 @@
+// 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=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// https://github.com/dart-lang/sdk/issues/35778
+
+import "dart:async";
+import "dart:isolate";
+import "dart:typed_data";
+import "package:expect/expect.dart";
+
+void child(replyPort) {
+  print("Child start");
+
+  replyPort.send(const <List>[]);
+  replyPort.send(const <Map>[]);
+  replyPort.send(const <Null>[]);
+  replyPort.send(const <Object>[]);
+  replyPort.send(const <String>[]);
+  replyPort.send(const <bool>[]);
+  replyPort.send(const <double>[]);
+  replyPort.send(const <int>[]);
+  replyPort.send(const <num>[]);
+
+  replyPort.send(const <List, List>{});
+  replyPort.send(const <List, Map>{});
+  replyPort.send(const <List, Null>{});
+  replyPort.send(const <List, Object>{});
+  replyPort.send(const <List, String>{});
+  replyPort.send(const <List, bool>{});
+  replyPort.send(const <List, double>{});
+  replyPort.send(const <List, int>{});
+  replyPort.send(const <List, num>{});
+
+  replyPort.send(const <Map, List>{});
+  replyPort.send(const <Map, Map>{});
+  replyPort.send(const <Map, Null>{});
+  replyPort.send(const <Map, Object>{});
+  replyPort.send(const <Map, String>{});
+  replyPort.send(const <Map, bool>{});
+  replyPort.send(const <Map, double>{});
+  replyPort.send(const <Map, int>{});
+  replyPort.send(const <Map, num>{});
+
+  replyPort.send(const <Null, List>{});
+  replyPort.send(const <Null, Map>{});
+  replyPort.send(const <Null, Null>{});
+  replyPort.send(const <Null, Object>{});
+  replyPort.send(const <Null, String>{});
+  replyPort.send(const <Null, bool>{});
+  replyPort.send(const <Null, double>{});
+  replyPort.send(const <Null, int>{});
+  replyPort.send(const <Null, num>{});
+
+  replyPort.send(const <Object, List>{});
+  replyPort.send(const <Object, Map>{});
+  replyPort.send(const <Object, Null>{});
+  replyPort.send(const <Object, Object>{});
+  replyPort.send(const <Object, String>{});
+  replyPort.send(const <Object, bool>{});
+  replyPort.send(const <Object, double>{});
+  replyPort.send(const <Object, int>{});
+  replyPort.send(const <Object, num>{});
+
+  replyPort.send(const <String, List>{});
+  replyPort.send(const <String, Map>{});
+  replyPort.send(const <String, Null>{});
+  replyPort.send(const <String, Object>{});
+  replyPort.send(const <String, String>{});
+  replyPort.send(const <String, bool>{});
+  replyPort.send(const <String, double>{});
+  replyPort.send(const <String, int>{});
+  replyPort.send(const <String, num>{});
+
+  replyPort.send(const <bool, List>{});
+  replyPort.send(const <bool, Map>{});
+  replyPort.send(const <bool, Null>{});
+  replyPort.send(const <bool, Object>{});
+  replyPort.send(const <bool, String>{});
+  replyPort.send(const <bool, bool>{});
+  replyPort.send(const <bool, double>{});
+  replyPort.send(const <bool, int>{});
+  replyPort.send(const <bool, num>{});
+
+  replyPort.send(const <double, List>{});
+  replyPort.send(const <double, Map>{});
+  replyPort.send(const <double, Null>{});
+  replyPort.send(const <double, Object>{});
+  replyPort.send(const <double, String>{});
+  replyPort.send(const <double, bool>{});
+  replyPort.send(const <double, double>{});
+  replyPort.send(const <double, int>{});
+  replyPort.send(const <double, num>{});
+
+  replyPort.send(const <int, List>{});
+  replyPort.send(const <int, Map>{});
+  replyPort.send(const <int, Null>{});
+  replyPort.send(const <int, Object>{});
+  replyPort.send(const <int, String>{});
+  replyPort.send(const <int, bool>{});
+  replyPort.send(const <int, double>{});
+  replyPort.send(const <int, int>{});
+  replyPort.send(const <int, num>{});
+
+  replyPort.send(const <num, List>{});
+  replyPort.send(const <num, Map>{});
+  replyPort.send(const <num, Null>{});
+  replyPort.send(const <num, Object>{});
+  replyPort.send(const <num, String>{});
+  replyPort.send(const <num, bool>{});
+  replyPort.send(const <num, double>{});
+  replyPort.send(const <num, int>{});
+  replyPort.send(const <num, num>{});
+
+  print("Child done");
+}
+
+Future<void> main(List<String> args) async {
+  print("Parent start");
+
+  ReceivePort port = new ReceivePort();
+  Isolate.spawn(child, port.sendPort);
+  StreamIterator<dynamic> incoming = new StreamIterator<dynamic>(port);
+
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <List>[]));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Map>[]));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Null>[]));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Object>[]));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <String>[]));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <bool>[]));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <double>[]));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <int>[]));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <num>[]));
+
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <List, List>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <List, Map>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <List, Null>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <List, Object>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <List, String>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <List, bool>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <List, double>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <List, int>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <List, num>{}));
+
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Map, List>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Map, Map>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Map, Null>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Map, Object>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Map, String>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Map, bool>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Map, double>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Map, int>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Map, num>{}));
+
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Null, List>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Null, Map>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Null, Null>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Null, Object>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Null, String>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Null, bool>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Null, double>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Null, int>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Null, num>{}));
+
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Object, List>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Object, Map>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Object, Null>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Object, Object>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Object, String>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Object, bool>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Object, double>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Object, int>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <Object, num>{}));
+
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <String, List>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <String, Map>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <String, Null>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <String, Object>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <String, String>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <String, bool>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <String, double>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <String, int>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <String, num>{}));
+
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <bool, List>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <bool, Map>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <bool, Null>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <bool, Object>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <bool, String>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <bool, bool>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <bool, double>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <bool, int>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <bool, num>{}));
+
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <double, List>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <double, Map>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <double, Null>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <double, Object>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <double, String>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <double, bool>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <double, double>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <double, int>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <double, num>{}));
+
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <int, List>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <int, Map>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <int, Null>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <int, Object>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <int, String>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <int, bool>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <int, double>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <int, int>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <int, num>{}));
+
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <num, List>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <num, Map>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <num, Null>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <num, Object>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <num, String>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <num, bool>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <num, double>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <num, int>{}));
+  Expect.isTrue(await incoming.moveNext());
+  Expect.isTrue(identical(incoming.current, const <num, num>{}));
+
+  port.close();
+  print("Parent done");
+}
diff --git a/tests/lib/isolate/message_enum_test.dart b/tests/lib/isolate/message_enum_test.dart
new file mode 100644
index 0000000..801afd4d
--- /dev/null
+++ b/tests/lib/isolate/message_enum_test.dart
@@ -0,0 +1,30 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import "dart:isolate";
+
+enum Foo { BAR, BAZ }
+
+main() {
+  var p;
+  p = new RawReceivePort((map) {
+    Expect.equals(1, map.keys.length);
+    Expect.equals(42, map.values.first);
+    var key = map.keys.first;
+    Expect.equals(42, map[key]);
+    p.close();
+  });
+  asyncStart();
+  Isolate.spawn(sendIt, p.sendPort).whenComplete(asyncEnd);
+}
+
+void sendIt(port) {
+  var map = {Foo.BAR: 42};
+  port.send(map);
+}
diff --git a/tests/lib/isolate/message_test.dart b/tests/lib/isolate/message_test.dart
new file mode 100644
index 0000000..8a7ec69
--- /dev/null
+++ b/tests/lib/isolate/message_test.dart
@@ -0,0 +1,153 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Dart test program for testing serialization of messages.
+// VMOptions=--enable_type_checks --enable_asserts
+
+library MessageTest;
+
+import 'dart:async';
+import 'dart:isolate';
+
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+// ---------------------------------------------------------------------------
+// Message passing test.
+// ---------------------------------------------------------------------------
+
+class MessageTest {
+  static const List list1 = const ["Hello", "World", "Hello", 0xfffffffffff];
+  static const List list2 = const [null, list1, list1, list1, list1];
+  static const List list3 = const [list2, 2.0, true, false, 0xfffffffffff];
+  static const Map map1 = const {
+    "a=1": 1,
+    "b=2": 2,
+    "c=3": 3,
+  };
+  static const Map map2 = const {
+    "list1": list1,
+    "list2": list2,
+    "list3": list3,
+  };
+  static const List list4 = const [map1, map2];
+  static const List elms = const [
+    list1,
+    list2,
+    list3,
+    list4,
+  ];
+
+  static void VerifyMap(Map expected, Map actual) {
+    Expect.equals(actual.length, expected.length);
+    testForEachMap(key, value) {
+      if (value is List) {
+        VerifyList(value, actual[key]);
+      } else {
+        Expect.equals(actual[key], value);
+      }
+    }
+
+    expected.forEach(testForEachMap);
+  }
+
+  static void VerifyList(List expected, List actual) {
+    for (int i = 0; i < expected.length; i++) {
+      if (expected[i] is List) {
+        VerifyList(expected[i], actual[i]);
+      } else if (expected[i] is Map) {
+        Expect.type<Map>(actual[i]);
+        VerifyMap(expected[i], actual[i]);
+      } else {
+        Expect.equals(actual[i], expected[i]);
+      }
+    }
+  }
+
+  static void VerifyObject(int index, var actual) {
+    var expected = elms[index];
+    Expect.type<List>(expected);
+    Expect.type<List>(actual);
+    Expect.equals(actual.length, expected.length);
+    VerifyList(expected, actual);
+  }
+}
+
+pingPong(replyTo) {
+  ReceivePort port = new ReceivePort();
+  int count = 0;
+  port.listen((pair) {
+    var message = pair[0];
+    var replyTo = pair[1];
+    if (message == -1) {
+      port.close();
+      replyTo.send(count);
+    } else {
+      // Check if the received object is correct.
+      if (count < MessageTest.elms.length) {
+        MessageTest.VerifyObject(count, message);
+      }
+      // Bounce the received object back so that the sender
+      // can make sure that the object matches.
+      replyTo.send(message);
+      count++;
+    }
+  });
+  replyTo.send(port.sendPort);
+}
+
+Future remoteCall(SendPort port, message) {
+  ReceivePort receivePort = new ReceivePort();
+  port.send([message, receivePort.sendPort]);
+  return receivePort.first;
+}
+
+void main([args, port]) {
+  ReceivePort port = new ReceivePort();
+  Isolate.spawn(pingPong, port.sendPort);
+  asyncStart();
+  port.first.then((remote) {
+    // Send objects and receive them back.
+    for (int i = 0; i < MessageTest.elms.length; i++) {
+      var sentObject = MessageTest.elms[i];
+      asyncStart();
+      remoteCall(remote, sentObject).then((receivedObject) {
+        MessageTest.VerifyObject(i, receivedObject);
+        asyncEnd();
+      });
+    }
+
+    // Send recursive objects and receive them back.
+    List local_list1 = ["Hello", "World", "Hello", 0xffffffffff];
+    List local_list2 = [null, local_list1, local_list1];
+    List local_list3 = [local_list2, 2.0, true, false, 0xffffffffff];
+    List sendObject = new List.filled(5, null);
+    sendObject[0] = local_list1;
+    sendObject[1] = sendObject;
+    sendObject[2] = local_list2;
+    sendObject[3] = sendObject;
+    sendObject[4] = local_list3;
+    remoteCall(remote, sendObject).then((var replyObject) {
+      Expect.type<List>(sendObject);
+      Expect.type<List>(replyObject);
+      Expect.equals(sendObject.length, replyObject.length);
+      Expect.identical(replyObject[1], replyObject);
+      Expect.identical(replyObject[3], replyObject);
+      Expect.identical(replyObject[0], replyObject[2][1]);
+      Expect.identical(replyObject[0], replyObject[2][2]);
+      Expect.identical(replyObject[2], replyObject[4][0]);
+      Expect.identical(replyObject[0][0], replyObject[0][2]);
+      Expect.equals(replyObject[0][3], replyObject[4][4]);
+    });
+
+    // Shutdown the MessageServer.
+    remoteCall(remote, -1).then((message) {
+      Expect.equals(message, MessageTest.elms.length + 1);
+      asyncEnd();
+    });
+  });
+}
diff --git a/tests/lib/isolate/mint_maker_test.dart b/tests/lib/isolate/mint_maker_test.dart
new file mode 100644
index 0000000..c4b25ec
--- /dev/null
+++ b/tests/lib/isolate/mint_maker_test.dart
@@ -0,0 +1,187 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library MintMakerTest;
+
+import 'dart:async';
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+class Mint {
+  Map<SendPort, Purse> _registry;
+  late SendPort port;
+
+  Mint() : _registry = new Map<SendPort, Purse>() {
+    ReceivePort mintPort = new ReceivePort();
+    port = mintPort.sendPort;
+    serveMint(mintPort);
+  }
+
+  void serveMint(ReceivePort port) {
+    port.listen((message) {
+      int balance = message[0];
+      Purse purse = createPurse(balance);
+      message[1].send(purse.port);
+    });
+  }
+
+  Purse createPurse(int balance) {
+    Purse purse = new Purse(this, balance);
+    _registry[purse.port] = purse;
+    return purse;
+  }
+
+  Purse lookupPurse(SendPort port) {
+    return (_registry[port])!;
+  }
+}
+
+class MintWrapper {
+  SendPort _mint;
+  MintWrapper(SendPort this._mint) {}
+
+  void createPurse(int balance, handlePurse(PurseWrapper purse)) {
+    ReceivePort reply = new ReceivePort();
+    reply.first.then((purse) {
+      handlePurse(new PurseWrapper(purse as SendPort));
+    });
+    _mint.send([balance, reply.sendPort]);
+  }
+}
+
+class Purse {
+  Mint mint;
+  int balance;
+  late SendPort port;
+
+  Purse(this.mint, this.balance) {
+    ReceivePort recipient = new ReceivePort();
+    port = recipient.sendPort;
+    servePurse(recipient);
+  }
+
+  void servePurse(ReceivePort recipient) {
+    recipient.listen((message) {
+      String command = message[0];
+      if (command == "balance") {
+        SendPort replyTo = message.last;
+        replyTo.send(queryBalance());
+      } else if (command == "deposit") {
+        Purse source = mint.lookupPurse(message[2]);
+        deposit(message[1], source);
+      } else if (command == "sprout") {
+        SendPort replyTo = message.last;
+        Purse result = sproutPurse();
+        replyTo.send(result.port);
+      } else {
+        // TODO: Send an exception back.
+        throw new UnsupportedError("Unsupported commend: $command");
+      }
+    });
+  }
+
+  int queryBalance() {
+    return balance;
+  }
+
+  Purse sproutPurse() {
+    return mint.createPurse(0);
+  }
+
+  void deposit(int amount, Purse source) {
+    // TODO: Throw an exception if the source purse doesn't hold
+    // enough dough.
+    balance += amount;
+    source.balance -= amount;
+  }
+}
+
+class PurseWrapper {
+  SendPort _purse;
+
+  PurseWrapper(this._purse) {}
+
+  void _sendReceive<T>(String message, replyHandler(T reply)) {
+    ReceivePort reply = new ReceivePort();
+    _purse.send([message, reply.sendPort]);
+    reply.first.then((a) => replyHandler(a as T));
+  }
+
+  void queryBalance(handleBalance(int balance)) {
+    _sendReceive("balance", handleBalance);
+  }
+
+  void sproutPurse(handleSprouted(PurseWrapper sprouted)) {
+    _sendReceive("sprout", (SendPort sprouted) {
+      handleSprouted(new PurseWrapper(sprouted));
+    });
+  }
+
+  void deposit(PurseWrapper source, int amount) {
+    _purse.send(["deposit", amount, source._purse]);
+  }
+}
+
+mintMakerWrapper(SendPort replyPort) {
+  ReceivePort receiver = new ReceivePort();
+  replyPort.send(receiver.sendPort);
+  receiver.listen((replyTo) {
+    Mint mint = new Mint();
+    (replyTo as SendPort).send(mint.port);
+  });
+}
+
+class MintMakerWrapper {
+  final SendPort _port;
+
+  static Future<MintMakerWrapper> create() {
+    ReceivePort reply = new ReceivePort();
+    return Isolate.spawn(mintMakerWrapper, reply.sendPort)
+        .then((_) => reply.first.then((port) => new MintMakerWrapper._(port)));
+  }
+
+  MintMakerWrapper._(this._port);
+
+  void makeMint(handleMint(MintWrapper mint)) {
+    ReceivePort reply = new ReceivePort();
+    reply.first.then((mint) {
+      handleMint(new MintWrapper(mint as SendPort));
+    });
+    _port.send(reply.sendPort);
+  }
+}
+
+_checkBalance(PurseWrapper wrapper, expected) {
+  wrapper.queryBalance((balance) {
+    Expect.equals(balance, expected);
+  });
+}
+
+void main([args, port]) {
+  asyncStart();
+  MintMakerWrapper.create().then((mintMaker) {
+    mintMaker.makeMint((mint) {
+      mint.createPurse(100, (purse) {
+        _checkBalance(purse, 100);
+        purse.sproutPurse((sprouted) {
+          _checkBalance(sprouted, 0);
+          _checkBalance(purse, 100);
+
+          sprouted.deposit(purse, 5);
+          _checkBalance(sprouted, 0 + 5);
+          _checkBalance(purse, 100 - 5);
+
+          sprouted.deposit(purse, 42);
+          _checkBalance(sprouted, 0 + 5 + 42);
+          _checkBalance(purse, 100 - 5 - 42);
+          asyncEnd();
+        });
+      });
+    });
+  });
+}
diff --git a/tests/lib/isolate/native_wrapper_message_test.dart b/tests/lib/isolate/native_wrapper_message_test.dart
new file mode 100644
index 0000000..2b663d5
--- /dev/null
+++ b/tests/lib/isolate/native_wrapper_message_test.dart
@@ -0,0 +1,37 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import 'dart:isolate';
+import 'dart:nativewrappers';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+
+echo(msg) {
+  var data = msg[0];
+  var reply = msg[1];
+  reply.send('echoing ${data(1)}}');
+}
+
+class Test extends NativeFieldWrapperClass2 {
+  Test(this.i, this.j);
+  int i, j;
+}
+
+main() {
+  var port = new RawReceivePort();
+  var obj = new Test(1, 2);
+  var msg = [obj, port.sendPort];
+  var snd = Isolate.spawn(echo, msg);
+
+  asyncStart();
+  snd.catchError((e) {
+    Expect.isTrue(e is ArgumentError);
+    Expect.isTrue("$e".contains("NativeWrapper"));
+    port.close();
+    asyncEnd();
+  });
+}
diff --git a/tests/lib/isolate/nested_spawn2_test.dart b/tests/lib/isolate/nested_spawn2_test.dart
new file mode 100644
index 0000000..d335909
--- /dev/null
+++ b/tests/lib/isolate/nested_spawn2_test.dart
@@ -0,0 +1,79 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Dart test program for testing that isolates can spawn other isolates and
+// that the nested isolates can communicate with the main once the spawner has
+// disappeared.
+
+library NestedSpawn2Test;
+
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+void isolateA(SendPort init) {
+  ReceivePort port = new ReceivePort();
+  init.send(port.sendPort);
+  port.first.then((message) {
+    Expect.equals(message[0], "launch nested!");
+    SendPort replyTo = message[1];
+    Isolate.spawn(isolateB, replyTo);
+  });
+}
+
+String msg0 = "0 there?";
+String msg1 = "1 Yes.";
+String msg2 = "2 great. Think the other one is already dead?";
+String msg3 = "3 Give him some time.";
+String msg4 = "4 now?";
+String msg5 = "5 Now.";
+String msg6 = "6 Great. Bye";
+
+void _call(SendPort p, msg, void onreceive(m, replyTo)) {
+  final replyTo = new ReceivePort();
+  p.send([msg, replyTo.sendPort]);
+  replyTo.first.then((m) {
+    onreceive(m[0], m[1]);
+  });
+}
+
+void isolateB(SendPort mainPort) {
+  // Do a little ping-pong dance to give the intermediate isolate
+  // time to die.
+  _call(mainPort, msg0, ((msg, replyTo) {
+    Expect.equals(msg[0], "1");
+    _call(replyTo, msg2, ((msg, replyTo) {
+      Expect.equals(msg[0], "3");
+      _call(replyTo, msg4, ((msg, replyTo) {
+        Expect.equals(msg[0], "5");
+        replyTo.send([msg6, null]);
+      }));
+    }));
+  }));
+}
+
+void main([args, port]) {
+  // spawned isolate can spawn other isolates
+  ReceivePort init = new ReceivePort();
+  Isolate.spawn(isolateA, init.sendPort);
+  asyncStart();
+  init.first.then((port) {
+    _call(port, "launch nested!", (msg, replyTo) {
+      Expect.equals(msg[0], "0");
+      _call(replyTo, msg1, (msg, replyTo) {
+        Expect.equals(msg[0], "2");
+        _call(replyTo, msg3, (msg, replyTo) {
+          Expect.equals(msg[0], "4");
+          _call(replyTo, msg5, (msg, _) {
+            Expect.equals(msg[0], "6");
+            asyncEnd();
+          });
+        });
+      });
+    });
+  });
+}
diff --git a/tests/lib/isolate/nested_spawn_test.dart b/tests/lib/isolate/nested_spawn_test.dart
new file mode 100644
index 0000000..0bc8c77
--- /dev/null
+++ b/tests/lib/isolate/nested_spawn_test.dart
@@ -0,0 +1,37 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Dart test program for testing that isolates can spawn other isolates.
+
+library NestedSpawnTest;
+
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+void isolateA(message) {
+  message.add("isolateA");
+  Isolate.spawn(isolateB, message);
+}
+
+void isolateB(message) {
+  message.add("isolateB");
+  message[0].send(message);
+}
+
+void main([args, port]) {
+  // spawned isolates can spawn nested isolates
+  ReceivePort port = new ReceivePort();
+  Isolate.spawn(isolateA, [port.sendPort, "main"]);
+  asyncStart();
+  port.first.then((message) {
+    Expect.equals("main", message[1]);
+    Expect.equals("isolateA", message[2]);
+    Expect.equals("isolateB", message[3]);
+    asyncEnd();
+  });
+}
diff --git a/tests/lib/isolate/non_fatal_exception_in_timer_callback_test.dart b/tests/lib/isolate/non_fatal_exception_in_timer_callback_test.dart
new file mode 100644
index 0000000..b361171
--- /dev/null
+++ b/tests/lib/isolate/non_fatal_exception_in_timer_callback_test.dart
@@ -0,0 +1,30 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import 'dart:async';
+import 'dart:isolate';
+import 'dart:io';
+
+main() async {
+  Isolate.current.setErrorsFatal(false);
+
+  new Timer(const Duration(milliseconds: 10), () {
+    print("Timer 1");
+
+    // This unhandled exception should not prevent the second timer from firing.
+    throw "Oh no!";
+  });
+
+  new Timer.periodic(const Duration(milliseconds: 20), (_) {
+    print("Timer 2");
+    exit(0);
+  });
+
+  sleep(const Duration(milliseconds: 30)); //# sleep: ok
+  // With sleep: both timers are due at the same wakeup event.
+  // Without sleep: the timers get separate wakeup events.
+}
diff --git a/tests/lib/isolate/object_leak_test.dart b/tests/lib/isolate/object_leak_test.dart
new file mode 100644
index 0000000..b8b94b4
--- /dev/null
+++ b/tests/lib/isolate/object_leak_test.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for 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
+
+// Regression test for http://dartbug.com/18942
+
+library LeakTest;
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+import 'dart:isolate';
+import 'dart:async';
+
+class A {
+  var x = 0;
+}
+
+fun(msg) {
+  var a = msg[0];
+  var replyTo = msg[1];
+  print("received: ${a.x}");
+  a.x = 1;
+  print("done updating: ${a.x}");
+  replyTo.send("done");
+}
+
+main() {
+  asyncStart();
+  var a = new A();
+  ReceivePort rp = new ReceivePort();
+  Isolate.spawn(fun, [a, rp.sendPort]);
+  rp.first.then((msg) {
+    Expect.equals("done", msg);
+    // Changes in other isolate must not reach here.
+    Expect.equals(0, a.x);
+    asyncEnd();
+  });
+}
diff --git a/tests/lib/isolate/ondone_test.dart b/tests/lib/isolate/ondone_test.dart
new file mode 100644
index 0000000..f378855
--- /dev/null
+++ b/tests/lib/isolate/ondone_test.dart
@@ -0,0 +1,127 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "dart:async";
+import "package:async_helper/async_helper.dart";
+
+void isomain(SendPort replyPort) {
+  RawReceivePort port = new RawReceivePort();
+  port.handler = (v) {
+    if (v == 0) {
+      // Shut down when receiving the 0 message.
+      port.close();
+    } else {
+      replyPort.send(v);
+    }
+  };
+  replyPort.send(port.sendPort);
+}
+
+void main() {
+  testExit();
+  testCancelExit();
+  testOverrideResponse();
+}
+
+void testExit() {
+  bool mayComplete = false;
+  asyncStart();
+  var completer = new Completer(); // Completed by first reply from isolate.
+  RawReceivePort reply = new RawReceivePort(completer.complete);
+  late RawReceivePort onExitPort;
+  onExitPort = new RawReceivePort((v) {
+    if (v != "RESPONSE") throw "WRONG RESPONSE: $v";
+    reply.close();
+    onExitPort.close();
+    if (!mayComplete) throw "COMPLETED EARLY";
+    asyncEnd();
+  });
+  Isolate.spawn(isomain, reply.sendPort).then((Isolate isolate) {
+    isolate.addOnExitListener(onExitPort.sendPort, response: "RESPONSE");
+    return completer.future;
+  }).then((echoPort) {
+    int counter = 4;
+    reply.handler = (v) {
+      if (v != counter) throw "WRONG REPLY";
+      if (v == 0) throw "REPLY INSTEAD OF SHUTDOWN";
+      counter--;
+      mayComplete = (counter == 0);
+      echoPort.send(counter);
+    };
+    echoPort.send(counter);
+  });
+}
+
+void testCancelExit() {
+  bool mayComplete = false;
+  asyncStart();
+  var completer = new Completer(); // Completed by first reply from isolate.
+  RawReceivePort reply = new RawReceivePort(completer.complete);
+  RawReceivePort onExitPort2 = new RawReceivePort((_) {
+    throw "RECEIVED EXIT MESSAGE";
+  });
+  late RawReceivePort onExitPort1;
+  onExitPort1 = new RawReceivePort((_) {
+    reply.close();
+    onExitPort1.close();
+    if (!mayComplete) throw "COMPLETED EARLY";
+    new Timer(const Duration(milliseconds: 0), () {
+      onExitPort2.close();
+      asyncEnd();
+    });
+  });
+  Isolate.spawn(isomain, reply.sendPort).then((Isolate isolate) {
+    isolate.addOnExitListener(onExitPort2.sendPort);
+    isolate.addOnExitListener(onExitPort1.sendPort);
+    return completer.future.then((echoPort) {
+      int counter = 4;
+      reply.handler = (v) {
+        if (v != counter) throw "WRONG REPLY";
+        if (v == 0) throw "REPLY INSTEAD OF SHUTDOWN";
+        counter--;
+        mayComplete = (counter == 0);
+        if (counter == 1) {
+          // Remove listener 2, keep listener 1.
+          isolate.removeOnExitListener(onExitPort2.sendPort);
+        }
+        echoPort.send(counter);
+      };
+      echoPort.send(counter);
+    });
+  });
+}
+
+void testOverrideResponse() {
+  bool mayComplete = false;
+  asyncStart();
+  var completer = new Completer(); // Completed by first reply from isolate.
+  RawReceivePort reply = new RawReceivePort(completer.complete);
+  late RawReceivePort onExitPort;
+  onExitPort = new RawReceivePort((v) {
+    if (v != "RESPONSE2") throw "WRONG RESPONSE: $v";
+    reply.close();
+    onExitPort.close();
+    if (!mayComplete) throw "COMPLETED EARLY";
+    asyncEnd();
+  });
+  Isolate.spawn(isomain, reply.sendPort).then((Isolate isolate) {
+    isolate.addOnExitListener(onExitPort.sendPort, response: "RESPONSE");
+    isolate.addOnExitListener(onExitPort.sendPort, response: "RESPONSE2");
+    return completer.future;
+  }).then((echoPort) {
+    int counter = 4;
+    reply.handler = (v) {
+      if (v != counter) throw "WRONG REPLY";
+      if (v == 0) throw "REPLY INSTEAD OF SHUTDOWN";
+      counter--;
+      mayComplete = (counter == 0);
+      echoPort.send(counter);
+    };
+    echoPort.send(counter);
+  });
+}
diff --git a/tests/lib/isolate/package_config_test.dart b/tests/lib/isolate/package_config_test.dart
new file mode 100644
index 0000000..cc345ee
--- /dev/null
+++ b/tests/lib/isolate/package_config_test.dart
@@ -0,0 +1,40 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+// VMOptions=--trace_shutdown
+import 'dart:io';
+import 'dart:isolate';
+
+final SPAWN_PACKAGE_CONFIG = "foobar:///no/such/file/";
+
+main([args, port]) async {
+  if (port != null) {
+    testPackageConfig(port);
+    return;
+  }
+  var p = new RawReceivePort();
+  Isolate.spawnUri(Platform.script, [], p.sendPort,
+      packageConfig: Uri.parse(SPAWN_PACKAGE_CONFIG));
+  p.handler = (msg) {
+    p.close();
+    if (msg[0] != SPAWN_PACKAGE_CONFIG) {
+      throw "Bad package config in child isolate: ${msg[0]}";
+    }
+    if (msg[1] != null) {
+      throw "Non-null loaded package config in isolate: ${msg[1]}";
+    }
+    print("SUCCESS");
+  };
+  print("Spawning isolate's package config: ${await Isolate.packageConfig}");
+}
+
+testPackageConfig(port) async {
+  var packageConfigStr = Platform.packageConfig;
+  var packageConfig = await Isolate.packageConfig;
+  print("Spawned isolate's package config flag: $packageConfigStr");
+  print("Spawned isolate's loaded package config: $packageConfig");
+  port.send([packageConfigStr, packageConfig.toString()]);
+}
diff --git a/tests/lib/isolate/package_resolve_test.dart b/tests/lib/isolate/package_resolve_test.dart
new file mode 100644
index 0000000..241732e
--- /dev/null
+++ b/tests/lib/isolate/package_resolve_test.dart
@@ -0,0 +1,52 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import 'dart:io';
+import 'dart:isolate';
+
+final SPAWN_PACKAGE_ROOT = "file:///no/such/package/root/";
+final PACKAGE_URI = "package:foo/bar.dart";
+final PACKAGE_PATH = "file:///no/such/package/root/foo/bar.dart";
+
+main([args, port]) async {
+  if (port != null) {
+    testPackageResolution(port);
+    return;
+  }
+  var p = new RawReceivePort();
+  Isolate.spawnUri(Platform.script, [], p.sendPort,
+      packageRoot: Uri.parse(SPAWN_PACKAGE_ROOT));
+  p.handler = (msg) {
+    p.close();
+    if (msg is! List) {
+      print(msg.runtimeType);
+      throw "Failure return from spawned isolate:\n\n$msg";
+    }
+    if (msg[0] != null) {
+      throw "Bad package root in child isolate: ${msg[0]}";
+    }
+    if (msg[1] != null) {
+      throw "Package path not matching: ${msg[1]}";
+    }
+    print("SUCCESS");
+  };
+  print("Spawning isolate's package root: ${await Isolate.packageRoot}");
+}
+
+testPackageResolution(port) async {
+  try {
+    var packageRootStr = Platform.packageRoot;
+    var packageRoot = await Isolate.packageRoot;
+    var resolvedPkg = await Isolate.resolvePackageUri(Uri.parse(PACKAGE_URI));
+    print("Spawned isolate's package root flag: $packageRootStr");
+    print("Spawned isolate's loaded package root: $packageRoot");
+    print("Spawned isolate's resolved package path: $resolvedPkg");
+    port.send([packageRoot.toString(), resolvedPkg.toString()]);
+  } catch (e, s) {
+    port.send("$e\n$s\n");
+  }
+}
diff --git a/tests/lib/isolate/package_root_test.dart b/tests/lib/isolate/package_root_test.dart
new file mode 100644
index 0000000..390df69
--- /dev/null
+++ b/tests/lib/isolate/package_root_test.dart
@@ -0,0 +1,35 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import 'dart:io';
+import 'dart:isolate';
+
+final SPAWN_PACKAGE_ROOT = "file:///no/such/file/";
+
+main([args, port]) async {
+  if (port != null) {
+    testPackageRoot(port);
+    return;
+  }
+  var p = new RawReceivePort();
+  Isolate.spawnUri(Platform.script, [], p.sendPort,
+      packageRoot: Uri.parse(SPAWN_PACKAGE_ROOT));
+  p.handler = (msg) {
+    p.close();
+    if (msg != null) {
+      throw "Bad package root in child isolate: $msg";
+    }
+    print("SUCCESS");
+  };
+  print("Spawning isolate's package root: ${await Isolate.packageRoot}");
+}
+
+testPackageRoot(port) async {
+  var packageRoot = await Isolate.packageRoot;
+  print("Spawned isolate's package root: $packageRoot");
+  port.send(packageRoot);
+}
diff --git a/tests/lib/isolate/pause_test.dart b/tests/lib/isolate/pause_test.dart
new file mode 100644
index 0000000..1e97f00a
--- /dev/null
+++ b/tests/lib/isolate/pause_test.dart
@@ -0,0 +1,47 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "dart:async";
+import "package:async_helper/async_helper.dart";
+
+isomain1(replyPort) {
+  RawReceivePort port = new RawReceivePort();
+  port.handler = (v) {
+    replyPort.send(v);
+    port.close();
+  };
+  replyPort.send(port.sendPort);
+}
+
+main() {
+  asyncStart();
+  RawReceivePort reply = new RawReceivePort();
+  late Isolate isolate;
+  late Capability resume;
+  var completer = new Completer(); // Completed by first reply from isolate.
+  reply.handler = completer.complete;
+  Isolate.spawn(isomain1, reply.sendPort).then((Isolate iso) {
+    isolate = iso;
+    return completer.future;
+  }).then((echoPort) {
+    // Isolate has been created, and first response has been returned.
+    resume = isolate.pause();
+    echoPort.send(24);
+    reply.handler = (v) {
+      throw "RESPONSE WHILE PAUSED?!?";
+    };
+    return new Future.delayed(const Duration(milliseconds: 250));
+  }).then((_) {
+    reply.handler = (v) {
+      if (v != 24) throw "WRONG ANSWER!";
+      reply.close();
+      asyncEnd();
+    };
+    isolate.resume(resume);
+  });
+}
diff --git a/tests/lib/isolate/ping_pause_test.dart b/tests/lib/isolate/ping_pause_test.dart
new file mode 100644
index 0000000..48ad135
--- /dev/null
+++ b/tests/lib/isolate/ping_pause_test.dart
@@ -0,0 +1,52 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+isomain1(replyPort) {
+  RawReceivePort port = new RawReceivePort();
+  port.handler = (v) {
+    replyPort.send(v);
+    if (v == 0) port.close();
+  };
+  replyPort.send(port.sendPort);
+}
+
+void main() {
+  asyncStart();
+  var completer = new Completer(); // Completed by first reply from isolate.
+  RawReceivePort reply = new RawReceivePort(completer.complete);
+  Isolate.spawn(isomain1, reply.sendPort).then((Isolate isolate) {
+    List result = [];
+    completer.future.then((echoPort) {
+      reply.handler = (v) {
+        result.add(v);
+        if (v == 0) {
+          Expect.listEquals([4, 3, 2, 1, 0], result);
+          reply.close();
+          asyncEnd();
+        }
+      };
+      echoPort.send(4);
+      echoPort.send(3);
+      Capability resume = isolate.pause();
+      var pingPort = new RawReceivePort();
+      pingPort.handler = (_) {
+        Expect.isTrue(result.length <= 2);
+        echoPort.send(0);
+        isolate.resume(resume);
+        pingPort.close();
+      };
+      isolate.ping(pingPort.sendPort, priority: Isolate.beforeNextEvent);
+      echoPort.send(2);
+      echoPort.send(1);
+    });
+  });
+}
diff --git a/tests/lib/isolate/ping_test.dart b/tests/lib/isolate/ping_test.dart
new file mode 100644
index 0000000..4371a4c0
--- /dev/null
+++ b/tests/lib/isolate/ping_test.dart
@@ -0,0 +1,63 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+isomain1(replyPort) {
+  RawReceivePort port = new RawReceivePort();
+  port.handler = (v) {
+    replyPort.send(v);
+    if (v == 0) port.close();
+  };
+  replyPort.send(port.sendPort);
+}
+
+void main() {
+  asyncStart();
+  var completer = new Completer(); // Completed by first reply from isolate.
+  RawReceivePort reply = new RawReceivePort(completer.complete);
+  Isolate.spawn(isomain1, reply.sendPort).then((Isolate isolate) {
+    List result = [];
+    completer.future.then((echoPort) {
+      reply.handler = (v) {
+        result.add(v);
+        if (v == 0) {
+          Expect.listEquals(["alive", "control"],
+              result.where((x) => x is String).toList(), "control events");
+          Expect.listEquals([3, 2, 1, 0],
+              result.where((x) => x is int).toList(), "data events");
+          Expect.isTrue(
+              result.indexOf("alive") < result.indexOf(2), "alive index < 2");
+          Expect.isTrue(result.indexOf("control") < result.indexOf(1),
+              "control index < 1");
+          reply.close();
+          asyncEnd();
+        }
+      };
+      var pingPort = new RawReceivePort();
+      int pingCount = 0;
+      pingPort.handler = (response) {
+        result.add(response);
+        pingCount++;
+        if (pingCount == 2) pingPort.close();
+      };
+      ping(message, priority) {
+        isolate.ping(pingPort.sendPort, response: message, priority: priority);
+      }
+
+      echoPort.send(3);
+      ping("alive", Isolate.immediate);
+      echoPort.send(2);
+      ping("control", Isolate.beforeNextEvent);
+      echoPort.send(1);
+      echoPort.send(0);
+    });
+  });
+}
diff --git a/tests/lib/isolate/port_test.dart b/tests/lib/isolate/port_test.dart
new file mode 100644
index 0000000..937d75e
--- /dev/null
+++ b/tests/lib/isolate/port_test.dart
@@ -0,0 +1,63 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Test properties of ports.
+
+library PortTest;
+
+import "package:expect/expect.dart";
+import 'dart:isolate';
+
+main() {
+  testHashCode();
+  testEquals();
+  testMap();
+}
+
+void testHashCode() {
+  ReceivePort rp0 = new ReceivePort();
+  ReceivePort rp1 = new ReceivePort();
+  Expect.equals(rp0.sendPort.hashCode, rp0.sendPort.hashCode);
+  Expect.equals(rp1.sendPort.hashCode, rp1.sendPort.hashCode);
+  rp0.close();
+  rp1.close();
+}
+
+void testEquals() {
+  ReceivePort rp0 = new ReceivePort();
+  ReceivePort rp1 = new ReceivePort();
+  Expect.equals(rp0.sendPort, rp0.sendPort);
+  Expect.equals(rp1.sendPort, rp1.sendPort);
+  Expect.isFalse(rp0.sendPort == rp1.sendPort);
+  rp0.close();
+  rp1.close();
+}
+
+void testMap() {
+  ReceivePort rp0 = new ReceivePort();
+  ReceivePort rp1 = new ReceivePort();
+  final map = new Map<SendPort, int>();
+  map[rp0.sendPort] = 42;
+  map[rp1.sendPort] = 87;
+  Expect.equals(map[rp0.sendPort], 42);
+  Expect.equals(map[rp1.sendPort], 87);
+
+  map[rp0.sendPort] = 99;
+  Expect.equals(map[rp0.sendPort], 99);
+  Expect.equals(map[rp1.sendPort], 87);
+
+  map.remove(rp0.sendPort);
+  Expect.isFalse(map.containsKey(rp0.sendPort));
+  Expect.equals(map[rp1.sendPort], 87);
+
+  map.remove(rp1.sendPort);
+  Expect.isFalse(map.containsKey(rp0.sendPort));
+  Expect.isFalse(map.containsKey(rp1.sendPort));
+
+  rp0.close();
+  rp1.close();
+}
diff --git a/tests/lib/isolate/raw_port_test.dart b/tests/lib/isolate/raw_port_test.dart
new file mode 100644
index 0000000..6f24212
--- /dev/null
+++ b/tests/lib/isolate/raw_port_test.dart
@@ -0,0 +1,85 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Test RawReceivePort.
+
+library raw_port_test;
+
+import 'dart:async';
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+void remote(SendPort port) {
+  port.send("reply");
+}
+
+void remote2(SendPort port) {
+  port.send("reply 1");
+  port.send("reply 2");
+}
+
+main([args, port]) async {
+  // Raw receive
+  asyncTest(() {
+    final completer = Completer<void>();
+    RawReceivePort port = new RawReceivePort();
+    Isolate.spawn(remote, port.sendPort);
+    port.handler = (v) {
+      Expect.equals(v, "reply");
+      port.close();
+      completer.complete();
+    };
+    return completer.future;
+  });
+
+  // Raw receive hashCode
+  {
+    RawReceivePort port = new RawReceivePort();
+    Expect.isTrue(port.hashCode is int);
+    port.close();
+  }
+
+  // Raw receive twice - change handler
+  asyncTest(() {
+    final completer = Completer<void>();
+    RawReceivePort port = new RawReceivePort();
+    Isolate.spawn(remote2, port.sendPort);
+    port.handler = (v) {
+      Expect.equals(v, "reply 1");
+      port.handler = (v) {
+        Expect.equals(v, "reply 2");
+        port.close();
+        completer.complete();
+      };
+    };
+    return completer.future;
+  });
+
+  // From raw port
+  asyncTest(() {
+    final completer = Completer<void>();
+    RawReceivePort rawPort = new RawReceivePort();
+    Isolate.spawn(remote, rawPort.sendPort);
+    rawPort.handler = (v) {
+      Expect.equals(v, "reply");
+      ReceivePort port = new ReceivePort.fromRawReceivePort(rawPort);
+      Isolate.spawn(remote, rawPort.sendPort);
+      Isolate.spawn(remote, port.sendPort);
+      int ctr = 2;
+      port.listen(
+        (v) {
+          Expect.equals(v, "reply");
+          ctr--;
+          if (ctr == 0) port.close();
+        },
+        onDone: () => completer.complete(),
+      );
+    };
+    return completer.future;
+  });
+}
diff --git a/tests/lib/isolate/regress_34752_test.dart b/tests/lib/isolate/regress_34752_test.dart
new file mode 100644
index 0000000..dafff29
--- /dev/null
+++ b/tests/lib/isolate/regress_34752_test.dart
@@ -0,0 +1,39 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Verifies that large BigInt can be passed through a message port and
+// simple arithmetic operations still work after that.
+// This is a regression test for https://github.com/dart-lang/sdk/issues/34752.
+
+import 'dart:io';
+import 'dart:isolate';
+
+import "package:expect/expect.dart";
+
+const int kValue = 12345678;
+const int kShift = 8192 * 8;
+
+void verify(BigInt x) {
+  BigInt y = x >> kShift;
+  Expect.equals("$kValue", "$y");
+}
+
+void main() {
+  BigInt big = BigInt.from(kValue) << kShift;
+  verify(big);
+
+  final rp = new ReceivePort();
+  rp.listen((dynamic data) {
+    BigInt received = data as BigInt;
+    verify(received);
+    BigInt x = received + BigInt.one - BigInt.one;
+    verify(x);
+    print("ok");
+    exit(0);
+  });
+  rp.sendPort.send(big);
+}
diff --git a/tests/lib/isolate/regress_flutter_22796_test.dart b/tests/lib/isolate/regress_flutter_22796_test.dart
new file mode 100644
index 0000000..1cab5f1
--- /dev/null
+++ b/tests/lib/isolate/regress_flutter_22796_test.dart
@@ -0,0 +1,46 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Verifies that large typed data can be passed in a field through message port.
+// This is a regression test for
+// https://github.com/flutter/flutter/issues/22796.
+
+import 'dart:io';
+import 'dart:isolate';
+import 'dart:typed_data';
+
+import "package:expect/expect.dart";
+
+class A {
+  // TFA thinks this field has type _Int32List but sending an object across
+  // a message port creates an instance that has _ExternalInt32List inside.
+  final _int32Array = new Int32List(5 * 1024);
+  A() {
+    _int32Array.setRange(
+        0, _int32Array.length, Iterable.generate(_int32Array.length));
+    verify();
+  }
+
+  void verify() {
+    for (var i = 0; i < _int32Array.length; i++) {
+      if (_int32Array[i] != i) {
+        print('_int32Array[$i]: ${_int32Array[i]} != ${i}');
+      }
+      Expect.equals(i, _int32Array[i]);
+    }
+  }
+}
+
+void main() {
+  final rp = new ReceivePort();
+  rp.listen((dynamic data) {
+    (data as A).verify();
+    print("ok");
+    exit(0);
+  });
+  rp.sendPort.send(A());
+}
diff --git a/tests/lib/isolate/request_reply_test.dart b/tests/lib/isolate/request_reply_test.dart
new file mode 100644
index 0000000..54d4d7c
--- /dev/null
+++ b/tests/lib/isolate/request_reply_test.dart
@@ -0,0 +1,38 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library RequestReplyTest;
+
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+void entry(initPort) {
+  ReceivePort port = new ReceivePort();
+  initPort.send(port.sendPort);
+  port.listen((pair) {
+    var message = pair[0];
+    SendPort replyTo = pair[1];
+    replyTo.send(message + 87);
+    port.close();
+  });
+}
+
+void main([args, port]) {
+  ReceivePort init = new ReceivePort();
+  Isolate.spawn(entry, init.sendPort);
+  asyncStart();
+  init.first.then((port) {
+    ReceivePort reply = new ReceivePort();
+    port.send([99, reply.sendPort]);
+    reply.listen((message) {
+      Expect.equals(message, 99 + 87);
+      reply.close();
+      asyncEnd();
+    });
+  });
+}
diff --git a/tests/lib/isolate/resolve_package_uri_test.dart b/tests/lib/isolate/resolve_package_uri_test.dart
new file mode 100644
index 0000000..9ea1d03
--- /dev/null
+++ b/tests/lib/isolate/resolve_package_uri_test.dart
@@ -0,0 +1,17 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Regression test for faulty encoding of `Isolate.resolvePackageUri` by
+// dart2js.
+
+import 'dart:async';
+import 'dart:isolate';
+
+main() {
+  var uri = Isolate.resolvePackageUri(Uri.parse('memory:main.dart'));
+  print(uri);
+}
diff --git a/tests/lib/isolate/send_private_test.dart b/tests/lib/isolate/send_private_test.dart
new file mode 100644
index 0000000..8ed717f
--- /dev/null
+++ b/tests/lib/isolate/send_private_test.dart
@@ -0,0 +1,35 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+import "package:expect/expect.dart";
+
+class _Private {
+  String data;
+  _Private(this.data);
+}
+
+void child(message) {
+  print("Got message: $message");
+  SendPort replyPort = message[0];
+  _Private object = message[1];
+  Expect.isTrue(object is _Private);
+  Expect.equals("XYZ", object.data);
+  replyPort.send(object);
+}
+
+void main() {
+  var port;
+  port = new RawReceivePort((message) {
+    print("Got reply: $message");
+    Expect.isTrue(message is _Private);
+    Expect.equals("XYZ", message.data);
+    port.close();
+  });
+
+  Isolate.spawn(child, [port.sendPort, new _Private("XYZ")]);
+}
diff --git a/tests/lib/isolate/simple_message_test.dart b/tests/lib/isolate/simple_message_test.dart
new file mode 100644
index 0000000..f0310af
--- /dev/null
+++ b/tests/lib/isolate/simple_message_test.dart
@@ -0,0 +1,30 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Dart test program for testing that isolates are spawned.
+
+library IsolateNegativeTest;
+
+import "package:expect/expect.dart";
+import 'dart:isolate';
+import "package:async_helper/async_helper.dart";
+
+void entry(SendPort replyTo) {
+  var message = "foo";
+  message = "bar"; // //# 01: runtime error
+  replyTo.send(message);
+}
+
+main() {
+  asyncStart();
+  ReceivePort response = new ReceivePort();
+  Isolate.spawn(entry, response.sendPort);
+  response.first.then((message) {
+    Expect.equals("foo", message);
+    asyncEnd();
+  });
+}
diff --git a/tests/lib/isolate/spawn_function_custom_class_test.dart b/tests/lib/isolate/spawn_function_custom_class_test.dart
new file mode 100644
index 0000000..0046cef
--- /dev/null
+++ b/tests/lib/isolate/spawn_function_custom_class_test.dart
@@ -0,0 +1,48 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Create a user-defined class in a new isolate.
+//
+// Regression test for vm bug 2235: We were forgetting to finalize
+// classes in new isolates started using the v2 api.
+
+library spawn_tests;
+
+import 'dart:isolate';
+import 'package:expect/expect.dart';
+
+class MyClass {
+  final myVar = 'there';
+  myFunc(msg) {
+    return '$msg $myVar';
+  }
+}
+
+isolateEntryPoint(args) {
+  final reply = args[1];
+  final msg = args[0];
+  reply.send('re: ${new MyClass().myFunc(msg)}');
+}
+
+Future<void> main([args, port]) async {
+  // message - reply chain'
+  final exitPort = ReceivePort();
+  final replyPort = ReceivePort();
+
+  Isolate.spawn(isolateEntryPoint, ['hi', replyPort.sendPort],
+      onExit: exitPort.sendPort);
+
+  replyPort.listen((msg) {
+    replyPort.close();
+    Expect.equals(msg, 're: hi there');
+  });
+
+  // Explicitly await spawned isolate exit to enforce main isolate not
+  // completing (and the stand-alone runtime exiting) before the spawned
+  // isolate is done.
+  await exitPort.first;
+}
diff --git a/tests/lib/isolate/spawn_function_test.dart b/tests/lib/isolate/spawn_function_test.dart
new file mode 100644
index 0000000..bd8d1c1
--- /dev/null
+++ b/tests/lib/isolate/spawn_function_test.dart
@@ -0,0 +1,41 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Example of spawning an isolate from a function.
+library spawn_tests;
+
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+isolateEntryPoint(args) {
+  var msg = args[0];
+  var sendPort = args[1];
+  sendPort.send('re: $msg');
+}
+
+Future<void> main([args, port]) async {
+  // message - reply chain
+  const String debugName = 'spawnedIsolate';
+
+  ReceivePort port = new ReceivePort();
+  asyncStart();
+  port.listen((msg) {
+    port.close();
+    Expect.equals(msg, 're: hi');
+    asyncEnd();
+  });
+
+  // Start new isolate; paused so it's alive till we read the debugName.
+  // If the isolate runs to completion, the isolate might get cleaned up
+  // and debugName might be null.
+  final isolate = await Isolate.spawn(isolateEntryPoint, ['hi', port.sendPort],
+      paused: true, debugName: debugName);
+
+  Expect.equals(isolate.debugName, debugName);
+  isolate.resume(isolate.pauseCapability!);
+}
diff --git a/tests/lib/isolate/spawn_generic_test.dart b/tests/lib/isolate/spawn_generic_test.dart
new file mode 100644
index 0000000..109f2a8
--- /dev/null
+++ b/tests/lib/isolate/spawn_generic_test.dart
@@ -0,0 +1,68 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Check that Isolate.spawn is generic.
+library spawn_generic;
+
+import "dart:isolate";
+import "dart:async";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+void isomain(num args) {
+  print(args);
+  // All is well. No throwing.
+}
+
+void isomain1(num? args) {
+  print(args);
+  // All is well. No throwing.
+}
+
+int _count = 0;
+void enter() {
+  asyncStart();
+  _count++;
+}
+
+bool exit() {
+  asyncEnd();
+  return --_count == 0;
+}
+
+main() {
+  var remotePort = new RawReceivePort();
+  remotePort.handler = (m) {
+    if (m == null) {
+      if (exit()) remotePort.close();
+    } else {
+      List list = m;
+      throw new AsyncError(m[0], new StackTrace.fromString(m[1]));
+    }
+  };
+  var port = remotePort.sendPort;
+
+  // Explicit type works.
+  enter();
+  Isolate.spawn<int>(isomain, 42, onExit: port, onError: port);
+  enter();
+  Isolate.spawn<num>(isomain, 42, onExit: port, onError: port);
+  enter();
+  Isolate.spawn<num>(isomain, 1.2, onExit: port, onError: port);
+  enter();
+  Isolate.spawn<double>(isomain, 1.2, onExit: port, onError: port);
+  enter();
+  Isolate.spawn<int?>(isomain1, null, onExit: port, onError: port);
+
+  // Inference gets it right.
+  enter();
+  Isolate.spawn(isomain, 42, onExit: port, onError: port);
+  enter();
+  Isolate.spawn(isomain, 1.2, onExit: port, onError: port);
+  enter();
+  Isolate.spawn(isomain1, null, onExit: port, onError: port);
+}
diff --git a/tests/lib/isolate/spawn_uri_child_isolate.dart b/tests/lib/isolate/spawn_uri_child_isolate.dart
new file mode 100644
index 0000000..81f40f9
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_child_isolate.dart
@@ -0,0 +1,11 @@
+// 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.
+
+// Child isolate code to be spawned from a URI to this file.
+library SpawnUriChildIsolate;
+
+void main(List<String> args, replyTo) {
+  var data = args[0];
+  replyTo.send('re: $data');
+}
diff --git a/tests/lib/isolate/spawn_uri_exported_main.dart b/tests/lib/isolate/spawn_uri_exported_main.dart
new file mode 100644
index 0000000..afd0122
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_exported_main.dart
@@ -0,0 +1,5 @@
+export "spawn_uri_exported_main_lib.dart";
+
+maine() {
+  print("This is not the maine you are looking for.");
+}
diff --git a/tests/lib/isolate/spawn_uri_exported_main_lib.dart b/tests/lib/isolate/spawn_uri_exported_main_lib.dart
new file mode 100644
index 0000000..7500465
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_exported_main_lib.dart
@@ -0,0 +1,6 @@
+library spawn_uri_exported_main_lib;
+
+main(args, msg) {
+  print("From main!");
+  msg.send(50);
+}
diff --git a/tests/lib/isolate/spawn_uri_exported_main_test.dart b/tests/lib/isolate/spawn_uri_exported_main_test.dart
new file mode 100644
index 0000000..837486e
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_exported_main_test.dart
@@ -0,0 +1,30 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:async";
+import "dart:isolate";
+import "package:expect/expect.dart";
+
+main() {
+  print("Spawning isolate.");
+  var t = new Timer(new Duration(seconds: 30), () {
+    // it might take some time for new isolate to get spawned from source since
+    // it needs to be compiled first.
+    Expect.fail("Isolate was not spawned successfully.");
+  });
+  var rp = new RawReceivePort();
+  rp.handler = (msg) {
+    print("Spawned main called.");
+    Expect.equals(msg, 50);
+    rp.close();
+  };
+  Isolate.spawnUri(Uri.parse("spawn_uri_exported_main.dart"), [], rp.sendPort)
+      .then((_) {
+    print("Loaded");
+    t.cancel();
+  });
+}
diff --git a/tests/lib/isolate/spawn_uri_fail_test.dart b/tests/lib/isolate/spawn_uri_fail_test.dart
new file mode 100644
index 0000000..6c9dc98
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_fail_test.dart
@@ -0,0 +1,45 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:io";
+import "dart:isolate";
+import "package:expect/expect.dart";
+
+main() async {
+  var pkgRoot = Uri.parse("file:///no/such/directory/");
+  var pkgConfig = Uri.parse("file:///no/such/.packages");
+  try {
+    var i = await Isolate.spawnUri(Platform.script, [], null,
+        packageRoot: pkgRoot, packageConfig: pkgConfig);
+  } catch (e) {
+    print(e);
+    Expect.isTrue(e is ArgumentError);
+  }
+  try {
+    var i = await Isolate.spawnUri(Platform.script, [], null,
+        packageRoot: pkgRoot, automaticPackageResolution: true);
+  } catch (e) {
+    print(e);
+    Expect.isTrue(e is ArgumentError);
+  }
+  try {
+    var i = await Isolate.spawnUri(Platform.script, [], null,
+        packageConfig: pkgConfig, automaticPackageResolution: true);
+  } catch (e) {
+    print(e);
+    Expect.isTrue(e is ArgumentError);
+  }
+  try {
+    var i = await Isolate.spawnUri(Platform.script, [], null,
+        packageRoot: pkgRoot,
+        packageConfig: pkgConfig,
+        automaticPackageResolution: true);
+  } catch (e) {
+    print(e);
+    Expect.isTrue(e is ArgumentError);
+  }
+}
diff --git a/tests/lib/isolate/spawn_uri_missing_from_isolate_test.dart b/tests/lib/isolate/spawn_uri_missing_from_isolate_test.dart
new file mode 100644
index 0000000..02521b6
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_missing_from_isolate_test.dart
@@ -0,0 +1,44 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+/// Tests that Isolate.spawnUri completes with an error when the given URI
+/// doesn't resolve to an existing resource.
+///
+/// This test is similar to spawn_uri_missing_test.dart, but tests what happens
+/// when Isolate.spawnUri is called from an a spawned isolate.  In dart2js,
+/// these two situations are different.
+library test.isolate.spawn_uri_missing_from_isolate_test;
+
+import 'dart:isolate';
+
+import 'dart:async';
+
+import 'package:async_helper/async_helper.dart';
+
+import 'spawn_uri_missing_test.dart';
+
+const String SUCCESS = 'Test worked.';
+
+void isolate(SendPort port) {
+  doTest().then((_) => port.send(SUCCESS),
+      onError: (error, stack) => port.send('Test failed: $error\n$stack'));
+}
+
+main() {
+  ReceivePort port = new ReceivePort();
+  Isolate.spawn(isolate, port.sendPort);
+  Completer completer = new Completer();
+  port.first.then((message) {
+    if (message == SUCCESS) {
+      completer.complete(null);
+    } else {
+      completer.completeError(message);
+    }
+  });
+
+  asyncTest(() => completer.future);
+}
diff --git a/tests/lib/isolate/spawn_uri_missing_test.dart b/tests/lib/isolate/spawn_uri_missing_test.dart
new file mode 100644
index 0000000..e13ec06
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_missing_test.dart
@@ -0,0 +1,33 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+/// Tests that Isolate.spanUri completes with an error when the given URI
+/// doesn't resolve to an existing resource.
+library test.isolate.spawn_uri_missing_test;
+
+import 'dart:isolate';
+
+import 'dart:async';
+
+import 'package:async_helper/async_helper.dart';
+
+const UNEXPECTED_MESSAGE = 'Created isolate from missing file.';
+
+Future doTest() {
+  return Isolate.spawnUri(Uri.base.resolve('no_such_file'), [], null)
+      .then((Isolate isolate) {
+    throw UNEXPECTED_MESSAGE;
+  }).catchError((error) {
+    if (error == UNEXPECTED_MESSAGE) throw error;
+    print('An error was thrown as expected');
+    return null;
+  });
+}
+
+main() {
+  asyncTest(doTest);
+}
diff --git a/tests/lib/isolate/spawn_uri_multi_test.dart b/tests/lib/isolate/spawn_uri_multi_test.dart
new file mode 100644
index 0000000..d5fdc46
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_multi_test.dart
@@ -0,0 +1,31 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Negative test to make sure that we are reaching all assertions.
+library spawn_tests;
+
+import 'dart:isolate';
+import 'package:async_helper/async_minitest.dart';
+
+/* Dummy import so multi-test copies the file.
+import 'spawn_uri_child_isolate.dart';
+*/
+
+main() {
+  test('isolate fromUri - negative test', () {
+    ReceivePort port = new ReceivePort();
+    port.first.then(expectAsync((msg) {
+      String expectedMessage = 're: hi';
+      // Should be hi, not hello.
+      expectedMessage = 're: hello'; //# 01: runtime error
+      expect(msg, equals(expectedMessage));
+    }));
+
+    Isolate.spawnUri(
+        Uri.parse('spawn_uri_child_isolate.dart'), ['hi'], port.sendPort);
+  });
+}
diff --git a/tests/lib/isolate/spawn_uri_nested_child1_vm_isolate.dart b/tests/lib/isolate/spawn_uri_nested_child1_vm_isolate.dart
new file mode 100644
index 0000000..6008357
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_nested_child1_vm_isolate.dart
@@ -0,0 +1,25 @@
+// 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.
+
+// Example of nested spawning of isolates from a URI
+// Note: the following comment is used by test.dart to additionally compile the
+// other isolate's code.
+library NestedSpawnUriChild1Library;
+
+import 'dart:isolate';
+
+main(List<String> args, message) {
+  ReceivePort port2 = new ReceivePort();
+  port2.listen((msg) {
+    if (msg != "re: hi") throw "Bad response: $msg";
+    port2.close();
+  });
+
+  Isolate.spawnUri(Uri.parse('spawn_uri_nested_child2_vm_isolate.dart'), ['hi'],
+      port2.sendPort);
+
+  var data = message[0];
+  var replyTo = message[1];
+  replyTo.send(data);
+}
diff --git a/tests/lib/isolate/spawn_uri_nested_child2_vm_isolate.dart b/tests/lib/isolate/spawn_uri_nested_child2_vm_isolate.dart
new file mode 100644
index 0000000..a6c90b8f
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_nested_child2_vm_isolate.dart
@@ -0,0 +1,13 @@
+// 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.
+
+// Child isolate code to be spawned from a URI to this file.
+library NestedSpawnUriChild2Library;
+
+import 'dart:isolate';
+
+void main(List<String> args, SendPort replyTo) {
+  var data = args[0];
+  replyTo.send('re: $data');
+}
diff --git a/tests/lib/isolate/spawn_uri_nested_vm_test.dart b/tests/lib/isolate/spawn_uri_nested_vm_test.dart
new file mode 100644
index 0000000..087b5fc
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_nested_vm_test.dart
@@ -0,0 +1,23 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Example of nested spawning of isolates from a URI
+library NestedSpawnUriLibrary;
+
+import 'dart:isolate';
+import 'package:async_helper/async_minitest.dart';
+
+main() {
+  test('isolate fromUri - nested send and reply', () {
+    ReceivePort port = new ReceivePort();
+    Isolate.spawnUri(Uri.parse('spawn_uri_nested_child1_vm_isolate.dart'), [], [
+      [1, 2],
+      port.sendPort
+    ]);
+    port.first.then(expectAsync((result) => print(result)));
+  });
+}
diff --git a/tests/lib/isolate/spawn_uri_test.dart b/tests/lib/isolate/spawn_uri_test.dart
new file mode 100644
index 0000000..28d7bce
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_test.dart
@@ -0,0 +1,42 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Example of spawning an isolate from a URI
+library spawn_tests;
+
+import 'dart:isolate';
+import 'package:async_helper/async_minitest.dart';
+
+main() {
+  test('isolate fromUri - send and reply', () async {
+    const String debugName = 'spawnedIsolate';
+
+    final exitPort = ReceivePort();
+
+    final port = new ReceivePort();
+    port.listen(expectAsync((msg) {
+      expect(msg, equals('re: hi'));
+      port.close();
+    }));
+
+    // Start new isolate; paused so it's alive till we read the debugName.
+    // If the isolate runs to completion, the isolate might get cleaned up
+    // and debugName might be null.
+    final isolate = await Isolate.spawnUri(
+        Uri.parse('spawn_uri_child_isolate.dart'), ['hi'], port.sendPort,
+        paused: true, debugName: debugName, onExit: exitPort.sendPort);
+
+    expect(isolate.debugName, debugName);
+
+    isolate.resume(isolate.pauseCapability!);
+
+    // Explicitly await spawned isolate exit to enforce main isolate not
+    // completing (and the stand-alone runtime exiting) before the spawned
+    // isolate is done.
+    await exitPort.first;
+  });
+}
diff --git a/tests/lib/isolate/spawn_uri_vm_test.dart b/tests/lib/isolate/spawn_uri_vm_test.dart
new file mode 100644
index 0000000..3832b42
--- /dev/null
+++ b/tests/lib/isolate/spawn_uri_vm_test.dart
@@ -0,0 +1,24 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Example of spawning an isolate from a URI
+library spawn_tests;
+
+import 'dart:isolate';
+import 'package:async_helper/async_minitest.dart';
+
+main() {
+  test('isolate fromUri - send and reply', () {
+    ReceivePort port = new ReceivePort();
+    port.first.then(expectAsync((msg) {
+      expect(msg, equals('re: hi'));
+    }));
+
+    Isolate.spawnUri(
+        Uri.parse('spawn_uri_child_isolate.dart'), ['hi'], port.sendPort);
+  });
+}
diff --git a/tests/lib/isolate/stacktrace_message_test.dart b/tests/lib/isolate/stacktrace_message_test.dart
new file mode 100644
index 0000000..41a0820
--- /dev/null
+++ b/tests/lib/isolate/stacktrace_message_test.dart
@@ -0,0 +1,42 @@
+// 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.
+
+import 'dart:isolate';
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+// Test that StackTrace objects can be sent between isolates spawned from
+// the same isolate using Isolate.spawn.
+
+void main() {
+  asyncStart();
+  ReceivePort reply = new ReceivePort();
+  Isolate.spawn(runTest, reply.sendPort);
+  reply.first.then((pair) {
+    StackTrace stack = pair[0];
+    String stackString = pair[1];
+    if (stack == null) {
+      print("Failed to send stack-trace");
+      print(stackString);
+      Expect.fail("Sending stack-trace");
+    }
+    Expect.equals(stackString, "!$stack");
+    print(stack);
+    asyncEnd();
+  });
+}
+
+runTest(SendPort sendport) {
+  try {
+    throw 'sorry';
+  } catch (e, stack) {
+    try {
+      sendport.send([stack, "$stack"]);
+      print("Stacktrace sent");
+    } catch (e, s) {
+      print("Stacktrace not sent");
+      sendport.send([null, "$e\n$s"]);
+    }
+  }
+}
diff --git a/tests/lib/isolate/start_paused_test.dart b/tests/lib/isolate/start_paused_test.dart
new file mode 100644
index 0000000..c9b2b57
--- /dev/null
+++ b/tests/lib/isolate/start_paused_test.dart
@@ -0,0 +1,82 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library start_paused_test;
+
+import "dart:isolate";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+void isomain(SendPort p) {
+  p.send("DONE");
+}
+
+void notyet(_) {
+  throw "NOT YET";
+}
+
+void main() {
+  asyncStart();
+  test1();
+  test2();
+  asyncEnd();
+}
+
+void test1() {
+  // Test that a paused isolate doesn't send events.
+  // We start two isolates, one paused and one not.
+  // The unpaused one must send an event, after which
+  // we resume that paused isolate, and expect the second event.
+  // This is not a guaranteed test, since it can succeede even if the
+  // paused isolate isn't really paused.
+  // However, it must never fail, since that would mean that a paused
+  // isolate sends a message.
+  asyncStart();
+  RawReceivePort p1 = new RawReceivePort(notyet);
+  Isolate.spawn(isomain, p1.sendPort, paused: true).then((isolate) {
+    late RawReceivePort p2;
+    p2 = new RawReceivePort((x) {
+      Expect.equals("DONE", x);
+      p2.close();
+      p1.handler = (x) {
+        Expect.equals("DONE", x);
+        p1.close();
+        asyncEnd();
+      };
+      isolate.resume(isolate.pauseCapability!);
+    });
+    Isolate.spawn(isomain, p2.sendPort);
+  });
+}
+
+void test2() {
+  // Test that a paused isolate doesn't send events.
+  // Like the test above, except that we change the pause capability
+  // of the paused isolate by pausing it using another capability and
+  // then resuming the initial pause. This must not cause it to send
+  // a message before the second pause is resumed as well.
+  asyncStart();
+  RawReceivePort p1 = new RawReceivePort(notyet);
+  Isolate.spawn(isomain, p1.sendPort, paused: true).then((isolate) {
+    late RawReceivePort p2;
+    Capability c2 = new Capability();
+    // Switch to another pause capability.
+    isolate.pause(c2);
+    isolate.resume(isolate.pauseCapability!);
+    p2 = new RawReceivePort((x) {
+      Expect.equals("DONE", x);
+      p2.close();
+      p1.handler = (x) {
+        Expect.equals("DONE", x);
+        p1.close();
+        asyncEnd();
+      };
+      isolate.resume(c2);
+    });
+    Isolate.spawn(isomain, p2.sendPort);
+  });
+}
diff --git a/tests/lib/isolate/static_function_lib.dart b/tests/lib/isolate/static_function_lib.dart
new file mode 100644
index 0000000..886284f
--- /dev/null
+++ b/tests/lib/isolate/static_function_lib.dart
@@ -0,0 +1,44 @@
+// 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.
+
+library static_function_testlib;
+
+import "dart:isolate" show SendPort;
+
+// Used by static_function_test.dart.
+
+void function(port) {
+  port.send("LIBTOP");
+}
+
+void _function(port) {
+  port.send("_LIBTOP");
+}
+
+Function get privateFunction => _function;
+
+class C {
+  static void function(SendPort port) {
+    port.send("LIB");
+  }
+
+  static void _function(SendPort port) {
+    port.send("LIBPRIVATE");
+  }
+
+  static Function get privateFunction => _function;
+}
+
+Function get privateClassFunction => _C.function;
+Function get privateClassAndFunction => _C._function;
+
+class _C {
+  static void function(SendPort port) {
+    port.send("_LIB");
+  }
+
+  static void _function(SendPort port) {
+    port.send("_LIBPRIVATE");
+  }
+}
diff --git a/tests/lib/isolate/static_function_test.dart b/tests/lib/isolate/static_function_test.dart
new file mode 100644
index 0000000..e1ece06
--- /dev/null
+++ b/tests/lib/isolate/static_function_test.dart
@@ -0,0 +1,149 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// Test starting isolate with static functions (and toplevel ones, for sanity).
+
+library static_function_test;
+
+import 'dart:isolate';
+import 'static_function_lib.dart' as lib;
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+void function(SendPort port) {
+  port.send("TOP");
+}
+
+void _function(SendPort port) {
+  port.send("_TOP");
+}
+
+// A closure created at top-level (not inside a method), but not by a top-level
+// function declaration.
+var staticClosure = (SendPort port) {
+  port.send("WHAT?");
+};
+
+// An unnamed closure created inside a function.
+get dynamicClosure => (SendPort port) {
+      port.send("WHAT??");
+    };
+
+// A named closure created inside a function.
+get namedDynamicClosure {
+  void foo(SendPort port) {
+    port.send("WHAT FOO??");
+  }
+
+  ;
+  return foo;
+}
+
+class C {
+  // Unnamed closure created during object initialization, but not inside
+  // a method or constructor.
+  final Function instanceClosure = (SendPort port) {
+    port.send("C WHAT?");
+  };
+  // Unnamed closure created during object initializer list evaluation.
+  final Function constructorInitializerClosure;
+  // Unnamed closure created inside constructor body.
+  late Function constructorBodyClosure;
+  // Named closure created inside constructor body.
+  late Function namedConstructorBodyClosure;
+
+  C()
+      : constructorInitializerClosure = ((SendPort port) {
+          port.send("Init?");
+        }) {
+    constructorBodyClosure = (SendPort port) {
+      port.send("bodyClosure?");
+    };
+    void foo(SendPort port) {
+      port.send("namedBodyClosure?");
+    }
+
+    namedConstructorBodyClosure = foo;
+  }
+
+  static void function(SendPort port) {
+    port.send("YES");
+  }
+
+  static void _function(SendPort port) {
+    port.send("PRIVATE");
+  }
+
+  void instanceMethod(SendPort port) {
+    port.send("INSTANCE WHAT?");
+  }
+}
+
+class _C {
+  static void function(SendPort port) {
+    port.send("_YES");
+  }
+
+  static void _function(SendPort port) {
+    port.send("_PRIVATE");
+  }
+}
+
+void spawnTest(name, function, response) {
+  print(name);
+  ReceivePort r = new ReceivePort();
+  Isolate.spawn(function, r.sendPort);
+  asyncStart();
+  r.listen((v) {
+    Expect.equals(v, response);
+    r.close();
+    asyncEnd();
+  });
+}
+
+void functionFailTest(name, function) {
+  print("throws on $name");
+  asyncStart();
+  Isolate.spawn(function, null).catchError((e) {
+    /* do nothing */
+    asyncEnd();
+  });
+}
+
+void main([args, port]) {
+  asyncStart();
+  // Sanity check.
+  spawnTest("function", function, "TOP");
+  spawnTest("_function", _function, "_TOP");
+  spawnTest("lib.function", lib.function, "LIBTOP");
+  spawnTest("lib._function", lib.privateFunction, "_LIBTOP");
+
+  // Local static functions.
+  spawnTest("class.function", C.function, "YES");
+  spawnTest("class._function", C._function, "PRIVATE");
+  spawnTest("_class._function", _C.function, "_YES");
+  spawnTest("_class._function", _C._function, "_PRIVATE");
+
+  // Imported static functions.
+  spawnTest("lib.class.function", lib.C.function, "LIB");
+  spawnTest("lib.class._function", lib.C.privateFunction, "LIBPRIVATE");
+  spawnTest("lib._class._function", lib.privateClassFunction, "_LIB");
+  spawnTest("lib._class._function", lib.privateClassAndFunction, "_LIBPRIVATE");
+
+  // Negative tests
+  functionFailTest("static closure", staticClosure);
+  functionFailTest("dynamic closure", dynamicClosure);
+  functionFailTest("named dynamic closure", namedDynamicClosure);
+  functionFailTest("instance closure", new C().instanceClosure);
+  functionFailTest(
+      "initializer closure", new C().constructorInitializerClosure);
+  functionFailTest("constructor closure", new C().constructorBodyClosure);
+  functionFailTest(
+      "named constructor closure", new C().namedConstructorBodyClosure);
+  functionFailTest("instance method", new C().instanceMethod);
+  asyncEnd();
+}
diff --git a/tests/lib/isolate/string_from_environment_default_value_test.dart b/tests/lib/isolate/string_from_environment_default_value_test.dart
new file mode 100644
index 0000000..78b2feb
--- /dev/null
+++ b/tests/lib/isolate/string_from_environment_default_value_test.dart
@@ -0,0 +1,24 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:isolate";
+
+import "package:expect/expect.dart";
+
+void test(port) {
+  Expect.equals('', const String.fromEnvironment('NOT_FOUND'));
+  Expect.equals(
+      'x', const String.fromEnvironment('NOT_FOUND', defaultValue: 'x'));
+  if (port != null) port.send(null);
+}
+
+main() {
+  test(null);
+  var port = new ReceivePort();
+  Isolate.spawn(test, port.sendPort);
+  port.listen((_) => port.close());
+}
diff --git a/tests/lib/isolate/timer_isolate_test.dart b/tests/lib/isolate/timer_isolate_test.dart
new file mode 100644
index 0000000..58e93c5
--- /dev/null
+++ b/tests/lib/isolate/timer_isolate_test.dart
@@ -0,0 +1,41 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library multiple_timer_test;
+
+import 'dart:isolate';
+import 'dart:async';
+import 'package:async_helper/async_minitest.dart';
+
+const Duration TIMEOUT = const Duration(milliseconds: 100);
+
+// Some browsers (Firefox and IE so far) can trigger too early. Add a safety
+// margin. We use identical(1, 1.0) as an easy way to know if the test is
+// compiled by dart2js.
+int get safetyMargin => identical(1, 1.0) ? 100 : 0;
+
+createTimer(replyTo) {
+  new Timer(TIMEOUT, () {
+    replyTo.send("timer_fired");
+  });
+}
+
+main() {
+  test("timer in isolate", () {
+    Stopwatch stopwatch = new Stopwatch();
+    ReceivePort port = new ReceivePort();
+
+    port.first.then(expectAsync((msg) {
+      expect("timer_fired", msg);
+      expect(stopwatch.elapsedMilliseconds + safetyMargin,
+          greaterThanOrEqualTo(TIMEOUT.inMilliseconds));
+    }));
+
+    stopwatch.start();
+    var remote = Isolate.spawn(createTimer, port.sendPort);
+  });
+}
diff --git a/tests/lib/isolate/timer_multiple_isolates_test.dart b/tests/lib/isolate/timer_multiple_isolates_test.dart
new file mode 100644
index 0000000..3f7d8f3
--- /dev/null
+++ b/tests/lib/isolate/timer_multiple_isolates_test.dart
@@ -0,0 +1,45 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+library timer_multiple_isolates_test;
+
+import 'dart:isolate';
+import 'dart:async';
+
+child(msg) {
+  var i = msg[0] as int;
+  var reponsePort = msg[1];
+  print("Starting child $i");
+
+  // Keep this isolate running to prevent its shutdown from touching the event
+  // handler.
+  new RawReceivePort();
+
+  // Try to get separate wakeups for each isolate.
+  new Timer(new Duration(milliseconds: 100 * (i + 1)), () {
+    print("Timer fired $i");
+    reponsePort.send(null);
+  });
+}
+
+main() {
+  var port;
+  var replies = 0;
+  var n = 3;
+  port = new RawReceivePort((reply) {
+    replies++;
+    print("Got reply $replies");
+    if (replies == n) {
+      print("Done");
+      port.close();
+    }
+  });
+
+  for (var i = 0; i < n; i++) {
+    Isolate.spawn(child, [i, port.sendPort]);
+  }
+}
diff --git a/tests/lib/isolate/transferable_failed_to_send_test.dart b/tests/lib/isolate/transferable_failed_to_send_test.dart
new file mode 100644
index 0000000..ac6f80e
--- /dev/null
+++ b/tests/lib/isolate/transferable_failed_to_send_test.dart
@@ -0,0 +1,86 @@
+// 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=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:io" show ServerSocket;
+import "dart:isolate";
+import "dart:typed_data" show ByteData;
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+void main() async {
+  final port = new ReceivePort();
+
+  // Sending a socket object will result in an error.
+  final socket = await ServerSocket.bind('localhost', 0);
+
+  final x = new ByteData(4);
+  for (int i = 0; i < 4; i++) {
+    x.setUint8(i, i);
+  }
+  {
+    final transferableFirst = TransferableTypedData.fromList([x]);
+    Expect.throwsArgumentError(
+        () => port.sendPort.send(<dynamic>[transferableFirst, socket]));
+    // Once TransferableTypedData was sent even if attempt failed, it can't be
+    // materialized.
+    // This need to be changed so that on failed send we should not detach the
+    // buffer form the transferrable. The order should not matter (i.e. if the
+    // error happens before or after the serializer hits a transferrable object)
+
+    final data1 = transferableFirst.materialize().asUint8List();
+    Expect.equals(x.lengthInBytes, data1.length);
+    for (int i = 0; i < data1.length; i++) {
+      Expect.equals(i, data1[i]);
+    }
+  }
+  {
+    final transferableFirst = TransferableTypedData.fromList([x]);
+    Expect.throwsArgumentError(() => port.sendPort
+        .send(<dynamic>[transferableFirst, transferableFirst, socket]));
+    // Once TransferableTypedData was sent even if attempt failed, it can't be
+    // materialized.
+    // This need to be changed so that on failed send we should not detach the
+    // buffer form the transferrable. The order should not matter (i.e. if the
+    // error happens before or after the serializer hits a transferrable object)
+
+    final data1 = transferableFirst.materialize().asUint8List();
+    Expect.equals(x.lengthInBytes, data1.length);
+    for (int i = 0; i < data1.length; i++) {
+      Expect.equals(i, data1[i]);
+    }
+  }
+
+  {
+    final transferableSecond = TransferableTypedData.fromList([x]);
+    Expect.throwsArgumentError(
+        () => port.sendPort.send(<dynamic>[socket, transferableSecond]));
+    // Once TransferableTypedData was sent even if attempt failed, it can't be
+    // materialized.
+    final data2 = transferableSecond.materialize().asUint8List();
+    Expect.equals(x.lengthInBytes, data2.length);
+    for (int i = 0; i < data2.length; i++) {
+      Expect.equals(i, data2[i]);
+    }
+  }
+
+  {
+    final transferableSecond = TransferableTypedData.fromList([x]);
+    Expect.throwsArgumentError(() => port.sendPort
+        .send(<dynamic>[socket, transferableSecond, transferableSecond]));
+    // Once TransferableTypedData was sent even if attempt failed, it can't be
+    // materialized.
+    final data2 = transferableSecond.materialize().asUint8List();
+    Expect.equals(x.lengthInBytes, data2.length);
+    for (int i = 0; i < data2.length; i++) {
+      Expect.equals(i, data2[i]);
+    }
+  }
+
+  socket.close();
+  port.close();
+}
diff --git a/tests/lib/isolate/transferable_test.dart b/tests/lib/isolate/transferable_test.dart
new file mode 100644
index 0000000..8680828
--- /dev/null
+++ b/tests/lib/isolate/transferable_test.dart
@@ -0,0 +1,287 @@
+// 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=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import "dart:async";
+import "dart:collection";
+import "dart:isolate";
+import "dart:typed_data";
+import "package:expect/expect.dart";
+
+const large = 2 * 1024 * 1024;
+
+void child(replyPort) {
+  print("Child start");
+
+  print("Child ByteData");
+  dynamic x = new ByteData(large);
+  for (int i = 0; i < 4; i++) {
+    x.setInt8(i, i);
+  }
+  replyPort.send(TransferableTypedData.fromList([x.buffer.asUint8List()]));
+
+  print("Child Uint8List");
+  x = new Uint8List(large);
+  for (int i = 0; i < 4; i++) {
+    x[i] = i;
+  }
+  replyPort.send(TransferableTypedData.fromList([x]));
+
+  print("Child Uint8List.view");
+  x = new Uint8List.view(x.buffer, 1, 2);
+  replyPort.send(TransferableTypedData.fromList([x]));
+
+  print("Child Int8List");
+  x = new Int8List(large);
+  for (int i = 0; i < 4; i++) {
+    x[i] = i;
+  }
+  replyPort.send(TransferableTypedData.fromList([x]));
+
+  print("Child Uint16List");
+  x = new Uint16List(large);
+  for (int i = 0; i < 4; i++) {
+    x[i] = i;
+  }
+  replyPort.send(TransferableTypedData.fromList([x]));
+
+  print("Child Int16List");
+  x = new Int16List(large);
+  for (int i = 0; i < 4; i++) {
+    x[i] = i;
+  }
+  replyPort.send(TransferableTypedData.fromList([x]));
+
+  print("Child Uint32List");
+  x = new Uint32List(large);
+  for (int i = 0; i < 4; i++) {
+    x[i] = i;
+  }
+  replyPort.send(TransferableTypedData.fromList([x]));
+
+  print("Child Int32List");
+  x = new Int32List(large);
+  for (int i = 0; i < 4; i++) {
+    x[i] = i;
+  }
+  replyPort.send(TransferableTypedData.fromList([x]));
+
+  print("Child Uint64List");
+  x = new Uint64List(large);
+  for (int i = 0; i < 4; i++) {
+    x[i] = i;
+  }
+  replyPort.send(TransferableTypedData.fromList([x]));
+
+  print("Child Int64List");
+  x = new Int64List(large);
+  for (int i = 0; i < 4; i++) {
+    x[i] = i;
+  }
+  replyPort.send(TransferableTypedData.fromList([x]));
+
+  print("Child two Uint8Lists");
+  x = new Uint8List(large);
+  for (int i = 0; i < 4; i++) {
+    x[i] = i;
+  }
+  replyPort.send([
+    TransferableTypedData.fromList([x]),
+    TransferableTypedData.fromList([x])
+  ]);
+
+  print("Child same Uint8List twice - materialize first");
+  x = new Uint8List(large);
+  for (int i = 0; i < 4; i++) {
+    x[i] = i;
+  }
+  var tr = TransferableTypedData.fromList([x]);
+  replyPort.send([tr, tr]);
+
+  print("Child same Uint8List twice - materialize second");
+  x = new Uint8List(large);
+  for (int i = 0; i < 4; i++) {
+    x[i] = i;
+  }
+  tr = TransferableTypedData.fromList([x]);
+  replyPort.send([tr, tr]);
+
+  print("Child done");
+}
+
+Future<void> main(List<String> args) async {
+  print("Parent start");
+
+  ReceivePort port = new ReceivePort();
+  Isolate.spawn(child, port.sendPort);
+  StreamIterator<dynamic> incoming = new StreamIterator<dynamic>(port);
+
+  print("Parent ByteData");
+  Expect.isTrue(await incoming.moveNext());
+  dynamic x = incoming.current.materialize().asByteData();
+  Expect.isTrue(x is ByteData);
+  Expect.equals(large, x.length);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, x.getUint8(i));
+  }
+
+  print("Parent Uint8List");
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current.materialize();
+  Expect.isTrue(x is ByteBuffer);
+  x = x.asUint8List();
+  Expect.equals(large, x.length);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, x[i]);
+  }
+
+  print("Parent Uint8List view");
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current.materialize().asUint8List();
+  Expect.equals(1, x[0]);
+  Expect.equals(2, x[1]);
+
+  print("Parent Int8");
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current.materialize().asInt8List();
+  Expect.equals(large, x.length);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, x[i]);
+  }
+
+  print("Parent Uint16");
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current.materialize().asUint16List();
+  Expect.equals(large, x.length);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, x[i]);
+  }
+
+  print("Parent Int16");
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current.materialize().asInt16List();
+  Expect.equals(large, x.length);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, x[i]);
+  }
+
+  print("Parent Uint32");
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current.materialize().asUint32List();
+  Expect.equals(large, x.length);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, x[i]);
+  }
+
+  print("Parent Int32");
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current.materialize().asInt32List();
+  Expect.equals(large, x.length);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, x[i]);
+  }
+
+  print("Parent Uint64");
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current.materialize().asUint64List();
+  Expect.equals(large, x.length);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, x[i]);
+  }
+
+  print("Parent Int64");
+  Expect.isTrue(await incoming.moveNext());
+  x = incoming.current.materialize().asInt64List();
+  Expect.equals(large, x.length);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, x[i]);
+  }
+
+  print("Parent two Uint8Lists");
+  Expect.isTrue(await incoming.moveNext());
+  final x1 = incoming.current[0].materialize().asUint8List();
+  final x2 = incoming.current[1].materialize().asUint8List();
+  Expect.equals(large, x1.length);
+  Expect.equals(large, x2.length);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, x1[i]);
+    Expect.equals(i, x2[i]);
+  }
+
+  print("Parent same Uint8Lists twice, materialize first");
+  Expect.isTrue(await incoming.moveNext());
+  final tr0 = incoming.current[0].materialize().asUint8List();
+  Expect.throwsArgumentError(() => incoming.current[1].materialize());
+  Expect.equals(large, tr0.length);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, tr0[i]);
+  }
+
+  print("Parent same Uint8Lists twice, materialize second");
+  Expect.isTrue(await incoming.moveNext());
+  final tr1 = incoming.current[1].materialize().asUint8List();
+  Expect.throwsArgumentError(() => incoming.current[0].materialize());
+  Expect.equals(large, tr1.length);
+  for (int i = 0; i < 4; i++) {
+    Expect.equals(i, tr1[i]);
+  }
+
+  port.close();
+  print("Parent done");
+
+  testCreateMaterializeInSameIsolate();
+  testIterableToList();
+  testUserExtendedList();
+}
+
+testCreateMaterializeInSameIsolate() {
+  // Test same-isolate operation of TransferableTypedData.
+  final Uint8List bytes = new Uint8List(large);
+  for (int i = 0; i < bytes.length; ++i) {
+    bytes[i] = i % 256;
+  }
+  final tr = TransferableTypedData.fromList([bytes]);
+  Expect.listEquals(bytes, tr.materialize().asUint8List());
+}
+
+testIterableToList() {
+  // Test that iterable.toList() can be used as an argument.
+  final list1 = Uint8List(10);
+  for (int i = 0; i < list1.length; i++) {
+    list1[i] = i;
+  }
+  final list2 = Uint8List(20);
+  for (int i = 0; i < list2.length; i++) {
+    list2[i] = i + list1.length;
+  }
+  final map = {list1: true, list2: true};
+  Iterable<Uint8List> iterable = map.keys;
+  final result = TransferableTypedData.fromList(iterable.toList())
+      .materialize()
+      .asUint8List();
+  for (int i = 0; i < result.length; i++) {
+    Expect.equals(i, result[i]);
+  }
+}
+
+class MyList<E> extends ListBase<E> {
+  List<E> _source;
+  MyList(this._source);
+  int get length => _source.length;
+  void set length(int length) {
+    _source.length = length;
+  }
+
+  E operator [](int index) => _source[index];
+  void operator []=(int index, E value) {
+    _source[index] = value;
+  }
+}
+
+testUserExtendedList() {
+  final list = MyList<TypedData>([Uint8List(10)]);
+  TransferableTypedData.fromList(list);
+}
diff --git a/tests/lib/isolate/typed_message_test.dart b/tests/lib/isolate/typed_message_test.dart
new file mode 100644
index 0000000..38e24d0
--- /dev/null
+++ b/tests/lib/isolate/typed_message_test.dart
@@ -0,0 +1,51 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+// Dart test program for testing isolate communication with
+// typed objects.
+
+library TypedMessageTest;
+
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+import "dart:isolate";
+
+void logMessages(SendPort replyTo) {
+  print("Starting log server.");
+  ReceivePort port = new ReceivePort();
+  replyTo.send(port.sendPort);
+  port.first.then((_message) {
+    List<int> message = _message;
+    print("Log $message");
+    Expect.equals(5, message.length);
+    Expect.equals(0, message[0]);
+    Expect.equals(1, message[1]);
+    Expect.equals(2, message[2]);
+    Expect.equals(3, message[3]);
+    Expect.equals(4, message[4]);
+    port.close();
+    replyTo.send(1);
+    print("Stopping log server.");
+  });
+}
+
+main() {
+  asyncStart();
+  ReceivePort receivePort = new ReceivePort();
+  Future<Isolate> remote = Isolate.spawn(logMessages, receivePort.sendPort);
+  var msg = <int>[0, 1, 2, 3, 4];
+  StreamIterator iterator = new StreamIterator(receivePort);
+  iterator.moveNext().then((b) {
+    SendPort sendPort = iterator.current;
+    sendPort.send(msg);
+    return iterator.moveNext();
+  }).then((b) {
+    Expect.equals(1, iterator.current);
+    receivePort.close();
+    asyncEnd();
+  });
+}
diff --git a/tests/lib/isolate/unboxed_double_snapshot_writer_test.dart b/tests/lib/isolate/unboxed_double_snapshot_writer_test.dart
new file mode 100644
index 0000000..132ad6b
--- /dev/null
+++ b/tests/lib/isolate/unboxed_double_snapshot_writer_test.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:async';
+import 'dart:isolate';
+import 'dart:typed_data';
+
+import 'package:expect/expect.dart';
+
+double getDoubleWithHeapObjectTag() {
+  final bd = ByteData(8);
+  bd.setUint64(0, 0x8000000000000001, Endian.host);
+  final double v = bd.getFloat64(0, Endian.host);
+  return v;
+}
+
+class Foo {
+  final double x = getDoubleWithHeapObjectTag();
+  final String name = "Foo Class";
+  Foo();
+}
+
+main(args) async {
+  final receivePort = new ReceivePort();
+
+  receivePort.sendPort.send(Foo());
+  final it = StreamIterator(receivePort);
+  Expect.isTrue(await it.moveNext());
+  final Foo receivedFoo = it.current as Foo;
+  Expect.equals(receivedFoo.x, getDoubleWithHeapObjectTag());
+  Expect.equals(receivedFoo.name, "Foo Class");
+  await it.cancel();
+}
diff --git a/tests/lib/isolate/unresolved_ports_test.dart b/tests/lib/isolate/unresolved_ports_test.dart
new file mode 100644
index 0000000..7707fab
--- /dev/null
+++ b/tests/lib/isolate/unresolved_ports_test.dart
@@ -0,0 +1,83 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+// spawns multiple isolates and sends unresolved ports between them.
+library unresolved_ports;
+
+import 'dart:async';
+import 'dart:isolate';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+// This test does the following:
+//  - main spawns two isolates: 'tim' and 'beth'
+//  - 'tim' spawns an isolate: 'bob'
+//  - main starts a message chain:
+//       main -> beth -> tim -> bob -> main
+//    by giving 'beth' a send-port to 'tim'.
+
+bethIsolate(init) {
+  ReceivePort port = initIsolate(init);
+  // TODO(sigmund): use expectAsync when it is OK to use it within an isolate
+  // (issue #6856)
+  port.first.then((msg) => msg[1]
+      .send(['${msg[0]}\nBeth says: Tim are you coming? And Bob?', msg[2]]));
+}
+
+timIsolate(init) {
+  ReceivePort port = initIsolate(init);
+  spawnFunction(bobIsolate).then((bob) {
+    port.first.then((msg) => bob.send([
+          '${msg[0]}\nTim says: Can you tell "main" that we are all coming?',
+          msg[1]
+        ]));
+  });
+}
+
+bobIsolate(init) {
+  ReceivePort port = initIsolate(init);
+  port.first
+      .then((msg) => msg[1].send('${msg[0]}\nBob says: we are all coming!'));
+}
+
+Future spawnFunction(function) {
+  ReceivePort init = new ReceivePort();
+  Isolate.spawn(function, init.sendPort);
+  return init.first;
+}
+
+ReceivePort initIsolate(SendPort starter) {
+  ReceivePort port = new ReceivePort();
+  starter.send(port.sendPort);
+  return port;
+}
+
+baseTest({bool failForNegativeTest: false}) {
+  // Message chain with unresolved ports
+  ReceivePort port = new ReceivePort();
+  asyncStart();
+  port.listen((msg) {
+    Expect.equals(
+        msg,
+        'main says: Beth, find out if Tim is coming.'
+        '\nBeth says: Tim are you coming? And Bob?'
+        '\nTim says: Can you tell "main" that we are all coming?'
+        '\nBob says: we are all coming!');
+    Expect.isFalse(failForNegativeTest);
+    port.close();
+    asyncEnd();
+  });
+
+  spawnFunction(timIsolate).then((tim) {
+    spawnFunction(bethIsolate).then((beth) {
+      beth.send(
+          ['main says: Beth, find out if Tim is coming.', tim, port.sendPort]);
+    });
+  });
+}
+
+void main([args, port]) => baseTest();
diff --git a/tests/lib/isolate/vm_rehash_test.dart b/tests/lib/isolate/vm_rehash_test.dart
new file mode 100644
index 0000000..f5a0a73
--- /dev/null
+++ b/tests/lib/isolate/vm_rehash_test.dart
@@ -0,0 +1,62 @@
+// 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.
+
+// VMOptions=--enable-isolate-groups
+// VMOptions=--no-enable-isolate-groups
+
+import 'dart:async';
+import 'dart:isolate';
+
+int globalHash = 0;
+
+class A {
+  int get hashCode => globalHash;
+  bool operator ==(other) => true;
+}
+
+final key = new A();
+
+other(SendPort sendPort) async {
+  // We use a different hash than the main isolate, but the re-hashing on our
+  // side happens after this line and should therefore also deserialize the map
+  // with a new hash, so we should be able to find the value in the map.
+  globalHash = 4321;
+
+  final port = new ReceivePort();
+  sendPort.send(port.sendPort);
+
+  final Map map = await port.first;
+  sendPort.send(map[key]);
+  port.close();
+}
+
+void launchIsolate(argument) {
+  other(argument);
+}
+
+main() async {
+  final r = new ReceivePort();
+  final re = new ReceivePort();
+  final map = {};
+
+  globalHash = 1234;
+  map[key] = 1;
+
+  await Isolate.spawn(launchIsolate, r.sendPort, onError: re.sendPort);
+  re.listen((error) => throw 'Error $error');
+
+  final it = new StreamIterator(r);
+
+  await it.moveNext();
+  final SendPort port = it.current;
+
+  port.send(map);
+  await it.moveNext();
+  final otherIsolateMapEntry = await it.current;
+  if (map[key] != otherIsolateMapEntry) {
+    throw "test failed";
+  }
+  r.close();
+  re.close();
+}
diff --git a/tests/lib/lib_kernel.status b/tests/lib/lib_kernel.status
index 51d3d73..8151fcf 100644
--- a/tests/lib/lib_kernel.status
+++ b/tests/lib/lib_kernel.status
@@ -55,6 +55,7 @@
 isolate/static_function_test: Skip # Times out. Issue 31855. CompileTimeError. Issue 31402
 mirrors/invocation_fuzz_test: Crash
 mirrors/metadata_allowed_values_test/16: Skip # Flaky, crashes.
+mirrors/native_class_test: SkipByDesign # Imports dart:html
 
 [ $hot_reload_rollback && ($compiler == dartk || $compiler == dartkb) ]
 isolate/illegal_msg_function_test: Skip # Timeout
diff --git a/tests/lib/lib_vm.status b/tests/lib/lib_vm.status
index 4412dcf..c4207d9 100644
--- a/tests/lib/lib_vm.status
+++ b/tests/lib/lib_vm.status
@@ -80,5 +80,93 @@
 [ $runtime == vm && ($arch == simarm || $arch == simarmv6) ]
 convert/utf85_test: Skip # Pass, Slow Issue 12644.
 
+[ $arch == simarm || $arch == simarm64 || $hot_reload || $hot_reload_rollback ]
+convert/chunked_conversion_utf88_test: SkipSlow
+convert/streamed_conversion_json_utf8_decode_test: SkipSlow
+convert/utf85_test: SkipSlow
+
 [ $arch == simarmv6 || $arch == simarm && $runtime == vm ]
 convert/chunked_conversion_utf88_test: Skip # Pass, Slow Issue 12644.
+
+[ $hot_reload || $hot_reload_rollback ]
+isolate/bool_from_environment_default_value_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/capability_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/compile_time_error_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/count_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/cross_isolate_message_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/enum_const_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/error_at_spawn_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/error_at_spawnuri_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/error_exit_at_spawn_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/error_exit_at_spawnuri_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/exit_at_spawn_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/exit_at_spawnuri_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/function_send1_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/function_send_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/handle_error2_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/handle_error3_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/handle_error_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/illegal_msg_function_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/illegal_msg_mirror_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/int32_length_overflow_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/int_from_environment_default_value_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/isolate_complex_messages_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/isolate_current_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/isolate_import_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/issue_21398_parent_isolate1_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/issue_21398_parent_isolate2_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/issue_21398_parent_isolate_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/issue_22778_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/issue_35626_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/issue_6610_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/kill2_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/kill_self_synchronously_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/kill_self_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/kill_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/large_byte_data_leak_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/large_byte_data_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/mandel_isolate_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/message2_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/message3_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/message4_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/message_const_type_arguments_1_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/message_const_type_arguments_2_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/message_enum_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/message_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/mint_maker_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/native_wrapper_message_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/nested_spawn2_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/nested_spawn_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/non_fatal_exception_in_timer_callback_test/none: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/non_fatal_exception_in_timer_callback_test/sleep: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/object_leak_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/ondone_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/pause_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/ping_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/port_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/raw_port_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/regress_34752_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/regress_flutter_22796_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/request_reply_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/resolve_package_uri_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/send_private_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/simple_message_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/spawn_function_custom_class_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/spawn_function_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/spawn_generic_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/spawn_uri_exported_main_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/spawn_uri_missing_from_isolate_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/spawn_uri_missing_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/spawn_uri_multi_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/spawn_uri_nested_vm_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/spawn_uri_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/spawn_uri_vm_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/start_paused_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/string_from_environment_default_value_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/timer_isolate_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/timer_multiple_isolates_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/transferable_failed_to_send_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/transferable_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/typed_message_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/unresolved_ports_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
+isolate/vm_rehash_test: Skip # https://dartbug.com/36097: Ongoing concurrency work.
diff --git a/tests/lib/mirrors/abstract_class_test.dart b/tests/lib/mirrors/abstract_class_test.dart
index 285d032..17fd28f 100644
--- a/tests/lib/mirrors/abstract_class_test.dart
+++ b/tests/lib/mirrors/abstract_class_test.dart
@@ -53,11 +53,11 @@
 }
 
 abstract class GenericFoo<T> {
-  T genericFoo();
+  T genericFoo(T t);
 }
 
 class GenericBar<T> extends GenericFoo<T> {
-  T genericFoo() {}
+  T genericFoo(T t) => t;
 }
 
 testGeneric() {
diff --git a/tests/lib/mirrors/generic_local_function_test.dart b/tests/lib/mirrors/generic_local_function_test.dart
index bc56f29..c8bd0e8 100644
--- a/tests/lib/mirrors/generic_local_function_test.dart
+++ b/tests/lib/mirrors/generic_local_function_test.dart
@@ -12,13 +12,13 @@
 
 class C<T> {
   makeClosure1() {
-    T closure1(T t) {}
+    T closure1(T t) => t;
     return closure1;
   }
 
   makeClosure2() {
     enclosing() {
-      T closure2(T t) {}
+      T closure2(T t) => t;
       return closure2;
     }
 
diff --git a/tests/lib/mirrors/generics_dynamic_test.dart b/tests/lib/mirrors/generics_dynamic_test.dart
index 8a583da..152d0d8 100644
--- a/tests/lib/mirrors/generics_dynamic_test.dart
+++ b/tests/lib/mirrors/generics_dynamic_test.dart
@@ -8,7 +8,7 @@
 class A<T> {}
 
 class B<T extends A> extends A implements C {
-  A m(A a) {}
+  A m(A a) => a;
   late A field;
 }
 
diff --git a/tests/lib/mirrors/metadata_symbol_literal_test.dart b/tests/lib/mirrors/metadata_symbol_literal_test.dart
index 129d4cd..5709ecd 100644
--- a/tests/lib/mirrors/metadata_symbol_literal_test.dart
+++ b/tests/lib/mirrors/metadata_symbol_literal_test.dart
@@ -12,7 +12,7 @@
 
 class U {
   @T(#x)
-  int field;
+  int? field;
 }
 
 main() {
diff --git a/tests/lib/mirrors/method_mirror_source_test.dart b/tests/lib/mirrors/method_mirror_source_test.dart
index a55fbc7..5657efa 100644
--- a/tests/lib/mirrors/method_mirror_source_test.dart
+++ b/tests/lib/mirrors/method_mirror_source_test.dart
@@ -36,8 +36,8 @@
     : _y = y,
       super();
 
-  factory C.other(num z) {}
-  factory C.other2() {}
+  factory C.other(num z) => C(z, z);
+  factory C.other2() => C(0, 0);
   factory C.other3() = C.other2;
 
   static dynamic foo() {
@@ -87,7 +87,7 @@
       "    : _y = y,\n"
       "      super();");
   expectSource(cm.declarations[#C.other]!,
-      "factory C.other(num z) {}");
+      "factory C.other(num z) => C(z, z);");
   expectSource(cm.declarations[#C.other3]!,
       "factory C.other3() = C.other2;");
 
diff --git a/tests/lib/mirrors/mirror_in_static_init_test.dart b/tests/lib/mirrors/mirror_in_static_init_test.dart
index 4de3ef6..90afd5a 100644
--- a/tests/lib/mirrors/mirror_in_static_init_test.dart
+++ b/tests/lib/mirrors/mirror_in_static_init_test.dart
@@ -12,7 +12,7 @@
 
 // This class is only loaded during initialization of `staticField`.
 abstract class C {
-  int _a;
+  int? _a;
   // This is a syntax error on purpose.
   C([this._a: 0]); //# 01: compile-time error
 }
diff --git a/tests/lib/mirrors/operator_test.dart b/tests/lib/mirrors/operator_test.dart
index a7fafbc..c466775 100644
--- a/tests/lib/mirrors/operator_test.dart
+++ b/tests/lib/mirrors/operator_test.dart
@@ -12,26 +12,26 @@
 import 'stringify.dart';
 
 class Foo {
-  Foo operator ~() {}
-  Foo operator -() {}
+  Foo operator ~() => this;
+  Foo operator -() => this;
 
-  bool operator ==(a) {}
-  Foo operator [](int a) {}
-  Foo operator *(Foo a) {}
-  Foo operator /(Foo a) {}
-  Foo operator %(Foo a) {}
-  Foo operator ~/(Foo a) {}
-  Foo operator +(Foo a) {}
-  Foo operator <<(Foo a) {}
-  Foo operator >>(Foo a) {}
-  Foo operator >=(Foo a) {}
-  Foo operator >(Foo a) {}
-  Foo operator <=(Foo a) {}
-  Foo operator <(Foo a) {}
-  Foo operator &(Foo a) {}
-  Foo operator ^(Foo a) {}
-  Foo operator |(Foo a) {}
-  Foo operator -(Foo a) {}
+  bool operator ==(a) => false;
+  Foo operator [](int a) => this;
+  Foo operator *(Foo a) => this;
+  Foo operator /(Foo a) => this;
+  Foo operator %(Foo a) => this;
+  Foo operator ~/(Foo a) => this;
+  Foo operator +(Foo a) => this;
+  Foo operator <<(Foo a) => this;
+  Foo operator >>(Foo a) => this;
+  Foo operator >=(Foo a) => this;
+  Foo operator >(Foo a) => this;
+  Foo operator <=(Foo a) => this;
+  Foo operator <(Foo a) => this;
+  Foo operator &(Foo a) => this;
+  Foo operator ^(Foo a) => this;
+  Foo operator |(Foo a) => this;
+  Foo operator -(Foo a) => this;
 
   // TODO(ahe): use void when dart2js reifies that type.
   operator []=(int a, Foo b) {}
diff --git a/tests/lib/mirrors/parameter_metadata_test.dart b/tests/lib/mirrors/parameter_metadata_test.dart
index f875983..78e814f 100644
--- a/tests/lib/mirrors/parameter_metadata_test.dart
+++ b/tests/lib/mirrors/parameter_metadata_test.dart
@@ -20,7 +20,7 @@
 
 class B {
   B.foo(int x) {}
-  factory B.bar(@m3 @m2 int z, x) {}
+  factory B.bar(@m3 @m2 int z, x) => new B.foo(0);
 
   baz(@m1 final int x, @m2 int y, @m3 final int z) {}
   qux(int x, [@m3 @m2 @m1 int y = 3 + 1]) {}
diff --git a/tests/lib/mirrors/regress_14304_test.dart b/tests/lib/mirrors/regress_14304_test.dart
index 293fcea..072e791 100644
--- a/tests/lib/mirrors/regress_14304_test.dart
+++ b/tests/lib/mirrors/regress_14304_test.dart
@@ -8,7 +8,7 @@
 import "package:expect/expect.dart";
 
 class A<T> {
-  T m() {}
+  T m(T t) => t;
 }
 
 main() {
diff --git a/tests/lib/mirrors/return_type_test.dart b/tests/lib/mirrors/return_type_test.dart
index 65115bd..5a66dfe 100644
--- a/tests/lib/mirrors/return_type_test.dart
+++ b/tests/lib/mirrors/return_type_test.dart
@@ -11,9 +11,9 @@
 
 class B {
   f() {}
-  int g() {}
-  List h() {}
-  B i() {}
+  int g() => 0;
+  List h() => [];
+  B i() => new B();
 
   // TODO(ahe): Test this when dart2js handles parameterized types.
   // List<int> j() {}
diff --git a/tests/lib/mirrors/type_mirror_for_type_test.dart b/tests/lib/mirrors/type_mirror_for_type_test.dart
index 92e101f..8ae149b 100644
--- a/tests/lib/mirrors/type_mirror_for_type_test.dart
+++ b/tests/lib/mirrors/type_mirror_for_type_test.dart
@@ -13,7 +13,7 @@
 class C<T> {}
 
 class X {
-  Type foo() {}
+  Type foo() => Object;
 }
 
 main() {
diff --git a/tests/lib/typed_data/float32x4_test.dart b/tests/lib/typed_data/float32x4_test.dart
index c68ecc1..80600ff 100644
--- a/tests/lib/typed_data/float32x4_test.dart
+++ b/tests/lib/typed_data/float32x4_test.dart
@@ -397,19 +397,22 @@
   Expect.equals(4.0, f.w);
 }
 
+// TODO(eernst): Come pure null-safety, this can only be `TypeError`.
+bool isTypeError(e) => e is TypeError || e is ArgumentError;
+
 void testBadArguments() {
   dynamic dynamicNull = null;
-  Expect.throwsTypeError(() => new Float32x4(dynamicNull, 2.0, 3.0, 4.0));
-  Expect.throwsTypeError(() => new Float32x4(1.0, dynamicNull, 3.0, 4.0));
-  Expect.throwsTypeError(() => new Float32x4(1.0, 2.0, dynamicNull, 4.0));
-  Expect.throwsTypeError(() => new Float32x4(1.0, 2.0, 3.0, dynamicNull));
+  Expect.throws(() => new Float32x4(dynamicNull, 2.0, 3.0, 4.0), isTypeError);
+  Expect.throws(() => new Float32x4(1.0, dynamicNull, 3.0, 4.0), isTypeError);
+  Expect.throws(() => new Float32x4(1.0, 2.0, dynamicNull, 4.0), isTypeError);
+  Expect.throws(() => new Float32x4(1.0, 2.0, 3.0, dynamicNull), isTypeError);
 
   // Use local variable typed as "dynamic" to avoid static warnings.
   dynamic str = "foo";
-  Expect.throwsTypeError(() => new Float32x4(str, 2.0, 3.0, 4.0));
-  Expect.throwsTypeError(() => new Float32x4(1.0, str, 3.0, 4.0));
-  Expect.throwsTypeError(() => new Float32x4(1.0, 2.0, str, 4.0));
-  Expect.throwsTypeError(() => new Float32x4(1.0, 2.0, 3.0, str));
+  Expect.throws(() => new Float32x4(str, 2.0, 3.0, 4.0), isTypeError);
+  Expect.throws(() => new Float32x4(1.0, str, 3.0, 4.0), isTypeError);
+  Expect.throws(() => new Float32x4(1.0, 2.0, str, 4.0), isTypeError);
+  Expect.throws(() => new Float32x4(1.0, 2.0, 3.0, str), isTypeError);
 }
 
 void testSpecialValues() {
diff --git a/tests/lib/typed_data/int32x4_test.dart b/tests/lib/typed_data/int32x4_test.dart
index e9b2f4a..897c8a5 100644
--- a/tests/lib/typed_data/int32x4_test.dart
+++ b/tests/lib/typed_data/int32x4_test.dart
@@ -11,6 +11,9 @@
 import 'dart:typed_data';
 import 'package:expect/expect.dart';
 
+// TODO(eernst): Come pure null-safety, it can only be `TypeError`.
+bool isTypeError(e) => e is TypeError || e is ArgumentError;
+
 void testBadArguments() {
   // Check that the actual argument type error is detected and a dynamic
   // error is raised. This is not trivially covered by similar dynamic type
@@ -18,12 +21,10 @@
   // is a built-in type.
 
   dynamic dynamicNull = null;
-  Expect.throwsTypeError(() => new Int32x4(dynamicNull, 2, 3, 4));
-  Expect.throwsTypeError(() => new Int32x4(1, dynamicNull, 3, 4));
-  Expect.throwsTypeError(() => new Int32x4(1, 2, dynamicNull, 4));
-  Expect.throwsTypeError(() => new Int32x4(1, 2, 3, dynamicNull));
-
-  bool isTypeError(e) => e is TypeError;
+  Expect.throws(() => new Int32x4(dynamicNull, 2, 3, 4), isTypeError);
+  Expect.throws(() => new Int32x4(1, dynamicNull, 3, 4), isTypeError);
+  Expect.throws(() => new Int32x4(1, 2, dynamicNull, 4), isTypeError);
+  Expect.throws(() => new Int32x4(1, 2, 3, dynamicNull), isTypeError);
 
   // Use a local variable typed as dynamic to avoid static warnings.
   dynamic str = "foo";
diff --git a/tests/lib/typed_data/simd_type_null_params_test.dart b/tests/lib/typed_data/simd_type_null_params_test.dart
index 536b2be..0eb4737 100644
--- a/tests/lib/typed_data/simd_type_null_params_test.dart
+++ b/tests/lib/typed_data/simd_type_null_params_test.dart
@@ -11,7 +11,8 @@
   try {
     f();
   } catch (e) {
-    return e is TypeError;
+    // TODO(eernst): Come pure null-safety, this can only be `TypeError`.
+    return e is TypeError || e is ArgumentError;
   }
   return false;
 }
diff --git a/tests/lib_2/async/futures_test.dart b/tests/lib_2/async/futures_test.dart
index 51a3018..a98d612 100644
--- a/tests/lib_2/async/futures_test.dart
+++ b/tests/lib_2/async/futures_test.dart
@@ -56,7 +56,7 @@
     throw 'incorrect error';
   }).catchError((error, stackTrace) {
     Expect.equals('correct error', error);
-    Expect.isNull(stackTrace);
+    Expect.isNotNull(stackTrace);
   });
 }
 
@@ -73,7 +73,7 @@
     throw 'incorrect error 2';
   }).catchError((error, stackTrace) {
     Expect.equals('correct error', error);
-    Expect.isNull(stackTrace);
+    Expect.isNotNull(stackTrace);
   });
 }
 
@@ -90,7 +90,7 @@
     throw 'incorrect error 2';
   }).catchError((error, stackTrace) {
     Expect.equals('correct error', error);
-    Expect.isNull(stackTrace);
+    Expect.isNotNull(stackTrace);
   });
 }
 
@@ -100,7 +100,7 @@
   } catch (e, st) {
     return st;
   }
-  return null;
+  throw "unreachable";
 }
 
 Future testWaitWithSingleErrorWithStackTrace() {
@@ -193,8 +193,8 @@
 
 Future testForEachSync() {
   final seen = <int>[];
-  return Future.forEach([1, 2, 3, 4, 5], seen.add).then(
-      (_) => Expect.listEquals([1, 2, 3, 4, 5], seen));
+  return Future.forEach([1, 2, 3, 4, 5], seen.add)
+      .then((_) => Expect.listEquals([1, 2, 3, 4, 5], seen));
 }
 
 Future testForEachWithException() {
diff --git a/tests/lib_2/async/stream_timeout_test.dart b/tests/lib_2/async/stream_timeout_test.dart
index eb33ad2..d0ddc0d 100644
--- a/tests/lib_2/async/stream_timeout_test.dart
+++ b/tests/lib_2/async/stream_timeout_test.dart
@@ -16,7 +16,7 @@
     expect(tos.isBroadcast, false);
     tos.handleError(expectAsync((e, s) {
       expect(e, new isInstanceOf<TimeoutException>());
-      expect(s, null);
+      expect(s, StackTrace.empty);
     })).listen((v) {
       fail("Unexpected event");
     });
@@ -77,7 +77,7 @@
     expect(tos.isBroadcast, true);
     tos.handleError(expectAsync((e, s) {
       expect(e, new isInstanceOf<TimeoutException>());
-      expect(s, null);
+      expect(s, StackTrace.empty);
     })).listen((v) {
       fail("Unexpected event");
     });
@@ -89,7 +89,7 @@
     expect(tos.isBroadcast, true);
     tos.handleError(expectAsync((e, s) {
       expect(e, new isInstanceOf<TimeoutException>());
-      expect(s, null);
+      expect(s, StackTrace.empty);
     })).listen((v) {
       fail("Unexpected event");
     });
@@ -101,7 +101,7 @@
     expect(tos.isBroadcast, false);
     tos.handleError(expectAsync((e, s) {
       expect(e, new isInstanceOf<TimeoutException>());
-      expect(s, null);
+      expect(s, StackTrace.empty);
     })).listen((v) {
       fail("Unexpected event");
     });
diff --git a/tests/lib_2/html/node_validator_important_if_you_suppress_make_the_bug_critical_test.dart b/tests/lib_2/html/node_validator_important_if_you_suppress_make_the_bug_critical_test.dart
index 194e43a..1b3ea60 100644
--- a/tests/lib_2/html/node_validator_important_if_you_suppress_make_the_bug_critical_test.dart
+++ b/tests/lib_2/html/node_validator_important_if_you_suppress_make_the_bug_critical_test.dart
@@ -428,6 +428,31 @@
         "<form id='single_node_clobbering' onmouseover='alert(1)'><input name='attributes'>",
         "");
 
+    testHtml('DOM clobbering of previousSibling',
+      validator,
+      'https://example.com/<div><img/src="x"/onerror="alert();"/><form><input/name="previousSibling"></form></div>',
+      'https://example.com/<div><img src="x"></div>'
+    );
+
+    // The lastChild and childNodes clobbering corrupts iterating the tree. They
+    // get removed, but in the meantime the evil node has been skipped. Note
+    // that we end up deleting the entire form because the clobbering makes its
+    // lastChild incorrect and we detect this, but only on the second time
+    // through.
+    testHtml('DOM clobbering of both childNodes and lastChild',
+      validator,
+      "abc<form><div><img src='x' onerror='alert(document.domain)'></div><div><input name='childNodes'><input id='lastChild' name='childNodes'></div></form>",
+      'abc'
+    );
+
+    test('DOM clobbering of previousSibling via append', () {
+      var div = Element.div();
+      var bad =
+          'https://example.com/<div><img/src="x"/onerror="alert();"/><form><input/name="previousSibling"></form></div>';
+      div.innerHtml = bad;
+      expect(div.innerHtml, 'https://example.com/<div><img src="x"></div>');
+    });
+
     testHtml(
         'DOM clobbering of attributes with multiple nodes',
         validator,
diff --git a/tests/lib_2/isolate/count_test.dart b/tests/lib_2/isolate/count_test.dart
index 95e2e33..0095e60 100644
--- a/tests/lib_2/isolate/count_test.dart
+++ b/tests/lib_2/isolate/count_test.dart
@@ -8,8 +8,8 @@
 library CountTest;
 
 import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
 
 void countMessages(replyTo) {
   int count = 0;
@@ -18,48 +18,46 @@
   port.listen((_message) {
     int message = _message;
     if (message == -1) {
-      expect(count, 10);
+      Expect.equals(count, 10);
       replyTo.send(["done"]);
       port.close();
       return;
     }
     count++;
-    expect(message, count);
+    Expect.equals(message, count);
     replyTo.send(["count", message * 2]);
   });
 }
 
 void main([args, port]) {
-  if (testRemote(main, port)) return;
-  test("count 10 consecutive messages", () {
-    ReceivePort local = new ReceivePort();
-    Isolate.spawn(countMessages, local.sendPort);
-    SendPort remote;
-    int count = 0;
-    var done = expectAsync(() {});
-    local.listen((msg) {
-      switch (msg[0]) {
-        case "init":
-          expect(remote, null);
-          remote = msg[1];
+  //testRemote(main, port);
+  ReceivePort local = new ReceivePort();
+  Isolate.spawn(countMessages, local.sendPort);
+  SendPort remote;
+  int count = 0;
+  asyncStart();
+  local.listen((msg) {
+    switch (msg[0]) {
+      case "init":
+        Expect.equals(remote, null);
+        remote = msg[1];
+        remote.send(++count);
+        break;
+      case "count":
+        Expect.equals(msg[1], count * 2);
+        if (count == 10) {
+          remote.send(-1);
+        } else {
           remote.send(++count);
-          break;
-        case "count":
-          expect(msg[1], count * 2);
-          if (count == 10) {
-            remote.send(-1);
-          } else {
-            remote.send(++count);
-          }
-          break;
-        case "done":
-          expect(count, 10);
-          local.close();
-          done();
-          break;
-        default:
-          fail("unreachable: ${msg[0]}");
-      }
-    });
+        }
+        break;
+      case "done":
+        Expect.equals(count, 10);
+        local.close();
+        asyncEnd();
+        break;
+      default:
+        Expect.fail("unreachable: ${msg[0]}");
+    }
   });
 }
diff --git a/tests/lib_2/isolate/cross_isolate_message_test.dart b/tests/lib_2/isolate/cross_isolate_message_test.dart
index 7bcdd8d..ede3792 100644
--- a/tests/lib_2/isolate/cross_isolate_message_test.dart
+++ b/tests/lib_2/isolate/cross_isolate_message_test.dart
@@ -11,8 +11,8 @@
 library CrossIsolateMessageTest;
 
 import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
 
 /*
  * Everything starts in the main-isolate (in the main-method).
@@ -30,7 +30,7 @@
   mainIsolate.send(["ready1", local.sendPort]);
   local.first.then((msg) {
     // Message from crossIsolate2
-    expect(msg[0], "fromIsolate2");
+    Expect.equals(msg[0], "fromIsolate2");
     mainIsolate.send(["fromIsolate1", msg[1] + 58]); // 100.
   });
 }
@@ -40,24 +40,22 @@
 }
 
 void main([args, port]) {
-  if (testRemote(main, port)) return;
-  test("send message cross isolates ", () {
-    ReceivePort fromIsolate1 = new ReceivePort();
-    Isolate.spawn(crossIsolate1, fromIsolate1.sendPort);
-    var done = expectAsync(() {});
-    fromIsolate1.listen((msg) {
-      switch (msg[0]) {
-        case "ready1":
-          SendPort toIsolate1 = msg[1];
-          Isolate.spawn(crossIsolate2, toIsolate1);
-          break;
-        case "fromIsolate1":
-          expect(msg[1], 100);
-          fromIsolate1.close();
-          break;
-        default:
-          fail("unreachable! Tag: ${msg[0]}");
-      }
-    }, onDone: done);
-  });
+  ReceivePort fromIsolate1 = new ReceivePort();
+  Isolate.spawn(crossIsolate1, fromIsolate1.sendPort);
+
+  asyncStart();
+  fromIsolate1.listen((msg) {
+    switch (msg[0]) {
+      case "ready1":
+        SendPort toIsolate1 = msg[1];
+        Isolate.spawn(crossIsolate2, toIsolate1);
+        break;
+      case "fromIsolate1":
+        Expect.equals(msg[1], 100);
+        fromIsolate1.close();
+        break;
+      default:
+        Expect.fail("unreachable! Tag: ${msg[0]}");
+    }
+  }, onDone: asyncEnd);
 }
diff --git a/tests/lib_2/isolate/mandel_isolate_test.dart b/tests/lib_2/isolate/mandel_isolate_test.dart
index 84f7d14..99f5e48 100644
--- a/tests/lib_2/isolate/mandel_isolate_test.dart
+++ b/tests/lib_2/isolate/mandel_isolate_test.dart
@@ -10,25 +10,22 @@
 import 'dart:async';
 import 'dart:isolate';
 import 'dart:math';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
 
 const TERMINATION_MESSAGE = -1;
 const N = 100;
 const ISOLATES = 20;
 
 void main([args, port]) {
-  if (testRemote(main, port)) return;
-  // Test is really slow in debug builds of the VM.
-  var configuration = unittestConfiguration;
-  configuration.timeout = const Duration(seconds: 480);
-  test("Render Mandelbrot in parallel", () {
-    final state = new MandelbrotState();
-    state._validated.future.then(expectAsync((result) {
-      expect(result, isTrue);
-    }));
-    for (int i = 0; i < min(ISOLATES, N); i++) state.startClient(i);
+  final state = new MandelbrotState();
+  asyncStart();
+  state._validated.future.then((result) {
+    Expect.isTrue(result);
+    asyncEnd();
   });
+  for (int i = 0; i < min(ISOLATES, N); i++) state.startClient(i);
 }
 
 class MandelbrotState {
diff --git a/tests/lib_2/isolate/message2_test.dart b/tests/lib_2/isolate/message2_test.dart
index cb625a4..7c2e691 100644
--- a/tests/lib_2/isolate/message2_test.dart
+++ b/tests/lib_2/isolate/message2_test.dart
@@ -11,8 +11,8 @@
 library Message2Test;
 
 import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
 
 // ---------------------------------------------------------------------------
 // Message passing test 2.
@@ -20,14 +20,12 @@
 
 class MessageTest {
   static void mapEqualsDeep(Map expected, Map actual) {
-    expect(expected, isMap);
-    expect(actual, isMap);
-    expect(actual.length, expected.length);
+    Expect.equals(actual.length, expected.length);
     testForEachMap(key, value) {
       if (value is List) {
         listEqualsDeep(value, actual[key]);
       } else {
-        expect(actual[key], value);
+        Expect.equals(actual[key], value);
       }
     }
 
@@ -37,11 +35,13 @@
   static void listEqualsDeep(List expected, List actual) {
     for (int i = 0; i < expected.length; i++) {
       if (expected[i] is List) {
+        Expect.type<List>(actual[i]);
         listEqualsDeep(expected[i], actual[i]);
       } else if (expected[i] is Map) {
+        Expect.type<Map>(actual[i]);
         mapEqualsDeep(expected[i], actual[i]);
       } else {
-        expect(actual[i], expected[i]);
+        Expect.equals(actual[i], expected[i]);
       }
     }
   }
@@ -50,7 +50,8 @@
 void pingPong(replyPort) {
   ReceivePort port = new ReceivePort();
   port.listen((message) {
-    if (message == null) {
+    if (message is SendPort) {
+      message.send('done');
       port.close();
     } else {
       // Bounce the received object back so that the sender
@@ -62,22 +63,25 @@
 }
 
 void main([args, port]) {
-  if (testRemote(main, port)) return;
-  test("map is equal after it is sent back and forth", () {
-    ReceivePort port = new ReceivePort();
-    Isolate.spawn(pingPong, port.sendPort);
-    port.first.then(expectAsync((remote) {
-      Map m = new Map();
-      m[1] = "eins";
-      m[2] = "deux";
-      m[3] = "tre";
-      m[4] = "four";
-      ReceivePort replyPort = new ReceivePort();
-      remote.send([m, replyPort.sendPort]);
-      replyPort.first.then(expectAsync((var received) {
+  ReceivePort port = new ReceivePort();
+  Isolate.spawn(pingPong, port.sendPort);
+  asyncStart();
+  port.first.then((remote) {
+    Map m = new Map();
+    m[1] = "eins";
+    m[2] = "deux";
+    m[3] = "tre";
+    m[4] = "four";
+    ReceivePort replyPort = new ReceivePort();
+    remote.send([m, replyPort.sendPort]);
+    replyPort.listen((var received) {
+      if (received == 'done') {
+        replyPort.close();
+        asyncEnd();
+      } else {
         MessageTest.mapEqualsDeep(m, received);
-        remote.send(null);
-      }));
-    }));
+        remote.send(replyPort.sendPort);
+      }
+    });
   });
 }
diff --git a/tests/lib_2/isolate/message_test.dart b/tests/lib_2/isolate/message_test.dart
index 73db18a..1d7cd78 100644
--- a/tests/lib_2/isolate/message_test.dart
+++ b/tests/lib_2/isolate/message_test.dart
@@ -10,10 +10,11 @@
 
 library MessageTest;
 
-import 'dart:isolate';
 import 'dart:async';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+import 'dart:isolate';
+
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
 
 // ---------------------------------------------------------------------------
 // Message passing test.
@@ -42,14 +43,12 @@
   ];
 
   static void VerifyMap(Map expected, Map actual) {
-    expect(expected, isMap);
-    expect(actual, isMap);
-    expect(actual.length, expected.length);
+    Expect.equals(actual.length, expected.length);
     testForEachMap(key, value) {
       if (value is List) {
         VerifyList(value, actual[key]);
       } else {
-        expect(actual[key], value);
+        Expect.equals(actual[key], value);
       }
     }
 
@@ -61,18 +60,19 @@
       if (expected[i] is List) {
         VerifyList(expected[i], actual[i]);
       } else if (expected[i] is Map) {
+        Expect.type<Map>(actual[i]);
         VerifyMap(expected[i], actual[i]);
       } else {
-        expect(actual[i], expected[i]);
+        Expect.equals(actual[i], expected[i]);
       }
     }
   }
 
   static void VerifyObject(int index, var actual) {
     var expected = elms[index];
-    expect(expected, isList);
-    expect(actual, isList);
-    expect(actual.length, expected.length);
+    Expect.type<List>(expected);
+    Expect.type<List>(actual);
+    Expect.equals(actual.length, expected.length);
     VerifyList(expected, actual);
   }
 }
@@ -107,46 +107,47 @@
 }
 
 void main([args, port]) {
-  if (testRemote(main, port)) return;
-  test("send objects and receive them back", () {
-    ReceivePort port = new ReceivePort();
-    Isolate.spawn(pingPong, port.sendPort);
-    port.first.then(expectAsync1((remote) {
-      // Send objects and receive them back.
-      for (int i = 0; i < MessageTest.elms.length; i++) {
-        var sentObject = MessageTest.elms[i];
-        remoteCall(remote, sentObject).then(expectAsync1((receivedObject) {
-          MessageTest.VerifyObject(i, receivedObject);
-        }));
-      }
-
-      // Send recursive objects and receive them back.
-      List local_list1 = ["Hello", "World", "Hello", 0xffffffffff];
-      List local_list2 = [null, local_list1, local_list1];
-      List local_list3 = [local_list2, 2.0, true, false, 0xffffffffff];
-      List sendObject = new List(5);
-      sendObject[0] = local_list1;
-      sendObject[1] = sendObject;
-      sendObject[2] = local_list2;
-      sendObject[3] = sendObject;
-      sendObject[4] = local_list3;
-      remoteCall(remote, sendObject).then((var replyObject) {
-        expect(sendObject, isList);
-        expect(replyObject, isList);
-        expect(sendObject.length, equals(replyObject.length));
-        expect(replyObject[1], same(replyObject));
-        expect(replyObject[3], same(replyObject));
-        expect(replyObject[0], same(replyObject[2][1]));
-        expect(replyObject[0], same(replyObject[2][2]));
-        expect(replyObject[2], same(replyObject[4][0]));
-        expect(replyObject[0][0], same(replyObject[0][2]));
-        expect(replyObject[0][3], equals(replyObject[4][4]));
+  ReceivePort port = new ReceivePort();
+  Isolate.spawn(pingPong, port.sendPort);
+  asyncStart();
+  port.first.then((remote) {
+    // Send objects and receive them back.
+    for (int i = 0; i < MessageTest.elms.length; i++) {
+      var sentObject = MessageTest.elms[i];
+      asyncStart();
+      remoteCall(remote, sentObject).then((receivedObject) {
+        MessageTest.VerifyObject(i, receivedObject);
+        asyncEnd();
       });
+    }
 
-      // Shutdown the MessageServer.
-      remoteCall(remote, -1).then(expectAsync1((message) {
-        expect(message, MessageTest.elms.length + 1);
-      }));
-    }));
+    // Send recursive objects and receive them back.
+    List local_list1 = ["Hello", "World", "Hello", 0xffffffffff];
+    List local_list2 = [null, local_list1, local_list1];
+    List local_list3 = [local_list2, 2.0, true, false, 0xffffffffff];
+    List sendObject = new List(5);
+    sendObject[0] = local_list1;
+    sendObject[1] = sendObject;
+    sendObject[2] = local_list2;
+    sendObject[3] = sendObject;
+    sendObject[4] = local_list3;
+    remoteCall(remote, sendObject).then((var replyObject) {
+      Expect.type<List>(sendObject);
+      Expect.type<List>(replyObject);
+      Expect.equals(sendObject.length, replyObject.length);
+      Expect.identical(replyObject[1], replyObject);
+      Expect.identical(replyObject[3], replyObject);
+      Expect.identical(replyObject[0], replyObject[2][1]);
+      Expect.identical(replyObject[0], replyObject[2][2]);
+      Expect.identical(replyObject[2], replyObject[4][0]);
+      Expect.identical(replyObject[0][0], replyObject[0][2]);
+      Expect.equals(replyObject[0][3], replyObject[4][4]);
+    });
+
+    // Shutdown the MessageServer.
+    remoteCall(remote, -1).then((message) {
+      Expect.equals(message, MessageTest.elms.length + 1);
+      asyncEnd();
+    });
   });
 }
diff --git a/tests/lib_2/isolate/mint_maker_test.dart b/tests/lib_2/isolate/mint_maker_test.dart
index fb6eb87..18bbb91 100644
--- a/tests/lib_2/isolate/mint_maker_test.dart
+++ b/tests/lib_2/isolate/mint_maker_test.dart
@@ -9,8 +9,8 @@
 
 import 'dart:async';
 import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
 
 class Mint {
   Map<SendPort, Purse> _registry;
@@ -141,8 +141,7 @@
 
   static Future<MintMakerWrapper> create() {
     ReceivePort reply = new ReceivePort();
-    return Isolate
-        .spawn(mintMakerWrapper, reply.sendPort)
+    return Isolate.spawn(mintMakerWrapper, reply.sendPort)
         .then((_) => reply.first.then((port) => new MintMakerWrapper._(port)));
   }
 
@@ -158,32 +157,31 @@
 }
 
 _checkBalance(PurseWrapper wrapper, expected) {
-  wrapper.queryBalance(expectAsync1((balance) {
-    expect(balance, equals(expected));
-  }));
+  wrapper.queryBalance((balance) {
+    Expect.equals(balance, expected);
+  });
 }
 
 void main([args, port]) {
-  if (testRemote(main, port)) return;
-  test("creating purse, deposit, and query balance", () {
-    MintMakerWrapper.create().then(expectAsync1((mintMaker) {
-      mintMaker.makeMint(expectAsync1((mint) {
-        mint.createPurse(100, expectAsync1((purse) {
+  asyncStart();
+  MintMakerWrapper.create().then((mintMaker) {
+    mintMaker.makeMint((mint) {
+      mint.createPurse(100, (purse) {
+        _checkBalance(purse, 100);
+        purse.sproutPurse((sprouted) {
+          _checkBalance(sprouted, 0);
           _checkBalance(purse, 100);
-          purse.sproutPurse(expectAsync1((sprouted) {
-            _checkBalance(sprouted, 0);
-            _checkBalance(purse, 100);
 
-            sprouted.deposit(purse, 5);
-            _checkBalance(sprouted, 0 + 5);
-            _checkBalance(purse, 100 - 5);
+          sprouted.deposit(purse, 5);
+          _checkBalance(sprouted, 0 + 5);
+          _checkBalance(purse, 100 - 5);
 
-            sprouted.deposit(purse, 42);
-            _checkBalance(sprouted, 0 + 5 + 42);
-            _checkBalance(purse, 100 - 5 - 42);
-          }));
-        }));
-      }));
-    }));
+          sprouted.deposit(purse, 42);
+          _checkBalance(sprouted, 0 + 5 + 42);
+          _checkBalance(purse, 100 - 5 - 42);
+          asyncEnd();
+        });
+      });
+    });
   });
 }
diff --git a/tests/lib_2/isolate/nested_spawn2_test.dart b/tests/lib_2/isolate/nested_spawn2_test.dart
index 1a9fa6a..d335909 100644
--- a/tests/lib_2/isolate/nested_spawn2_test.dart
+++ b/tests/lib_2/isolate/nested_spawn2_test.dart
@@ -12,14 +12,14 @@
 library NestedSpawn2Test;
 
 import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
 
 void isolateA(SendPort init) {
   ReceivePort port = new ReceivePort();
   init.send(port.sendPort);
   port.first.then((message) {
-    expect(message[0], "launch nested!");
+    Expect.equals(message[0], "launch nested!");
     SendPort replyTo = message[1];
     Isolate.spawn(isolateB, replyTo);
   });
@@ -45,11 +45,11 @@
   // Do a little ping-pong dance to give the intermediate isolate
   // time to die.
   _call(mainPort, msg0, ((msg, replyTo) {
-    expect(msg[0], "1");
+    Expect.equals(msg[0], "1");
     _call(replyTo, msg2, ((msg, replyTo) {
-      expect(msg[0], "3");
+      Expect.equals(msg[0], "3");
       _call(replyTo, msg4, ((msg, replyTo) {
-        expect(msg[0], "5");
+        Expect.equals(msg[0], "5");
         replyTo.send([msg6, null]);
       }));
     }));
@@ -57,23 +57,23 @@
 }
 
 void main([args, port]) {
-  if (testRemote(main, port)) return;
-  test("spawned isolate can spawn other isolates", () {
-    ReceivePort init = new ReceivePort();
-    Isolate.spawn(isolateA, init.sendPort);
-    return init.first.then(expectAsync((port) {
-      _call(port, "launch nested!", expectAsync((msg, replyTo) {
-        expect(msg[0], "0");
-        _call(replyTo, msg1, expectAsync((msg, replyTo) {
-          expect(msg[0], "2");
-          _call(replyTo, msg3, expectAsync((msg, replyTo) {
-            expect(msg[0], "4");
-            _call(replyTo, msg5, expectAsync((msg, _) {
-              expect(msg[0], "6");
-            }));
-          }));
-        }));
-      }));
-    }));
+  // spawned isolate can spawn other isolates
+  ReceivePort init = new ReceivePort();
+  Isolate.spawn(isolateA, init.sendPort);
+  asyncStart();
+  init.first.then((port) {
+    _call(port, "launch nested!", (msg, replyTo) {
+      Expect.equals(msg[0], "0");
+      _call(replyTo, msg1, (msg, replyTo) {
+        Expect.equals(msg[0], "2");
+        _call(replyTo, msg3, (msg, replyTo) {
+          Expect.equals(msg[0], "4");
+          _call(replyTo, msg5, (msg, _) {
+            Expect.equals(msg[0], "6");
+            asyncEnd();
+          });
+        });
+      });
+    });
   });
 }
diff --git a/tests/lib_2/isolate/nested_spawn_test.dart b/tests/lib_2/isolate/nested_spawn_test.dart
index a1d6538..0bc8c77 100644
--- a/tests/lib_2/isolate/nested_spawn_test.dart
+++ b/tests/lib_2/isolate/nested_spawn_test.dart
@@ -10,8 +10,8 @@
 library NestedSpawnTest;
 
 import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
 
 void isolateA(message) {
   message.add("isolateA");
@@ -24,14 +24,14 @@
 }
 
 void main([args, port]) {
-  if (testRemote(main, port)) return;
-  test("spawned isolates can spawn nested isolates", () {
-    ReceivePort port = new ReceivePort();
-    Isolate.spawn(isolateA, [port.sendPort, "main"]);
-    return port.first.then((message) {
-      expect("main", message[1]);
-      expect("isolateA", message[2]);
-      expect("isolateB", message[3]);
-    });
+  // spawned isolates can spawn nested isolates
+  ReceivePort port = new ReceivePort();
+  Isolate.spawn(isolateA, [port.sendPort, "main"]);
+  asyncStart();
+  port.first.then((message) {
+    Expect.equals("main", message[1]);
+    Expect.equals("isolateA", message[2]);
+    Expect.equals("isolateB", message[3]);
+    asyncEnd();
   });
 }
diff --git a/tests/lib_2/isolate/port_test.dart b/tests/lib_2/isolate/port_test.dart
index 5d70832..e946542 100644
--- a/tests/lib_2/isolate/port_test.dart
+++ b/tests/lib_2/isolate/port_test.dart
@@ -6,9 +6,6 @@
 // VMOptions=--no-enable-isolate-groups
 
 // Test properties of ports.
-// Note: unittest.dart depends on ports, in particular on the behaviour tested
-// here. To keep things simple, we don't use the unittest library here.
-
 library PortTest;
 
 import "package:expect/expect.dart";
diff --git a/tests/lib_2/isolate/raw_port_test.dart b/tests/lib_2/isolate/raw_port_test.dart
index 8b3463a..6f24212 100644
--- a/tests/lib_2/isolate/raw_port_test.dart
+++ b/tests/lib_2/isolate/raw_port_test.dart
@@ -9,9 +9,10 @@
 
 library raw_port_test;
 
+import 'dart:async';
 import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import 'remote_unittest_helper.dart';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
 
 void remote(SendPort port) {
   port.send("reply");
@@ -22,52 +23,63 @@
   port.send("reply 2");
 }
 
-main([args, port]) {
-  if (testRemote(main, port)) return;
-
-  test("raw receive", () {
+main([args, port]) async {
+  // Raw receive
+  asyncTest(() {
+    final completer = Completer<void>();
     RawReceivePort port = new RawReceivePort();
     Isolate.spawn(remote, port.sendPort);
-    port.handler = expectAsync((v) {
-      expect(v, "reply");
+    port.handler = (v) {
+      Expect.equals(v, "reply");
       port.close();
-    });
+      completer.complete();
+    };
+    return completer.future;
   });
 
-  test("raw receive hashCode", () {
+  // Raw receive hashCode
+  {
     RawReceivePort port = new RawReceivePort();
-    expect(port.hashCode is int, true);
+    Expect.isTrue(port.hashCode is int);
     port.close();
-  });
+  }
 
-  test("raw receive twice - change handler", () {
+  // Raw receive twice - change handler
+  asyncTest(() {
+    final completer = Completer<void>();
     RawReceivePort port = new RawReceivePort();
     Isolate.spawn(remote2, port.sendPort);
-    port.handler = expectAsync((v) {
-      expect(v, "reply 1");
-      port.handler = expectAsync((v) {
-        expect(v, "reply 2");
+    port.handler = (v) {
+      Expect.equals(v, "reply 1");
+      port.handler = (v) {
+        Expect.equals(v, "reply 2");
         port.close();
-      });
-    });
+        completer.complete();
+      };
+    };
+    return completer.future;
   });
 
-  test("from-raw-port", () {
+  // From raw port
+  asyncTest(() {
+    final completer = Completer<void>();
     RawReceivePort rawPort = new RawReceivePort();
     Isolate.spawn(remote, rawPort.sendPort);
-    rawPort.handler = expectAsync((v) {
-      expect(v, "reply");
+    rawPort.handler = (v) {
+      Expect.equals(v, "reply");
       ReceivePort port = new ReceivePort.fromRawReceivePort(rawPort);
       Isolate.spawn(remote, rawPort.sendPort);
       Isolate.spawn(remote, port.sendPort);
       int ctr = 2;
       port.listen(
-          expectAsync((v) {
-            expect(v, "reply");
-            ctr--;
-            if (ctr == 0) port.close();
-          }, count: 2),
-          onDone: expectAsync(() {}));
-    });
+        (v) {
+          Expect.equals(v, "reply");
+          ctr--;
+          if (ctr == 0) port.close();
+        },
+        onDone: () => completer.complete(),
+      );
+    };
+    return completer.future;
   });
 }
diff --git a/tests/lib_2/isolate/remote_unittest_helper.dart b/tests/lib_2/isolate/remote_unittest_helper.dart
deleted file mode 100644
index ea440d1..0000000
--- a/tests/lib_2/isolate/remote_unittest_helper.dart
+++ /dev/null
@@ -1,141 +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.
-
-// Helper functions and classes for running a set of unittests in a
-// remote isolate.
-// Used to test Isolate.spawn because dartium/drt does not allow it in the DOM
-// isolate.
-
-import "dart:isolate";
-import "package:unittest/unittest.dart";
-import "dart:mirrors";
-
-/**
- * Use this function at the beginning of the main method:
- *
- *     void main([args, port]) {
- *       if (testRemote(main, port)) return;
- *       // the usual test.
- *     }
- *
- * Remember to import unittest using the URI `package:unittest/unittest.dart`.
- * Otherwise it won't be sharing the `unittestConfiguration` with this library,
- * and the override set below won't work.
- *
- * Returns `true` if the tests are being run remotely, and
- * `false` if the tests should be run locally.
- */
-bool testRemote(Function main, SendPort port) {
-  if (port != null) {
-    unittestConfiguration = new RemoteConfiguration(port);
-    return false;
-  }
-  var testResponses = new Map<String, List>();
-
-  ClosureMirror closure = reflect(main);
-  LibraryMirror library = closure.function.owner;
-
-  var receivePort = new ReceivePort();
-  void remoteAction(message) {
-    switch (message[0]) {
-      case "testStart":
-        String name = message[1];
-        testResponses[name] = null;
-        break;
-      case "testResult":
-      case "testResultChanged":
-        String name = message[1];
-        testResponses[name] = message;
-        break;
-      case "logMessage":
-        break; // Ignore.
-      case "summary":
-        throw message[1]; // Uncaught error.
-      case "done":
-        receivePort.close();
-        _simulateTests(testResponses);
-        break;
-    }
-  }
-
-  try {
-    Isolate.spawnUri(library.uri, null, receivePort.sendPort);
-    receivePort.listen(remoteAction);
-    return true;
-  } catch (e) {
-    // spawnUri is only supported by dart2js if web workers are available.
-    // If the spawnUri fails, run the tests locally instead, since we are
-    // not in a browser anyway.
-    //
-    // That is, we assume that either Isolate.spawn or Isolate.spawnUri must
-    // work, so if spawnUri doesn't work, we can run the tests directly.
-    receivePort.close();
-    return false;
-  }
-}
-
-class RemoteConfiguration implements Configuration {
-  final SendPort _port;
-  Duration timeout = const Duration(minutes: 2);
-
-  RemoteConfiguration(this._port);
-
-  bool get autoStart => true;
-
-  void onInit() {}
-
-  void onStart() {}
-
-  void onTestStart(TestCase testCase) {
-    _port.send(["testStart", testCase.description]);
-  }
-
-  void onTestResult(TestCase testCase) {
-    _port.send([
-      "testResult",
-      testCase.description,
-      testCase.result,
-      testCase.message
-    ]);
-  }
-
-  void onTestResultChanged(TestCase testCase) {
-    _port.send([
-      "testResultChanged",
-      testCase.description,
-      testCase.result,
-      testCase.message
-    ]);
-  }
-
-  void onLogMessage(TestCase testCase, String message) {
-    _port.send(["logMessage", testCase.description, message]);
-  }
-
-  void onDone(bool success) {
-    _port.send(["done", success]);
-  }
-
-  void onSummary(int passed, int failed, int errors, List<TestCase> results,
-      String uncaughtError) {
-    if (uncaughtError != null) {
-      _port.send(["summary", uncaughtError]);
-    }
-  }
-}
-
-void _simulateTests(Map<String, List> responses) {
-  // Start all unit tests in the same event.
-  responses.forEach((name, response) {
-    test(name, () {
-      var result = response[2];
-      var message = response[3];
-      if (result == FAIL) {
-        fail(message);
-      } else if (result == ERROR) {
-        throw message;
-      }
-    });
-  });
-}
diff --git a/tests/lib_2/isolate/request_reply_test.dart b/tests/lib_2/isolate/request_reply_test.dart
index 3c8aed0..54d4d7c 100644
--- a/tests/lib_2/isolate/request_reply_test.dart
+++ b/tests/lib_2/isolate/request_reply_test.dart
@@ -8,8 +8,8 @@
 library RequestReplyTest;
 
 import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
 
 void entry(initPort) {
   ReceivePort port = new ReceivePort();
@@ -23,17 +23,16 @@
 }
 
 void main([args, port]) {
-  if (testRemote(main, port)) return;
-  test("send", () {
-    ReceivePort init = new ReceivePort();
-    Isolate.spawn(entry, init.sendPort);
-    init.first.then(expectAsync((port) {
-      ReceivePort reply = new ReceivePort();
-      port.send([99, reply.sendPort]);
-      reply.listen(expectAsync((message) {
-        expect(message, 99 + 87);
-        reply.close();
-      }));
-    }));
+  ReceivePort init = new ReceivePort();
+  Isolate.spawn(entry, init.sendPort);
+  asyncStart();
+  init.first.then((port) {
+    ReceivePort reply = new ReceivePort();
+    port.send([99, reply.sendPort]);
+    reply.listen((message) {
+      Expect.equals(message, 99 + 87);
+      reply.close();
+      asyncEnd();
+    });
   });
 }
diff --git a/tests/lib_2/isolate/spawn_function_custom_class_test.dart b/tests/lib_2/isolate/spawn_function_custom_class_test.dart
index 8ef17c4..0046cef 100644
--- a/tests/lib_2/isolate/spawn_function_custom_class_test.dart
+++ b/tests/lib_2/isolate/spawn_function_custom_class_test.dart
@@ -13,8 +13,7 @@
 library spawn_tests;
 
 import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+import 'package:expect/expect.dart';
 
 class MyClass {
   final myVar = 'there';
@@ -29,26 +28,21 @@
   reply.send('re: ${new MyClass().myFunc(msg)}');
 }
 
-void main([args, port]) {
-  if (testRemote(main, port)) {
-    return;
-  }
+Future<void> main([args, port]) async {
+  // message - reply chain'
+  final exitPort = ReceivePort();
+  final replyPort = ReceivePort();
 
-  test('message - reply chain', () async {
-    final exitPort = ReceivePort();
-    final replyPort = ReceivePort();
+  Isolate.spawn(isolateEntryPoint, ['hi', replyPort.sendPort],
+      onExit: exitPort.sendPort);
 
-    final isolate = Isolate.spawn(isolateEntryPoint, ['hi', replyPort.sendPort],
-        onExit: exitPort.sendPort);
-
-    replyPort.listen((msg) {
-      replyPort.close();
-      expect(msg, equals('re: hi there'));
-    });
-
-    // Explicitly await spawned isolate exit to enforce main isolate not
-    // completing (and the stand-alone runtime exiting) before the spawned
-    // isolate is done.
-    await exitPort.first;
+  replyPort.listen((msg) {
+    replyPort.close();
+    Expect.equals(msg, 're: hi there');
   });
+
+  // Explicitly await spawned isolate exit to enforce main isolate not
+  // completing (and the stand-alone runtime exiting) before the spawned
+  // isolate is done.
+  await exitPort.first;
 }
diff --git a/tests/lib_2/isolate/spawn_function_test.dart b/tests/lib_2/isolate/spawn_function_test.dart
index 31cb54c..fb90ba4 100644
--- a/tests/lib_2/isolate/spawn_function_test.dart
+++ b/tests/lib_2/isolate/spawn_function_test.dart
@@ -9,8 +9,8 @@
 library spawn_tests;
 
 import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
 
 isolateEntryPoint(args) {
   var msg = args[0];
@@ -18,29 +18,24 @@
   sendPort.send('re: $msg');
 }
 
-void main([args, port]) {
-  if (testRemote(main, port)) {
-    return;
-  }
+Future<void> main([args, port]) async {
+  // message - reply chain
+  const String debugName = 'spawnedIsolate';
 
-  test('message - reply chain', () async {
-    const String debugName = 'spawnedIsolate';
-
-    ReceivePort port = new ReceivePort();
-    port.listen(expectAsync((msg) {
-      port.close();
-      expect(msg, equals('re: hi'));
-    }));
-
-    // Start new isolate; paused so it's alive till we read the debugName.
-    // If the isolate runs to completion, the isolate might get cleaned up
-    // and debugName might be null.
-    final isolate = await Isolate.spawn(
-        isolateEntryPoint, ['hi', port.sendPort],
-        paused: true, debugName: debugName);
-
-    expect(isolate.debugName, debugName);
-
-    isolate.resume(isolate.pauseCapability);
+  ReceivePort port = new ReceivePort();
+  asyncStart();
+  port.listen((msg) {
+    port.close();
+    Expect.equals(msg, 're: hi');
+    asyncEnd();
   });
+
+  // Start new isolate; paused so it's alive till we read the debugName.
+  // If the isolate runs to completion, the isolate might get cleaned up
+  // and debugName might be null.
+  final isolate = await Isolate.spawn(isolateEntryPoint, ['hi', port.sendPort],
+      paused: true, debugName: debugName);
+
+  Expect.equals(isolate.debugName, debugName);
+  isolate.resume(isolate.pauseCapability);
 }
diff --git a/tests/lib_2/isolate/static_function_test.dart b/tests/lib_2/isolate/static_function_test.dart
index b1e115e..1c785a5 100644
--- a/tests/lib_2/isolate/static_function_test.dart
+++ b/tests/lib_2/isolate/static_function_test.dart
@@ -10,10 +10,9 @@
 library static_function_test;
 
 import 'dart:isolate';
-import 'dart:async';
 import 'static_function_lib.dart' as lib;
-import 'package:unittest/unittest.dart';
-import 'remote_unittest_helper.dart';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
 
 void function(SendPort port) {
   port.send("TOP");
@@ -95,26 +94,28 @@
 }
 
 void spawnTest(name, function, response) {
-  test(name, () {
-    ReceivePort r = new ReceivePort();
-    Isolate.spawn(function, r.sendPort);
-    r.listen(expectAsync((v) {
-      expect(v, response);
-      r.close();
-    }));
+  print(name);
+  ReceivePort r = new ReceivePort();
+  Isolate.spawn(function, r.sendPort);
+  asyncStart();
+  r.listen((v) {
+    Expect.equals(v, response);
+    r.close();
+    asyncEnd();
   });
 }
 
 void functionFailTest(name, function) {
-  test("throws on $name", () {
-    Isolate.spawn(function, null).catchError(expectAsync((e) {
-      /* do nothing */
-    }));
+  print("throws on $name");
+  asyncStart();
+  Isolate.spawn(function, null).catchError((e) {
+    /* do nothing */
+    asyncEnd();
   });
 }
 
 void main([args, port]) {
-  if (testRemote(main, port)) return;
+  asyncStart();
   // Sanity check.
   spawnTest("function", function, "TOP");
   spawnTest("_function", _function, "_TOP");
@@ -144,4 +145,5 @@
   functionFailTest(
       "named constructor closure", new C().namedConstructorBodyClosure);
   functionFailTest("instance method", new C().instanceMethod);
+  asyncEnd();
 }
diff --git a/tests/lib_2/isolate/unresolved_ports_test.dart b/tests/lib_2/isolate/unresolved_ports_test.dart
index 78bef1a..7707fab 100644
--- a/tests/lib_2/isolate/unresolved_ports_test.dart
+++ b/tests/lib_2/isolate/unresolved_ports_test.dart
@@ -10,8 +10,8 @@
 
 import 'dart:async';
 import 'dart:isolate';
-import 'package:unittest/unittest.dart';
-import "remote_unittest_helper.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
 
 // This test does the following:
 //  - main spawns two isolates: 'tim' and 'beth'
@@ -57,32 +57,27 @@
 }
 
 baseTest({bool failForNegativeTest: false}) {
-  test('Message chain with unresolved ports', () {
-    ReceivePort port = new ReceivePort();
-    port.listen(expectAsync((msg) {
-      expect(
-          msg,
-          equals('main says: Beth, find out if Tim is coming.'
-              '\nBeth says: Tim are you coming? And Bob?'
-              '\nTim says: Can you tell "main" that we are all coming?'
-              '\nBob says: we are all coming!'));
-      expect(failForNegativeTest, isFalse);
-      port.close();
-    }));
+  // Message chain with unresolved ports
+  ReceivePort port = new ReceivePort();
+  asyncStart();
+  port.listen((msg) {
+    Expect.equals(
+        msg,
+        'main says: Beth, find out if Tim is coming.'
+        '\nBeth says: Tim are you coming? And Bob?'
+        '\nTim says: Can you tell "main" that we are all coming?'
+        '\nBob says: we are all coming!');
+    Expect.isFalse(failForNegativeTest);
+    port.close();
+    asyncEnd();
+  });
 
-    spawnFunction(timIsolate).then((tim) {
-      spawnFunction(bethIsolate).then((beth) {
-        beth.send([
-          'main says: Beth, find out if Tim is coming.',
-          tim,
-          port.sendPort
-        ]);
-      });
+  spawnFunction(timIsolate).then((tim) {
+    spawnFunction(bethIsolate).then((beth) {
+      beth.send(
+          ['main says: Beth, find out if Tim is coming.', tim, port.sendPort]);
     });
   });
 }
 
-void main([args, port]) {
-  if (testRemote(main, port)) return;
-  baseTest();
-}
+void main([args, port]) => baseTest();
diff --git a/tests/search/.blazeproject b/tests/search/.blazeproject
deleted file mode 100644
index feb408a..0000000
--- a/tests/search/.blazeproject
+++ /dev/null
@@ -1,7 +0,0 @@
-directories:
-  crm/greentea/fe3/service/search
-
-targets:
-  //crm/greentea/fe3/service/search/...:all
-additional_languages:
-  dart
\ No newline at end of file
diff --git a/tests/standalone/io/addlatexhash_test.dart b/tests/standalone/io/addlatexhash_test.dart
index fe8c166..50c778a 100755
--- a/tests/standalone/io/addlatexhash_test.dart
+++ b/tests/standalone/io/addlatexhash_test.dart
@@ -73,8 +73,7 @@
   // file names/paths for file containing groups of 8 variants of a paragraph
   const par8timesName = "addlatexhash_test_src";
   const par8timesFileName = "$par8timesName.tex";
-  final par8timesDirPath =
-      path.join(dartRootDir, "tests", "standalone_2", "io");
+  final par8timesDirPath = path.join(dartRootDir, "tests", "standalone", "io");
   final par8timesPath = path.join(par8timesDirPath, par8timesFileName);
   final tmpPar8timesPath = path.join(tmpDirPath, par8timesFileName);
 
diff --git a/tests/standalone/io/dart_std_io_pipe_test.dart b/tests/standalone/io/dart_std_io_pipe_test.dart
index 7d3e6fc..3163d7e 100644
--- a/tests/standalone/io/dart_std_io_pipe_test.dart
+++ b/tests/standalone/io/dart_std_io_pipe_test.dart
@@ -105,16 +105,15 @@
 
   // Get the shell script for testing the Standalone Dart VM with
   // piping and redirections of stdio.
-  var shellScript = new File("tests/standalone_2/io/dart_std_io_pipe_test.sh");
+  var shellScript = new File("tests/standalone/io/dart_std_io_pipe_test.sh");
   if (!shellScript.existsSync()) {
-    shellScript = new File("../tests/standalone_2/io/dart_std_io_pipe_test.sh");
+    shellScript = new File("../tests/standalone/io/dart_std_io_pipe_test.sh");
   }
   // Get the Dart script file which echoes stdin to stdout or stderr or both.
-  var scriptFile =
-      new File("tests/standalone_2/io/dart_std_io_pipe_script.dart");
+  var scriptFile = new File("tests/standalone/io/dart_std_io_pipe_script.dart");
   if (!scriptFile.existsSync()) {
     scriptFile =
-        new File("../tests/standalone_2/io/dart_std_io_pipe_script.dart");
+        new File("../tests/standalone/io/dart_std_io_pipe_script.dart");
   }
 
   // Run the shell script.
diff --git a/tests/standalone/io/directory_fuzz_test.dart b/tests/standalone/io/directory_fuzz_test.dart
index f76fc79..358bcff 100644
--- a/tests/standalone/io/directory_fuzz_test.dart
+++ b/tests/standalone/io/directory_fuzz_test.dart
@@ -18,9 +18,10 @@
     doItSync(() {
       Directory.systemTemp.createTempSync(v as String?).deleteSync();
     });
-    late Directory d;
-    doItSync(() => d = new Directory(v as String));
-    if (d == null) return;
+    Directory? directory;
+    doItSync(() => directory = new Directory(v as String));
+    if (directory == null) return;
+    final d = directory!;
     doItSync(d.existsSync);
     doItSync(d.createSync);
     doItSync(d.deleteSync);
diff --git a/tests/standalone/io/file_fuzz_test.dart b/tests/standalone/io/file_fuzz_test.dart
index 82dd4ac..f7f89c8 100644
--- a/tests/standalone/io/file_fuzz_test.dart
+++ b/tests/standalone/io/file_fuzz_test.dart
@@ -15,9 +15,10 @@
 
 fuzzSyncMethods() {
   typeMapping.forEach((k, v) {
-    late File f;
-    doItSync(() => f = new File(v as String));
-    if (f == null) return;
+    File? file;
+    doItSync(() => file = new File(v as String));
+    if (file == null) return;
+    final f = file!;
     doItSync(f.existsSync);
     doItSync(f.createSync);
     doItSync(f.deleteSync);
@@ -41,9 +42,10 @@
   asyncStart();
   var futures = <Future>[];
   typeMapping.forEach((k, v) {
-    late File f;
-    doItSync(() => f = new File(v as String));
-    if (f == null) return;
+    File? file;
+    doItSync(() => file = new File(v as String));
+    if (file == null) return;
+    final f = file!;
     futures.add(doItAsync(f.exists));
     futures.add(doItAsync(f.delete));
     futures.add(doItAsync(() => f.parent));
diff --git a/tests/standalone/io/http_headers_test.dart b/tests/standalone/io/http_headers_test.dart
index d1d0b8c..5617498 100644
--- a/tests/standalone/io/http_headers_test.dart
+++ b/tests/standalone/io/http_headers_test.dart
@@ -259,6 +259,25 @@
   }
 
   HeaderValue headerValue;
+  headerValue = HeaderValue.parse("");
+  check(headerValue, "", {});
+  headerValue = HeaderValue.parse(";");
+  check(headerValue, "", {});
+  headerValue = HeaderValue.parse(";;");
+  check(headerValue, "", {});
+  headerValue = HeaderValue.parse("v;a");
+  check(headerValue, "v", {"a": null});
+  headerValue = HeaderValue.parse("v;a=");
+  check(headerValue, "v", {"a": ""});
+  Expect.throws(() => HeaderValue.parse("v;a=\""), (e) => e is HttpException);
+  headerValue = HeaderValue.parse("v;a=\"\"");
+  check(headerValue, "v", {"a": ""});
+  Expect.throws(() => HeaderValue.parse("v;a=\"\\"), (e) => e is HttpException);
+  Expect.throws(
+      () => HeaderValue.parse("v;a=\";b=\"c\""), (e) => e is HttpException);
+  Expect.throws(() => HeaderValue.parse("v;a=b c"), (e) => e is HttpException);
+  headerValue = HeaderValue.parse("æ;ø=å");
+  check(headerValue, "æ", {"ø": "å"});
   headerValue =
       HeaderValue.parse("xxx; aaa=bbb; ccc=\"\\\";\\a\"; ddd=\"    \"");
   check(headerValue, "xxx", {"aaa": "bbb", "ccc": '\";a', "ddd": "    "});
@@ -280,6 +299,24 @@
   check(headerValue, "attachment", parameters);
   headerValue = HeaderValue.parse("xxx; aaa; bbb; ccc");
   check(headerValue, "xxx", {"aaa": null, "bbb": null, "ccc": null});
+
+  Expect.equals("", HeaderValue().toString());
+  Expect.equals("", HeaderValue("").toString());
+  Expect.equals("v", HeaderValue("v").toString());
+  Expect.equals("v", HeaderValue("v", {}).toString());
+  Expect.equals("v; ", HeaderValue("v", {"": null}).toString());
+  Expect.equals("v; a", HeaderValue("v", {"a": null}).toString());
+  Expect.equals("v; a; b", HeaderValue("v", {"a": null, "b": null}).toString());
+  Expect.equals(
+      "v; a; b=c", HeaderValue("v", {"a": null, "b": "c"}).toString());
+  Expect.equals(
+      "v; a=c; b", HeaderValue("v", {"a": "c", "b": null}).toString());
+  Expect.equals("v; a=\"\"", HeaderValue("v", {"a": ""}).toString());
+  Expect.equals("v; a=\"b c\"", HeaderValue("v", {"a": "b c"}).toString());
+  Expect.equals("v; a=\",\"", HeaderValue("v", {"a": ","}).toString());
+  Expect.equals(
+      "v; a=\"\\\\\\\"\"", HeaderValue("v", {"a": "\\\""}).toString());
+  Expect.equals("v; a=\"ø\"", HeaderValue("v", {"a": "ø"}).toString());
 }
 
 void testContentType() {
@@ -352,7 +389,7 @@
   check(contentType, "text", "html", {"charset": "utf-8", "xxx": "yyy"});
 
   contentType = ContentType.parse("text/html; charset=;");
-  check(contentType, "text", "html", {"charset": null});
+  check(contentType, "text", "html", {"charset": ""});
   contentType = ContentType.parse("text/html; charset;");
   check(contentType, "text", "html", {"charset": null});
 
diff --git a/tests/standalone/io/internet_address_test.dart b/tests/standalone/io/internet_address_test.dart
index 1832207..493957e 100644
--- a/tests/standalone/io/internet_address_test.dart
+++ b/tests/standalone/io/internet_address_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:io';
+import 'dart:convert';
+import 'dart:typed_data';
 
 import "package:expect/expect.dart";
 
@@ -131,10 +133,40 @@
   });
 }
 
+void testRawAddress() {
+  Uint8List addr = Uint8List.fromList([127, 0, 0, 1]);
+  var address = InternetAddress.fromRawAddress(addr);
+  Expect.equals('127.0.0.1', address.address);
+  Expect.equals(address.address, address.host);
+  Expect.equals(InternetAddressType.IPv4, address.type);
+}
+
+void testRawAddressIPv6() {
+  Uint8List addr =
+      Uint8List.fromList([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]);
+  var address = InternetAddress.fromRawAddress(addr);
+  Expect.equals('::1', address.address);
+  Expect.equals(address.address, address.host);
+  Expect.equals(InternetAddressType.IPv6, address.type);
+}
+
+void testRawPath() {
+  var name = 'test_raw_path';
+  Uint8List path = Uint8List.fromList(utf8.encode(name));
+  var address =
+      InternetAddress.fromRawAddress(path, type: InternetAddressType.unix);
+  Expect.equals(name, address.address);
+  Expect.equals(address.address, address.host);
+  Expect.equals(InternetAddressType.unix, address.type);
+}
+
 void main() {
   testDefaultAddresses();
   testConstructor();
   testEquality();
   testLookup();
   testReverseLookup();
+  testRawAddress();
+  testRawAddressIPv6();
+  testRawPath();
 }
diff --git a/tests/standalone/io/io_override_test.dart b/tests/standalone/io/io_override_test.dart
index aafa0ff..03c41af 100644
--- a/tests/standalone/io/io_override_test.dart
+++ b/tests/standalone/io/io_override_test.dart
@@ -7,6 +7,7 @@
 import 'dart:io';
 import 'dart:typed_data';
 
+import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
 
 class DirectoryMock extends FileSystemEntity implements Directory {
@@ -127,9 +128,12 @@
   }
 }
 
+final _mockFileSystemEvent = new Stream<FileSystemEvent>.empty();
+
 class FileSystemWatcherMock {
   static Stream<FileSystemEvent> watch(
-      String path, int events, bool recursive) async* {}
+          String path, int events, bool recursive) =>
+      _mockFileSystemEvent;
 
   static bool watchSupported() => false;
 }
@@ -187,11 +191,12 @@
       Expect.equals(
           FileSystemEntity.typeSync("file"), FileSystemEntityType.file);
       Expect.isFalse(FileSystemEntity.isWatchSupported);
-      Expect.isNull(new Directory("directory").watch());
+      Expect.identical(
+          _mockFileSystemEvent, new Directory("directory").watch());
       Expect.isTrue(new Link("link") is LinkMock);
-      Expect.isNull(Socket.connect(null, 0));
-      Expect.isNull(Socket.startConnect(null, 0));
-      Expect.isNull(ServerSocket.bind(null, 0));
+      asyncExpectThrows(() async => await Socket.connect(null, 0));
+      asyncExpectThrows(() async => await Socket.startConnect(null, 0));
+      asyncExpectThrows(() async => await ServerSocket.bind(null, 0));
     },
     createDirectory: DirectoryMock.createDirectory,
     getCurrentDirectory: DirectoryMock.getCurrent,
diff --git a/tests/standalone/io/platform_test.dart b/tests/standalone/io/platform_test.dart
index e337c5c..64ac7d0 100644
--- a/tests/standalone/io/platform_test.dart
+++ b/tests/standalone/io/platform_test.dart
@@ -46,8 +46,8 @@
   // Move directory to be sure script is correct.
   var oldDir = Directory.current;
   Directory.current = Directory.current.parent;
-  Expect.isTrue(Platform.script.path
-      .endsWith('tests/standalone_2/io/platform_test.dart'));
+  Expect.isTrue(
+      Platform.script.path.endsWith('tests/standalone/io/platform_test.dart'));
   Expect.isTrue(Platform.script.toFilePath().startsWith(oldDir.path));
   // Restore dir.
   Directory.current = oldDir;
@@ -87,8 +87,7 @@
     // SpawnFunction retains the script url of the parent which in this
     // case was a relative path.
     Expect.equals("file", uri.scheme);
-    Expect.isTrue(
-        uri.path.endsWith('tests/standalone_2/io/platform_test.dart'));
+    Expect.isTrue(uri.path.endsWith('tests/standalone/io/platform_test.dart'));
     Expect.equals(Platform.packageRoot, results["Platform.packageRoot"]);
     Expect.listEquals(
         Platform.executableArguments, results["Platform.executableArguments"]);
@@ -99,7 +98,10 @@
 testVersion() {
   checkValidVersion(String version) {
     RegExp re = new RegExp(r'(\d+)\.(\d+)\.(\d+)(-dev\.([^\.]*)\.([^\.]*))?');
-    var match = re.firstMatch(version)!;
+    var match = re.firstMatch(version);
+    if (match == null) {
+      throw new FormatException();
+    }
     var major = int.parse(match.group(1)!);
     // Major version.
     Expect.isTrue(major == 1 || major == 2);
diff --git a/tests/standalone/io/process_check_arguments_test.dart b/tests/standalone/io/process_check_arguments_test.dart
index c79c00e..f6bfd0b 100644
--- a/tests/standalone/io/process_check_arguments_test.dart
+++ b/tests/standalone/io/process_check_arguments_test.dart
@@ -22,10 +22,10 @@
 main() {
   // Get the Dart script file which checks arguments.
   var scriptFile =
-      new File("tests/standalone_2/io/process_check_arguments_script.dart");
+      new File("tests/standalone/io/process_check_arguments_script.dart");
   if (!scriptFile.existsSync()) {
-    scriptFile = new File(
-        "../tests/standalone_2/io/process_check_arguments_script.dart");
+    scriptFile =
+        new File("../tests/standalone/io/process_check_arguments_script.dart");
   }
   test([scriptFile.path, '3', '0', 'a']);
   test([scriptFile.path, '3', '0', 'a b']);
diff --git a/tests/standalone/io/process_environment_test.dart b/tests/standalone/io/process_environment_test.dart
index ca56130..8d46681 100644
--- a/tests/standalone/io/process_environment_test.dart
+++ b/tests/standalone/io/process_environment_test.dart
@@ -12,7 +12,7 @@
 runEnvironmentProcess(
     Map<String, String> environment, name, includeParent, callback) {
   var dartExecutable = Platform.executable;
-  var printEnv = 'tests/standalone_2/io/print_env.dart';
+  var printEnv = 'tests/standalone/io/print_env.dart';
   if (!new File(printEnv).existsSync()) {
     printEnv = '../$printEnv';
   }
diff --git a/tests/standalone/io/process_run_output_test.dart b/tests/standalone/io/process_run_output_test.dart
index 11b111a..c9fb7ae 100644
--- a/tests/standalone/io/process_run_output_test.dart
+++ b/tests/standalone/io/process_run_output_test.dart
@@ -55,11 +55,9 @@
 }
 
 main() {
-  var scriptFile =
-      new File("tests/standalone_2/io/process_std_io_script2.dart");
+  var scriptFile = new File("tests/standalone/io/process_std_io_script2.dart");
   if (!scriptFile.existsSync()) {
-    scriptFile =
-        new File("../tests/standalone_2/io/process_std_io_script2.dart");
+    scriptFile = new File("../tests/standalone/io/process_std_io_script2.dart");
   }
   Expect.isTrue(scriptFile.existsSync());
   test(scriptFile.path, 'ascii', 'stdout');
diff --git a/tests/standalone/io/process_stderr_test.dart b/tests/standalone/io/process_stderr_test.dart
index 0492fe2..904377c 100644
--- a/tests/standalone/io/process_stderr_test.dart
+++ b/tests/standalone/io/process_stderr_test.dart
@@ -61,10 +61,9 @@
 
   // Run the test using the dart binary with an echo script.
   // The test runner can be run from either the root or from runtime.
-  var scriptFile = new File("tests/standalone_2/io/process_std_io_script.dart");
+  var scriptFile = new File("tests/standalone/io/process_std_io_script.dart");
   if (!scriptFile.existsSync()) {
-    scriptFile =
-        new File("../tests/standalone_2/io/process_std_io_script.dart");
+    scriptFile = new File("../tests/standalone/io/process_std_io_script.dart");
   }
   Expect.isTrue(scriptFile.existsSync());
   test(
diff --git a/tests/standalone/io/process_stdin_transform_unsubscribe_test.dart b/tests/standalone/io/process_stdin_transform_unsubscribe_test.dart
index fa36a06..5d8b6e2 100644
--- a/tests/standalone/io/process_stdin_transform_unsubscribe_test.dart
+++ b/tests/standalone/io/process_stdin_transform_unsubscribe_test.dart
@@ -33,9 +33,9 @@
 
 main() {
   var scriptName = "process_stdin_transform_unsubscribe_script.dart";
-  var scriptFile = new File("tests/standalone_2/io/$scriptName");
+  var scriptFile = new File("tests/standalone/io/$scriptName");
   if (!scriptFile.existsSync()) {
-    scriptFile = new File("../tests/standalone_2/io/$scriptName");
+    scriptFile = new File("../tests/standalone/io/$scriptName");
   }
   Expect.isTrue(scriptFile.existsSync());
   test(
diff --git a/tests/standalone/io/process_stdout_test.dart b/tests/standalone/io/process_stdout_test.dart
index 7d3bc7f..10c27f7 100644
--- a/tests/standalone/io/process_stdout_test.dart
+++ b/tests/standalone/io/process_stdout_test.dart
@@ -59,10 +59,9 @@
 
   // Run the test using the dart binary with an echo script.
   // The test runner can be run from either the root or from runtime.
-  var scriptFile = new File("tests/standalone_2/io/process_std_io_script.dart");
+  var scriptFile = new File("tests/standalone/io/process_std_io_script.dart");
   if (!scriptFile.existsSync()) {
-    scriptFile =
-        new File("../tests/standalone_2/io/process_std_io_script.dart");
+    scriptFile = new File("../tests/standalone/io/process_std_io_script.dart");
   }
   Expect.isTrue(scriptFile.existsSync());
   test(
diff --git a/tests/standalone/io/raw_synchronous_socket_test.dart b/tests/standalone/io/raw_synchronous_socket_test.dart
index 74a82f2..50cb0f2 100644
--- a/tests/standalone/io/raw_synchronous_socket_test.dart
+++ b/tests/standalone/io/raw_synchronous_socket_test.dart
@@ -419,7 +419,7 @@
   asyncEnd();
 }
 
-Future testInvalidReadWriteOperations() {
+void testInvalidReadWriteOperations() {
   asyncStart();
   RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     server.listen((socket) {});
diff --git a/tests/standalone/io/resolve_symbolic_links_test.dart b/tests/standalone/io/resolve_symbolic_links_test.dart
index 57561db..9ff0e9e 100644
--- a/tests/standalone/io/resolve_symbolic_links_test.dart
+++ b/tests/standalone/io/resolve_symbolic_links_test.dart
@@ -16,16 +16,16 @@
   // All of these tests test that resolveSymbolicLinks gives a path
   // that points to the same place as the original, and that it removes
   // all links, .., and . segments, and that it produces an absolute path.
-  asyncTest(() => testFile(join(
-      testsDir, 'standalone_2', 'io', 'resolve_symbolic_links_test.dart')));
-  asyncTest(() => testFile(join(testsDir, 'standalone_2', 'io', '..', 'io',
+  asyncTest(() => testFile(
+      join(testsDir, 'standalone', 'io', 'resolve_symbolic_links_test.dart')));
+  asyncTest(() => testFile(join(testsDir, 'standalone', 'io', '..', 'io',
       'resolve_symbolic_links_test.dart')));
 
-  asyncTest(() => testDir(join(testsDir, 'standalone_2', 'io')));
-  asyncTest(() => testDir(join(testsDir, 'lib_2', '..', 'standalone_2', 'io')));
+  asyncTest(() => testDir(join(testsDir, 'standalone', 'io')));
+  asyncTest(() => testDir(join(testsDir, 'lib_2', '..', 'standalone', 'io')));
   // Test a relative path.
   if (Platform.isWindows) {
-    asyncTest(() => testFile(join('\\\\?\\$testsDir', 'standalone_2', 'io',
+    asyncTest(() => testFile(join('\\\\?\\$testsDir', 'standalone', 'io',
         'resolve_symbolic_links_test.dart')));
     asyncTest(() => testDir('\\\\?\\$testsDir'));
   }
diff --git a/tests/standalone/io/secure_server_client_certificate_test.dart b/tests/standalone/io/secure_server_client_certificate_test.dart
index 18ae856..2223d3e 100644
--- a/tests/standalone/io/secure_server_client_certificate_test.dart
+++ b/tests/standalone/io/secure_server_client_certificate_test.dart
@@ -67,7 +67,7 @@
       : clientNoCertContext(certType, password);
   var clientEndFuture =
       SecureSocket.connect(HOST, server.port, context: clientContext);
-  if (required && sendCert) {
+  if (required && !sendCert) {
     try {
       await server.first;
     } catch (e) {
diff --git a/tests/standalone/io/socket_from_raw_path_test.dart b/tests/standalone/io/socket_from_raw_path_test.dart
new file mode 100644
index 0000000..757bf37
--- /dev/null
+++ b/tests/standalone/io/socket_from_raw_path_test.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for 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 'dart:typed_data';
+
+import 'package:expect/expect.dart';
+
+Future testAddress(Uint8List name, String addr,
+    {InternetAddressType? type}) async {
+  var address = InternetAddress.fromRawAddress(name, type: type);
+  Expect.equals(address.address, addr);
+  var server = await ServerSocket.bind(address, 0);
+  var client = await Socket.connect(address, server.port);
+  var completer = Completer();
+  server.listen((socket) async {
+    Expect.equals(socket.port, server.port);
+    Expect.equals(client.port, socket.remotePort);
+    Expect.equals(client.remotePort, socket.port);
+
+    Expect.equals(client.remoteAddress, address);
+    socket.destroy();
+    client.destroy();
+    await server.close();
+    completer.complete();
+  });
+  await completer.future;
+}
+
+Future<void> testUnixAddress() async {
+  Directory dir = Directory.systemTemp.createTempSync();
+  var name = 'raw_path_test';
+  try {
+    final file = File('${dir.path}/$name');
+    Uint8List path = Uint8List.fromList(utf8.encode(file.path));
+    var address =
+        InternetAddress.fromRawAddress(path, type: InternetAddressType.unix);
+    Expect.isTrue(address.address.toString().endsWith(name));
+
+    // Test socket
+    var server = await ServerSocket.bind(address, 0);
+    var client = await Socket.connect(address, server.port);
+    var completer = Completer<void>();
+    server.listen((socket) async {
+      Expect.equals(socket.port, server.port);
+      Expect.equals(client.port, socket.remotePort);
+      Expect.equals(client.remotePort, socket.port);
+
+      Expect.equals(client.remoteAddress, address);
+      socket.destroy();
+      client.destroy();
+      await server.close();
+      completer.complete();
+    });
+    await completer.future;
+  } finally {
+    dir.deleteSync(recursive: true);
+  }
+}
+
+void main() async {
+  // Test for internet address ipv4 ('127.0.0.1').
+  Uint8List addr = Uint8List.fromList([127, 0, 0, 1]);
+  await testAddress(addr, '127.0.0.1');
+
+  // Test unix socket
+  if (Platform.isMacOS || Platform.isLinux || Platform.isAndroid) {
+    await testUnixAddress();
+  }
+}
diff --git a/tests/standalone/io/socket_info_ipv6_test.dart b/tests/standalone/io/socket_info_ipv6_test.dart
index 11920fb..7c15b7d 100644
--- a/tests/standalone/io/socket_info_ipv6_test.dart
+++ b/tests/standalone/io/socket_info_ipv6_test.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 "package:expect/expect.dart";
+import "dart:async";
 import "dart:io";
+import "dart:typed_data";
+
+import "package:expect/expect.dart";
 
 void testHostAndPort() {
   ServerSocket.bind("::1", 0).then((server) {
@@ -29,6 +32,30 @@
   });
 }
 
-void main() {
+Future<void> testRawAddress() async {
+  var list =
+      Uint8List.fromList([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]);
+  var addr = '::1';
+  var address = InternetAddress.fromRawAddress(list);
+  Expect.equals(address.address, addr);
+  var server = await ServerSocket.bind(address, 0);
+  var client = await Socket.connect(address, server.port);
+  var completer = Completer<void>();
+  server.listen((socket) async {
+    Expect.equals(socket.port, server.port);
+    Expect.equals(client.port, socket.remotePort);
+    Expect.equals(client.remotePort, socket.port);
+
+    Expect.equals(client.remoteAddress, address);
+    socket.destroy();
+    client.destroy();
+    await server.close();
+    completer.complete();
+  });
+  await completer.future;
+}
+
+void main() async {
   testHostAndPort();
+  await testRawAddress();
 }
diff --git a/tests/standalone/io/test_extension_test.dart b/tests/standalone/io/test_extension_test.dart
index e69ae28..fc7caef 100644
--- a/tests/standalone/io/test_extension_test.dart
+++ b/tests/standalone/io/test_extension_test.dart
@@ -21,6 +21,7 @@
     default:
       Expect.fail('Unknown operating system ${Platform.operatingSystem}');
   }
+  throw 'Unknown operating system ${Platform.operatingSystem}';
 }
 
 // Returns a list containing the source file name in the first element and the
@@ -37,6 +38,7 @@
     default:
       Expect.fail('Unknown operating system ${Platform.operatingSystem}');
   }
+  throw 'Unknown operating system ${Platform.operatingSystem}';
 }
 
 String getExtensionPath(String buildDirectory, String filename) {
diff --git a/tests/standalone/io/unix_socket_test.dart b/tests/standalone/io/unix_socket_test.dart
new file mode 100644
index 0000000..cc6ed79
--- /dev/null
+++ b/tests/standalone/io/unix_socket_test.dart
@@ -0,0 +1,174 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for 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:expect/expect.dart';
+
+Future testAddress(String name) async {
+  var address = InternetAddress('$name/sock', type: InternetAddressType.unix);
+  var server = await ServerSocket.bind(address, 0);
+
+  var type = FileSystemEntity.typeSync(address.address);
+
+  var client = await Socket.connect(address, server.port);
+  var completer = Completer<void>();
+  server.listen((socket) async {
+    Expect.equals(socket.port, 0);
+    Expect.equals(socket.port, server.port);
+    Expect.equals(client.port, socket.remotePort);
+    Expect.equals(client.remotePort, socket.port);
+
+    // Client has not bound to a path. This is an unnamed socket.
+    Expect.equals(socket.remoteAddress.toString(), "InternetAddress('', Unix)");
+    Expect.equals(client.remoteAddress.toString(), address.toString());
+    socket.destroy();
+    client.destroy();
+    await server.close();
+    completer.complete();
+  });
+  await completer.future;
+}
+
+testBindShared(String name) async {
+  var address = InternetAddress('$name/sock', type: InternetAddressType.unix);
+  var socket = await ServerSocket.bind(address, 0, shared: true);
+  Expect.isTrue(socket.port == 0);
+
+  // Same path
+  var socket2 = await ServerSocket.bind(address, 0, shared: true);
+  Expect.equals(socket.address.address, socket2.address.address);
+  Expect.equals(socket.port, socket2.port);
+
+  // Test relative path
+  var path = name.substring(name.lastIndexOf('/') + 1);
+  address = InternetAddress('${name}/../${path}/sock',
+      type: InternetAddressType.unix);
+
+  var socket3 = await ServerSocket.bind(address, 0, shared: true);
+  Expect.isTrue(FileSystemEntity.identicalSync(
+      socket.address.address, socket3.address.address));
+  Expect.equals(socket.port, socket2.port);
+  await socket.close();
+  await socket2.close();
+  await socket3.close();
+}
+
+testBind(String name) async {
+  var address = InternetAddress('$name/sock', type: InternetAddressType.unix);
+  var server = await ServerSocket.bind(address, 0, shared: false);
+  Expect.isTrue(server.address.toString().contains(name));
+  // Unix domain socket does not have a valid port number.
+  Expect.equals(server.port, 0);
+
+  var type = FileSystemEntity.typeSync(address.address);
+
+  var sub;
+  sub = server.listen((s) {
+    sub.cancel();
+    server.close();
+  });
+
+  var socket = await Socket.connect(address, server.port);
+  socket.write(" socket content");
+
+  await socket.destroy();
+  await server.close();
+}
+
+Future testListenCloseListenClose(String name) async {
+  var address = InternetAddress('$name/sock', type: InternetAddressType.unix);
+  ServerSocket socket = await ServerSocket.bind(address, 0, shared: true);
+  ServerSocket socket2 =
+      await ServerSocket.bind(address, socket.port, shared: true);
+
+  // The second socket should have kept the OS socket alive. We can therefore
+  // test if it is working correctly.
+  await socket.close();
+
+  var type = FileSystemEntity.typeSync(address.address);
+
+  // For robustness we ignore any clients unrelated to this test.
+  List<int> sendData = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
+  socket2.listen((Socket client) async {
+    client.add(sendData);
+    await Future.wait([client.drain(), client.close()]);
+  });
+
+  final client = await Socket.connect(address, socket2.port);
+  List<int> data = [];
+  var completer = Completer<void>();
+  client.listen(data.addAll, onDone: () {
+    Expect.listEquals(sendData, data);
+    completer.complete();
+  });
+  await completer.future;
+  await client.close();
+
+  // Close the second server socket.
+  await socket2.close();
+}
+
+Future testSourceAddressConnect(String name) async {
+  var address = InternetAddress('$name/sock', type: InternetAddressType.unix);
+  ServerSocket server = await ServerSocket.bind(address, 0);
+
+  var completer = Completer<void>();
+  var localAddress =
+      InternetAddress('$name/local', type: InternetAddressType.unix);
+  server.listen((Socket socket) async {
+    Expect.equals(socket.address.address, address.address);
+    Expect.equals(socket.remoteAddress.address, localAddress.address);
+    socket.drain();
+    socket.close();
+    completer.complete();
+  });
+
+  var type = FileSystemEntity.typeSync(address.address);
+
+  Socket client =
+      await Socket.connect(address, server.port, sourceAddress: localAddress);
+  Expect.equals(client.remoteAddress.address, address.address);
+  await completer.future;
+  await client.close();
+  await client.drain();
+  await server.close();
+}
+
+// Create socket in temp directory
+Future withTempDir(String prefix, void test(Directory dir)) async {
+  var tempDir = Directory.systemTemp.createTempSync(prefix);
+  try {
+    await test(tempDir);
+  } finally {
+    tempDir.deleteSync(recursive: true);
+  }
+}
+
+void main() async {
+  try {
+    await withTempDir('unix_socket_test', (Directory dir) async {
+      await testAddress('${dir.path}');
+    });
+    await withTempDir('unix_socket_test', (Directory dir) async {
+      await testBind('${dir.path}');
+    });
+    await withTempDir('unix_socket_test', (Directory dir) async {
+      await testBindShared('${dir.path}');
+    });
+    await withTempDir('unix_socket_test', (Directory dir) async {
+      await testListenCloseListenClose('${dir.path}');
+    });
+    await withTempDir('unix_socket_test', (Directory dir) async {
+      await testSourceAddressConnect('${dir.path}');
+    });
+  } catch (e) {
+    if (Platform.isMacOS || Platform.isLinux || Platform.isAndroid) {
+      Expect.fail("Unexpected exceptions are thrown");
+    } else {
+      Expect.isTrue(e is SocketException);
+    }
+  }
+}
diff --git a/tests/standalone/io/web_socket_ping_test.dart b/tests/standalone/io/web_socket_ping_test.dart
index 3960958..ef6169d 100644
--- a/tests/standalone/io/web_socket_ping_test.dart
+++ b/tests/standalone/io/web_socket_ping_test.dart
@@ -36,20 +36,22 @@
       response.headers.add("Sec-WebSocket-Accept", accept);
       response.headers.contentLength = 0;
       response.detachSocket().then((socket) {
-        socket.drain().then((_) {
-          socket.close();
-          closed++;
-          if (closed == totalConnections) {
-            server.close();
-          }
-        });
+        socket.destroy();
       });
     });
 
+    int closeCount = 0;
     for (int i = 0; i < totalConnections; i++) {
       WebSocket.connect('ws://localhost:${server.port}').then((webSocket) {
         webSocket.pingInterval = const Duration(milliseconds: 100);
-        webSocket.drain();
+        webSocket.listen((message) {
+          Expect.fail("unexpected message");
+        }, onDone: () {
+          closeCount++;
+          if (closeCount == totalConnections) {
+            server.close();
+          }
+        });
       });
     }
   });
diff --git a/tests/standalone_2/dwarf_stack_trace_obfuscate_test.dart b/tests/standalone_2/dwarf_stack_trace_obfuscate_test.dart
index 60f7bb7..37fd305 100644
--- a/tests/standalone_2/dwarf_stack_trace_obfuscate_test.dart
+++ b/tests/standalone_2/dwarf_stack_trace_obfuscate_test.dart
@@ -49,12 +49,12 @@
   // The first frame should correspond to the throw in bar, which was inlined
   // into foo (so we'll get information for two calls for that PC address).
   [
-    CallInfo(
+    DartCallInfo(
         function: "bar",
         filename: "dwarf_stack_trace_obfuscate_test.dart",
         line: 17,
         inlined: true),
-    CallInfo(
+    DartCallInfo(
         function: "foo",
         filename: "dwarf_stack_trace_obfuscate_test.dart",
         line: 23,
@@ -62,7 +62,7 @@
   ],
   // The second frame corresponds to call to foo in main.
   [
-    CallInfo(
+    DartCallInfo(
         function: "main",
         filename: "dwarf_stack_trace_obfuscate_test.dart",
         line: 29,
diff --git a/tests/standalone_2/dwarf_stack_trace_test.dart b/tests/standalone_2/dwarf_stack_trace_test.dart
index fd811ca..bed8cfa 100644
--- a/tests/standalone_2/dwarf_stack_trace_test.dart
+++ b/tests/standalone_2/dwarf_stack_trace_test.dart
@@ -143,12 +143,12 @@
   // The first frame should correspond to the throw in bar, which was inlined
   // into foo (so we'll get information for two calls for that PC address).
   [
-    CallInfo(
+    DartCallInfo(
         function: "bar",
         filename: "dwarf_stack_trace_test.dart",
         line: 17,
         inlined: true),
-    CallInfo(
+    DartCallInfo(
         function: "foo",
         filename: "dwarf_stack_trace_test.dart",
         line: 23,
@@ -156,7 +156,7 @@
   ],
   // The second frame corresponds to call to foo in main.
   [
-    CallInfo(
+    DartCallInfo(
         function: "main",
         filename: "dwarf_stack_trace_test.dart",
         line: 29,
@@ -168,14 +168,14 @@
 
 List<List<CallInfo>> removeInternalCalls(List<List<CallInfo>> original) =>
     original
-        .map((frame) => frame.where((call) => call.line > 0).toList())
+        .map((frame) => frame.where((call) => !call.isInternal).toList())
         .toList();
 
 void checkConsistency(
     List<List<CallInfo>> externalFrames, List<List<CallInfo>> allFrames) {
   // We should have the same number of frames for both external-only
   // and combined call information.
-  Expect.equals(externalFrames.length, allFrames.length);
+  Expect.equals(allFrames.length, externalFrames.length);
 
   for (var frame in externalFrames) {
     // There should be no frames in either version where we failed to look up
@@ -185,7 +185,7 @@
     // External-only call information should only include call information with
     // positive line numbers.
     for (var call in frame) {
-      Expect.isTrue(call.line > 0);
+      Expect.isTrue(!call.isInternal);
     }
   }
 
@@ -200,11 +200,10 @@
   }
 
   // The information in the external-only and combined call information should
-  // be consistent for external frames.
-  for (var i = 0; i < allFrames.length; i++) {
-    if (externalFrames[i].isNotEmpty) {
-      Expect.listEquals(externalFrames[i], allFrames[i]);
-    }
+  // be consistent for externally visible calls.
+  final allFramesStripped = removeInternalCalls(allFrames);
+  for (var i = 0; i < allFramesStripped.length; i++) {
+    Expect.listEquals(allFramesStripped[i], externalFrames[i]);
   }
 }
 
@@ -218,15 +217,15 @@
   // non-positive line numbers match, as long as they're both non-positive.
   for (var i = 0; i < expectedInfo.length; i++) {
     for (var j = 0; j < expectedInfo[i].length; j++) {
-      final got = framesInfo[i][j];
-      final expected = expectedInfo[i][j];
-      Expect.equals(got.function, expected.function);
-      Expect.equals(got.inlined, expected.inlined);
-      Expect.equals(path.basename(got.filename), expected.filename);
-      if (expected.line > 0) {
-        Expect.equals(got.line, expected.line);
+      final DartCallInfo got = framesInfo[i][j];
+      final DartCallInfo expected = expectedInfo[i][j];
+      Expect.equals(expected.function, got.function);
+      Expect.equals(expected.inlined, got.inlined);
+      Expect.equals(expected.filename, path.basename(got.filename));
+      if (expected.isInternal) {
+        Expect.isTrue(got.isInternal);
       } else {
-        Expect.isTrue(got.line <= 0);
+        Expect.equals(expected.line, got.line);
       }
     }
   }
@@ -236,11 +235,13 @@
   var ret = <String>[];
   for (final frame in expectedCalls) {
     for (final call in frame) {
-      ret.add(call.function);
-      if (call.line > 0) {
-        ret.add("${call.filename}:${call.line}");
-      } else {
-        ret.add("${call.filename}:??");
+      if (call is DartCallInfo) {
+        ret.add(call.function);
+        if (call.isInternal) {
+          ret.add("${call.filename}:??");
+        } else {
+          ret.add("${call.filename}:${call.line}");
+        }
       }
     }
   }
diff --git a/tests/standalone_2/io/http_headers_test.dart b/tests/standalone_2/io/http_headers_test.dart
index d1d0b8c..1213e85 100644
--- a/tests/standalone_2/io/http_headers_test.dart
+++ b/tests/standalone_2/io/http_headers_test.dart
@@ -259,6 +259,25 @@
   }
 
   HeaderValue headerValue;
+  headerValue = HeaderValue.parse("");
+  check(headerValue, "", {});
+  headerValue = HeaderValue.parse(";");
+  check(headerValue, "", {});
+  headerValue = HeaderValue.parse(";;");
+  check(headerValue, "", {});
+  headerValue = HeaderValue.parse("v;a");
+  check(headerValue, "v", {"a": null});
+  headerValue = HeaderValue.parse("v;a=");
+  check(headerValue, "v", {"a": ""});
+  Expect.throws(() => HeaderValue.parse("v;a=\""), (e) => e is HttpException);
+  headerValue = HeaderValue.parse("v;a=\"\"");
+  check(headerValue, "v", {"a": ""});
+  Expect.throws(() => HeaderValue.parse("v;a=\"\\"), (e) => e is HttpException);
+  Expect.throws(
+      () => HeaderValue.parse("v;a=\";b=\"c\""), (e) => e is HttpException);
+  Expect.throws(() => HeaderValue.parse("v;a=b c"), (e) => e is HttpException);
+  headerValue = HeaderValue.parse("æ;ø=å");
+  check(headerValue, "æ", {"ø": "å"});
   headerValue =
       HeaderValue.parse("xxx; aaa=bbb; ccc=\"\\\";\\a\"; ddd=\"    \"");
   check(headerValue, "xxx", {"aaa": "bbb", "ccc": '\";a', "ddd": "    "});
@@ -280,6 +299,25 @@
   check(headerValue, "attachment", parameters);
   headerValue = HeaderValue.parse("xxx; aaa; bbb; ccc");
   check(headerValue, "xxx", {"aaa": null, "bbb": null, "ccc": null});
+
+  Expect.equals("", HeaderValue().toString());
+  Expect.equals("", HeaderValue("").toString());
+  Expect.equals("v", HeaderValue("v").toString());
+  Expect.equals("v", HeaderValue("v", null).toString());
+  Expect.equals("v", HeaderValue("v", {}).toString());
+  Expect.equals("v; ", HeaderValue("v", {"": null}).toString());
+  Expect.equals("v; a", HeaderValue("v", {"a": null}).toString());
+  Expect.equals("v; a; b", HeaderValue("v", {"a": null, "b": null}).toString());
+  Expect.equals(
+      "v; a; b=c", HeaderValue("v", {"a": null, "b": "c"}).toString());
+  Expect.equals(
+      "v; a=c; b", HeaderValue("v", {"a": "c", "b": null}).toString());
+  Expect.equals("v; a=\"\"", HeaderValue("v", {"a": ""}).toString());
+  Expect.equals("v; a=\"b c\"", HeaderValue("v", {"a": "b c"}).toString());
+  Expect.equals("v; a=\",\"", HeaderValue("v", {"a": ","}).toString());
+  Expect.equals(
+      "v; a=\"\\\\\\\"\"", HeaderValue("v", {"a": "\\\""}).toString());
+  Expect.equals("v; a=\"ø\"", HeaderValue("v", {"a": "ø"}).toString());
 }
 
 void testContentType() {
@@ -352,7 +390,7 @@
   check(contentType, "text", "html", {"charset": "utf-8", "xxx": "yyy"});
 
   contentType = ContentType.parse("text/html; charset=;");
-  check(contentType, "text", "html", {"charset": null});
+  check(contentType, "text", "html", {"charset": ""});
   contentType = ContentType.parse("text/html; charset;");
   check(contentType, "text", "html", {"charset": null});
 
diff --git a/tests/standalone_2/io/internet_address_test.dart b/tests/standalone_2/io/internet_address_test.dart
index 1832207..d35e91c 100644
--- a/tests/standalone_2/io/internet_address_test.dart
+++ b/tests/standalone_2/io/internet_address_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:io';
+import 'dart:convert';
+import 'dart:typed_data';
 
 import "package:expect/expect.dart";
 
@@ -131,10 +133,39 @@
   });
 }
 
+void testRawAddress() {
+  Uint8List addr = Uint8List.fromList([127, 0, 0, 1]);
+  var address = InternetAddress.fromRawAddress(addr);
+  Expect.equals('127.0.0.1', address.address);
+  Expect.equals(address.address, address.host);
+  Expect.equals(InternetAddressType.IPv4, address.type);
+}
+
+void testRawAddressIPv6() {
+  Uint8List addr =
+      Uint8List.fromList([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]);
+  var address = InternetAddress.fromRawAddress(addr);
+  Expect.equals('::1', address.address);
+  Expect.equals(address.address, address.host);
+  Expect.equals(InternetAddressType.IPv6, address.type);
+}
+
+void testRawPath() {
+  var name = 'test_raw_path';
+  var address = InternetAddress.fromRawAddress(utf8.encode(name),
+      type: InternetAddressType.unix);
+  Expect.equals(name, address.address);
+  Expect.equals(address.address, address.host);
+  Expect.equals(InternetAddressType.unix, address.type);
+}
+
 void main() {
   testDefaultAddresses();
   testConstructor();
   testEquality();
   testLookup();
   testReverseLookup();
+  testRawAddress();
+  testRawAddressIPv6();
+  testRawPath();
 }
diff --git a/tests/standalone_2/io/socket_from_raw_path_test.dart b/tests/standalone_2/io/socket_from_raw_path_test.dart
new file mode 100644
index 0000000..794f075
--- /dev/null
+++ b/tests/standalone_2/io/socket_from_raw_path_test.dart
@@ -0,0 +1,72 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for 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 'dart:typed_data';
+
+import 'package:expect/expect.dart';
+
+Future testAddress(Uint8List name, String addr,
+    {InternetAddressType type}) async {
+  var address = InternetAddress.fromRawAddress(name, type: type);
+  Expect.equals(address.address, addr);
+  var server = await ServerSocket.bind(address, 0);
+  var client = await Socket.connect(address, server.port);
+  var completer = Completer();
+  server.listen((socket) async {
+    Expect.equals(socket.port, server.port);
+    Expect.equals(client.port, socket.remotePort);
+    Expect.equals(client.remotePort, socket.port);
+
+    Expect.equals(client.remoteAddress, address);
+    socket.destroy();
+    client.destroy();
+    await server.close();
+    completer.complete();
+  });
+  await completer.future;
+}
+
+Future<void> testUnixAddress() async {
+  Directory dir = Directory.systemTemp.createTempSync();
+  var name = 'raw_path_test';
+  try {
+    var file = File('${dir.path}/$name');
+    var address = InternetAddress.fromRawAddress(utf8.encode(file.path),
+        type: InternetAddressType.unix);
+    Expect.isTrue(address.address.toString().endsWith(name));
+
+    // Test socket
+    var server = await ServerSocket.bind(address, 0);
+    var client = await Socket.connect(address, server.port);
+    var completer = Completer<void>();
+    server.listen((socket) async {
+      Expect.equals(socket.port, server.port);
+      Expect.equals(client.port, socket.remotePort);
+      Expect.equals(client.remotePort, socket.port);
+
+      Expect.equals(client.remoteAddress, address);
+      socket.destroy();
+      client.destroy();
+      await server.close();
+      completer.complete();
+    });
+    await completer.future;
+  } finally {
+    dir.deleteSync(recursive: true);
+  }
+}
+
+void main() async {
+  // Test for internet address ipv4 ('127.0.0.1').
+  Uint8List addr = Uint8List.fromList([127, 0, 0, 1]);
+  await testAddress(addr, '127.0.0.1');
+
+  // Test unix socket
+  if (Platform.isMacOS || Platform.isLinux || Platform.isAndroid) {
+    await testUnixAddress();
+  }
+}
diff --git a/tests/standalone_2/io/socket_info_ipv6_test.dart b/tests/standalone_2/io/socket_info_ipv6_test.dart
index 11920fb..7c15b7d 100644
--- a/tests/standalone_2/io/socket_info_ipv6_test.dart
+++ b/tests/standalone_2/io/socket_info_ipv6_test.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 "package:expect/expect.dart";
+import "dart:async";
 import "dart:io";
+import "dart:typed_data";
+
+import "package:expect/expect.dart";
 
 void testHostAndPort() {
   ServerSocket.bind("::1", 0).then((server) {
@@ -29,6 +32,30 @@
   });
 }
 
-void main() {
+Future<void> testRawAddress() async {
+  var list =
+      Uint8List.fromList([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]);
+  var addr = '::1';
+  var address = InternetAddress.fromRawAddress(list);
+  Expect.equals(address.address, addr);
+  var server = await ServerSocket.bind(address, 0);
+  var client = await Socket.connect(address, server.port);
+  var completer = Completer<void>();
+  server.listen((socket) async {
+    Expect.equals(socket.port, server.port);
+    Expect.equals(client.port, socket.remotePort);
+    Expect.equals(client.remotePort, socket.port);
+
+    Expect.equals(client.remoteAddress, address);
+    socket.destroy();
+    client.destroy();
+    await server.close();
+    completer.complete();
+  });
+  await completer.future;
+}
+
+void main() async {
   testHostAndPort();
+  await testRawAddress();
 }
diff --git a/tests/standalone_2/io/unix_socket_test.dart b/tests/standalone_2/io/unix_socket_test.dart
new file mode 100644
index 0000000..cc6ed79
--- /dev/null
+++ b/tests/standalone_2/io/unix_socket_test.dart
@@ -0,0 +1,174 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for 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:expect/expect.dart';
+
+Future testAddress(String name) async {
+  var address = InternetAddress('$name/sock', type: InternetAddressType.unix);
+  var server = await ServerSocket.bind(address, 0);
+
+  var type = FileSystemEntity.typeSync(address.address);
+
+  var client = await Socket.connect(address, server.port);
+  var completer = Completer<void>();
+  server.listen((socket) async {
+    Expect.equals(socket.port, 0);
+    Expect.equals(socket.port, server.port);
+    Expect.equals(client.port, socket.remotePort);
+    Expect.equals(client.remotePort, socket.port);
+
+    // Client has not bound to a path. This is an unnamed socket.
+    Expect.equals(socket.remoteAddress.toString(), "InternetAddress('', Unix)");
+    Expect.equals(client.remoteAddress.toString(), address.toString());
+    socket.destroy();
+    client.destroy();
+    await server.close();
+    completer.complete();
+  });
+  await completer.future;
+}
+
+testBindShared(String name) async {
+  var address = InternetAddress('$name/sock', type: InternetAddressType.unix);
+  var socket = await ServerSocket.bind(address, 0, shared: true);
+  Expect.isTrue(socket.port == 0);
+
+  // Same path
+  var socket2 = await ServerSocket.bind(address, 0, shared: true);
+  Expect.equals(socket.address.address, socket2.address.address);
+  Expect.equals(socket.port, socket2.port);
+
+  // Test relative path
+  var path = name.substring(name.lastIndexOf('/') + 1);
+  address = InternetAddress('${name}/../${path}/sock',
+      type: InternetAddressType.unix);
+
+  var socket3 = await ServerSocket.bind(address, 0, shared: true);
+  Expect.isTrue(FileSystemEntity.identicalSync(
+      socket.address.address, socket3.address.address));
+  Expect.equals(socket.port, socket2.port);
+  await socket.close();
+  await socket2.close();
+  await socket3.close();
+}
+
+testBind(String name) async {
+  var address = InternetAddress('$name/sock', type: InternetAddressType.unix);
+  var server = await ServerSocket.bind(address, 0, shared: false);
+  Expect.isTrue(server.address.toString().contains(name));
+  // Unix domain socket does not have a valid port number.
+  Expect.equals(server.port, 0);
+
+  var type = FileSystemEntity.typeSync(address.address);
+
+  var sub;
+  sub = server.listen((s) {
+    sub.cancel();
+    server.close();
+  });
+
+  var socket = await Socket.connect(address, server.port);
+  socket.write(" socket content");
+
+  await socket.destroy();
+  await server.close();
+}
+
+Future testListenCloseListenClose(String name) async {
+  var address = InternetAddress('$name/sock', type: InternetAddressType.unix);
+  ServerSocket socket = await ServerSocket.bind(address, 0, shared: true);
+  ServerSocket socket2 =
+      await ServerSocket.bind(address, socket.port, shared: true);
+
+  // The second socket should have kept the OS socket alive. We can therefore
+  // test if it is working correctly.
+  await socket.close();
+
+  var type = FileSystemEntity.typeSync(address.address);
+
+  // For robustness we ignore any clients unrelated to this test.
+  List<int> sendData = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
+  socket2.listen((Socket client) async {
+    client.add(sendData);
+    await Future.wait([client.drain(), client.close()]);
+  });
+
+  final client = await Socket.connect(address, socket2.port);
+  List<int> data = [];
+  var completer = Completer<void>();
+  client.listen(data.addAll, onDone: () {
+    Expect.listEquals(sendData, data);
+    completer.complete();
+  });
+  await completer.future;
+  await client.close();
+
+  // Close the second server socket.
+  await socket2.close();
+}
+
+Future testSourceAddressConnect(String name) async {
+  var address = InternetAddress('$name/sock', type: InternetAddressType.unix);
+  ServerSocket server = await ServerSocket.bind(address, 0);
+
+  var completer = Completer<void>();
+  var localAddress =
+      InternetAddress('$name/local', type: InternetAddressType.unix);
+  server.listen((Socket socket) async {
+    Expect.equals(socket.address.address, address.address);
+    Expect.equals(socket.remoteAddress.address, localAddress.address);
+    socket.drain();
+    socket.close();
+    completer.complete();
+  });
+
+  var type = FileSystemEntity.typeSync(address.address);
+
+  Socket client =
+      await Socket.connect(address, server.port, sourceAddress: localAddress);
+  Expect.equals(client.remoteAddress.address, address.address);
+  await completer.future;
+  await client.close();
+  await client.drain();
+  await server.close();
+}
+
+// Create socket in temp directory
+Future withTempDir(String prefix, void test(Directory dir)) async {
+  var tempDir = Directory.systemTemp.createTempSync(prefix);
+  try {
+    await test(tempDir);
+  } finally {
+    tempDir.deleteSync(recursive: true);
+  }
+}
+
+void main() async {
+  try {
+    await withTempDir('unix_socket_test', (Directory dir) async {
+      await testAddress('${dir.path}');
+    });
+    await withTempDir('unix_socket_test', (Directory dir) async {
+      await testBind('${dir.path}');
+    });
+    await withTempDir('unix_socket_test', (Directory dir) async {
+      await testBindShared('${dir.path}');
+    });
+    await withTempDir('unix_socket_test', (Directory dir) async {
+      await testListenCloseListenClose('${dir.path}');
+    });
+    await withTempDir('unix_socket_test', (Directory dir) async {
+      await testSourceAddressConnect('${dir.path}');
+    });
+  } catch (e) {
+    if (Platform.isMacOS || Platform.isLinux || Platform.isAndroid) {
+      Expect.fail("Unexpected exceptions are thrown");
+    } else {
+      Expect.isTrue(e is SocketException);
+    }
+  }
+}
diff --git a/tests/standalone_2/io/web_socket_ping_test.dart b/tests/standalone_2/io/web_socket_ping_test.dart
index 3960958..ef6169d 100644
--- a/tests/standalone_2/io/web_socket_ping_test.dart
+++ b/tests/standalone_2/io/web_socket_ping_test.dart
@@ -36,20 +36,22 @@
       response.headers.add("Sec-WebSocket-Accept", accept);
       response.headers.contentLength = 0;
       response.detachSocket().then((socket) {
-        socket.drain().then((_) {
-          socket.close();
-          closed++;
-          if (closed == totalConnections) {
-            server.close();
-          }
-        });
+        socket.destroy();
       });
     });
 
+    int closeCount = 0;
     for (int i = 0; i < totalConnections; i++) {
       WebSocket.connect('ws://localhost:${server.port}').then((webSocket) {
         webSocket.pingInterval = const Duration(milliseconds: 100);
-        webSocket.drain();
+        webSocket.listen((message) {
+          Expect.fail("unexpected message");
+        }, onDone: () {
+          closeCount++;
+          if (closeCount == totalConnections) {
+            server.close();
+          }
+        });
       });
     }
   });
diff --git a/tools/VERSION b/tools/VERSION
index 4acf823..858a4ac 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -33,7 +33,7 @@
 MAJOR 2
 MINOR 8
 PATCH 0
-PRERELEASE 16
+PRERELEASE 17
 PRERELEASE_PATCH 0
-ABI_VERSION 29
-OLDEST_SUPPORTED_ABI_VERSION 29
+ABI_VERSION 30
+OLDEST_SUPPORTED_ABI_VERSION 30
diff --git a/tools/addlatexhash.dart b/tools/addlatexhash.dart
index 2354668..a3b2230 100755
--- a/tools/addlatexhash.dart
+++ b/tools/addlatexhash.dart
@@ -111,7 +111,7 @@
 multilineNormalize(lines) {
   var afterBlankLines = false; // Does [line] succeed >0 empty lines?
   var afterCommentLines = false; // Does [line] succeed >0 commentOnly lines?
-  var newLines = new List();
+  var newLines = [];
   for (var line in lines) {
     if (afterBlankLines && afterCommentLines) {
       // Previous line was both blank and a comment: not possible.
@@ -193,7 +193,7 @@
 /// and "interesting" lines may be characterized by [analysisFunc] via
 /// the returned event object.
 findEvents(lines, analyzer) {
-  var events = new List();
+  var events = [];
   for (var line in lines) {
     var event = analyzer.analyze(line);
     if (event != null) events.add(event);
@@ -543,7 +543,7 @@
 
   // Perform single-line normalization.
   var inDartCode = false;
-  var normalizedLines = new List();
+  var normalizedLines = [];
 
   for (var line in lines) {
     if (sispIsDartBegin(line)) {
diff --git a/tools/bots/bot_utils.py b/tools/bots/bot_utils.py
index 7e3c496..9e79caf 100755
--- a/tools/bots/bot_utils.py
+++ b/tools/bots/bot_utils.py
@@ -72,7 +72,7 @@
 
   For every (channel,revision,release-type) tuple we have a base path:
 
-    gs://dart-archive/channels/{be,dev,stable,try,integration}
+    gs://dart-archive/channels/{be,beta,dev,stable,try,integration}
                      /{raw,signed,release}/{revision,latest}/
 
   Under every base path, the following structure is used:
diff --git a/tools/bots/find_base_commit.dart b/tools/bots/find_base_commit.dart
index 5a0a741..5da2e31 100755
--- a/tools/bots/find_base_commit.dart
+++ b/tools/bots/find_base_commit.dart
@@ -89,8 +89,10 @@
   for (final build in builds) {
     final parameters = jsonDecode(build["parameters_json"]);
     final bot = parameters["builder_name"];
-    if (bot.endsWith("-dev") || bot.endsWith("-stable")) {
-      // Ignore the -dev and -stable builders. The -try builders aren't in the
+    if (bot.endsWith("-beta") ||
+        bot.endsWith("-dev") ||
+        bot.endsWith("-stable")) {
+      // Ignore the release builders. The -try builders aren't in the
       // bucket we're reading.
       continue;
     }
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 6fac31d..f69d3e0 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -526,6 +526,36 @@
         "timeout": 240
       }
     },
+    "dartkp-asan-(linux|mac)-(debug|product|release)-x64": {
+      "options": {
+        "builder-tag": "asan",
+        "timeout": 240
+      }
+    },
+    "dartkp-lsan-(linux|mac)-(debug|product|release)-x64": {
+      "options": {
+        "builder-tag": "lsan",
+        "timeout": 240
+      }
+    },
+    "dartkp-msan-linux-(debug|product|release)-x64": {
+      "options": {
+        "builder-tag": "msan",
+        "timeout": 240
+      }
+    },
+    "dartkp-tsan-(linux|mac)-(debug|product|release)-x64": {
+      "options": {
+        "builder-tag": "tsan",
+        "timeout": 240
+      }
+    },
+    "dartkp-ubsan-(linux|mac)-(debug|product|release)-x64": {
+      "options": {
+        "builder-tag": "ubsan",
+        "timeout": 240
+      }
+    },
     "dart2js-(linux|mac|win)-chrome": {
       "options": {
         "use-sdk": true
@@ -1323,9 +1353,10 @@
           "name": "vm nnbd tests in weak mode with asserts",
           "arguments": [
             "-ndartkp-weak-asserts-${system}-${mode}-${arch}",
+            "corelib",
             "ffi",
             "language",
-            "lib/mirrors",
+            "lib",
             "standalone/io"
           ]
         },
@@ -1333,9 +1364,10 @@
           "name": "vm nnbd tests in strong mode",
           "arguments": [
             "-ndartkp-strong-${system}-${mode}-${arch}",
+            "corelib",
             "ffi",
             "language",
-            "lib/mirrors",
+            "lib",
             "standalone/io"
           ]
         }
@@ -1726,9 +1758,10 @@
           "name": "vm nnbd test in weak mode with asserts",
           "arguments": [
             "-ndartk-weak-asserts-${system}-${mode}-${arch}",
+            "corelib",
             "ffi",
             "language",
-            "lib/mirrors",
+            "lib",
             "standalone/io"
           ]
         },
@@ -1736,9 +1769,10 @@
           "name": "vm nnbd tests in strong mode",
           "arguments": [
             "-ndartk-strong-${system}-${mode}-${arch}",
+            "corelib",
             "ffi",
             "language",
-            "lib/mirrors",
+            "lib",
             "standalone/io"
           ]
         }
@@ -3207,6 +3241,14 @@
           ]
         },
         {
+          "name": "analyze pkg/dds",
+          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
+          "arguments": [
+            "--fatal-warnings",
+            "pkg/dds"
+          ]
+        },
+        {
           "name": "analyze runtime/observatory",
           "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
           "arguments": [
@@ -3626,6 +3668,7 @@
   ],
   "sanitizer_options": {
     "ASAN_OPTIONS": "check_initialization_order=true:handle_segv=0:detect_leaks=1:detect_stack_use_after_return=0:disable_coredump=0:abort_on_error=1",
+    "LSAN_OPTIONS": "check_initialization_order=true:handle_segv=0:detect_leaks=1:detect_stack_use_after_return=0:disable_coredump=0:abort_on_error=1",
     "MSAN_OPTIONS": "check_initialization_order=true:handle_segv=0:detect_leaks=1:detect_stack_use_after_return=0:disable_coredump=0:abort_on_error=1",
     "TSAN_OPTIONS": "handle_segv=0:disable_coredump=0:abort_on_error=1",
     "UBSAN_OPTIONS": "handle_segv=0:disable_coredump=0:abort_on_error=1"
diff --git a/tools/bots/version_checker.py b/tools/bots/version_checker.py
index 6c72aaf..89c4cdd 100755
--- a/tools/bots/version_checker.py
+++ b/tools/bots/version_checker.py
@@ -73,7 +73,8 @@
             print 'No sanity checking on bleeding edge'
         else:
             assert (channel == bot_utils.Channel.STABLE or
-                    channel == bot_utils.Channel.DEV)
+                    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
diff --git a/tools/create_debian_chroot.sh b/tools/create_debian_chroot.sh
index 1cfcf1e..4f2f25e 100755
--- a/tools/create_debian_chroot.sh
+++ b/tools/create_debian_chroot.sh
@@ -9,7 +9,7 @@
 #
 
 function usage {
-  USAGE="Usage: $0 i386|amd64 [target dir] [be|dev|<stable version>]]\n
+  USAGE="Usage: $0 i386|amd64 [target dir] [be|beta|dev|<stable version>]]\n
 \n
 The first mandatory argument speciifies the CPU architecture using\n
 the Debian convention (e.g. i386 and amd64).\n
diff --git a/tools/dom/nnbd_src/Validators.dart b/tools/dom/nnbd_src/Validators.dart
index aca5628..26dac65 100644
--- a/tools/dom/nnbd_src/Validators.dart
+++ b/tools/dom/nnbd_src/Validators.dart
@@ -157,6 +157,9 @@
  */
 class _ValidatingTreeSanitizer implements NodeTreeSanitizer {
   NodeValidator validator;
+
+  /// Did we modify the tree by removing anything.
+  bool modifiedTree = false;
   _ValidatingTreeSanitizer(this.validator) {}
 
   void sanitizeTree(Node node) {
@@ -165,11 +168,15 @@
 
       var child = node.lastChild;
       while (null != child) {
-        var nextChild;
+        Node? nextChild;
         try {
-          // Child may be removed during the walk, and we may not
-          // even be able to get its previousNode.
+          // Child may be removed during the walk, and we may not even be able
+          // to get its previousNode. But it's also possible that previousNode
+          // (i.e. previousSibling) is being spoofed, so double-check it.
           nextChild = child.previousNode;
+          if (nextChild != null && nextChild.nextNode != child) {
+            throw StateError("Corrupt HTML");
+          }
         } catch (e) {
           // Child appears bad, remove it. We want to check the rest of the
           // children of node and, but we have no way of getting to the next
@@ -183,7 +190,12 @@
       }
     }
 
+    modifiedTree = false;
     walk(node, null);
+    while (modifiedTree) {
+      modifiedTree = false;
+      walk(node, null);
+    }
   }
 
   /// Aggressively try to remove node.
@@ -191,7 +203,8 @@
     // If we have the parent, it's presumably already passed more sanitization
     // or is the fragment, so ask it to remove the child. And if that fails
     // try to set the outer html.
-    if (parent == null) {
+    modifiedTree = true;
+    if (parent == null || parent != node.parentNode) {
       node.remove();
     } else {
       parent._removeChild(node);
diff --git a/tools/dom/src/Validators.dart b/tools/dom/src/Validators.dart
index ceb6968..ce706ef 100644
--- a/tools/dom/src/Validators.dart
+++ b/tools/dom/src/Validators.dart
@@ -157,6 +157,9 @@
  */
 class _ValidatingTreeSanitizer implements NodeTreeSanitizer {
   NodeValidator validator;
+
+  /// Did we modify the tree by removing anything.
+  bool modifiedTree = false;
   _ValidatingTreeSanitizer(this.validator) {}
 
   void sanitizeTree(Node node) {
@@ -165,11 +168,15 @@
 
       var child = node.lastChild;
       while (null != child) {
-        var nextChild;
+        Node nextChild;
         try {
-          // Child may be removed during the walk, and we may not
-          // even be able to get its previousNode.
+          // Child may be removed during the walk, and we may not even be able
+          // to get its previousNode. But it's also possible that previousNode
+          // (i.e. previousSibling) is being spoofed, so double-check it.
           nextChild = child.previousNode;
+          if (nextChild != null && nextChild.nextNode != child) {
+            throw StateError("Corrupt HTML");
+          }
         } catch (e) {
           // Child appears bad, remove it. We want to check the rest of the
           // children of node and, but we have no way of getting to the next
@@ -183,7 +190,12 @@
       }
     }
 
+    modifiedTree = false;
     walk(node, null);
+    while (modifiedTree) {
+      modifiedTree = false;
+      walk(node, null);
+    }
   }
 
   /// Aggressively try to remove node.
@@ -191,7 +203,8 @@
     // If we have the parent, it's presumably already passed more sanitization
     // or is the fragment, so ask it to remove the child. And if that fails
     // try to set the outer html.
-    if (parent == null) {
+    modifiedTree = true;
+    if (parent == null || parent != node.parentNode) {
       node.remove();
     } else {
       parent._removeChild(node);
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index d692342..76ddcde 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -1449,6 +1449,14 @@
          if (!(element.attributes instanceof NamedNodeMap)) {
 	   return true;
 	 }
+         // If something has corrupted the traversal we want to detect
+         // these on not only the children (tested below) but on the node itself
+         // in case it was bypassed.
+         if (element["id"] == 'lastChild' || element["name"] == 'lastChild' ||
+             element["id"] == 'previousSibling' || element["name"] == 'previousSibling' ||
+             element["id"] == 'children' || element["name"] == 'children') {
+           return true;
+         }
 	 var childNodes = element.childNodes;
 	 if (element.lastChild &&
 	     element.lastChild !== childNodes[childNodes.length -1]) {
@@ -1474,6 +1482,7 @@
            // allowing us to check for clobbering that may show up in other accesses.
            if (child["id"] == 'attributes' || child["name"] == 'attributes' ||
                child["id"] == 'lastChild'  || child["name"] == 'lastChild' ||
+               child["id"] == 'previousSibling'  || child["name"] == 'previousSibling' ||
                child["id"] == 'children' || child["name"] == 'children') {
              return true;
            }
diff --git a/tools/make_version.py b/tools/make_version.py
index 4b16d91..eb01d35 100755
--- a/tools/make_version.py
+++ b/tools/make_version.py
@@ -47,17 +47,6 @@
 
 def MakeVersionString(quiet, no_git_hash, custom_for_pub=None):
     channel = utils.GetChannel()
-    if custom_for_pub:
-        # TODO(athom): remove the custom 2.7.0 logic post release.
-        # For 2.7.0, we want flutter to claim Dart is 2.7.0 even before it is
-        # decided what exactly 2.7.0 will be. Dart & Flutter stable releases
-        # will be synced, so that what will be released as Dart 2.7.0 will also
-        # be what will be packaged with Flutter.
-        version = utils.ReadVersionFile()
-        custom_version_string = "%s.%s.%s" % (version.major, version.minor,
-                                              version.patch)
-        if custom_version_string == "2.7.0" and custom_for_pub == "flutter":
-            return "2.7.0"
 
     if custom_for_pub and channel == 'be':
         latest = utils.GetLatestDevTag()
@@ -98,6 +87,8 @@
 
     version_cc_text = open(input_file).read()
     version_cc_text = version_cc_text.replace("{{VERSION_STR}}", version_string)
+    channel = utils.GetChannel()
+    version_cc_text = version_cc_text.replace("{{CHANNEL}}", channel)
     version_time = utils.GetGitTimestamp()
     if no_git_hash or version_time == None:
         version_time = "Unknown timestamp"
diff --git a/tools/sdks/update.sh b/tools/sdks/update.sh
index 857c98f..6f1cc4e 100755
--- a/tools/sdks/update.sh
+++ b/tools/sdks/update.sh
@@ -8,9 +8,10 @@
   exit 1
 fi
 
-channel="stable"
 case "$1" in
-*-dev.*) channel="dev";;
+*-dev.*.0) channel="dev";;
+*-dev.*) channel="beta";;
+*) channel="stable";;
 esac
 
 tmpdir=$(mktemp -d)
diff --git a/tools/utils.py b/tools/utils.py
index 7fa9d73..fb26d28 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -378,7 +378,7 @@
 
     if version.channel == 'be':
         postfix = '-edge' if no_git_hash else '-edge.%s' % GetGitRevision()
-    elif version.channel == 'dev':
+    elif version.channel in ('beta', 'dev'):
         postfix = '-dev.%s.%s' % (version.prerelease, version.prerelease_patch)
     else:
         assert version.channel == 'stable'
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index 6925150..a0fa6b0 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -202,25 +202,14 @@
 group("dartdevc_test_kernel_pkg") {
   deps = [
     ":async_helper_js",
+    ":collection_js",
     ":expect_js",
     ":js_js",
+    ":matcher_js",
     ":meta_js",
+    ":path_js",
+    ":stack_trace_js",
   ]
-
-  # TODO(38701): Cleanup after merging the forked SDK into mainline.
-  if (!use_nnbd) {
-    # TODO(sigmund): Merge this list into above. We turned this off temporarily
-    # while the migration of libraries is in flux, this step otherwise fails
-    # with many nnbd-related compile-time errors because the packages are
-    # assumed to be nnbd compilant.
-    deps += [
-      ":collection_js",
-      ":matcher_js",
-      ":path_js",
-      ":stack_trace_js",
-      ":unittest_js",
-    ]
-  }
 }
 
 template("dartdevc_kernel_compile") {
@@ -329,21 +318,6 @@
   package_dependencies = [ "path" ]
 }
 
-# TODO(rnystrom): Remove this when unittest is no longer used. Also remove
-# any of the above packages that are only here because unittest uses them.
-dartdevc_kernel_compile("unittest_js") {
-  package = "unittest"
-  package_dependencies = [
-    "path",
-    "stack_trace",
-  ]
-  extra_libraries = [
-    "html_config",
-    "html_individual_config",
-    "html_enhanced_config",
-  ]
-}
-
 compile_platform("dartdevc_platform") {
   single_root_scheme = "org-dartlang-sdk"
   single_root_base = rebase_path("../../")